diff --git a/Community/Tdarr_Plugin_00td_filter_bit_depth.js b/Community/Tdarr_Plugin_00td_filter_bit_depth.js new file mode 100644 index 0000000..b479a0f --- /dev/null +++ b/Community/Tdarr_Plugin_00td_filter_bit_depth.js @@ -0,0 +1,104 @@ +const details = () => ({ + id: 'Tdarr_Plugin_00td_filter_bit_depth', + Stage: 'Pre-processing', + Name: 'Filter bit depth: 8,10,12 bit video', + Type: 'Video', + Operation: 'Filter', + Description: 'Allow/disallow 8,10,12 bit video to be processed.', + Version: '1.00', + Tags: 'filter', + Inputs: [ + { + name: 'process8BitVideo', + type: 'boolean', + defaultValue: true, + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Set true to allow 8 bit video to be processed.', + }, + { + name: 'process10BitVideo', + type: 'boolean', + defaultValue: true, + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Set true to allow 10 bit video to be processed.', + }, + { + name: 'process12BitVideo', + type: 'boolean', + defaultValue: true, + inputUI: { + type: 'dropdown', + options: [ + 'false', + 'true', + ], + }, + tooltip: 'Set true to allow 12 bit video to be processed.', + }, + ], +}); + +// eslint-disable-next-line no-unused-vars +const plugin = (file, librarySettings, inputs, otherArguments) => { + const lib = require('../methods/lib')(); + // eslint-disable-next-line no-unused-vars,no-param-reassign + inputs = lib.loadDefaultValues(inputs, details); + const response = { + processFile: false, + infoLog: '', + }; + + // process8BitVideo + // process10BitVideo + // process12BitVideo + + const bitDepths = { + 8: 'Main', + 10: 'Main 10', + 12: 'Main 12', + }; + + let foundBitDepth = false; + Object.keys(bitDepths).forEach((bitDepth) => { + try { + const fileHasSpecifiedBitDepth = file.ffProbeData.streams + .filter((row) => row.bits_per_raw_sample === bitDepth).length > 0 + || file.ffProbeData.streams.filter((row) => row.profile === bitDepths[bitDepth]).length > 0; + + if (fileHasSpecifiedBitDepth) { + foundBitDepth = true; + response.infoLog += `File video is ${bitDepth} bit.`; + if (inputs[`process${bitDepth}BitVideo`]) { + response.processFile = true; + response.infoLog += ` ${bitDepth} bit is allowed, will process.`; + } else { + response.infoLog += ` ${bitDepth} bit is not allowed, will not process.`; + } + } + } catch (err) { + // eslint-disable-next-line no-console + console.log(err); + } + }); + + if (!foundBitDepth) { + response.infoLog += ' Unable to find file bit depth. Won\'t process.'; + } + + return response; +}; + +module.exports.details = details; +module.exports.plugin = plugin; diff --git a/tests/Community/Tdarr_Plugin_00td_filter_bit_depth.js b/tests/Community/Tdarr_Plugin_00td_filter_bit_depth.js new file mode 100644 index 0000000..c3a2bd3 --- /dev/null +++ b/tests/Community/Tdarr_Plugin_00td_filter_bit_depth.js @@ -0,0 +1,242 @@ +/* eslint max-len: 0 */ +const _ = require('lodash'); +const run = require('../helpers/run'); + +const tests = [ + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')), + librarySettings: {}, + inputs: {}, + otherArguments: {}, + }, + output: { + processFile: true, infoLog: 'File video is 8 bit. 8 bit is allowed, will process.', + }, + }, + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH265_1.json')), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 8 bit. 8 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '8'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 8 bit. 8 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '8'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: true, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: 'File video is 8 bit. 8 bit is allowed, will process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = 'Main 10'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 10 bit. 10 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = 'Main 10'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: true, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: 'File video is 10 bit. 10 bit is allowed, will process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '10'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 10 bit. 10 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '10'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: true, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: 'File video is 10 bit. 10 bit is allowed, will process.', + }, + }, + // + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = 'Main 12'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 12 bit. 12 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = 'Main 12'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: true, + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: 'File video is 12 bit. 12 bit is allowed, will process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '12'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: false, + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: 'File video is 12 bit. 12 bit is not allowed, will not process.', + }, + }, + { + input: { + file: (() => { + const file = _.cloneDeep(require('../sampleData/media/sampleH265_1.json')); + file.ffProbeData.streams[0].profile = ''; + file.ffProbeData.streams[0].bits_per_raw_sample = '12'; + return file; + })(), + librarySettings: {}, + inputs: { + process8BitVideo: false, + process10BitVideo: false, + process12BitVideo: true, + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: 'File video is 12 bit. 12 bit is allowed, will process.', + }, + }, +]; + +run(tests);