mirror of http://git.sublab.org/mjpegplexer/
163 lines
4.1 KiB
JavaScript
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);
|