mirror of
https://github.com/gabehf/Tdarr_Plugins.git
synced 2026-03-09 15:38:19 -07:00
Merge pull request #663 from HaveAGitGat/compare_live
Compare File Size Ratio Live
This commit is contained in:
commit
d9b8ce4ebb
27 changed files with 479 additions and 40 deletions
|
|
@ -128,6 +128,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
@ -181,6 +182,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli2.runCli()];
|
||||
case 2:
|
||||
|
|
|
|||
|
|
@ -383,6 +383,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -217,6 +217,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 2:
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 2:
|
||||
|
|
|
|||
|
|
@ -183,6 +183,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,138 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.plugin = exports.details = void 0;
|
||||
/* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */
|
||||
var details = function () { return ({
|
||||
name: 'Compare File Size Ratio Live',
|
||||
description: "\n Compare either the estimated final size or current output size to the input size and \n give an error if estimated final size or current size surpasses the threshold %.\n\n Works with 'FfmpegCommand', 'HandBrake Custom Arguments', 'Run Classic Transcode' and other flow plugins \n that output a file.\n\n Can be placed anywhere before a plugin which outputs a new file.\n ',\n ",
|
||||
style: {
|
||||
borderColor: 'orange',
|
||||
},
|
||||
tags: '',
|
||||
isStartPlugin: false,
|
||||
pType: '',
|
||||
requiresVersion: '2.11.01',
|
||||
sidebarPosition: -1,
|
||||
icon: 'faQuestion',
|
||||
inputs: [
|
||||
{
|
||||
label: 'Enabled',
|
||||
name: 'enabled',
|
||||
type: 'boolean',
|
||||
defaultValue: 'true',
|
||||
inputUI: {
|
||||
type: 'switch',
|
||||
},
|
||||
tooltip: "Enable or disable this plugin. For example you may want to enable it for one transcoding block and then\n disable it for another block.\n ",
|
||||
},
|
||||
{
|
||||
label: 'Compare Method',
|
||||
name: 'compareMethod',
|
||||
type: 'string',
|
||||
defaultValue: 'estimatedFinalSize',
|
||||
inputUI: {
|
||||
type: 'dropdown',
|
||||
options: [
|
||||
'estimatedFinalSize',
|
||||
'currentSize',
|
||||
],
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: "Specify the method to compare.\n Estimated Final Size: Compare the estimated final output size to the input size.\n Current Size: Compare the current output size to the input size.\n ",
|
||||
},
|
||||
{
|
||||
label: 'Threshold Size %',
|
||||
name: 'thresholdPerc',
|
||||
type: 'number',
|
||||
defaultValue: '60',
|
||||
inputUI: {
|
||||
type: 'text',
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: "Enter the threshold size percentage relative to the input size. \n An error will be triggered if the estimated or current size exceeds this percentage.\n\n For example, if the input size is 100MB and the threshold is 60%, the estimated final size or current size\n must not surpass 60MB else an error will be given and processing will stop.\n ",
|
||||
},
|
||||
{
|
||||
label: 'Check Delay (seconds)',
|
||||
name: 'checkDelaySeconds',
|
||||
type: 'number',
|
||||
defaultValue: '20',
|
||||
inputUI: {
|
||||
type: 'text',
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: "\n Specify the delay in seconds before beginning the comparison.\n A larger delay gives more time for the estimated final size to stabilize.\n ",
|
||||
},
|
||||
],
|
||||
outputs: [
|
||||
{
|
||||
number: 1,
|
||||
tooltip: 'Continue to next plugin',
|
||||
},
|
||||
],
|
||||
}); };
|
||||
exports.details = details;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
var plugin = function (args) {
|
||||
var lib = require('../../../../../methods/lib')();
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-param-reassign
|
||||
args.inputs = lib.loadDefaultValues(args.inputs, details);
|
||||
var enabled = Boolean(args.inputs.enabled);
|
||||
var compareMethod = String(args.inputs.compareMethod);
|
||||
var thresholdPerc = Number(args.inputs.thresholdPerc);
|
||||
var checkDelaySeconds = Number(args.inputs.checkDelaySeconds);
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
args.variables.liveSizeCompare = {
|
||||
enabled: enabled,
|
||||
compareMethod: compareMethod,
|
||||
thresholdPerc: thresholdPerc,
|
||||
checkDelaySeconds: checkDelaySeconds,
|
||||
};
|
||||
return {
|
||||
outputFileObj: args.inputFileObj,
|
||||
outputNumber: 1,
|
||||
variables: args.variables,
|
||||
};
|
||||
};
|
||||
exports.plugin = plugin;
|
||||
|
|
@ -153,6 +153,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 4:
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 4:
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ var details = function () { return ({
|
|||
tags: '',
|
||||
isStartPlugin: false,
|
||||
pType: '',
|
||||
requiresVersion: '2.11.01',
|
||||
requiresVersion: '2.18.01',
|
||||
sidebarPosition: -1,
|
||||
icon: 'faBell',
|
||||
inputs: [
|
||||
|
|
@ -104,6 +104,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -262,6 +262,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ var plugin = function (args) { return __awaiter(void 0, void 0, void 0, function
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args: args,
|
||||
});
|
||||
return [4 /*yield*/, cli.runCli()];
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -97,10 +97,14 @@ var CLI = /** @class */ (function () {
|
|||
this.oldProgress = 0;
|
||||
this.lastProgCheck = 0;
|
||||
this.hbPass = 0;
|
||||
this.cancelled = false;
|
||||
this.startTime = new Date().getTime();
|
||||
this.updateETA = function (perc) { return __awaiter(_this, void 0, void 0, function () {
|
||||
var n, secsSinceLastCheck, eta, sum, avg, estSize, outputFileSizeInGbytes, singleFileSize, err_1;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
var n, secsSinceLastCheck, eta, sum, avg, estSize, outputFileSizeInGbytes, singleFileSize, err_1, secondsSinceStart, _a, compareMethod, thresholdPerc_1, checkDelaySeconds, inputFileSize, inputFileSizeInGbytes_1, cancel, ratio, ratio;
|
||||
var _this = this;
|
||||
var _b;
|
||||
return __generator(this, function (_c) {
|
||||
switch (_c.label) {
|
||||
case 0:
|
||||
if (!(perc > 0)) return [3 /*break*/, 6];
|
||||
if (!(this.lastProgCheck === 0)) return [3 /*break*/, 1];
|
||||
|
|
@ -122,12 +126,12 @@ var CLI = /** @class */ (function () {
|
|||
avg = sum / this.progAVG.length;
|
||||
estSize = 0;
|
||||
outputFileSizeInGbytes = void 0;
|
||||
_a.label = 2;
|
||||
_c.label = 2;
|
||||
case 2:
|
||||
_a.trys.push([2, 4, , 5]);
|
||||
_c.trys.push([2, 4, , 5]);
|
||||
return [4 /*yield*/, (0, fileUtils_1.fileExists)(this.config.outputFilePath)];
|
||||
case 3:
|
||||
if (_a.sent()) {
|
||||
if (_c.sent()) {
|
||||
singleFileSize = fs_1.default.statSync(this.config.outputFilePath);
|
||||
// @ts-expect-error type
|
||||
singleFileSize = singleFileSize.size;
|
||||
|
|
@ -142,7 +146,7 @@ var CLI = /** @class */ (function () {
|
|||
}
|
||||
return [3 /*break*/, 5];
|
||||
case 4:
|
||||
err_1 = _a.sent();
|
||||
err_1 = _c.sent();
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(err_1);
|
||||
return [3 /*break*/, 5];
|
||||
|
|
@ -157,7 +161,41 @@ var CLI = /** @class */ (function () {
|
|||
}
|
||||
this.lastProgCheck = n;
|
||||
this.oldProgress = perc;
|
||||
_a.label = 6;
|
||||
secondsSinceStart = (new Date().getTime() - this.startTime) / 1000;
|
||||
// live size compare
|
||||
if ((_b = this.config.args.variables.liveSizeCompare) === null || _b === void 0 ? void 0 : _b.enabled) {
|
||||
_a = this.config.args.variables.liveSizeCompare, compareMethod = _a.compareMethod, thresholdPerc_1 = _a.thresholdPerc, checkDelaySeconds = _a.checkDelaySeconds;
|
||||
if (secondsSinceStart > checkDelaySeconds) {
|
||||
inputFileSize = this.config.inputFileObj.file_size;
|
||||
inputFileSizeInGbytes_1 = inputFileSize / 1024;
|
||||
cancel = function (ratio) {
|
||||
_this.config.jobLog("Input file size: ".concat(inputFileSizeInGbytes_1, "GB"));
|
||||
_this.config.jobLog("Ratio: ".concat(ratio, "%"));
|
||||
_this.config.jobLog("Ratio is greater than threshold: ".concat(thresholdPerc_1, "%, cancelling job"));
|
||||
_this.cancelled = true;
|
||||
_this.killThread();
|
||||
};
|
||||
if (compareMethod === 'estimatedFinalSize'
|
||||
&& estSize !== undefined
|
||||
&& estSize > 0) {
|
||||
ratio = (estSize / inputFileSizeInGbytes_1) * 100;
|
||||
if (ratio > thresholdPerc_1) {
|
||||
this.config.jobLog("Estimated final size: ".concat(estSize, "GB"));
|
||||
cancel(ratio);
|
||||
}
|
||||
}
|
||||
else if (compareMethod === 'currentSize'
|
||||
&& outputFileSizeInGbytes !== undefined
|
||||
&& outputFileSizeInGbytes > 0) {
|
||||
ratio = (outputFileSizeInGbytes / inputFileSizeInGbytes_1) * 100;
|
||||
if (ratio > thresholdPerc_1) {
|
||||
this.config.jobLog("Current output size: ".concat(outputFileSizeInGbytes, "GB"));
|
||||
cancel(ratio);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_c.label = 6;
|
||||
case 6: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
|
|
@ -247,8 +285,7 @@ var CLI = /** @class */ (function () {
|
|||
}
|
||||
}
|
||||
};
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
|
||||
this.killThread = function (thread) {
|
||||
this.killThread = function () {
|
||||
var killArray = [
|
||||
'SIGKILL',
|
||||
'SIGHUP',
|
||||
|
|
@ -256,14 +293,14 @@ var CLI = /** @class */ (function () {
|
|||
'SIGINT',
|
||||
];
|
||||
try {
|
||||
thread.kill();
|
||||
_this.thread.kill();
|
||||
}
|
||||
catch (err) {
|
||||
// err
|
||||
}
|
||||
killArray.forEach(function (com) {
|
||||
try {
|
||||
thread.kill(com);
|
||||
_this.thread.kill(com);
|
||||
}
|
||||
catch (err) {
|
||||
// err
|
||||
|
|
@ -271,7 +308,7 @@ var CLI = /** @class */ (function () {
|
|||
});
|
||||
};
|
||||
this.runCli = function () { return __awaiter(_this, void 0, void 0, function () {
|
||||
var childProcess, errorLogFull, thread, exitHandler, cliExitCode;
|
||||
var childProcess, errorLogFull, exitHandler, cliExitCode;
|
||||
var _this = this;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
|
|
@ -280,11 +317,11 @@ var CLI = /** @class */ (function () {
|
|||
errorLogFull = [];
|
||||
this.config.jobLog("Running ".concat(this.config.cli, " ").concat(this.config.spawnArgs.join(' ')));
|
||||
exitHandler = function () {
|
||||
if (thread) {
|
||||
if (_this.thread) {
|
||||
try {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Main thread exiting, cleaning up running CLI');
|
||||
_this.killThread(thread);
|
||||
_this.killThread();
|
||||
}
|
||||
catch (err) {
|
||||
// eslint-disable-next-line no-console
|
||||
|
|
@ -299,17 +336,17 @@ var CLI = /** @class */ (function () {
|
|||
try {
|
||||
var opts = _this.config.spawnOpts || {};
|
||||
var spawnArgs = _this.config.spawnArgs.map(function (row) { return row.trim(); }).filter(function (row) { return row !== ''; });
|
||||
thread = childProcess.spawn(_this.config.cli, spawnArgs, opts);
|
||||
thread.stdout.on('data', function (data) {
|
||||
_this.thread = childProcess.spawn(_this.config.cli, spawnArgs, opts);
|
||||
_this.thread.stdout.on('data', function (data) {
|
||||
errorLogFull.push(data.toString());
|
||||
_this.parseOutput(data);
|
||||
});
|
||||
thread.stderr.on('data', function (data) {
|
||||
_this.thread.stderr.on('data', function (data) {
|
||||
// eslint-disable-next-line no-console
|
||||
errorLogFull.push(data.toString());
|
||||
_this.parseOutput(data);
|
||||
});
|
||||
thread.on('error', function () {
|
||||
_this.thread.on('error', function () {
|
||||
// catches execution error (bad file)
|
||||
// eslint-disable-next-line no-console
|
||||
console.log("Error executing binary: ".concat(_this.config.cli));
|
||||
|
|
@ -318,7 +355,7 @@ var CLI = /** @class */ (function () {
|
|||
});
|
||||
// thread.stdout.pipe(process.stdout);
|
||||
// thread.stderr.pipe(process.stderr);
|
||||
thread.on('close', function (code) {
|
||||
_this.thread.on('close', function (code) {
|
||||
if (code !== 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log("CLI error code: ".concat(code));
|
||||
|
|
@ -338,10 +375,13 @@ var CLI = /** @class */ (function () {
|
|||
case 1:
|
||||
cliExitCode = _a.sent();
|
||||
process.removeListener('exit', exitHandler);
|
||||
thread = undefined;
|
||||
this.thread = undefined;
|
||||
if (!this.config.logFullCliOutput) {
|
||||
this.config.jobLog(errorLogFull.slice(-1000).join(''));
|
||||
}
|
||||
if (this.cancelled) {
|
||||
cliExitCode = 1;
|
||||
}
|
||||
return [2 /*return*/, {
|
||||
cliExitCode: cliExitCode,
|
||||
errorLogFull: errorLogFull,
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
@ -160,6 +161,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res2 = await cli2.runCli();
|
||||
|
|
|
|||
|
|
@ -356,6 +356,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -182,6 +182,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -187,6 +187,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,169 @@
|
|||
import {
|
||||
IpluginDetails,
|
||||
IpluginInputArgs,
|
||||
IpluginOutputArgs,
|
||||
} from '../../../../FlowHelpers/1.0.0/interfaces/interfaces';
|
||||
|
||||
/* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */
|
||||
const details = (): IpluginDetails => ({
|
||||
name: 'Compare File Size Ratio Live',
|
||||
description: `
|
||||
Compare either the estimated final size or current output size to the input size and
|
||||
give an error if estimated final size or current size surpasses the threshold %.
|
||||
|
||||
Works with 'FfmpegCommand', 'HandBrake Custom Arguments', 'Run Classic Transcode' and other flow plugins
|
||||
that output a file.
|
||||
|
||||
Can be placed anywhere before a plugin which outputs a new file.
|
||||
',
|
||||
`,
|
||||
style: {
|
||||
borderColor: 'orange',
|
||||
},
|
||||
tags: '',
|
||||
isStartPlugin: false,
|
||||
pType: '',
|
||||
requiresVersion: '2.11.01',
|
||||
sidebarPosition: -1,
|
||||
icon: 'faQuestion',
|
||||
inputs: [
|
||||
{
|
||||
label: 'Enabled',
|
||||
name: 'enabled',
|
||||
type: 'boolean',
|
||||
defaultValue: 'true',
|
||||
inputUI: {
|
||||
type: 'switch',
|
||||
},
|
||||
tooltip: `Enable or disable this plugin. For example you may want to enable it for one transcoding block and then
|
||||
disable it for another block.
|
||||
`,
|
||||
},
|
||||
{
|
||||
label: 'Compare Method',
|
||||
name: 'compareMethod',
|
||||
type: 'string',
|
||||
defaultValue: 'estimatedFinalSize',
|
||||
inputUI: {
|
||||
type: 'dropdown',
|
||||
options: [
|
||||
'estimatedFinalSize',
|
||||
'currentSize',
|
||||
],
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: `Specify the method to compare.
|
||||
Estimated Final Size: Compare the estimated final output size to the input size.
|
||||
Current Size: Compare the current output size to the input size.
|
||||
`,
|
||||
},
|
||||
{
|
||||
label: 'Threshold Size %',
|
||||
name: 'thresholdPerc',
|
||||
type: 'number',
|
||||
defaultValue: '60',
|
||||
inputUI: {
|
||||
type: 'text',
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: `Enter the threshold size percentage relative to the input size.
|
||||
An error will be triggered if the estimated or current size exceeds this percentage.
|
||||
|
||||
For example, if the input size is 100MB and the threshold is 60%, the estimated final size or current size
|
||||
must not surpass 60MB else an error will be given and processing will stop.
|
||||
`,
|
||||
},
|
||||
{
|
||||
label: 'Check Delay (seconds)',
|
||||
name: 'checkDelaySeconds',
|
||||
type: 'number',
|
||||
defaultValue: '20',
|
||||
inputUI: {
|
||||
type: 'text',
|
||||
displayConditions: {
|
||||
logic: 'AND',
|
||||
sets: [
|
||||
{
|
||||
logic: 'AND',
|
||||
inputs: [
|
||||
{
|
||||
name: 'enabled',
|
||||
value: 'true',
|
||||
condition: '===',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
tooltip: `
|
||||
Specify the delay in seconds before beginning the comparison.
|
||||
A larger delay gives more time for the estimated final size to stabilize.
|
||||
`,
|
||||
},
|
||||
],
|
||||
outputs: [
|
||||
{
|
||||
number: 1,
|
||||
tooltip: 'Continue to next plugin',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const plugin = (args: IpluginInputArgs):IpluginOutputArgs => {
|
||||
const lib = require('../../../../../methods/lib')();
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-param-reassign
|
||||
args.inputs = lib.loadDefaultValues(args.inputs, details);
|
||||
|
||||
const enabled = Boolean(args.inputs.enabled);
|
||||
const compareMethod = String(args.inputs.compareMethod);
|
||||
const thresholdPerc = Number(args.inputs.thresholdPerc);
|
||||
const checkDelaySeconds = Number(args.inputs.checkDelaySeconds);
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
args.variables.liveSizeCompare = {
|
||||
enabled,
|
||||
compareMethod,
|
||||
thresholdPerc,
|
||||
checkDelaySeconds,
|
||||
};
|
||||
|
||||
return {
|
||||
outputFileObj: args.inputFileObj,
|
||||
outputNumber: 1,
|
||||
variables: args.variables,
|
||||
};
|
||||
};
|
||||
export {
|
||||
details,
|
||||
plugin,
|
||||
};
|
||||
|
|
@ -122,6 +122,7 @@ const plugin = async (args:IpluginInputArgs):Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ const details = ():IpluginDetails => ({
|
|||
tags: '',
|
||||
isStartPlugin: false,
|
||||
pType: '',
|
||||
requiresVersion: '2.11.01',
|
||||
requiresVersion: '2.18.01',
|
||||
sidebarPosition: -1,
|
||||
icon: 'faBell',
|
||||
inputs: [
|
||||
|
|
@ -71,6 +71,7 @@ const plugin = async (args:IpluginInputArgs):Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -251,6 +251,7 @@ const plugin = async (args: IpluginInputArgs): Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ const plugin = async (args:IpluginInputArgs):Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ const plugin = async (args:IpluginInputArgs):Promise<IpluginOutputArgs> => {
|
|||
inputFileObj: args.inputFileObj,
|
||||
logFullCliOutput: args.logFullCliOutput,
|
||||
updateWorker: args.updateWorker,
|
||||
args,
|
||||
});
|
||||
|
||||
const res = await cli.runCli();
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import fs from 'fs';
|
|||
import {
|
||||
editreadyParser, ffmpegParser, getHandBrakeFps, handbrakeParser,
|
||||
} from './cliParsers';
|
||||
import { Ilog, IupdateWorker } from './interfaces/interfaces';
|
||||
import { Ilog, IpluginInputArgs, IupdateWorker } from './interfaces/interfaces';
|
||||
import { IFileObject, Istreams } from './interfaces/synced/IFileObject';
|
||||
import { fileExists } from './fileUtils';
|
||||
|
||||
|
|
@ -71,6 +71,7 @@ interface Iconfig {
|
|||
updateWorker: IupdateWorker,
|
||||
logFullCliOutput: boolean,
|
||||
inputFileObj: IFileObject,
|
||||
args: IpluginInputArgs,
|
||||
}
|
||||
|
||||
class CLI {
|
||||
|
|
@ -89,6 +90,13 @@ class CLI {
|
|||
|
||||
hbPass = 0;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
|
||||
thread: any;
|
||||
|
||||
cancelled = false;
|
||||
|
||||
startTime = new Date().getTime();
|
||||
|
||||
constructor(config: Iconfig) {
|
||||
this.config = config;
|
||||
}
|
||||
|
|
@ -156,6 +164,58 @@ class CLI {
|
|||
|
||||
this.lastProgCheck = n;
|
||||
this.oldProgress = perc;
|
||||
|
||||
const secondsSinceStart = (new Date().getTime() - this.startTime) / 1000;
|
||||
|
||||
// live size compare
|
||||
if (
|
||||
this.config.args.variables.liveSizeCompare?.enabled
|
||||
) {
|
||||
const {
|
||||
compareMethod,
|
||||
thresholdPerc,
|
||||
checkDelaySeconds,
|
||||
} = this.config.args.variables.liveSizeCompare;
|
||||
|
||||
if (secondsSinceStart > checkDelaySeconds) {
|
||||
// MB
|
||||
const inputFileSize = this.config.inputFileObj.file_size;
|
||||
const inputFileSizeInGbytes = inputFileSize / 1024;
|
||||
|
||||
const cancel = (ratio:number) => {
|
||||
this.config.jobLog(`Input file size: ${inputFileSizeInGbytes}GB`);
|
||||
this.config.jobLog(`Ratio: ${ratio}%`);
|
||||
|
||||
this.config.jobLog(`Ratio is greater than threshold: ${thresholdPerc}%, cancelling job`);
|
||||
this.cancelled = true;
|
||||
this.killThread();
|
||||
};
|
||||
|
||||
if (
|
||||
compareMethod === 'estimatedFinalSize'
|
||||
&& estSize !== undefined
|
||||
&& estSize > 0
|
||||
) {
|
||||
const ratio = (estSize / inputFileSizeInGbytes) * 100;
|
||||
|
||||
if (ratio > thresholdPerc) {
|
||||
this.config.jobLog(`Estimated final size: ${estSize}GB`);
|
||||
cancel(ratio);
|
||||
}
|
||||
} else if (
|
||||
compareMethod === 'currentSize'
|
||||
&& outputFileSizeInGbytes !== undefined
|
||||
&& outputFileSizeInGbytes > 0
|
||||
) {
|
||||
const ratio = (outputFileSizeInGbytes / inputFileSizeInGbytes) * 100;
|
||||
|
||||
if (ratio > thresholdPerc) {
|
||||
this.config.jobLog(`Current output size: ${outputFileSizeInGbytes}GB`);
|
||||
cancel(ratio);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -255,8 +315,7 @@ class CLI {
|
|||
}
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
|
||||
killThread = (thread:any): void => {
|
||||
killThread = (): void => {
|
||||
const killArray = [
|
||||
'SIGKILL',
|
||||
'SIGHUP',
|
||||
|
|
@ -265,14 +324,14 @@ class CLI {
|
|||
];
|
||||
|
||||
try {
|
||||
thread.kill();
|
||||
this.thread.kill();
|
||||
} catch (err) {
|
||||
// err
|
||||
}
|
||||
|
||||
killArray.forEach((com: string) => {
|
||||
try {
|
||||
thread.kill(com);
|
||||
this.thread.kill(com);
|
||||
} catch (err) {
|
||||
// err
|
||||
}
|
||||
|
|
@ -289,15 +348,12 @@ class CLI {
|
|||
|
||||
this.config.jobLog(`Running ${this.config.cli} ${this.config.spawnArgs.join(' ')}`);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
|
||||
let thread: any;
|
||||
|
||||
const exitHandler = () => {
|
||||
if (thread) {
|
||||
if (this.thread) {
|
||||
try {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Main thread exiting, cleaning up running CLI');
|
||||
this.killThread(thread);
|
||||
this.killThread();
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Error running cliUtils on Exit function');
|
||||
|
|
@ -309,24 +365,24 @@ class CLI {
|
|||
|
||||
process.on('exit', exitHandler);
|
||||
|
||||
const cliExitCode: number = await new Promise((resolve) => {
|
||||
let cliExitCode: number = await new Promise((resolve) => {
|
||||
try {
|
||||
const opts = this.config.spawnOpts || {};
|
||||
const spawnArgs = this.config.spawnArgs.map((row) => row.trim()).filter((row) => row !== '');
|
||||
thread = childProcess.spawn(this.config.cli, spawnArgs, opts);
|
||||
this.thread = childProcess.spawn(this.config.cli, spawnArgs, opts);
|
||||
|
||||
thread.stdout.on('data', (data: string) => {
|
||||
this.thread.stdout.on('data', (data: string) => {
|
||||
errorLogFull.push(data.toString());
|
||||
this.parseOutput(data);
|
||||
});
|
||||
|
||||
thread.stderr.on('data', (data: string) => {
|
||||
this.thread.stderr.on('data', (data: string) => {
|
||||
// eslint-disable-next-line no-console
|
||||
errorLogFull.push(data.toString());
|
||||
this.parseOutput(data);
|
||||
});
|
||||
|
||||
thread.on('error', () => {
|
||||
this.thread.on('error', () => {
|
||||
// catches execution error (bad file)
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`Error executing binary: ${this.config.cli}`);
|
||||
|
|
@ -336,7 +392,7 @@ class CLI {
|
|||
|
||||
// thread.stdout.pipe(process.stdout);
|
||||
// thread.stderr.pipe(process.stderr);
|
||||
thread.on('close', (code: number) => {
|
||||
this.thread.on('close', (code: number) => {
|
||||
if (code !== 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`CLI error code: ${code}`);
|
||||
|
|
@ -355,12 +411,16 @@ class CLI {
|
|||
|
||||
process.removeListener('exit', exitHandler);
|
||||
|
||||
thread = undefined;
|
||||
this.thread = undefined;
|
||||
|
||||
if (!this.config.logFullCliOutput) {
|
||||
this.config.jobLog(errorLogFull.slice(-1000).join(''));
|
||||
}
|
||||
|
||||
if (this.cancelled) {
|
||||
cliExitCode = 1;
|
||||
}
|
||||
|
||||
return {
|
||||
cliExitCode,
|
||||
errorLogFull,
|
||||
|
|
|
|||
|
|
@ -96,12 +96,20 @@ export interface IffmpegCommand {
|
|||
overallOuputArguments: string[],
|
||||
}
|
||||
|
||||
export interface IliveSizeCompare {
|
||||
enabled: boolean,
|
||||
compareMethod: string,
|
||||
thresholdPerc: number,
|
||||
checkDelaySeconds: number,
|
||||
}
|
||||
|
||||
export interface Ivariables {
|
||||
ffmpegCommand: IffmpegCommand,
|
||||
flowFailed: boolean,
|
||||
user: Record<string, string>,
|
||||
healthCheck?: 'Success',
|
||||
queueTags?: string,
|
||||
liveSizeCompare?: IliveSizeCompare
|
||||
}
|
||||
|
||||
export interface IpluginOutputArgs {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue