@nexrender/core 1.40.0 → 1.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/helpers/autofind.js +1 -0
- package/src/index.js +5 -1
- package/src/tasks/render.js +23 -2
- package/src/tasks/setup.js +1 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexrender/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.41.0",
|
|
4
4
|
"main": "src/index.js",
|
|
5
5
|
"author": "Inlife",
|
|
6
6
|
"scripts": {
|
|
@@ -30,5 +30,5 @@
|
|
|
30
30
|
"publishConfig": {
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "01e3428a9194eb50e40f22a66bb236c9fc70a03c"
|
|
34
34
|
}
|
package/src/helpers/autofind.js
CHANGED
|
@@ -13,6 +13,7 @@ const defaultPaths = {
|
|
|
13
13
|
'/Applications/Adobe After Effects 2020',
|
|
14
14
|
'/Applications/Adobe After Effects 2021',
|
|
15
15
|
'/Applications/Adobe After Effects 2022',
|
|
16
|
+
'/Applications/Adobe After Effects 2023',
|
|
16
17
|
'/Applications/Adobe After Effects CC 2021',
|
|
17
18
|
'/Applications/Adobe After Effects CC 2022',
|
|
18
19
|
'/Applications/Adobe After Effects CC 2023',
|
package/src/index.js
CHANGED
|
@@ -21,6 +21,8 @@ const dorender = require('./tasks/render')
|
|
|
21
21
|
const postrender = require('./tasks/actions')('postrender')
|
|
22
22
|
const cleanup = require('./tasks/cleanup')
|
|
23
23
|
|
|
24
|
+
const { create } = require('@nexrender/types/job')
|
|
25
|
+
|
|
24
26
|
/* place to register all plugins */
|
|
25
27
|
/* so they will be picked up and resolved by pkg */
|
|
26
28
|
if (process.env.NEXRENDER_REQUIRE_PLUGINS) {
|
|
@@ -103,11 +105,13 @@ const init = (settings) => {
|
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
|
|
106
|
-
const render = (
|
|
108
|
+
const render = (jobConfig, settings = {}) => {
|
|
107
109
|
if (!settings.__initialized) {
|
|
108
110
|
settings = init(settings)
|
|
109
111
|
}
|
|
110
112
|
|
|
113
|
+
/* fill default job fields */
|
|
114
|
+
const job = create(jobConfig)
|
|
111
115
|
return Promise.resolve(job)
|
|
112
116
|
.then(job => state(job, settings, setup, 'setup'))
|
|
113
117
|
.then(job => state(job, settings, predownload, 'predownload'))
|
package/src/tasks/render.js
CHANGED
|
@@ -14,6 +14,7 @@ const option = (params, name, ...values) => {
|
|
|
14
14
|
values.every(value => value !== undefined) ? params.push(name, ...values) : undefined
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
|
|
17
18
|
const seconds = (string) => string.split(':')
|
|
18
19
|
.map((e, i) => (i < 3) ? +e * Math.pow(60, 2 - i) : +e * 10e-6)
|
|
19
20
|
.reduce((acc, val) => acc + val);
|
|
@@ -117,7 +118,7 @@ module.exports = (job, settings) => {
|
|
|
117
118
|
|
|
118
119
|
// There will be multiple error messages parsed when nexrender throws an error,
|
|
119
120
|
// but we want only the first
|
|
120
|
-
if(matchError !== null && !errorSent){
|
|
121
|
+
if (matchError !== null && !errorSent) {
|
|
121
122
|
settings.logger.log(`[${job.uid}] rendering reached an error: ${matchError[1]}`);
|
|
122
123
|
if (job.hasOwnProperty('onRenderError') && typeof job['onRenderError'] == 'function') {
|
|
123
124
|
job.onRenderError(job, matchError[1]);
|
|
@@ -132,6 +133,8 @@ module.exports = (job, settings) => {
|
|
|
132
133
|
return new Promise((resolve, reject) => {
|
|
133
134
|
renderStopwatch = Date.now();
|
|
134
135
|
|
|
136
|
+
let timeoutID = 0;
|
|
137
|
+
|
|
135
138
|
if (settings.debug) {
|
|
136
139
|
settings.logger.log(`[${job.uid}] spawning aerender process: ${settings.binary} ${params.join(' ')}`);
|
|
137
140
|
}
|
|
@@ -145,7 +148,10 @@ module.exports = (job, settings) => {
|
|
|
145
148
|
// env: { PATH: path.dirname(settings.binary) },
|
|
146
149
|
});
|
|
147
150
|
|
|
148
|
-
instance.on('error', err =>
|
|
151
|
+
instance.on('error', err => {
|
|
152
|
+
clearTimeout(timeoutID);
|
|
153
|
+
return reject(new Error(`Error starting aerender process: ${err}`));
|
|
154
|
+
});
|
|
149
155
|
|
|
150
156
|
instance.stdout.on('data', (data) => {
|
|
151
157
|
output.push(parse(data.toString('utf8')));
|
|
@@ -157,6 +163,17 @@ module.exports = (job, settings) => {
|
|
|
157
163
|
(settings.verbose && settings.logger.log(data.toString('utf8')));
|
|
158
164
|
});
|
|
159
165
|
|
|
166
|
+
if (settings.maxRenderTimeout && settings.maxRenderTimeout > 0) {
|
|
167
|
+
const timeout = 1000 * settings.maxRenderTimeout;
|
|
168
|
+
timeoutID = setTimeout(
|
|
169
|
+
() => {
|
|
170
|
+
reject(new Error(`Maximum rendering time exceeded`));
|
|
171
|
+
instance.kill('SIGINT');
|
|
172
|
+
},
|
|
173
|
+
timeout
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
160
177
|
/* on finish (code 0 - success, other - error) */
|
|
161
178
|
instance.on('close', (code) => {
|
|
162
179
|
|
|
@@ -169,6 +186,7 @@ module.exports = (job, settings) => {
|
|
|
169
186
|
settings.logger.log(fs.readFileSync(logPath, 'utf8'))
|
|
170
187
|
}
|
|
171
188
|
|
|
189
|
+
clearTimeout(timeoutID);
|
|
172
190
|
return reject(new Error(outputStr || 'aerender.exe failed to render the output into the file due to an unknown reason'));
|
|
173
191
|
}
|
|
174
192
|
|
|
@@ -179,6 +197,7 @@ module.exports = (job, settings) => {
|
|
|
179
197
|
|
|
180
198
|
/* resolve job without checking if file exists, or its size for image sequences */
|
|
181
199
|
if (settings.skipRender || job.template.imageSequence || ['jpeg', 'jpg', 'png'].indexOf(outputFile) !== -1) {
|
|
200
|
+
clearTimeout(timeoutID);
|
|
182
201
|
return resolve(job)
|
|
183
202
|
}
|
|
184
203
|
|
|
@@ -205,6 +224,7 @@ module.exports = (job, settings) => {
|
|
|
205
224
|
settings.logger.log(fs.readFileSync(logPath, 'utf8'))
|
|
206
225
|
}
|
|
207
226
|
|
|
227
|
+
clearTimeout(timeoutID);
|
|
208
228
|
return reject(new Error(`Couldn't find a result file: ${outputFile}`))
|
|
209
229
|
}
|
|
210
230
|
|
|
@@ -215,6 +235,7 @@ module.exports = (job, settings) => {
|
|
|
215
235
|
settings.logger.log(`[${job.uid}] Warning: output file size is less than 1000 bytes (${stats.size} bytes), be advised that file is corrupted, or rendering is still being finished`)
|
|
216
236
|
}
|
|
217
237
|
|
|
238
|
+
clearTimeout(timeoutID);
|
|
218
239
|
resolve(job)
|
|
219
240
|
});
|
|
220
241
|
|
package/src/tasks/setup.js
CHANGED
|
@@ -3,15 +3,12 @@ const path = require('path')
|
|
|
3
3
|
const mkdirp = require('mkdirp')
|
|
4
4
|
const assert = require('assert')
|
|
5
5
|
|
|
6
|
-
const {
|
|
6
|
+
const { validate } = require('@nexrender/types/job')
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* This task creates working directory for current job
|
|
10
10
|
*/
|
|
11
11
|
module.exports = (job, settings) => {
|
|
12
|
-
/* fill default job fields */
|
|
13
|
-
job = create(job)
|
|
14
|
-
|
|
15
12
|
settings.logger.log(`[${job.uid}] setting up job...`);
|
|
16
13
|
|
|
17
14
|
try {
|