summaryrefslogtreecommitdiff
path: root/lib/worker/processFiles.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/worker/processFiles.js')
-rw-r--r--lib/worker/processFiles.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/lib/worker/processFiles.js b/lib/worker/processFiles.js
new file mode 100644
index 0000000..fd97928
--- /dev/null
+++ b/lib/worker/processFiles.js
@@ -0,0 +1,110 @@
+const db = require('../db')
+const dbFile = db.crud(db.File)
+const path = require('path')
+const ffprobe = require('node-ffprobe')
+const execFile = require('child_process').execFile
+const mimeFromExtension = require('./mimeFromExtension')
+ffprobe.FFPROBE_PATH = process.env.FFPROBE_BINARY
+
+let processing = false
+
+module.exports = function processFiles() {
+ if (processing) return
+ processing = true
+
+ dbFile.index({ processed: false }).then( (files) => {
+ console.log(files.length + ' files left to process')
+ if (files.length === 0) {
+ processing = false
+ return
+ }
+
+ file = files.at(0)
+ console.log('processing', file.get('name'))
+ const mimeType = mimeFromExtension(file.get('name'))
+ file.set('mime', mimeType.mime)
+ file.set('type', mimeType.type)
+ switch (mimeType.type) {
+ case 'audio':
+ return processAudio(file)
+ default:
+ return processDone(file)
+ }
+ }).then( () => {
+ console.log('done')
+ if (processing) {
+ processing = false
+ setTimeout( processFiles )
+ }
+ })
+}
+
+function processAudio(file) {
+ const filePath = path.join(__dirname, '../..', 'public/data', String(file.get('folder_id')))
+ // console.log(filePath)
+ const fullPath = path.join(filePath, file.get('name'))
+ console.log(fullPath)
+
+ return new Promise ( (resolve, reject) => {
+ cacheFfprobe(file, fullPath)
+ .then(() => { return processSpectrum(fullPath) })
+ .then(() => { return trimSpectrum(fullPath) })
+ .then(() => { return convertToMp3(fullPath) })
+ .then(() => { return processDone(file) })
+ .then(() => { return resolve() })
+ })
+}
+
+function processSpectrum(fullPath) {
+ return new Promise ( (resolve, reject) => {
+ console.log('process spectrum')
+ execFile(process.env.PYTHON_BINARY, ['./python/spectrum.py', fullPath], (err, stdout, stderr) => {
+ // console.log('spectrum done')
+ resolve()
+ })
+ })
+}
+function trimSpectrum(fullPath) {
+ return new Promise ( (resolve, reject) => {
+ console.log('trim spectrum')
+ const thumbPath = fullPath + '.png'
+ execFile(process.env.CONVERT_BINARY, [thumbPath, '-trim', thumbPath], (err, stdout, stderr) => {
+ // console.log('trim done')
+ resolve()
+ })
+ })
+}
+function cacheFfprobe(file, fullPath) {
+ return new Promise ( (resolve, reject) => {
+ console.log('ffprobe')
+ ffprobe(fullPath, function(err, probeData) {
+ // console.log(probeData)
+ file.set('duration', probeData.format.duration)
+ resolve()
+ })
+ })
+}
+function convertToMp3(fullPath) {
+ return new Promise ( (resolve, reject) => {
+ console.log('convert to mp3')
+ if (fullPath.match(/\.mp3$/i)) {
+ return resolve()
+ }
+ const mp3Path = fullPath + '.mp3'
+ execFile(process.env.FFMPEG_BINARY, ['-y', '-i', fullPath, '-q:a', '6', mp3Path], (err, stdout, stderr) => {
+ // console.log(stdout, stderr)
+ resolve()
+ })
+ })
+}
+
+function processImage(file) {
+ return new Promise ( (resolve, reject) => {
+ // process image?
+ resolve()
+ })
+}
+
+function processDone(file) {
+ return file.save({ processed: true })
+} \ No newline at end of file