mjpegplexer/server.js

163 lines
4.1 KiB
JavaScript

'use strict';
var express = require('express');
var fs = require('fs');
var http = require('http');
var url_module = require('url');
var child_process = require('child_process');
var MjpegProxy = require('mjpeg-proxy').MjpegProxy;
var app = express();
app.use(express.json());
var storage_dir = '/home/untersuchung/storage';
var cameras = [
{
baseurl: 'http://192.168.1.20:8080/cam/0',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/1',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/2',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/3',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/4',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/5',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/6',
model: 'mjpegplexer'
},
{
baseurl: 'http://192.168.1.20:8080/cam/7',
model: 'mjpegplexer'
},
];
var still_frames = [
fs.readFileSync(__dirname + '/noise.jpg'),
fs.readFileSync(__dirname + '/noise2.jpg'),
];
function SimpleProxy(url) {
var self = this;
self.url = url;
self.handle_request = function(req, res) {
var request_options = url_module.parse(self.url);
request_options.agent = false;
var proxy = http.request(request_options, function(proxy_res) {
proxy_res.on('data', function(chunk) {
res.write(chunk, 'binary');
});
proxy_res.on('end', function() {
res.end();
});
res.writeHead(proxy_res.statusCode,
proxy_res.headers);
});
proxy.on('error', function(err) {
console.log("Simple proxy " + self.url + " failed:");
console.log(err);
res.end();
});
req.on('data', function(chunk) {
proxy.write(chunk, 'binary');
});
req.on('end', function() {
proxy.end();
});
};
}
for (var camera_idx in cameras) {
var camera = cameras[camera_idx];
var urls = {};
if (camera.model == 'conceptronic') {
urls.mjpeg = camera.baseurl + '/videostream.cgi?rate=1';
urls.down = camera.baseurl
+ '/decoder_control.cgi?onestep=1&command=0';
urls.up = camera.baseurl
+ '/decoder_control.cgi?onestep=1&command=2';
urls.right = camera.baseurl
+ '/decoder_control.cgi?onestep=1&command=4';
urls.left = camera.baseurl
+ '/decoder_control.cgi?onestep=1&command=6';
urls.snapshot = camera.baseurl + '/snapshot.cgi';
} else if (camera.model == 'mjpegplexer') {
urls.mjpeg = camera.baseurl + '/stream.mjpeg';
urls.down = camera.baseurl + '/control/down';
urls.up = camera.baseurl + '/control/up';
urls.right = camera.baseurl + '/control/right';
urls.left = camera.baseurl + '/control/left';
urls.snapshot = camera.baseurl + '/snapshot.jpg';
};
camera.proxy = new MjpegProxy(urls.mjpeg, still_frames);
app.get('/cam/' + camera_idx + '/stream.mjpeg', camera.proxy.proxyRequest);
for (var url in urls) {
if (url == 'mjpeg' || url == 'snapshot')
continue;
app.get('/cam/' + camera_idx + '/control/' + url,
new SimpleProxy(urls[url]).handle_request);
}
app.get('/cam/' + camera_idx + '/snapshot.jpg',
new SimpleProxy(urls.snapshot).handle_request);
app.use('/cam/' + camera_idx + '/browse',
express.static(__dirname + '/cam_public'));
}
app.use('/interface',
express.static(__dirname + '/public'));
app.get('/blackout', function(req, res) {
for (var camera_idx in cameras) {
var camera = cameras[camera_idx];
camera.proxy.on_air = !camera.proxy.on_air;
}
res.send('OK');
});
/* receives the form from the user */
app.post('/submit', function(req, res) {
var timestamp = req.body.formDate;
var path = storage_dir + '/' + timestamp;
fs.mkdirSync(path);
/* Save the image to disk */
/* XXX: here be dragons */
var image = req.body.formImage;
var regex = /^data:.+?\/.+?;base64,(.*?)$/;
var matches = image.match(regex);
var base_data = matches[1];
var buffer = new Buffer(base_data, 'base64');
fs.writeFileSync(path + '/snapshot.jpg', buffer);
req.body.formImage = undefined;
var info = JSON.stringify(req.body);
fs.writeFileSync(path + '/info.json', info);
child_process.spawn(__dirname + '/preprint/run.py', [path], {
detached: true,
stdio: 'inherit'
});
res.send('OK');
});
app.listen(8080);