diff options
Diffstat (limited to 'lib/worker')
| -rw-r--r-- | lib/worker/index.js | 32 | ||||
| -rw-r--r-- | lib/worker/mimeFromExtension.js | 44 | ||||
| -rw-r--r-- | lib/worker/processFiles.js | 110 |
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 |
