From b8316bb9893e0ff94de1d4071455a99f486da4fb Mon Sep 17 00:00:00 2001 From: MrFry Date: Wed, 6 Nov 2019 13:18:39 +0100 Subject: [PATCH] File streaming --- modules/stuff.js | 89 +++++++++++++++++++---------------- public/moodle-test-userscript | 2 +- views/stuff/video.ejs | 2 +- 3 files changed, 50 insertions(+), 43 deletions(-) diff --git a/modules/stuff.js b/modules/stuff.js index e6ca958..b7732a4 100644 --- a/modules/stuff.js +++ b/modules/stuff.js @@ -49,50 +49,57 @@ app.use(bodyParser.json({ // -------------------------------------------------------------- -app.get('/*.mp4', function (req, res) { - let p = req.url.replace(/%20/g, ' ') - let fp = p.split('?') - fp.pop() - const fpath = './public/files' + fp.join('/') - if (req.query.stream) { - const stat = fs.statSync(fpath) - const fileSize = stat.size - const range = req.headers.range - if (range) { - const parts = range.replace(/bytes=/, '').split('-') - const start = parseInt(parts[0], 10) - const end = parts[1] - ? parseInt(parts[1], 10) - : fileSize - 1 - const chunksize = (end - start) + 1 - const file = fs.createReadStream(fpath, { start, end }) - const head = { - 'Content-Range': `bytes ${start}-${end}/${fileSize}`, - 'Accept-Ranges': 'bytes', - 'Content-Length': chunksize, - 'Content-Type': 'video/mp4' +// app, '/*.mp4', 'video/mp4', 'stuff/video' +function appGetFileType (app, wildcard, contentType, pageToRender) { + app.get(wildcard, function (req, res) { + let p = req.url.replace(/%20/g, ' ') + let fp = p.split('?') + fp.pop() + const fpath = './public/files' + fp.join('/') + if (req.query.stream) { + const stat = fs.statSync(fpath) + const fileSize = stat.size + const range = req.headers.range + if (range) { + const parts = range.replace(/bytes=/, '').split('-') + const start = parseInt(parts[0], 10) + const end = parts[1] + ? parseInt(parts[1], 10) + : fileSize - 1 + const chunksize = (end - start) + 1 + const file = fs.createReadStream(fpath, { start, end }) + const head = { + 'Content-Range': `bytes ${start}-${end}/${fileSize}`, + 'Accept-Ranges': 'bytes', + 'Content-Length': chunksize, + 'Content-Type': contentType + } + res.writeHead(206, head) + file.pipe(res) + } else { + const head = { + 'Content-Length': fileSize, + 'Content-Type': contentType + } + res.writeHead(200, head) + fs.createReadStream(fpath).pipe(res) } - res.writeHead(206, head) - file.pipe(res) } else { - const head = { - 'Content-Length': fileSize, - 'Content-Type': 'video/mp4' - } - res.writeHead(200, head) - fs.createReadStream(fpath).pipe(res) + logger.LogReq(req) + let fname = p.split('/') + fname = fname.pop() + res.render(pageToRender, { + path: p, + fname, + url, + contentType + }) } - } else { - logger.LogReq(req) - let fname = p.split('/') - fname = fname.pop() - res.render('stuff/video', { - path: p, - fname, - url - }) - } -}) + }) +} + +appGetFileType(app, '/*.mp4', 'video/mp4', 'stuff/video') +appGetFileType(app, '/*.mp3', 'audio/mpeg', 'stuff/audio') app.get('/*', function (req, res) { let parsedUrl = req.url.replace(/%20/g, ' ') diff --git a/public/moodle-test-userscript b/public/moodle-test-userscript index cbfaffa..fe74436 160000 --- a/public/moodle-test-userscript +++ b/public/moodle-test-userscript @@ -1 +1 @@ -Subproject commit cbfaffa70ceb29b4beac4b13f6cbb4b85baac8a8 +Subproject commit fe74436ab119a31fdb35f7a3bbae50a572b0fb21 diff --git a/views/stuff/video.ejs b/views/stuff/video.ejs index 707b225..62db36a 100644 --- a/views/stuff/video.ejs +++ b/views/stuff/video.ejs @@ -21,7 +21,7 @@ <%= fname %> -