{ "_id": "mJaHgACeP", "name": "Transcode Video", "description": "Transcode Video", "tags": "", "flowPlugins": [ { "name": "Custom Arguments ", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "-fflags +genpts -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv", "outputArguments": "" }, "fpEnabled": true, "id": "mNiWjPApd", "position": { "x": 408, "y": -540 } }, { "name": "Custom Arguments ", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "-fflags +genpts", "outputArguments": "" }, "fpEnabled": true, "id": "euDOr7lhD", "position": { "x": -120, "y": 60 } }, { "name": "Custom Arguments ", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "-fflags +genpts -init_hw_device qsv=hw -filter_hw_device hw", "outputArguments": "" }, "fpEnabled": true, "id": "_CuE72hKu", "position": { "x": 12, "y": 108 } }, { "name": "Execute", "sourceRepo": "Community", "pluginName": "ffmpegCommandExecute", "version": "1.0.0", "id": "NdLwGbfU6", "position": { "x": -1536, "y": 396 }, "fpEnabled": true }, { "name": "Set Container", "sourceRepo": "Community", "pluginName": "ffmpegCommandSetContainer", "version": "1.0.0", "id": "QZPoQx6iz", "position": { "x": -1524, "y": 288 }, "fpEnabled": true }, { "name": "Remove Data Streams", "sourceRepo": "Community", "pluginName": "ffmpegCommandRemoveDataStreams", "version": "1.0.0", "fpEnabled": true, "id": "7Mli0Vg5y", "position": { "x": -1512, "y": 192 } }, { "name": "Remove Data Streams", "sourceRepo": "Community", "pluginName": "ffmpegCommandRemoveDataStreams", "version": "1.0.0", "fpEnabled": true, "id": "70jrGfqVD", "position": { "x": -1608, "y": -324 } }, { "name": "Downscale to 1080p", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "", "outputArguments": "-vf hwupload=extra_hw_frames=64,scale_qsv=1920:-1:format=nv12" }, "fpEnabled": true, "id": "iaCL_IejN", "position": { "x": 276, "y": -192 } }, { "name": "Custom Arguments ", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "", "outputArguments": "-c:a copy " }, "fpEnabled": true, "id": "-INpu6k4A", "position": { "x": 360, "y": -840 } }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "fpEnabled": true, "id": "KPjWhP-uO", "position": { "x": -924, "y": 1764 } }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "fpEnabled": true, "id": "AtarTlMKu", "position": { "x": -360, "y": 1584 } }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "fpEnabled": true, "id": "cSRpMDsfC", "position": { "x": -636, "y": 1356 } }, { "name": "Save New Size", "sourceRepo": "Community", "pluginName": "setFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "newSizeGB", "value": "{{{args.inputFileObj.oldSize}}}" }, "fpEnabled": true, "id": "QeI90j2m2", "position": { "x": -371.90379679431317, "y": 905.5503438173446 } }, { "name": "Successful Transcode Radarr-3D not notified", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "inputsDB": { "code": "const { exec } = require('child_process');\n\nmodule.exports = async (args) => {\n // Old size (GB) from flow/user variables\n const oldSizeGB = parseFloat(\n args.variables.originalSizeGB ?? args.variables.user?.originalSizeGB\n );\n\n // New size (GB) from flow/user variables\n const newSizeGB = parseFloat(\n args.variables.newSizeGB ?? args.variables.user?.newSizeGB\n );\n\n if (isNaN(oldSizeGB) || isNaN(newSizeGB)) {\n console.error(\"Size data missing or invalid:\", {\n oldSizeGB: args.variables.originalSizeGB,\n userOriginalSizeGB: args.variables.user?.originalSizeGB,\n newSizeGB: args.variables.newSizeGB,\n userNewSizeGB: args.variables.user?.newSizeGB\n });\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Calculate % difference\n const percentChange = ((newSizeGB - oldSizeGB) / oldSizeGB) * 100;\n let changeText;\n if (percentChange.toFixed(1) === \"0.0\") {\n changeText = \"No Size Change\";\n } else if (percentChange < 0) {\n changeText = `${Math.abs(percentChange).toFixed(1)}% smaller`;\n } else {\n changeText = `${percentChange.toFixed(1)}% bigger`;\n }\n\n // Helper for human-readable size\n function formatSize(gb) {\n return gb >= 1\n ? `${gb.toFixed(2)} GB`\n : `${(gb * 1024).toFixed(1)} MB`;\n }\n\n // Compose message\n const message = `File ${args.inputFileObj.fileNameWithoutExtension} processed, but Radarr-3D was not notified. Old size: ${formatSize(oldSizeGB)} → New size: ${formatSize(newSizeGB)} (${changeText})`;\n\n // Get webhook from global variables\n const webhookUrl = args.userVariables.global.DISCORD_WEBHOOK;\n if (!webhookUrl) {\n console.error('Discord webhook URL not found in global user variables.');\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Escape quotes in message for shell safety\n const cmd = `apprise -vv -t \"Processed Successfully\" -b \"${message.replace(/\"/g, '\\\\\"')}\" \"${webhookUrl}\"`;\n\n return new Promise((resolve) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n console.error('Apprise error:', stderr || error);\n } else {\n console.log('Apprise output:', stdout);\n }\n resolve({\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n });\n });\n });\n};\n" }, "fpEnabled": true, "id": "rxdus8CVN", "position": { "x": -948, "y": 1848 } }, { "name": "Apply Radarr-3D naming policy", "sourceRepo": "Community", "pluginName": "applyRadarrOrSonarrNamingPolicy", "version": "1.0.0", "inputsDB": { "arr": "radarr", "arr_host": "http://radarr-3d:7878", "arr_api_key": "{{{args.userVariables.global.RADARR3D}}}" }, "fpEnabled": true, "id": "ueBbYS4wk", "position": { "x": -1043.2662847573854, "y": 1960.5966783880078 } }, { "name": "Notify Radarr-3D", "sourceRepo": "Community", "pluginName": "notifyRadarrOrSonarr", "version": "2.0.0", "inputsDB": { "arr_host": "http://radarr-3d:7878", "arr_api_key": "{{{args.userVariables.global.RADARR3D}}}" }, "fpEnabled": true, "id": "inDRdMhUJ", "position": { "x": -1080, "y": 1752 } }, { "name": "Is it a 3D Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "3D Movies" }, "fpEnabled": true, "id": "75NHA0fhp", "position": { "x": -1077.8205116292272, "y": 1611.1306216903079 } }, { "name": "Custom Arguments", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "", "outputArguments": "-c:v hevc_qsv -vf hwupload=extra_hw_frames=64,scale_qsv=1920:960:format=nv12" }, "fpEnabled": true, "id": "umnL3dtz5", "position": { "x": 408, "y": -432 } }, { "name": "Is it a 3D Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "3D Movies" }, "fpEnabled": true, "id": "Qwb8WDxVM", "position": { "x": 456, "y": -684 } }, { "name": "Is it a 3D Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "3D Movies" }, "fpEnabled": true, "id": "DfBPp6TuP", "position": { "x": -783.8205116292272, "y": 345.13062169030786 } }, { "name": "Successful Transcode Whisparr-V3 not notified", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "inputsDB": { "code": "const { exec } = require('child_process');\n\nmodule.exports = async (args) => {\n // Old size (GB) from flow/user variables\n const oldSizeGB = parseFloat(\n args.variables.originalSizeGB ?? args.variables.user?.originalSizeGB\n );\n\n // New size (GB) from flow/user variables\n const newSizeGB = parseFloat(\n args.variables.newSizeGB ?? args.variables.user?.newSizeGB\n );\n\n if (isNaN(oldSizeGB) || isNaN(newSizeGB)) {\n console.error(\"Size data missing or invalid:\", {\n oldSizeGB: args.variables.originalSizeGB,\n userOriginalSizeGB: args.variables.user?.originalSizeGB,\n newSizeGB: args.variables.newSizeGB,\n userNewSizeGB: args.variables.user?.newSizeGB\n });\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Calculate % difference\n const percentChange = ((newSizeGB - oldSizeGB) / oldSizeGB) * 100;\n let changeText;\n if (percentChange.toFixed(1) === \"0.0\") {\n changeText = \"No Size Change\";\n } else if (percentChange < 0) {\n changeText = `${Math.abs(percentChange).toFixed(1)}% smaller`;\n } else {\n changeText = `${percentChange.toFixed(1)}% bigger`;\n }\n\n // Helper for human-readable size\n function formatSize(gb) {\n return gb >= 1\n ? `${gb.toFixed(2)} GB`\n : `${(gb * 1024).toFixed(1)} MB`;\n }\n\n // Compose message\n const message = `File ${args.inputFileObj.fileNameWithoutExtension} processed, but Whisparr-V3 was not notified. Old size: ${formatSize(oldSizeGB)} → New size: ${formatSize(newSizeGB)} (${changeText})`;\n\n // Get webhook from global variables\n const webhookUrl = args.userVariables.global.DISCORD_WEBHOOK;\n if (!webhookUrl) {\n console.error('Discord webhook URL not found in global user variables.');\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Escape quotes in message for shell safety\n const cmd = `apprise -vv -t \"Processed Successfully\" -b \"${message.replace(/\"/g, '\\\\\"')}\" \"${webhookUrl}\"`;\n\n return new Promise((resolve) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n console.error('Apprise error:', stderr || error);\n } else {\n console.log('Apprise output:', stdout);\n }\n resolve({\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n });\n });\n });\n};\n" }, "fpEnabled": true, "id": "uKmVO9y-k", "position": { "x": -96, "y": 1716 } }, { "name": "Successful Transcode Sonarr not notified", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "inputsDB": { "code": "const { exec } = require('child_process');\n\nmodule.exports = async (args) => {\n // Old size (GB) from flow/user variables\n const oldSizeGB = parseFloat(\n args.variables.originalSizeGB ?? args.variables.user?.originalSizeGB\n );\n\n // New size (GB) from flow/user variables\n const newSizeGB = parseFloat(\n args.variables.newSizeGB ?? args.variables.user?.newSizeGB\n );\n\n if (isNaN(oldSizeGB) || isNaN(newSizeGB)) {\n console.error(\"Size data missing or invalid:\", {\n oldSizeGB: args.variables.originalSizeGB,\n userOriginalSizeGB: args.variables.user?.originalSizeGB,\n newSizeGB: args.variables.newSizeGB,\n userNewSizeGB: args.variables.user?.newSizeGB\n });\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Calculate % difference\n const percentChange = ((newSizeGB - oldSizeGB) / oldSizeGB) * 100;\n let changeText;\n if (percentChange.toFixed(1) === \"0.0\") {\n changeText = \"No Size Change\";\n } else if (percentChange < 0) {\n changeText = `${Math.abs(percentChange).toFixed(1)}% smaller`;\n } else {\n changeText = `${percentChange.toFixed(1)}% bigger`;\n }\n\n // Helper for human-readable size\n function formatSize(gb) {\n return gb >= 1\n ? `${gb.toFixed(2)} GB`\n : `${(gb * 1024).toFixed(1)} MB`;\n }\n\n // Compose message\n const message = `File ${args.inputFileObj.fileNameWithoutExtension} processed, but Sonarr was not notified. Old size: ${formatSize(oldSizeGB)} → New size: ${formatSize(newSizeGB)} (${changeText})`;\n\n // Get webhook from global variables\n const webhookUrl = args.userVariables.global.DISCORD_WEBHOOK;\n if (!webhookUrl) {\n console.error('Discord webhook URL not found in global user variables.');\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Escape quotes in message for shell safety\n const cmd = `apprise -vv -t \"Processed Successfully\" -b \"${message.replace(/\"/g, '\\\\\"')}\" \"${webhookUrl}\"`;\n\n return new Promise((resolve) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n console.error('Apprise error:', stderr || error);\n } else {\n console.log('Apprise output:', stdout);\n }\n resolve({\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n });\n });\n });\n};\n" }, "fpEnabled": true, "id": "qwhBJNaZ-", "position": { "x": -304.1072058992422, "y": 1404.0831093705938 } }, { "name": "Successful Transcode Radarr not notified", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "inputsDB": { "code": "const { exec } = require('child_process');\n\nmodule.exports = async (args) => {\n // Old size (GB) from flow/user variables\n const oldSizeGB = parseFloat(\n args.variables.originalSizeGB ?? args.variables.user?.originalSizeGB\n );\n\n // New size (GB) from flow/user variables\n const newSizeGB = parseFloat(\n args.variables.newSizeGB ?? args.variables.user?.newSizeGB\n );\n\n if (isNaN(oldSizeGB) || isNaN(newSizeGB)) {\n console.error(\"Size data missing or invalid:\", {\n oldSizeGB: args.variables.originalSizeGB,\n userOriginalSizeGB: args.variables.user?.originalSizeGB,\n newSizeGB: args.variables.newSizeGB,\n userNewSizeGB: args.variables.user?.newSizeGB\n });\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Calculate % difference\n const percentChange = ((newSizeGB - oldSizeGB) / oldSizeGB) * 100;\n let changeText;\n if (percentChange.toFixed(1) === \"0.0\") {\n changeText = \"No Size Change\";\n } else if (percentChange < 0) {\n changeText = `${Math.abs(percentChange).toFixed(1)}% smaller`;\n } else {\n changeText = `${percentChange.toFixed(1)}% bigger`;\n }\n\n // Helper for human-readable size\n function formatSize(gb) {\n return gb >= 1\n ? `${gb.toFixed(2)} GB`\n : `${(gb * 1024).toFixed(1)} MB`;\n }\n\n // Compose message\n const message = `File ${args.inputFileObj.fileNameWithoutExtension} processed, but Radarr was not notified. Old size: ${formatSize(oldSizeGB)} → New size: ${formatSize(newSizeGB)} (${changeText})`;\n\n // Get webhook from global variables\n const webhookUrl = args.userVariables.global.DISCORD_WEBHOOK;\n if (!webhookUrl) {\n console.error('Discord webhook URL not found in global user variables.');\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Escape quotes in message for shell safety\n const cmd = `apprise -vv -t \"Processed Successfully\" -b \"${message.replace(/\"/g, '\\\\\"')}\" \"${webhookUrl}\"`;\n\n return new Promise((resolve) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n console.error('Apprise error:', stderr || error);\n } else {\n console.log('Apprise output:', stdout);\n }\n resolve({\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n });\n });\n });\n};\n" }, "fpEnabled": true, "id": "QqA4-3GM7", "position": { "x": -131.10720589924222, "y": 1247.0831093705938 } }, { "name": "Apply Radarr naming policy", "sourceRepo": "Community", "pluginName": "applyRadarrOrSonarrNamingPolicy", "version": "1.0.0", "inputsDB": { "arr": "radarr", "arr_host": "http://radarr:7878", "arr_api_key": "{{{args.userVariables.global.RADARR}}}" }, "fpEnabled": true, "id": "phpdAalRh", "position": { "x": -525.2662847573854, "y": 1318.9812487005074 } }, { "name": "Set HVEC Software Decode", "sourceRepo": "Community", "pluginName": "ffmpegCommandSetVideoEncoder", "version": "1.0.0", "inputsDB": { "hardwareType": "qsv", "forceEncoding": "false", "ffmpegPreset": "fast", "ffmpegQuality": "22", "hardwareDecoding": "false" }, "fpEnabled": true, "id": "2WU8tgfMA", "position": { "x": -118.22411255941807, "y": 154.1469834068858 } }, { "name": "Check Video Codec", "sourceRepo": "Community", "pluginName": "checkVideoCodec", "version": "1.0.0", "inputsDB": { "codec": "av1" }, "fpEnabled": true, "id": "EN7ztE59v", "position": { "x": -69.4101663739799, "y": -59.054338022613166 } }, { "name": "Notify Whisparr", "sourceRepo": "Community", "pluginName": "notifyRadarrOrSonarr", "version": "2.0.0", "inputsDB": { "arr_api_key": "{{{args.userVariables.global.WHISPARR_V3}}}", "arr_host": "http://whisparr:6969" }, "fpEnabled": true, "id": "ij3d4eqWN", "position": { "x": -905.2662847573854, "y": 1508.9812487005074 } }, { "name": "Notify Sonarr", "sourceRepo": "Community", "pluginName": "notifyRadarrOrSonarr", "version": "2.0.0", "inputsDB": { "arr": "sonarr", "arr_host": "http://sonarr:8989", "arr_api_key": "{{{args.userVariables.global.SONARR}}}" }, "fpEnabled": true, "id": "NF6Rd-iA1", "position": { "x": -843.2662847573854, "y": 1362.9812487005074 } }, { "name": "Apply Whisparr naming policy", "sourceRepo": "Community", "pluginName": "applyRadarrOrSonarrNamingPolicy", "version": "1.0.0", "inputsDB": { "arr_api_key": "{{{args.userVariables.global.WHISPARR_V3}}}", "arr_host": "http://whisparr:6969" }, "fpEnabled": true, "id": "ASB6zPsBQ", "position": { "x": -717.2662847573854, "y": 1554.9812487005074 } }, { "name": "Apply Sonarr naming policy", "sourceRepo": "Community", "pluginName": "applyRadarrOrSonarrNamingPolicy", "version": "1.0.0", "inputsDB": { "arr": "sonarr", "arr_host": "http://sonarr:8989", "arr_api_key": "{{{args.userVariables.global.SONARR}}}" }, "fpEnabled": true, "id": "UliuIfTUY", "position": { "x": -612, "y": 1488 } }, { "name": "Is it an Adult Scene?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "XXX Scenes" }, "fpEnabled": true, "id": "xc1iOQh9n", "position": { "x": -1093.8205116292272, "y": 1534.620209092651 } }, { "name": "Is it an Adult Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "XXX Movies" }, "fpEnabled": true, "id": "itXg7sd7X", "position": { "x": -1118.870620367164, "y": 1451.8147690678322 } }, { "name": "Is it a Kids Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Kids TV" }, "fpEnabled": true, "id": "u6PfbYK5Y", "position": { "x": -1142.4818822071097, "y": 1364.5327051999202 } }, { "name": "Is it an Anime Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Anime" }, "fpEnabled": true, "id": "_PXYtgZaq", "position": { "x": -1163.4246529836269, "y": 1283.2999514807739 } }, { "name": "Is it a TV Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "TV Shows" }, "fpEnabled": true, "id": "GVrt9zhwP", "position": { "x": -1188.2688034626121, "y": 1196.0671977616273 } }, { "name": "Is it Live on Stage?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Live on Stage" }, "fpEnabled": true, "id": "ljyqu47Vh", "position": { "x": -1216.7184727514707, "y": 1120.785133893715 } }, { "name": "Is it a Bootleg Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Bootlegs" }, "fpEnabled": true, "id": "breB23d-R", "position": { "x": -1243.562623230456, "y": 1029.6016903233344 } }, { "name": "Is it an Anime Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Anime Movies" }, "fpEnabled": true, "id": "fxW7qLVZQ", "position": { "x": -1270.4067737094415, "y": 960.2703163066565 } }, { "name": "Is it a Non English or Spanish Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Foreign Films" }, "fpEnabled": true, "id": "Zn_rXEN6Z", "position": { "x": -1293.3495444859584, "y": 875.2348031825736 } }, { "name": "Is it a Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Movies" }, "fpEnabled": true, "id": "RrfndsA8F", "position": { "x": -1311.751899013755, "y": 781.7554987195981 } }, { "name": "Original Audio, English, and Spanish (radarr)", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng", "user_langs": "spa", "priority": "radarr", "sonarr_api_key": "", "sonarr_url": "192.168.0.37:8989", "api_key": "{{{args.userVariables.global.TMDB}}}", "radarr_api_key": "{{{args.userVariables.global.RADARR}}}", "radarr_url": "192.168.0.37:7878" }, "fpEnabled": true, "id": "Z_IQXytAo", "position": { "x": -1071.4027684006849, "y": 546.1686597178235 } }, { "name": "Is it an Adult Scene?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "XXX Scenes" }, "fpEnabled": true, "id": "iAku19f-E", "position": { "x": -857.8205116292272, "y": 269.13062169030786 } }, { "name": "Is it an Adult Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "XXX Movies" }, "fpEnabled": true, "id": "TT0hrZqNx", "position": { "x": -882.8706203671641, "y": 159.0469590092389 } }, { "name": "Is it a Kids Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Kids TV" }, "fpEnabled": true, "id": "uImSjvBPt", "position": { "x": -908.4818822071097, "y": 53.48021496554543 } }, { "name": "Is it an Anime Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Anime" }, "fpEnabled": true, "id": "hWWduaXxj", "position": { "x": -935.4246529836269, "y": -41.7525387536009 } }, { "name": "Is it a TV Show?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "TV Shows" }, "fpEnabled": true, "id": "tl-ZH6rIJ", "position": { "x": -958.2688034626121, "y": -140.98529247274735 } }, { "name": "Is it Live on Stage?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Live on Stage" }, "fpEnabled": true, "id": "GAP8-LI1_", "position": { "x": -984.7184727514707, "y": -210.2673563406596 } }, { "name": "Is it a Bootleg Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Bootlegs" }, "fpEnabled": true, "id": "sFwltcPmM", "position": { "x": -1013.562623230456, "y": -315.4507999110401 } }, { "name": "Is it an Anime Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Anime Movies" }, "fpEnabled": true, "id": "arRSldmHM", "position": { "x": -1044, "y": -408 } }, { "name": "Is it a Non English or Spanish Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Foreign Films" }, "fpEnabled": true, "id": "-k0iilQE1", "position": { "x": -1097.3495444859584, "y": -519.8176870518012 } }, { "name": "Input File", "sourceRepo": "Community", "pluginName": "inputFile", "version": "1.0.0", "fpEnabled": true, "id": "Mc5PmBxBL", "position": { "x": -866.6393321932699, "y": -997.6077121438432 } }, { "name": "Check File Medium", "sourceRepo": "Community", "pluginName": "checkFileMedium", "version": "1.0.0", "fpEnabled": true, "id": "2srjzGNd9", "position": { "x": -856.6062846316244, "y": -704.4053453149247 } }, { "name": "Apprise", "sourceRepo": "Community", "pluginName": "apprise", "version": "1.0.0", "inputsDB": { "command": "-vv -t \"Not Audio/Video\" -b \"File {{{args.inputFileObj._id}}} is not recognized as an Audio or Video file.\" {{{args.userVariables.global.DISCORD_WEBHOOK}}}" }, "fpEnabled": true, "id": "PlWI5vazs", "position": { "x": -668.0086062920312, "y": -542.4339599266661 } }, { "name": "Fail Flow", "sourceRepo": "Community", "pluginName": "failFlow", "version": "1.0.0", "fpEnabled": true, "id": "zAfrWL_3L", "position": { "x": -668.5086062920312, "y": -451.93395992666615 } }, { "name": "Go To Flow", "sourceRepo": "Community", "pluginName": "goToFlow", "version": "2.0.0", "inputsDB": { "flowId": "dlMesRSgV", "pluginId": " iunvKS4NQ" }, "fpEnabled": true, "id": "A-sN8P922", "position": { "x": -859.0005080359464, "y": -570.1084901855957 } }, { "name": "Check Skiplist", "sourceRepo": "Community", "pluginName": "processedCheck", "version": "1.0.0", "inputsDB": { "checkType": "fileHash" }, "fpEnabled": true, "id": "QWisX2YAN", "position": { "x": -866.0803254511329, "y": -911.902812819098 } }, { "name": "Is it a Movie?", "sourceRepo": "Community", "pluginName": "checkFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "args.librarySettings.name", "value": "Movies" }, "fpEnabled": true, "id": "3guCCsb0G", "position": { "x": -1157.8978340723486, "y": -589.2969915147767 } }, { "name": "English and Spanish", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_MC93_Migz3CleanAudio", "language": "eng,spa,und" }, "fpEnabled": true, "id": "EQfrNr7JA", "position": { "x": -1180.821253019104, "y": 450.0822187743156 } }, { "name": "Original Language, English, and Spanish (sonarr)", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng", "user_langs": "spa,jpn", "priority": "sonarr", "sonarr_api_key": "{{{args.userVariables.global.SONARR}}}", "sonarr_url": "192.168.0.37:8989", "api_key": "{{{args.userVariables.global.TMDB}}}", "radarr_url": "" }, "fpEnabled": true, "id": "gYahuZMfZ", "position": { "x": -984, "y": 672 } }, { "name": "English, Spanish Subs ONLY", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_MC93_Migz4CleanSubs", "language": "eng,spa" }, "fpEnabled": true, "id": "0vN0CbwNi", "position": { "x": 60, "y": -1116 } }, { "name": "Check Video Resolution", "sourceRepo": "Community", "pluginName": "checkVideoResolution", "version": "1.0.0", "fpEnabled": true, "id": "XzcD9ksuC", "position": { "x": 42.73371524261461, "y": -482.8161891399741 } }, { "name": "Check Video Codec", "sourceRepo": "Community", "pluginName": "checkVideoCodec", "version": "1.0.0", "fpEnabled": true, "id": "-7J8xXZrv", "position": { "x": -177.2662847573854, "y": -204.81618913997409 } }, { "name": "Check HDR Video", "sourceRepo": "Community", "pluginName": "checkHdr", "version": "1.0.0", "fpEnabled": true, "id": "Q5jG1l-YI", "position": { "x": 278.7337152426146, "y": -20.816189139974085 } }, { "name": "Check File Extension", "sourceRepo": "Community", "pluginName": "checkFileExtension", "version": "1.0.0", "inputsDB": { "extensions": "mkv" }, "fpEnabled": true, "id": "N6i5771rz", "position": { "x": -269.2662847573854, "y": 398.7934864581705 } }, { "name": "Begin Command", "sourceRepo": "Community", "pluginName": "ffmpegCommandStart", "version": "1.0.0", "fpEnabled": true, "id": "8i_C-2RL_", "position": { "x": 60, "y": -876 } }, { "name": "Remove Data Streams", "sourceRepo": "Community", "pluginName": "ffmpegCommandRemoveDataStreams", "version": "1.0.0", "fpEnabled": true, "id": "nq04iI5JY", "position": { "x": 60, "y": -792 } }, { "name": "Reorder Streams", "sourceRepo": "Community", "pluginName": "ffmpegCommandRorderStreams", "version": "1.0.0", "inputsDB": { "languages": "eng,spa,fra,jpn,heb,swe,myn,ita,kor,und" }, "fpEnabled": true, "id": "QfJ9R-QdQ", "position": { "x": 60, "y": -708 } }, { "name": "Set Container", "sourceRepo": "Community", "pluginName": "ffmpegCommandSetContainer", "version": "1.0.0", "fpEnabled": true, "id": "_4s4NaW0v", "position": { "x": -27.266284757385392, "y": 530.8203804432966 } }, { "name": "HDR to SDR", "sourceRepo": "Community", "pluginName": "ffmpegCommandHdrToSdr", "version": "1.0.0", "fpEnabled": true, "id": "uR0ws0Ta3", "position": { "x": 254.7337152426146, "y": 120.43005604144105 } }, { "name": "Set HVEC Hardware Decode", "sourceRepo": "Community", "pluginName": "ffmpegCommandSetVideoEncoder", "version": "1.0.0", "inputsDB": { "hardwareType": "qsv", "forceEncoding": "false", "ffmpegPreset": "fast", "ffmpegQuality": "22" }, "fpEnabled": true, "id": "Senk6m0Zn", "position": { "x": -0.5912587534866134, "y": 270.4846318270458 } }, { "name": "Custom Arguments (convert Audio to AAC)", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "inputsDB": { "inputArguments": "", "outputArguments": "-c:a aac" }, "fpEnabled": true, "id": "iZmkg2JIs", "position": { "x": 576, "y": -852 } }, { "name": "Execute", "sourceRepo": "Community", "pluginName": "ffmpegCommandExecute", "version": "1.0.0", "fpEnabled": true, "id": "no1PzoAbZ", "position": { "x": -243.2662847573854, "y": 832.279246747383 } }, { "name": "Notify Radarr ", "sourceRepo": "Community", "pluginName": "notifyRadarrOrSonarr", "version": "2.0.0", "inputsDB": { "arr_host": "http://radarr:7878", "arr_api_key": "{{{args.userVariables.global.RADARR}}}" }, "fpEnabled": true, "id": "VghUJu1wR", "position": { "x": -747.2662847573854, "y": 1194.7564928411325 } }, { "name": "Replace Original File", "sourceRepo": "Community", "pluginName": "replaceOriginalFile", "version": "1.0.0", "fpEnabled": true, "id": "l9t4_PNCo", "position": { "x": -385.2662847573854, "y": 968.7564928411325 } }, { "name": "Add To Skiplist", "sourceRepo": "Community", "pluginName": "processedAdd", "version": "1.0.0", "inputsDB": { "checkType": "fileHash" }, "fpEnabled": true, "id": "ZguXxh1GN", "position": { "x": -444, "y": 1872 } }, { "name": "Successful Transcode Notification", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "inputsDB": { "code": "const { exec } = require('child_process');\n\nmodule.exports = async (args) => {\n // Old size (GB) from flow/user variables\n const oldSizeGB = parseFloat(\n args.variables.originalSizeGB ?? args.variables.user?.originalSizeGB\n );\n\n // New size (GB) from flow/user variables\n const newSizeGB = parseFloat(\n args.variables.newSizeGB ?? args.variables.user?.newSizeGB\n );\n\n if (isNaN(oldSizeGB) || isNaN(newSizeGB)) {\n console.error(\"Size data missing or invalid:\", {\n oldSizeGB: args.variables.originalSizeGB,\n userOriginalSizeGB: args.variables.user?.originalSizeGB,\n newSizeGB: args.variables.newSizeGB,\n userNewSizeGB: args.variables.user?.newSizeGB\n });\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Calculate % difference\n const percentChange = ((newSizeGB - oldSizeGB) / oldSizeGB) * 100;\n let changeText;\n if (percentChange.toFixed(1) === \"0.0\") {\n changeText = \"No Size Change\";\n } else if (percentChange < 0) {\n changeText = `${Math.abs(percentChange).toFixed(1)}% smaller`;\n } else {\n changeText = `${percentChange.toFixed(1)}% bigger`;\n }\n\n // Helper for human-readable size\n function formatSize(gb) {\n return gb >= 1\n ? `${gb.toFixed(2)} GB`\n : `${(gb * 1024).toFixed(1)} MB`;\n }\n\n // Compose message\n const message = `File ${args.inputFileObj.fileNameWithoutExtension} processed. Old size: ${formatSize(oldSizeGB)} → New size: ${formatSize(newSizeGB)} (${changeText})`;\n\n // Get webhook from global variables\n const webhookUrl = args.userVariables.global.DISCORD_WEBHOOK;\n if (!webhookUrl) {\n console.error('Discord webhook URL not found in global user variables.');\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Escape quotes in message for shell safety\n const cmd = `apprise -vv -t \"Processed Successfully\" -b \"${message.replace(/\"/g, '\\\\\"')}\" \"${webhookUrl}\"`;\n\n return new Promise((resolve) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n console.error('Apprise error:', stderr || error);\n } else {\n console.log('Apprise output:', stdout);\n }\n resolve({\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n });\n });\n });\n};\n" }, "fpEnabled": true, "id": "qQoyC6L-r", "position": { "x": -471.1072058992422, "y": 1714.0831093705938 } }, { "name": "Run Classic Transcode Plugin", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_MC93_MigzImageRemoval" }, "fpEnabled": true, "id": "oElfDYblg", "position": { "x": 60, "y": -996 } }, { "name": "Save Old Size", "sourceRepo": "Community", "pluginName": "setFlowVariable", "version": "1.0.0", "inputsDB": { "variable": "originalSizeGB", "value": "{{{args.inputFileObj.oldSize}}}" }, "fpEnabled": true, "id": "WrYPlH7kf", "position": { "x": -1188, "y": -720 } }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "fpEnabled": true, "id": "wDUc2MLMI", "position": { "x": -576, "y": 1200 } }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "fpEnabled": true, "id": "Rp42ahv0U", "position": { "x": -204, "y": 1920 } }, { "name": "Begin Command", "sourceRepo": "Community", "pluginName": "ffmpegCommandStart", "version": "1.0.0", "id": "w5JKDYmwt", "position": { "x": -1608, "y": -492 }, "fpEnabled": true }, { "name": "Custom Arguments", "sourceRepo": "Community", "pluginName": "ffmpegCommandCustomArguments", "version": "1.0.0", "id": "rfYiPPliH", "position": { "x": -1608, "y": -408 }, "fpEnabled": true, "inputsDB": { "outputArguments": "-c:v copy -c:a copy -c:s srt" } }, { "name": "Execute", "sourceRepo": "Community", "pluginName": "ffmpegCommandExecute", "version": "1.0.0", "id": "M6P6vnyRg", "position": { "x": -1608, "y": -144 }, "fpEnabled": true }, { "name": "Filter Webvtt and Mov_Text subtitles", "sourceRepo": "Community", "pluginName": "customFunction", "version": "1.0.0", "id": "8geIUC4mK", "position": { "x": -1560, "y": -696 }, "fpEnabled": true, "inputsDB": { "code": "// Tdarr Custom JS Function v1.0.7 (Minimal Problem Filter)\n// Output 1 -> file CONTAINS mov_text or webvtt (Needs processing)\n// Output 2 -> file does NOT contain target formats (Skip processing)\n\nmodule.exports = function (args) {\n const file = args.inputFileObj;\n // ONLY define the codecs that require conversion\n const TARGET_CODECS_REGEX = /(movtext|tx3g|webvtt|vtt)/; \n\n if (!file) {\n console.log(\"[FilterSubs] No file object provided, skipping.\");\n return { outputFileObj: args.inputFileObj, outputNumber: 2, variables: args.variables };\n }\n\n // --- 1. Robust Stream Collection (Same as before) ---\n const ffprobeStreams = file.ffProbeData && file.ffProbeData.streams;\n const mediaInfoTracks = file.mediaInfo && file.mediaInfo.track;\n let streams = [];\n\n if (ffprobeStreams) {\n streams = ffprobeStreams;\n } else if (mediaInfoTracks) {\n streams = mediaInfoTracks.slice(1).flat();\n } else {\n console.log(\"[FilterSubs] No stream data found, skipping file.\");\n return { outputFileObj: args.inputFileObj, outputNumber: 2, variables: args.variables };\n }\n \n // --- 2. Normalized Stream Processing (Same as before) ---\n const normalized = streams.map((s) => {\n if (!s) return {};\n\n // Aggressive normalization of codec name\n const codec = (\n s.codec_name || s.CodecID || s.Format || s.SubFormat || s[\"CodecID/String\"] || s.title || \"\"\n )\n .toString()\n .toLowerCase()\n .replace(/^(s_)?(text\\/)?/i, '')\n .replace(/[^a-z0-9]/g, '');\n\n const type = (s.codec_type || s[\"@type\"] || \"\").toString().toLowerCase();\n\n // Determine the final type\n let finalType = type;\n if (finalType.includes(\"subtitle\") || finalType.includes(\"text\") || (s[\"@type\"] && s[\"@type\"].toLowerCase() === \"text\")) {\n finalType = \"subtitle\";\n }\n\n return {\n codec_name: codec,\n codec_type: finalType,\n };\n });\n\n // --- 3. Simple Filtering Logic ---\n \n // Check for ANY target subtitles (mov_text/webvtt) OR those with missing codec names (\"codec 0\") that MUST be converted\n const targetSubs = normalized.filter(\n (s) =>\n s.codec_type === \"subtitle\" &&\n (\n TARGET_CODECS_REGEX.test(s.codec_name) ||\n s.codec_name === \"\" // FIX: Include subtitles that result in an empty codec name after normalization (e.g., \"codec 0\" in FFmpeg)\n )\n );\n \n // Updated log message to reflect the new condition\n console.log(`[FilterSubs] Found ${targetSubs.length} target subtitle(s) (mov_text/webvtt/empty codec).`);\n\n // If even one target subtitle is found, send to Output 1\n if (targetSubs.length > 0) {\n console.log(\"[FilterSubs] ✅ Output 1: Needs subtitle conversion.\");\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 1,\n variables: args.variables,\n };\n }\n\n // Otherwise, skip the file (Output 2)\n console.log(\"[FilterSubs] ❌ Output 2: No conversion needed.\");\n return {\n outputFileObj: args.inputFileObj,\n outputNumber: 2,\n variables: args.variables,\n };\n};" } }, { "name": "Set Container", "sourceRepo": "Community", "pluginName": "ffmpegCommandSetContainer", "version": "1.0.0", "id": "znhQA2eFW", "position": { "x": -1608, "y": -228 }, "fpEnabled": true }, { "name": "Check Audio Codec", "sourceRepo": "Community", "pluginName": "checkAudioCodec", "version": "1.0.0", "id": "Nx8ue3C9r", "position": { "x": 444, "y": -972 }, "fpEnabled": true }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "id": "rcg0pbtss", "position": { "x": -1488, "y": -12 }, "fpEnabled": true }, { "name": "Begin Command", "sourceRepo": "Community", "pluginName": "ffmpegCommandStart", "version": "1.0.0", "id": "r1f8Rxjc3", "position": { "x": -1512, "y": 96 }, "fpEnabled": true }, { "name": "Remove Subtitles", "sourceRepo": "Community", "pluginName": "ffmpegCommandRemoveSubtitles", "version": "1.0.0", "id": "5CFR2huKH", "position": { "x": -1752, "y": 192 }, "fpEnabled": true }, { "name": "Reset Flow Error", "sourceRepo": "Community", "pluginName": "resetFlowError", "version": "1.0.0", "id": "DJuzusWGU", "position": { "x": -660, "y": -804 }, "fpEnabled": true }, { "name": "Check 10 Bit Video", "sourceRepo": "Community", "pluginName": "check10Bit", "version": "1.0.0", "id": "2o6toNuJn", "position": { "x": -36, "y": 0 }, "fpEnabled": true } ], "flowEdges": [ { "source": "2srjzGNd9", "sourceHandle": "3", "target": "PlWI5vazs", "targetHandle": null, "id": "WMKvvqIrG" }, { "source": "PlWI5vazs", "sourceHandle": "1", "target": "zAfrWL_3L", "targetHandle": null, "id": "Glwjso4HK" }, { "source": "2srjzGNd9", "sourceHandle": "2", "target": "A-sN8P922", "targetHandle": null, "id": "hGgaKxaaO" }, { "source": "Mc5PmBxBL", "sourceHandle": "1", "target": "QWisX2YAN", "targetHandle": null, "id": "Qr9TbZduo" }, { "source": "3guCCsb0G", "sourceHandle": "2", "target": "-k0iilQE1", "targetHandle": null, "id": "Rn7o02Cx2" }, { "source": "-k0iilQE1", "sourceHandle": "2", "target": "arRSldmHM", "targetHandle": null, "id": "EvsrszRqC" }, { "source": "arRSldmHM", "sourceHandle": "2", "target": "sFwltcPmM", "targetHandle": null, "id": "DM3-xP9GY" }, { "source": "sFwltcPmM", "sourceHandle": "2", "target": "GAP8-LI1_", "targetHandle": null, "id": "_P7JWCfPl" }, { "source": "GAP8-LI1_", "sourceHandle": "2", "target": "tl-ZH6rIJ", "targetHandle": null, "id": "iLav2LAt0" }, { "source": "tl-ZH6rIJ", "sourceHandle": "2", "target": "hWWduaXxj", "targetHandle": null, "id": "Z_eJ_VCd7" }, { "source": "hWWduaXxj", "sourceHandle": "2", "target": "uImSjvBPt", "targetHandle": null, "id": "UPkMp0lat" }, { "source": "uImSjvBPt", "sourceHandle": "2", "target": "TT0hrZqNx", "targetHandle": null, "id": "S3ZOkbdz7" }, { "source": "TT0hrZqNx", "sourceHandle": "2", "target": "iAku19f-E", "targetHandle": null, "id": "voXtvgcd1" }, { "source": "3guCCsb0G", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "JXNT-1BTm" }, { "source": "tl-ZH6rIJ", "sourceHandle": "1", "target": "gYahuZMfZ", "targetHandle": null, "id": "ycBxP962m" }, { "source": "arRSldmHM", "sourceHandle": "1", "target": "Z_IQXytAo", "targetHandle": null, "id": "WdG-pyyuS" }, { "source": "sFwltcPmM", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "kCTjzKqCl" }, { "source": "GAP8-LI1_", "sourceHandle": "1", "target": "Z_IQXytAo", "targetHandle": null, "id": "2FVQi4aZJ" }, { "source": "hWWduaXxj", "sourceHandle": "1", "target": "gYahuZMfZ", "targetHandle": null, "id": "AoJwa5esH" }, { "source": "uImSjvBPt", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "IMaXyhoiQ" }, { "source": "TT0hrZqNx", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "QWL_uVUK3" }, { "source": "iAku19f-E", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "I9lBOj5XX" }, { "source": "EQfrNr7JA", "sourceHandle": "1", "target": "0vN0CbwNi", "targetHandle": null, "id": "3jW0-uZ_t" }, { "source": "Z_IQXytAo", "sourceHandle": "1", "target": "0vN0CbwNi", "targetHandle": null, "id": "A5RIydplk" }, { "source": "gYahuZMfZ", "sourceHandle": "1", "target": "0vN0CbwNi", "targetHandle": null, "id": "KHKC0RIKR" }, { "source": "XzcD9ksuC", "sourceHandle": "1", "target": "-7J8xXZrv", "targetHandle": null, "id": "3A-l6ewJf" }, { "source": "XzcD9ksuC", "sourceHandle": "2", "target": "-7J8xXZrv", "targetHandle": null, "id": "rchZuY5hr" }, { "source": "XzcD9ksuC", "sourceHandle": "3", "target": "-7J8xXZrv", "targetHandle": null, "id": "HpA-n19ZN" }, { "source": "XzcD9ksuC", "sourceHandle": "4", "target": "-7J8xXZrv", "targetHandle": null, "id": "u6wDZpFK8" }, { "source": "-7J8xXZrv", "sourceHandle": "1", "target": "N6i5771rz", "targetHandle": null, "id": "JtysLO8F2" }, { "source": "nq04iI5JY", "sourceHandle": "1", "target": "QfJ9R-QdQ", "targetHandle": null, "id": "2jGpl8N3w" }, { "source": "8i_C-2RL_", "sourceHandle": "1", "target": "nq04iI5JY", "targetHandle": null, "id": "lz7qBFBD5" }, { "source": "N6i5771rz", "sourceHandle": "2", "target": "_4s4NaW0v", "targetHandle": null, "id": "Swr1Bkw2J" }, { "source": "Q5jG1l-YI", "sourceHandle": "1", "target": "uR0ws0Ta3", "targetHandle": null, "id": "1xRf_cw2a" }, { "source": "uR0ws0Ta3", "sourceHandle": "1", "target": "-7J8xXZrv", "targetHandle": null, "id": "7aAwqFrgd" }, { "source": "Q5jG1l-YI", "sourceHandle": "2", "target": "-7J8xXZrv", "targetHandle": null, "id": "qQ3Ri3zIj" }, { "source": "Senk6m0Zn", "sourceHandle": "1", "target": "N6i5771rz", "targetHandle": null, "id": "ukLIHVevN" }, { "source": "l9t4_PNCo", "sourceHandle": "1", "target": "RrfndsA8F", "targetHandle": null, "id": "1E1cN7Mwf" }, { "source": "RrfndsA8F", "sourceHandle": "2", "target": "Zn_rXEN6Z", "targetHandle": null, "id": "cmHsMz5iT" }, { "source": "Zn_rXEN6Z", "sourceHandle": "2", "target": "fxW7qLVZQ", "targetHandle": null, "id": "YOpF8fqAf" }, { "source": "fxW7qLVZQ", "sourceHandle": "2", "target": "breB23d-R", "targetHandle": null, "id": "C5AFuUZnc" }, { "source": "breB23d-R", "sourceHandle": "2", "target": "ljyqu47Vh", "targetHandle": null, "id": "r4Zs8m5Vq" }, { "source": "ljyqu47Vh", "sourceHandle": "2", "target": "GVrt9zhwP", "targetHandle": null, "id": "4-tcS3LLw" }, { "source": "GVrt9zhwP", "sourceHandle": "2", "target": "_PXYtgZaq", "targetHandle": null, "id": "JlSYUM9PY" }, { "source": "_PXYtgZaq", "sourceHandle": "2", "target": "u6PfbYK5Y", "targetHandle": null, "id": "jg4R1-4pq" }, { "source": "u6PfbYK5Y", "sourceHandle": "2", "target": "itXg7sd7X", "targetHandle": null, "id": "_0nQshyXZ" }, { "source": "itXg7sd7X", "sourceHandle": "2", "target": "xc1iOQh9n", "targetHandle": null, "id": "lFCuZvqYS" }, { "source": "RrfndsA8F", "sourceHandle": "1", "target": "VghUJu1wR", "targetHandle": null, "id": "-R4ghCl9v" }, { "source": "Zn_rXEN6Z", "sourceHandle": "1", "target": "VghUJu1wR", "targetHandle": null, "id": "AT9usRDAg" }, { "source": "fxW7qLVZQ", "sourceHandle": "1", "target": "VghUJu1wR", "targetHandle": null, "id": "btZn0wnKr" }, { "source": "breB23d-R", "sourceHandle": "1", "target": "VghUJu1wR", "targetHandle": null, "id": "6TMniTX5S" }, { "source": "ljyqu47Vh", "sourceHandle": "1", "target": "VghUJu1wR", "targetHandle": null, "id": "iTvJp2T6T" }, { "source": "GVrt9zhwP", "sourceHandle": "1", "target": "NF6Rd-iA1", "targetHandle": null, "id": "NFDTKrU-c" }, { "source": "_PXYtgZaq", "sourceHandle": "1", "target": "NF6Rd-iA1", "targetHandle": null, "id": "94lb3qyhw" }, { "source": "u6PfbYK5Y", "sourceHandle": "1", "target": "NF6Rd-iA1", "targetHandle": null, "id": "xNBCNUg3k" }, { "source": "itXg7sd7X", "sourceHandle": "1", "target": "ij3d4eqWN", "targetHandle": null, "id": "jaKftZWQd" }, { "source": "-7J8xXZrv", "sourceHandle": "2", "target": "EN7ztE59v", "targetHandle": null, "id": "VeuIcITYE" }, { "source": "2WU8tgfMA", "sourceHandle": "1", "target": "N6i5771rz", "targetHandle": null, "id": "ehq5kmqlp" }, { "source": "EQfrNr7JA", "sourceHandle": "2", "target": "0vN0CbwNi", "targetHandle": null, "id": "r4xtxP40y" }, { "source": "Z_IQXytAo", "sourceHandle": "2", "target": "0vN0CbwNi", "targetHandle": null, "id": "LJzfRjhjm" }, { "source": "gYahuZMfZ", "sourceHandle": "2", "target": "0vN0CbwNi", "targetHandle": null, "id": "-V0_OvV9Z" }, { "source": "ij3d4eqWN", "sourceHandle": "1", "target": "ASB6zPsBQ", "targetHandle": null, "id": "8xBhD3b5O" }, { "source": "NF6Rd-iA1", "sourceHandle": "1", "target": "UliuIfTUY", "targetHandle": null, "id": "h6X_PxY89" }, { "source": "VghUJu1wR", "sourceHandle": "1", "target": "phpdAalRh", "targetHandle": null, "id": "8goMRFHGs" }, { "source": "phpdAalRh", "sourceHandle": "1", "target": "qQoyC6L-r", "targetHandle": null, "id": "ZaZfJSCcR" }, { "source": "qQoyC6L-r", "sourceHandle": "1", "target": "ZguXxh1GN", "targetHandle": null, "id": "oR3nffbke" }, { "source": "UliuIfTUY", "sourceHandle": "1", "target": "qQoyC6L-r", "targetHandle": null, "id": "Tc_Ks69XJ" }, { "source": "ASB6zPsBQ", "sourceHandle": "1", "target": "qQoyC6L-r", "targetHandle": null, "id": "a8Hjz2LKT" }, { "source": "ASB6zPsBQ", "sourceHandle": "2", "target": "qQoyC6L-r", "targetHandle": null, "id": "5zu2ixLkU" }, { "source": "UliuIfTUY", "sourceHandle": "2", "target": "qQoyC6L-r", "targetHandle": null, "id": "lmIjL-bG0" }, { "source": "phpdAalRh", "sourceHandle": "2", "target": "qQoyC6L-r", "targetHandle": null, "id": "zwPeRCt7C" }, { "source": "VghUJu1wR", "sourceHandle": "2", "target": "QqA4-3GM7", "targetHandle": null, "id": "5o00qQJCL" }, { "source": "NF6Rd-iA1", "sourceHandle": "2", "target": "qwhBJNaZ-", "targetHandle": null, "id": "F-gFro5JS" }, { "source": "ij3d4eqWN", "sourceHandle": "2", "target": "kIqdIJcf5", "targetHandle": null, "id": "EMn9lio1B" }, { "source": "uKmVO9y-k", "sourceHandle": "1", "target": "ZguXxh1GN", "targetHandle": null, "id": "hvkpZjNKs" }, { "source": "qwhBJNaZ-", "sourceHandle": "1", "target": "ZguXxh1GN", "targetHandle": null, "id": "gK9QyK9-2" }, { "source": "QqA4-3GM7", "sourceHandle": "1", "target": "ZguXxh1GN", "targetHandle": null, "id": "vzpzCv7pM" }, { "source": "iAku19f-E", "sourceHandle": "2", "target": "DfBPp6TuP", "targetHandle": null, "id": "cl7m_YD_K" }, { "source": "DfBPp6TuP", "sourceHandle": "1", "target": "EQfrNr7JA", "targetHandle": null, "id": "YF80tZDJW" }, { "source": "DfBPp6TuP", "sourceHandle": "2", "target": "0vN0CbwNi", "targetHandle": null, "id": "X31Phlk2M" }, { "source": "xc1iOQh9n", "sourceHandle": "2", "target": "75NHA0fhp", "targetHandle": null, "id": "8C69psQB_" }, { "source": "75NHA0fhp", "sourceHandle": "1", "target": "inDRdMhUJ", "targetHandle": null, "id": "Z7flAsL0l" }, { "source": "75NHA0fhp", "sourceHandle": "2", "target": "qQoyC6L-r", "targetHandle": null, "id": "HlvQXBxSy" }, { "source": "inDRdMhUJ", "sourceHandle": "1", "target": "ueBbYS4wk", "targetHandle": null, "id": "REjcTh51R" }, { "source": "inDRdMhUJ", "sourceHandle": "2", "target": "rxdus8CVN", "targetHandle": null, "id": "si2YRm5he" }, { "source": "ueBbYS4wk", "sourceHandle": "1", "target": "qQoyC6L-r", "targetHandle": null, "id": "eO79xIklT" }, { "source": "ueBbYS4wk", "sourceHandle": "2", "target": "qQoyC6L-r", "targetHandle": null, "id": "h2WnpVrED" }, { "source": "rxdus8CVN", "sourceHandle": "1", "target": "ZguXxh1GN", "targetHandle": null, "id": "dNl3Lq6Wd" }, { "source": "oElfDYblg", "sourceHandle": "1", "target": "8i_C-2RL_", "targetHandle": null, "id": "ftF8eYFUy" }, { "source": "oElfDYblg", "sourceHandle": "2", "target": "8i_C-2RL_", "targetHandle": null, "id": "6luWI7fPb" }, { "source": "QWisX2YAN", "sourceHandle": "1", "target": "2srjzGNd9", "targetHandle": null, "id": "1-yt6GBGu" }, { "source": "2srjzGNd9", "sourceHandle": "1", "target": "WrYPlH7kf", "targetHandle": null, "id": "hvLabsNY-" }, { "source": "no1PzoAbZ", "sourceHandle": "1", "target": "QeI90j2m2", "targetHandle": null, "id": "Wsx5D4oiQ" }, { "source": "QeI90j2m2", "sourceHandle": "1", "target": "l9t4_PNCo", "targetHandle": null, "id": "S60SydAh4" }, { "source": "VghUJu1wR", "sourceHandle": "err1", "target": "wDUc2MLMI", "targetHandle": null, "id": "wLGxtxE-Q" }, { "source": "wDUc2MLMI", "sourceHandle": "1", "target": "QqA4-3GM7", "targetHandle": null, "id": "_NX7nd8E6" }, { "source": "NF6Rd-iA1", "sourceHandle": "err1", "target": "cSRpMDsfC", "targetHandle": null, "id": "56zTz9qJ1" }, { "source": "cSRpMDsfC", "sourceHandle": "1", "target": "qwhBJNaZ-", "targetHandle": null, "id": "hA-SQ2FFv" }, { "source": "ij3d4eqWN", "sourceHandle": "err1", "target": "AtarTlMKu", "targetHandle": null, "id": "SeOnBkWcT" }, { "source": "AtarTlMKu", "sourceHandle": "1", "target": "uKmVO9y-k", "targetHandle": null, "id": "R3QUBa1hw" }, { "source": "inDRdMhUJ", "sourceHandle": "err1", "target": "KPjWhP-uO", "targetHandle": null, "id": "nkrTGUsY3" }, { "source": "KPjWhP-uO", "sourceHandle": "1", "target": "rxdus8CVN", "targetHandle": null, "id": "WhEbkxfTx" }, { "source": "ZguXxh1GN", "sourceHandle": "err1", "target": "Rp42ahv0U", "targetHandle": null, "id": "yW5vp1x8s" }, { "source": "-k0iilQE1", "sourceHandle": "1", "target": "Z_IQXytAo", "targetHandle": null, "id": "uVYYkz-NV" }, { "source": "0vN0CbwNi", "sourceHandle": "1", "target": "oElfDYblg", "targetHandle": null, "id": "GVz8sYnFD" }, { "source": "0vN0CbwNi", "sourceHandle": "2", "target": "oElfDYblg", "targetHandle": null, "id": "vrhLN0m4r" }, { "source": "N6i5771rz", "sourceHandle": "1", "target": "no1PzoAbZ", "targetHandle": null, "id": "yPJ_W2QzF" }, { "source": "_4s4NaW0v", "sourceHandle": "1", "target": "no1PzoAbZ", "targetHandle": null, "id": "CDDN2iJ86" }, { "source": "iZmkg2JIs", "sourceHandle": "1", "target": "Qwb8WDxVM", "targetHandle": null, "id": "QOb_mOM3i" }, { "source": "Qwb8WDxVM", "sourceHandle": "2", "target": "XzcD9ksuC", "targetHandle": null, "id": "PbB59lqPP" }, { "source": "umnL3dtz5", "sourceHandle": "1", "target": "N6i5771rz", "targetHandle": null, "id": "6VpytrJdE" }, { "source": "w5JKDYmwt", "sourceHandle": "1", "target": "rfYiPPliH", "targetHandle": null, "id": "vOYNNwgMM" }, { "source": "M6P6vnyRg", "sourceHandle": "1", "target": "3guCCsb0G", "targetHandle": null, "id": "2GS_mowgJ" }, { "source": "WrYPlH7kf", "sourceHandle": "1", "target": "8geIUC4mK", "targetHandle": null, "id": "5CTyvp9SQ" }, { "source": "8geIUC4mK", "sourceHandle": "2", "target": "3guCCsb0G", "targetHandle": null, "id": "_rGXFyXzA" }, { "source": "8geIUC4mK", "sourceHandle": "1", "target": "w5JKDYmwt", "targetHandle": null, "id": "fiMbluHV9" }, { "source": "znhQA2eFW", "sourceHandle": "1", "target": "M6P6vnyRg", "targetHandle": null, "id": "-iT8tUhfA" }, { "source": "QfJ9R-QdQ", "sourceHandle": "1", "target": "Nx8ue3C9r", "targetHandle": null, "id": "-_98-ZdlH" }, { "source": "Nx8ue3C9r", "sourceHandle": "2", "target": "iZmkg2JIs", "targetHandle": null, "id": "ePDXFQpv0" }, { "source": "Nx8ue3C9r", "sourceHandle": "1", "target": "-INpu6k4A", "targetHandle": null, "id": "BZDqLMSAR" }, { "source": "-INpu6k4A", "sourceHandle": "1", "target": "Qwb8WDxVM", "targetHandle": null, "id": "g1crY-Y86" }, { "source": "XzcD9ksuC", "sourceHandle": "5", "target": "iaCL_IejN", "targetHandle": null, "id": "_p6VTrdsx" }, { "source": "XzcD9ksuC", "sourceHandle": "6", "target": "iaCL_IejN", "targetHandle": null, "id": "9HHzbgE_h" }, { "source": "XzcD9ksuC", "sourceHandle": "7", "target": "iaCL_IejN", "targetHandle": null, "id": "8v_yofv5X" }, { "source": "XzcD9ksuC", "sourceHandle": "8", "target": "iaCL_IejN", "targetHandle": null, "id": "M16k3QUDI" }, { "source": "XzcD9ksuC", "sourceHandle": "9", "target": "iaCL_IejN", "targetHandle": null, "id": "UFdxk3J28" }, { "source": "iaCL_IejN", "sourceHandle": "1", "target": "Q5jG1l-YI", "targetHandle": null, "id": "ovnNl9hns" }, { "source": "xc1iOQh9n", "sourceHandle": "1", "target": "ij3d4eqWN", "targetHandle": null, "id": "y20Rn6kht" }, { "source": "rfYiPPliH", "sourceHandle": "1", "target": "70jrGfqVD", "targetHandle": null, "id": "tABoHf3TK" }, { "source": "70jrGfqVD", "sourceHandle": "1", "target": "znhQA2eFW", "targetHandle": null, "id": "Fg_clB075" }, { "source": "M6P6vnyRg", "sourceHandle": "err1", "target": "rcg0pbtss", "targetHandle": null, "id": "ZpJbAWZ1U" }, { "source": "rcg0pbtss", "sourceHandle": "1", "target": "r1f8Rxjc3", "targetHandle": null, "id": "rRKT_e8w7" }, { "source": "r1f8Rxjc3", "sourceHandle": "1", "target": "5CFR2huKH", "targetHandle": null, "id": "YF1-RvMA-" }, { "source": "5CFR2huKH", "sourceHandle": "1", "target": "7Mli0Vg5y", "targetHandle": null, "id": "S1PIB14xJ" }, { "source": "7Mli0Vg5y", "sourceHandle": "1", "target": "QZPoQx6iz", "targetHandle": null, "id": "2N8tocppp" }, { "source": "QZPoQx6iz", "sourceHandle": "1", "target": "NdLwGbfU6", "targetHandle": null, "id": "HdqB_Gesm" }, { "source": "NdLwGbfU6", "sourceHandle": "1", "target": "3guCCsb0G", "targetHandle": null, "id": "guwSrr7f9" }, { "source": "QWisX2YAN", "sourceHandle": "err1", "target": "DJuzusWGU", "targetHandle": null, "id": "pnJ5rOVN_" }, { "source": "DJuzusWGU", "sourceHandle": "1", "target": "2srjzGNd9", "targetHandle": null, "id": "rDt2X_EXF" }, { "source": "EN7ztE59v", "sourceHandle": "1", "target": "euDOr7lhD", "targetHandle": null, "id": "bdD0qzIo4" }, { "source": "euDOr7lhD", "sourceHandle": "1", "target": "2WU8tgfMA", "targetHandle": null, "id": "EI65vFvZ1" }, { "source": "_CuE72hKu", "sourceHandle": "1", "target": "Senk6m0Zn", "targetHandle": null, "id": "TIniTh-Dj" }, { "source": "Qwb8WDxVM", "sourceHandle": "1", "target": "mNiWjPApd", "targetHandle": null, "id": "vHy7rfsM2" }, { "source": "mNiWjPApd", "sourceHandle": "1", "target": "umnL3dtz5", "targetHandle": null, "id": "gITf7md4v" }, { "source": "EN7ztE59v", "sourceHandle": "2", "target": "2o6toNuJn", "targetHandle": null, "id": "_Q7l-XYTx" }, { "source": "2o6toNuJn", "sourceHandle": "1", "target": "euDOr7lhD", "targetHandle": null, "id": "B06QbHJus" }, { "source": "2o6toNuJn", "sourceHandle": "2", "target": "_CuE72hKu", "targetHandle": null, "id": "nGl1EzotK" } ] }