summaryrefslogtreecommitdiff
path: root/lib/worker/processTasks.js
blob: c60aaf5109c4b01b1096ca0a6f5a4afce13f5193 (plain)
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 }).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
  }
}