From 4c729fdccdd0bf137cebc2289e4bb1679af7a664 Mon Sep 17 00:00:00 2001 From: "Juan D. Jara" Date: Tue, 12 May 2020 03:06:03 +0200 Subject: [PATCH] serve static files and more stuff --- api/converter.js | 8 +++++--- api/index.js | 6 +++++- api/package-lock.json | 37 +++++++++++++++++++++++++++++++++++++ api/package.json | 1 + api/storage.js | 9 ++++++--- www/src/App.js | 9 +++++++-- 6 files changed, 61 insertions(+), 9 deletions(-) diff --git a/api/converter.js b/api/converter.js index 7992d48..6b4aafc 100644 --- a/api/converter.js +++ b/api/converter.js @@ -2,7 +2,7 @@ const fs = require('fs') const axios = require('axios') const tempy = require('tempy') const ffmpeg = require('fluent-ffmpeg') -const { getVideoName } = require('./storage') +const { getVideoName, STORAGE_PATH } = require('./storage') function parseDuration (timeStr) { const [h, m, s] = timeStr.split(':').map(Number) @@ -31,6 +31,7 @@ async function processVideo (job, done) { function ffmpegCommand (tempPath, job, done) { let duration = 0 + const outputFile = getVideoName(job) async function deleteTempFile () { await fs.promises.unlink(tempPath) @@ -77,9 +78,10 @@ function ffmpegCommand (tempPath, job, done) { .on('end', async () => { await deleteTempFile() job.progress(100) - done(null, getVideoName(job)) + job.log(`[converter.js] Finished transcoding job for output file ${outputFile}`) + done(null, outputFile.replace(`${STORAGE_PATH}/`, '')) }) - .saveToFile(getVideoName(job)) + .saveToFile(outputFile) } module.exports = { processVideo, ffmpegCommand } diff --git a/api/index.js b/api/index.js index 3e69a30..25e1c75 100644 --- a/api/index.js +++ b/api/index.js @@ -1,5 +1,6 @@ require('dotenv').config() -const app = require('express')() +const express = require('express') +const app = express() const cors = require('cors') const helmet = require('helmet') const logger = require('morgan') @@ -10,6 +11,7 @@ const Queue = require('bull') const redisMetrics = require('./redisMetrics') const { processVideo } = require('./converter') const { deleteVideo } = require('./storage') +const serveIndex = require('serve-index') app.set('json spaces', 2) app.use(cors()) @@ -25,6 +27,8 @@ const videoQueue = new Queue('video transcoding', { }) videoQueue.process(processVideo) +app.use('/files', express.static(`${__dirname}/files`), serveIndex(`${__dirname}/files`, { icons: true })) + app.get('/', (req, res) => { res.json({ name: pkg.name, diff --git a/api/package-lock.json b/api/package-lock.json index 5d73f4e..664708a 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -181,6 +181,11 @@ "safe-buffer": "5.1.2" } }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, "binary-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", @@ -1822,6 +1827,38 @@ } } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", diff --git a/api/package.json b/api/package.json index 547f439..6839637 100644 --- a/api/package.json +++ b/api/package.json @@ -30,6 +30,7 @@ "morgan": "^1.10.0", "node-ffprobe": "^3.0.0", "redis-info": "^3.0.7", + "serve-index": "^1.9.1", "tempy": "^0.5.0" }, "devDependencies": { diff --git a/api/storage.js b/api/storage.js index dda5244..6e36b4e 100644 --- a/api/storage.js +++ b/api/storage.js @@ -1,10 +1,13 @@ const path = require('path') const fs = require('fs').promises +const STORAGE_PATH = './files' + function getVideoName (job, extension = '.webm') { - const name = path.basename(job.data.url) + const urlFilename = path.basename(job.data.url) const ext = path.extname(job.data.url) - return decodeURIComponent(name.replace(ext, extension)) + const outputFilename = decodeURIComponent(urlFilename.replace(ext, '')) + extension + return path.join(STORAGE_PATH, outputFilename) } function deleteVideo (job) { @@ -12,4 +15,4 @@ function deleteVideo (job) { return fs.unlink(file) } -module.exports = { getVideoName, deleteVideo } +module.exports = { STORAGE_PATH, getVideoName, deleteVideo } diff --git a/www/src/App.js b/www/src/App.js index d17ffee..f170bf7 100644 --- a/www/src/App.js +++ b/www/src/App.js @@ -3,7 +3,7 @@ import Button from './Button' import AppStyles from './AppStyles' import RedisStats from './RedisStats' import Modal from './Modal' -import { getJobs, deleteJob, cancelJob, addJob, getLogs, getMetrics } from './apiService' +import { getJobs, deleteJob, cancelJob, addJob, getLogs, getMetrics, API } from './apiService' function AddIcon ({ color = '#609' }) { return ( @@ -189,7 +189,12 @@ function App() {

Job #{job.id}

{!job.finishedOn && ()}
- + + {job.returnvalue && ( + + + + )} {job.finishedOn ? ( ) : (