var spawn = require('child_process').spawn; var fs = require("fs"); var http = require('http'); var mime=require("mime"); var server = http.createServer(function (req, res) { var format = req.url.replace(/\/(.*)\.(.*?)/, "$2"); var url = req.url.replace(/\/(.*)\.(.*?)/, "$1"); if ( ! /^.*\.[a-z0-9]{3,5}$/.test(req.url) ) { format="mp4"; url = req.url.replace(/\/(.*)/, "$1"); } var file = url.replace(/[\/:?!&?=\.]/g, "")+"."+format; var mimeType=mime.lookup(file); var args = ["-o", "downloads/"+file]; if (format==="m4a") { args.push("-x"); args.push("--audio-format"); args.push(format); } else if (format==="mp3") { args.push("-x"); args.push("--audio-format"); args.push(format); } else if (format==="opus") { args.push("-x"); args.push("--audio-format"); args.push(format); } else { args.push("-f"); args.push(format); } args.push(url); var job = spawn('./youtube-dl',args); console.log(args.join(" ")); job.on('close', function (code, signal) { var fileStream = fs.createReadStream("downloads/"+file); pipeReadstream ( req, res, fileStream, mimeType, file, function ( err ) { console.log(err); }); }); job.stdout.on('data', function (data) { console.log('stdout: ' + data); }); job.stderr.on('data', function (data) { console.log('stderr: ' + data); }); }); server.listen(8567); // pipe some stream as HTTP response function pipeReadstream( req, res, readStream, mimeType, filename, cb ) { var headWritten = false; readStream.on('data', function(data) { if ( !headWritten ) { res.writeHead(200, {'Content-disposition':'attachment; filename='+filename,'Content-Type': mimeType }); headWritten = true; } var flushed = res.write( data ); // Pause the read stream when the write stream gets saturated if( !flushed ){ readStream.pause(); } }); res.on('drain', function() { // Resume the read stream when the write stream gets hungry readStream.resume(); }); readStream.on('end', function() { res.end(); }); readStream.on('error', function(err) { cb ( err ); }); }