summaryrefslogtreecommitdiff
path: root/lib/worker/processTask.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/worker/processTask.js')
-rw-r--r--lib/worker/processTask.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/lib/worker/processTask.js b/lib/worker/processTask.js
new file mode 100644
index 0000000..3c7b789
--- /dev/null
+++ b/lib/worker/processTask.js
@@ -0,0 +1,115 @@
+const ipc = require('node-ipc')
+const db = require('../db')
+const tools = require('../tools')
+const fs = require('fs')
+const path = require('path')
+const execFile = require('child_process').execFile
+const Loader = require('../vendor/Loader')
+
+let processing = false
+
+module.exports = function processTask() {
+ if (processing) return
+ processing = true
+
+ db.models.task.index({ completed: false, limit: 1 }).then( (tasks) => {
+ // console.log(tasks.length + ' tasks left to process')
+ console.log('fetching tasks...')
+ if (! tasks || tasks.length === 0) {
+ console.log('> completed all tasks!')
+ processing = false
+ return
+ }
+
+ task = tasks.at ? tasks.at(0) : tasks[0]
+ console.log('running task #', task ? task.id : '??')
+ return processTaskPromise(task)
+ }).then( () => {
+ console.log('done')
+ if (processing) {
+ processing = false
+ setTimeout( processTask )
+ }
+ })
+}
+
+function processTaskPromise(task) {
+ return new Promise ( (resolve, reject) => {
+ initTask(task)
+ .then(() => { return runTask(task) })
+ .then(() => { return processDone(task) })
+ .then(() => { return resolve() })
+ })
+}
+
+function initTask() {
+ return new Promise ( (resolve, reject) => {
+ if (task.content_file.type !== 'audio') reject()
+ if (task.style_file.type !== 'audio') reject()
+
+ constructFilePath(task.content_file)
+ constructFilePath(task.style_file)
+
+ db.models.folder.findOrCreate({ name: 'output' })
+ .then( (folder) => {
+ task.output_file = {
+ type: 'audio',
+ name: (folder.name || 'output') + '_' + Date.now() + '.aiff',
+ folder_id: folder.id,
+ processed: false,
+ }
+ constructFilePath(task.output_file)
+ resolve()
+ })
+ })
+}
+
+function checkAccess(file) {
+ return new Promise ( (resolve, reject) => {
+ fs.access(file.aiffPath, fs.constants.R_OK, (err) => {
+ if (err) reject()
+ else resolve()
+ })
+ })
+}
+
+function runTask(fullPath) {
+ return new Promise ( (resolve, reject) => {
+ console.log('running task')
+
+ console.log('create output file record...')
+ console.log(task.output_file.path)
+
+ const tool = tools[ task.tool ]
+
+ execFile(tool.cmd, [
+ tool.script_path,
+ task.content_file.path,
+ task.style_file.path,
+ task.output_file.path,
+ ], (err, stdout, stderr) => {
+ console.log(stdout, stderr)
+ db.models.file.create(task.output_file).then( file => {
+ task.output_file = file
+ task.output_file_id = file.id
+ resolve()
+ })
+ })
+ })
+}
+
+function processDone(task) {
+ task.completed = true
+ // console.log(task)
+ ipc.of.cortex && ipc.of.cortex.emit("completed", { task: task })
+ return db.models.task.update(task.id, task)
+}
+
+function constructFilePath (file) {
+ file.path = path.join(__dirname, '../..', 'public/data', String(file.folder_id), String(file.name))
+ switch (file.type) {
+ case 'audio':
+ file.aiffPath = file.mime === 'audio/aiff' ? file.path : file.path + '.aiff'
+ break
+ }
+}