Added executable

Added controller file to launch other processes
Moved compile dir to build
merge-requests/1/merge
knotteye 2019-09-20 11:09:15 -05:00
parent 4309da7c39
commit d05c59c896
5 changed files with 93 additions and 85 deletions

3
.gitignore vendored
View File

@ -1,5 +1,4 @@
node_modules node_modules
media media
server.js build/**
chanbot.js
lib/inspircd-* lib/inspircd-*

3
satyr Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env node
const satyr = require("./build/controller");
satyr.boot();

29
src/controller.ts Normal file
View File

@ -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 };

View File

@ -1,34 +1,13 @@
import NodeMediaServer = require('node-media-server'); import * as NodeMediaServer from "node-media-server";
import fs = require('fs'); import { mkdir } from "fs";
const { exec } = require('child_process'); const { exec } = require('child_process');
//initialize configs, eventually grab from runtime config file //initialize configs, eventually grab from runtime config file
const mediaconfig = { function initConfig(): void{
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 streamAuth(path: string){ /*function streamAuth(path: string){
if (path.split("/").length > 3){ if (path.split("/").length > 3){
console.log("[NodeMediaServer] Malformed URL, closing connection."); console.log("[NodeMediaServer] Malformed URL, closing connection.");
return false; return false;
@ -47,55 +26,57 @@ function streamAuth(path: string){
} }
console.log("[NodeMediaServer] Stream key ok."); console.log("[NodeMediaServer] Stream key ok.");
return true; return true;
}*/
function boot (config: any){
const nms = new NodeMediaServer(config);
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('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 };
const nms = new NodeMediaServer(mediaconfig);
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('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}`);
});

View File

@ -1,13 +1,9 @@
{ {
"compilerOptions": { "compilerOptions": {
"outDir":".", "outDir":"./build",
"allowJs":true "allowJs":true
}, },
"include":[ "include":[
"src/**/*" "src/**/*"
], ],
"exclude":[
"node_modules",
"lib"
]
} }