From e83408fb3cb2a7734d618d0cb55962ec85909770 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Fri, 28 Jul 2023 06:50:15 +0100 Subject: [PATCH 1/4] Add condition input --- ...arr_Plugin_00td_filter_by_file_property.js | 29 +++++++--- methods/utils.js | 57 +++++++++++++++++++ 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/Community/Tdarr_Plugin_00td_filter_by_file_property.js b/Community/Tdarr_Plugin_00td_filter_by_file_property.js index 35d5216..b0a57db 100644 --- a/Community/Tdarr_Plugin_00td_filter_by_file_property.js +++ b/Community/Tdarr_Plugin_00td_filter_by_file_property.js @@ -32,19 +32,24 @@ const details = () => ({ 'Enter a comma separated list of values to check for.', }, { - name: 'exactMatch', - type: 'boolean', - defaultValue: true, + name: 'condition', + type: 'string', + defaultValue: '==', inputUI: { type: 'dropdown', options: [ - 'false', - 'true', + '==', + '!=', + '>', + '>=', + '<', + '<=', + 'includes', + 'not includes', ], }, tooltip: - 'Specify true if the property value must be an exact match,' - + ' false if the property value must contain the value.', + 'Specify the condition to use when comparing the property value to the input value.', }, { name: 'continueIfPropertyFound', @@ -65,7 +70,7 @@ const details = () => ({ // eslint-disable-next-line no-unused-vars const plugin = (file, librarySettings, inputs, otherArguments) => { - const { strHasValue } = require('../methods/utils'); + const { conditionMet } = require('../methods/utils'); const lib = require('../methods/lib')(); // eslint-disable-next-line no-unused-vars,no-param-reassign inputs = lib.loadDefaultValues(inputs, details); @@ -86,10 +91,16 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { return response; } + // legacy + if (inputs.exactMatch === false && inputs.condition === '==') { + // eslint-disable-next-line no-param-reassign + inputs.condition = 'includes'; + } + const propertyValues = inputs.propertyValues.trim().split(','); try { - const fileContainsProperty = strHasValue(propertyValues, file[propertyName], inputs.exactMatch); + const fileContainsProperty = conditionMet(propertyValues, file[propertyName], inputs.condition); const message = `File property ${propertyName} of ${file[propertyName]}` + ` being one of ${propertyValues.join(',')} has`; diff --git a/methods/utils.js b/methods/utils.js index 11dfdc1..17f8d89 100644 --- a/methods/utils.js +++ b/methods/utils.js @@ -18,6 +18,63 @@ const strHasValue = (inputsArr, value, exactMatch) => { return contains; }; +const conditionMet = (inputsArr, value, condition) => { + for (let j = 0; j < inputsArr.length; j += 1) { + try { + switch (condition) { + case '==': + if (inputsArr[j] === String(value)) { + return true; + } + break; + case '!=': + if (inputsArr[j] !== String(value)) { + return true; + } + break; + case '>': + if (inputsArr[j] > Number(value)) { + return true; + } + break; + case '>=': + if (inputsArr[j] >= Number(value)) { + return true; + } + break; + case '<': + if (inputsArr[j] < Number(value)) { + return true; + } + break; + + case '<=': + if (inputsArr[j] <= Number(value)) { + return true; + } + break; + case 'includes': + if (String(value).includes(inputsArr[j])) { + return true; + } + break; + case 'not includes': + if (!String(value).includes(inputsArr[j])) { + return true; + } + break; + default: + } + } catch (err) { + // eslint-disable-next-line no-console + console.log(err); + } + } + + return false; +}; + module.exports = { strHasValue, + conditionMet, }; From ed9e2a72e343bd28ee827e33c258e4c5308cf03b Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Fri, 28 Jul 2023 06:56:20 +0100 Subject: [PATCH 2/4] Lint fixes --- .../Tdarr_Plugin_tsld_filter_modified_date.js | 25 ++++++++----------- .../Tdarr_Plugin_tsld_filter_modified_date.js | 12 ++++----- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Community/Tdarr_Plugin_tsld_filter_modified_date.js b/Community/Tdarr_Plugin_tsld_filter_modified_date.js index 38e5b16..6015f26 100644 --- a/Community/Tdarr_Plugin_tsld_filter_modified_date.js +++ b/Community/Tdarr_Plugin_tsld_filter_modified_date.js @@ -22,9 +22,9 @@ const details = () => ({ 365 \\nExample:\\n - 30` + 30`, }, - ] + ], }); // eslint-disable-next-line no-unused-vars @@ -36,26 +36,21 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { processFile: true, infoLog: '', }; - //response.infoLog += `Filter preventing processing. File mod time ${file.statSync.mtimeMs}`; - //response.infoLog += ` Now ${Date.now()}`; + // response.infoLog += `Filter preventing processing. File mod time ${file.statSync.mtimeMs}`; + // response.infoLog += ` Now ${Date.now()}`; const age = Date.now() - file.statSync.mtimeMs; const reqage = Number(inputs.minModifiedDaysOld) * 86400000; // response.infoLog += ` Age ${age} Require Min Age: ${reqage}`; - if (reqage < age) - { - response.infoLog += "File modified date old enough. Moving to next plugin."; - response.processFile = true; + if (reqage < age) { + response.infoLog += 'File modified date old enough. Moving to next plugin.'; + response.processFile = true; + } else { + response.infoLog += 'Skipping, file modified date not old enough'; + response.processFile = false; } - else - { - response.infoLog += "Skipping, file modified date not old enough"; - response.processFile = false; - } - return response; }; module.exports.details = details; module.exports.plugin = plugin; - diff --git a/tests/Community/Tdarr_Plugin_tsld_filter_modified_date.js b/tests/Community/Tdarr_Plugin_tsld_filter_modified_date.js index ffc6852..f6b10e6 100644 --- a/tests/Community/Tdarr_Plugin_tsld_filter_modified_date.js +++ b/tests/Community/Tdarr_Plugin_tsld_filter_modified_date.js @@ -7,7 +7,7 @@ const tests = [ file: require('../sampleData/media/sampleH264_2.json'), librarySettings: {}, inputs: { - minModifiedDaysOld: 1 + minModifiedDaysOld: 1, }, otherArguments: {}, }, @@ -21,13 +21,13 @@ const tests = [ file: require('../sampleData/media/sampleH264_1.json'), librarySettings: {}, inputs: { - minModifiedDaysOld: 9999 + minModifiedDaysOld: 9999, }, otherArguments: {}, }, output: { processFile: false, - infoLog: 'Skipping, file modified date not old enough', + infoLog: 'Skipping, file modified date not old enough', }, }, { @@ -35,7 +35,7 @@ const tests = [ file: require('../sampleData/media/sampleH264_1.json'), librarySettings: {}, inputs: { - minModifiedDaysOld: 1 + minModifiedDaysOld: 1, }, otherArguments: {}, }, @@ -49,7 +49,7 @@ const tests = [ file: require('../sampleData/media/sampleH264_1.json'), librarySettings: {}, inputs: { - minModifiedDaysOld: 9999 + minModifiedDaysOld: 9999, }, otherArguments: {}, }, @@ -60,4 +60,4 @@ const tests = [ }, ]; -run(tests); \ No newline at end of file +run(tests); From 2616e49217a24faf70153fc81a95186a9d3be29c Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Fri, 28 Jul 2023 08:07:11 +0100 Subject: [PATCH 3/4] Update tests --- ...arr_Plugin_00td_filter_by_file_property.js | 100 ++++- methods/utils.js | 57 --- ...arr_Plugin_00td_filter_by_file_property.js | 354 +++++++++++++++++- 3 files changed, 432 insertions(+), 79 deletions(-) diff --git a/Community/Tdarr_Plugin_00td_filter_by_file_property.js b/Community/Tdarr_Plugin_00td_filter_by_file_property.js index b0a57db..09416c7 100644 --- a/Community/Tdarr_Plugin_00td_filter_by_file_property.js +++ b/Community/Tdarr_Plugin_00td_filter_by_file_property.js @@ -68,9 +68,88 @@ const details = () => ({ ], }); +const conditionMet = (response, inputsArr, value, condition) => { + for (let j = 0; j < inputsArr.length; j += 1) { + try { + let v = value; + let i = inputsArr[j]; + + if ( + condition === '>' + || condition === '>=' + || condition === '<' + || condition === '<=' + + ) { + v = Number(value); + i = Number(inputsArr[j]); + } else if ( + condition === '==' + || condition === '!=' + || condition === 'includes' + || condition === 'not includes' + ) { + v = String(value); + i = String(inputsArr[j]); + } + + response.infoLog += ` Checking property value of ${v} ${condition} input value of ${i} \n`; + + switch (condition) { + case '==': + if (v === i) { + return true; + } + break; + case '!=': + if (v !== i) { + return true; + } + break; + case '>': + if (v > i) { + return true; + } + break; + case '>=': + if (v >= i) { + return true; + } + break; + case '<': + if (v < i) { + return true; + } + break; + + case '<=': + if (v <= i) { + return true; + } + break; + case 'includes': + if (v.includes(i)) { + return true; + } + break; + case 'not includes': + if (!v.includes(i)) { + return true; + } + break; + default: + } + } catch (err) { + // eslint-disable-next-line no-console + console.log(err); + } + } + + return false; +}; + // eslint-disable-next-line no-unused-vars const plugin = (file, librarySettings, inputs, otherArguments) => { - const { conditionMet } = require('../methods/utils'); const lib = require('../methods/lib')(); // eslint-disable-next-line no-unused-vars,no-param-reassign inputs = lib.loadDefaultValues(inputs, details); @@ -100,26 +179,25 @@ const plugin = (file, librarySettings, inputs, otherArguments) => { const propertyValues = inputs.propertyValues.trim().split(','); try { - const fileContainsProperty = conditionMet(propertyValues, file[propertyName], inputs.condition); - - const message = `File property ${propertyName} of ${file[propertyName]}` - + ` being one of ${propertyValues.join(',')} has`; + const isConditionMet = conditionMet(response, propertyValues, file[propertyName], inputs.condition); + response.infoLog += ` isConditionMet: ${isConditionMet} \n`; + response.infoLog += ` continueIfPropertyFound: ${inputs.continueIfPropertyFound} \n`; if (inputs.continueIfPropertyFound === true) { - if (fileContainsProperty === true) { + if (isConditionMet === true) { response.processFile = true; - response.infoLog += `${message} been found, continuing to next plugin \n`; + response.infoLog += 'Continuing to next plugin \n'; } else { response.processFile = false; - response.infoLog += `${message} not been found, breaking out of stack \n`; + response.infoLog += 'Breaking out of stack \n'; } } else if (inputs.continueIfPropertyFound === false) { - if (fileContainsProperty === true) { + if (isConditionMet === true) { response.processFile = false; - response.infoLog += `${message} been found, breaking out of stack \n`; + response.infoLog += 'Breaking out of stack \n'; } else { response.processFile = true; - response.infoLog += `${message} not been found, continuing to next plugin \n`; + response.infoLog += 'Continuing to next plugin \n'; } } } catch (err) { diff --git a/methods/utils.js b/methods/utils.js index 17f8d89..11dfdc1 100644 --- a/methods/utils.js +++ b/methods/utils.js @@ -18,63 +18,6 @@ const strHasValue = (inputsArr, value, exactMatch) => { return contains; }; -const conditionMet = (inputsArr, value, condition) => { - for (let j = 0; j < inputsArr.length; j += 1) { - try { - switch (condition) { - case '==': - if (inputsArr[j] === String(value)) { - return true; - } - break; - case '!=': - if (inputsArr[j] !== String(value)) { - return true; - } - break; - case '>': - if (inputsArr[j] > Number(value)) { - return true; - } - break; - case '>=': - if (inputsArr[j] >= Number(value)) { - return true; - } - break; - case '<': - if (inputsArr[j] < Number(value)) { - return true; - } - break; - - case '<=': - if (inputsArr[j] <= Number(value)) { - return true; - } - break; - case 'includes': - if (String(value).includes(inputsArr[j])) { - return true; - } - break; - case 'not includes': - if (!String(value).includes(inputsArr[j])) { - return true; - } - break; - default: - } - } catch (err) { - // eslint-disable-next-line no-console - console.log(err); - } - } - - return false; -}; - module.exports = { strHasValue, - conditionMet, }; diff --git a/tests/Community/Tdarr_Plugin_00td_filter_by_file_property.js b/tests/Community/Tdarr_Plugin_00td_filter_by_file_property.js index 4911788..9d318d6 100644 --- a/tests/Community/Tdarr_Plugin_00td_filter_by_file_property.js +++ b/tests/Community/Tdarr_Plugin_00td_filter_by_file_property.js @@ -12,7 +12,10 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property container of mkv being one of mkv,mp4 has been found, breaking out of stack \n', + infoLog: ' Checking property value of mkv == input value of mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', }, }, @@ -30,7 +33,10 @@ const tests = [ }, output: { processFile: true, - infoLog: 'File property container of mkv being one of avi has not been found, continuing to next plugin \n', + infoLog: ' Checking property value of mkv == input value of avi \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', }, }, @@ -48,7 +54,10 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property container of mkv being one of mkv has been found, breaking out of stack \n', + infoLog: ' Checking property value of mkv == input value of mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', }, }, @@ -66,7 +75,11 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property video_resolution of 1080p being one of 720p,1080p has been found, breaking out of stack \n', + infoLog: ' Checking property value of 1080p == input value of 720p \n' + + ' Checking property value of 1080p == input value of 1080p \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', }, }, @@ -84,7 +97,11 @@ const tests = [ }, output: { processFile: true, - infoLog: 'File property video_resolution of 1080p being one of 721p,1081p has not been found, continuing to next plugin \n', + infoLog: ' Checking property value of 1080p == input value of 721p \n' + + ' Checking property value of 1080p == input value of 1081p \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', }, }, @@ -103,7 +120,10 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property file of C:/Transcode/Source Folder/h264.mkv being one of Source Folder/h264.mkv has been found, breaking out of stack \n', + infoLog: ' Checking property value of C:/Transcode/Source Folder/h264.mkv includes input value of Source Folder/h264.mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', }, }, @@ -123,7 +143,10 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property container of mkv being one of avi has not been found, breaking out of stack \n', + infoLog: ' Checking property value of mkv == input value of avi \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: true \n' + + 'Breaking out of stack \n', }, }, @@ -141,7 +164,10 @@ const tests = [ }, output: { processFile: true, - infoLog: 'File property container of mkv being one of mkv has been found, continuing to next plugin \n', + infoLog: ' Checking property value of mkv == input value of mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: true \n' + + 'Continuing to next plugin \n', }, }, @@ -159,7 +185,10 @@ const tests = [ }, output: { processFile: true, - infoLog: 'File property container of mkv being one of mkv,mp4 has been found, continuing to next plugin \n', + infoLog: ' Checking property value of mkv == input value of mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: true \n' + + 'Continuing to next plugin \n', }, }, @@ -177,7 +206,11 @@ const tests = [ }, output: { processFile: false, - infoLog: 'File property video_resolution of 1080p being one of 721p,1081p has not been found, breaking out of stack \n', + infoLog: ' Checking property value of 1080p == input value of 721p \n' + + ' Checking property value of 1080p == input value of 1081p \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: true \n' + + 'Breaking out of stack \n', }, }, @@ -195,7 +228,306 @@ const tests = [ }, output: { processFile: true, - infoLog: 'File property file of C:/Transcode/Source Folder/h264.mkv being one of Source Folder/h264.mkv has been found, continuing to next plugin \n', + infoLog: ' Checking property value of C:/Transcode/Source Folder/h264.mkv includes input value of Source Folder/h264.mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: true \n' + + 'Continuing to next plugin \n', + }, + }, + + // check other conditions + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'mkv', + condition: '==', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of mkv == input value of mkv \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'avi', + condition: '==', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of mkv == input value of avi \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '60', + condition: '>', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of 64.9300765991211 > input value of 60 \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '70', + condition: '>', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of 64.9300765991211 > input value of 70 \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '60', + condition: '>=', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of 64.9300765991211 >= input value of 60 \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '70', + condition: '>=', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of 64.9300765991211 >= input value of 70 \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '60', + condition: '<', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of 64.9300765991211 < input value of 60 \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '70', + condition: '<', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of 64.9300765991211 < input value of 70 \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '60', + condition: '<=', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of 64.9300765991211 <= input value of 60 \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'file_size', + propertyValues: '70', + condition: '<=', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of 64.9300765991211 <= input value of 70 \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'mk', + condition: 'includes', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of mkv includes input value of mk \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'av', + condition: 'includes', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of mkv includes input value of av \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'mk', + condition: 'not includes', + + }, + otherArguments: {}, + }, + output: { + processFile: true, + infoLog: ' Checking property value of mkv not includes input value of mk \n' + + ' isConditionMet: false \n' + + ' continueIfPropertyFound: false \n' + + 'Continuing to next plugin \n', + }, + }, + + { + input: { + file: _.cloneDeep(require('../sampleData/media/sampleH264_2.json')), + librarySettings: {}, + inputs: { + propertyName: 'container', + propertyValues: 'av', + condition: 'not includes', + + }, + otherArguments: {}, + }, + output: { + processFile: false, + infoLog: ' Checking property value of mkv not includes input value of av \n' + + ' isConditionMet: true \n' + + ' continueIfPropertyFound: false \n' + + 'Breaking out of stack \n', }, }, ]; From 2583251e818e652486909322e496cb02a39c4dc8 Mon Sep 17 00:00:00 2001 From: HaveAGitGat <43864057+HaveAGitGat@users.noreply.github.com> Date: Fri, 28 Jul 2023 08:18:58 +0100 Subject: [PATCH 4/4] Add additional tooltip info --- Community/Tdarr_Plugin_00td_filter_by_file_property.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Community/Tdarr_Plugin_00td_filter_by_file_property.js b/Community/Tdarr_Plugin_00td_filter_by_file_property.js index 09416c7..e37c10a 100644 --- a/Community/Tdarr_Plugin_00td_filter_by_file_property.js +++ b/Community/Tdarr_Plugin_00td_filter_by_file_property.js @@ -49,7 +49,10 @@ const details = () => ({ ], }, tooltip: - 'Specify the condition to use when comparing the property value to the input value.', + 'Specify the condition to use when comparing the property value to the input value. \\n' + + ' The property value is on the left hand side of the comparison. For example \\n' + + ' property value includes input \\n' + + ' property value >= input \\n', }, { name: 'continueIfPropertyFound',