1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
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')
const processFiles = require('./processFiles')
let processing = false
module.exports = function processTasks() {
if (processing) return
processing = true
console.log('fetching tasks...')
db.models.task.index({ completed: false, limit: 1, orderBy: 'id asc', }).then( (tasks) => {
// console.log(tasks.length + ' tasks left to process')
if (! tasks || tasks.length === 0) {
console.log('> completed all tasks!')
processing = false
return
}
let task = tasks.at ? tasks.at(0) : tasks[0]
if (task) {
console.log('running task #', task.id)
return processTaskPromise(task)
}
else {
console.log('no more tasks')
return new Promise( resolve => resolve() )
}
}).then( () => {
console.log('done')
if (processing) {
processing = false
setTimeout( processFiles )
setTimeout( processTasks )
}
})
}
function processTaskPromise(task) {
return new Promise ( (resolve, reject) => {
initTask(task)
.then(() => { return runTask(task) })
.then(() => { return processDone(task) })
.then(() => { return resolve() })
})
}
function initTask(task) {
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)
task.processing = true
db.models.task.update(task.id, task).then( () => {
ipc.of.cortex && ipc.of.cortex.emit("updateTask", { task })
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,
generated: true,
}
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(task) {
return new Promise ( (resolve, reject) => {
console.log('running task')
const tool = tools[ task.tool ]
execFile(tool.cmd, [
path.join(__dirname, '../..', tool.script),
task.content_file.aiffPath,
task.style_file.aiffPath,
task.output_file.path,
], (err, stdout, stderr) => {
console.log("DONE")
console.log(err)
console.log(stdout)
console.log(stderr)
console.log('create output file record...')
console.log(task.output_file.path)
task.stdout = stdout
task.stderr = 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
task.processing = false
console.log(task)
ipc.of.cortex && ipc.of.cortex.emit("updateTask", { 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.path + '.aiff'
break
}
}
|