diff --git a/FlowPlugins/CommunityFlowPlugins/audio/normalizeAudio/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/audio/normalizeAudio/1.0.0/index.js index bc0cf7f..a2d331a 100644 --- a/FlowPlugins/CommunityFlowPlugins/audio/normalizeAudio/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/audio/normalizeAudio/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/basic/basicVideoOrAudio/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/basic/basicVideoOrAudio/1.0.0/index.js index 95f98ed..885faa7 100644 --- a/FlowPlugins/CommunityFlowPlugins/basic/basicVideoOrAudio/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/basic/basicVideoOrAudio/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/1.0.0/index.js index d9491a5..9610ea6 100644 --- a/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/2.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/2.0.0/index.js index 3fc0541..8748219 100644 --- a/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/2.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/classic/runClassicTranscodePlugin/2.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/ffmpegCommand/ffmpegCommandExecute/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/ffmpegCommand/ffmpegCommandExecute/1.0.0/index.js index 73d3ebb..49605db 100644 --- a/FlowPlugins/CommunityFlowPlugins/ffmpegCommand/ffmpegCommandExecute/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/ffmpegCommand/ffmpegCommandExecute/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/file/compareFileSizeRatioLive/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/file/compareFileSizeRatioLive/1.0.0/index.js new file mode 100644 index 0000000..16cb1b6 --- /dev/null +++ b/FlowPlugins/CommunityFlowPlugins/file/compareFileSizeRatioLive/1.0.0/index.js @@ -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 set of transcoding tests.', + }, + { + 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; diff --git a/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/1.0.0/index.js index d1eedf8..7e72d26 100644 --- a/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/2.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/2.0.0/index.js index acdc8ac..6c396a7 100644 --- a/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/2.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/handbrake/handbrakeCustomArguments/2.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/tools/apprise/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/tools/apprise/1.0.0/index.js index 479fc4b..6bfce81 100644 --- a/FlowPlugins/CommunityFlowPlugins/tools/apprise/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/tools/apprise/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/tools/runCli/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/tools/runCli/1.0.0/index.js index ffbc93c..ac1909a 100644 --- a/FlowPlugins/CommunityFlowPlugins/tools/runCli/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/tools/runCli/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/tools/runMkvPropEdit/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/tools/runMkvPropEdit/1.0.0/index.js index 16cd806..06e74ee 100644 --- a/FlowPlugins/CommunityFlowPlugins/tools/runMkvPropEdit/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/tools/runMkvPropEdit/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/CommunityFlowPlugins/video/runHealthCheck/1.0.0/index.js b/FlowPlugins/CommunityFlowPlugins/video/runHealthCheck/1.0.0/index.js index f5c38ee..dfc2d4a 100644 --- a/FlowPlugins/CommunityFlowPlugins/video/runHealthCheck/1.0.0/index.js +++ b/FlowPlugins/CommunityFlowPlugins/video/runHealthCheck/1.0.0/index.js @@ -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: diff --git a/FlowPlugins/FlowHelpers/1.0.0/cliUtils.js b/FlowPlugins/FlowHelpers/1.0.0/cliUtils.js index 0205188..f62fa85 100644 --- a/FlowPlugins/FlowHelpers/1.0.0/cliUtils.js +++ b/FlowPlugins/FlowHelpers/1.0.0/cliUtils.js @@ -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,