summaryrefslogtreecommitdiff
path: root/lib/worker
diff options
context:
space:
mode:
Diffstat (limited to 'lib/worker')
-rw-r--r--lib/worker/index.js32
-rw-r--r--lib/worker/mimeFromExtension.js44
-rw-r--r--lib/worker/processFiles.js110
3 files changed, 186 insertions, 0 deletions
diff --git a/lib/worker/index.js b/lib/worker/index.js
new file mode 100644
index 0000000..604756b
--- /dev/null
+++ b/lib/worker/index.js
@@ -0,0 +1,32 @@
+require('dotenv').config()
+
+const ipc = require('node-ipc')
+const db = require('../db')
+const dbFile = db.crud(db.File)
+
+const processFiles = require('./processFiles')
+
+ipc.config.id = 'cortexworker'
+ipc.config.retry = 1500
+
+processFiles()
+
+ipc.connectTo('cortex', () => {
+ ipc.of.cortex.on('connect', () => {
+ ipc.log('## connected to cortex ##', ipc.config.delay);
+ // ipc.of.cortex.emit('message', 'hello')
+ })
+ ipc.of.cortex.on('disconnect', () => {
+ ipc.log('disconnected'.notice)
+ })
+ ipc.of.cortex.on('message', (data) => {
+ ipc.log('received message!'.debug, data)
+ })
+ ipc.of.cortex.on('process', (data) => {
+ ipc.log('received process: '.debug, data);
+ processFiles()
+ })
+ ipc.of.cortex.on('job', (data) => {
+ ipc.log('received job: '.debug, data);
+ })
+})
diff --git a/lib/worker/mimeFromExtension.js b/lib/worker/mimeFromExtension.js
new file mode 100644
index 0000000..1619491
--- /dev/null
+++ b/lib/worker/mimeFromExtension.js
@@ -0,0 +1,44 @@
+module.exports = function mimeFromExtension (file) {
+ const fpartz = file.split('.')
+ const ext = fpartz[fpartz.length-1]
+ let mime, type;
+ switch (ext.toLowerCase()) {
+ case 'mp3':
+ mime = 'audio/mp3'
+ type = 'audio'
+ break
+ case 'wav':
+ mime = 'audio/wav'
+ type = 'audio'
+ break
+ case 'aif':
+ case 'aiff':
+ mime = 'audio/aiff'
+ type = 'audio'
+ break
+
+ case 'jpg':
+ case 'jpeg':
+ mime = 'image/jpeg'
+ type = 'image'
+ break
+ case 'gif':
+ mime = 'image/gif'
+ type = 'image'
+ break
+ case 'png':
+ mime = 'image/png'
+ type = 'image'
+ break
+
+ case 'txt':
+ mime = 'text/plain'
+ type = 'text'
+ break
+ case 'html':
+ mime = 'text/html'
+ type = 'text'
+ break
+ }
+ return { type, mime }
+} \ No newline at end of file
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