diff --git a/.gitignore b/.gitignore index b3380e3..684bf9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ node_modules media -server.js -chanbot.js +build/** lib/inspircd-* diff --git a/satyr b/satyr new file mode 100755 index 0000000..ee14b90 --- /dev/null +++ b/satyr @@ -0,0 +1,3 @@ +#!/usr/bin/env node +const satyr = require("./build/controller"); +satyr.boot(); diff --git a/src/controller.ts b/src/controller.ts new file mode 100644 index 0000000..d9c8612 --- /dev/null +++ b/src/controller.ts @@ -0,0 +1,29 @@ +import * as mediaserver from "./server"; +function boot(): void{ + const mediaconfig: any = { + rtmp: { + port: 1935, + chunk_size: 60000, + gop_cache: true, + ping: 30, + ping_timeout: 60 + }, + http: { + port:8000, + allow_origin: '*', + mediaroot: './media' + }, + trans: { + ffmpeg: '/usr/bin/ffmpeg', + tasks: [ + { + app: 'live', + hls: 'true', + hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]' + } + ] + } + }; + mediaserver.boot(mediaconfig); +} +export { boot }; \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index dbf8da5..a167d36 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,34 +1,13 @@ -import NodeMediaServer = require('node-media-server'); -import fs = require('fs'); +import * as NodeMediaServer from "node-media-server"; +import { mkdir } from "fs"; const { exec } = require('child_process'); //initialize configs, eventually grab from runtime config file -const mediaconfig = { - rtmp: { - port: 1935, - chunk_size: 60000, - gop_cache: true, - ping: 30, - ping_timeout: 60 - }, - http: { - port:8000, - allow_origin: '*', - mediaroot: './media' - }, - trans: { - ffmpeg: '/usr/bin/ffmpeg', - tasks: [ - { - app: 'live', - hls: 'true', - hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]' - } - ] - } -}; +function initConfig(): void{ + ; +} -function streamAuth(path: string){ +/*function streamAuth(path: string){ if (path.split("/").length > 3){ console.log("[NodeMediaServer] Malformed URL, closing connection."); return false; @@ -47,55 +26,57 @@ function streamAuth(path: string){ } console.log("[NodeMediaServer] Stream key ok."); return true; -} +}*/ +function boot (config: any){ + const nms = new NodeMediaServer(config); -const nms = new NodeMediaServer(mediaconfig); + nms.run(); -nms.run(); - -nms.on('prePublish', (id, StreamPath, args) => { - console.log("[NodeMediaServer] Prepublish Hook for stream id=",id); - let session = nms.getSession(id); - if (StreamPath.split("/").length > 3){ - console.log("[NodeMediaServer] Malformed URL, closing connection."); - session.reject(); - return false; - } - let app: string = StreamPath.split("/")[1]; - let key: string = StreamPath.split("/")[2]; - console.log("[NodeMediaServer] Authenticating stream with credentials: ",`app=${app} key=${key}`); - if (app !== "stream"){ - console.log("[NodeMediaServer] Invalid app name, closing connection."); - session.reject(); - return false; - } - console.log("[NodeMediaServer] App name ok."); - //TODO: Hook up to DB and redirect from query - if (key !== "temp"){ - console.log("[NodeMediaServer] Invalid stream key, closing connection."); - session.reject(); - return false; - } - console.log("[NodeMediaServer] Stream key ok."); - session.publishStreamPath = "/live/amy"; -}); + nms.on('prePublish', (id, StreamPath, args) => { + console.log("[NodeMediaServer] Prepublish Hook for stream id=",id); + let session = nms.getSession(id); + if (StreamPath.split("/").length > 3){ + console.log("[NodeMediaServer] Malformed URL, closing connection."); + session.reject(); + return false; + } + let app: string = StreamPath.split("/")[1]; + let key: string = StreamPath.split("/")[2]; + console.log("[NodeMediaServer] Authenticating stream with credentials: ",`app=${app} key=${key}`); + if (app !== "stream"){ + console.log("[NodeMediaServer] Invalid app name, closing connection."); + session.reject(); + return false; + } + console.log("[NodeMediaServer] App name ok."); + //TODO: Hook up to DB and redirect from query + if (key !== "temp"){ + console.log("[NodeMediaServer] Invalid stream key, closing connection."); + session.reject(); + return false; + } + console.log("[NodeMediaServer] Stream key ok."); + session.publishStreamPath = "/live/amy"; + }); -nms.on('postPublish', (id, StreamPath, args) => { - console.log('[NodeMediaServer] Checking record flag for ', `id=${id} StreamPath=${StreamPath}`); - //Hook up to postgres DB. - if(true){ - console.log('[NodeMediaServer] Initiating recording for ', `id=${id} StreamPath=${StreamPath}`); - fs.mkdir('./media'+StreamPath, { recursive : true }, (err) => { - if (err) throw err; - }); - let subprocess = exec('ffmpeg -i rtmp://127.0.0.1'+StreamPath+' -vcodec copy -acodec copy ./media'+StreamPath+'/$(date +%d%b%Y-%H%M).mp4',{ - detached : true, - stdio : 'inherit' - }); - subprocess.unref(); - //spawn an ffmpeg process to record the stream, then detach it completely - return true; - } - console.log('[NodeMediaServer] Skipping recording for ', `id=${id} StreamPath=${StreamPath}`); -}); + nms.on('postPublish', (id, StreamPath, args) => { + console.log('[NodeMediaServer] Checking record flag for ', `id=${id} StreamPath=${StreamPath}`); + //Hook up to postgres DB. + if(true){ + console.log('[NodeMediaServer] Initiating recording for ', `id=${id} StreamPath=${StreamPath}`); + mkdir('./media'+StreamPath, { recursive : true }, (err) => { + if (err) throw err; + }); + let subprocess = exec('ffmpeg -i rtmp://127.0.0.1'+StreamPath+' -vcodec copy -acodec copy ./media'+StreamPath+'/$(date +%d%b%Y-%H%M).mp4',{ + detached : true, + stdio : 'inherit' + }); + subprocess.unref(); + //spawn an ffmpeg process to record the stream, then detach it completely + return true; + } + console.log('[NodeMediaServer] Skipping recording for ', `id=${id} StreamPath=${StreamPath}`); + }); +} +export { boot }; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9c26e75..963380a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,9 @@ { "compilerOptions": { - "outDir":".", + "outDir":"./build", "allowJs":true }, "include":[ "src/**/*" ], - "exclude":[ - "node_modules", - "lib" - ] }