-
-
Save gssariev/0b93a11e809c38e035388e4157b42c9a to your computer and use it in GitHub Desktop.
/* eslint-disable no-await-in-loop */ | |
module.exports.dependencies = ['[email protected]', '@cospired/i18n-iso-languages']; | |
const details = () => ({ | |
id: 'Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng', | |
Stage: 'Pre-processing', | |
Name: 'Remove all langs except native and English', | |
Type: 'Audio', | |
Operation: 'Transcode', | |
Description: `This is a modified version made by gsariev of the original plugin. This plugin will remove all language audio tracks except the 'native' and user-specified languages. | |
(requires TMDB api key). | |
'Native' languages are the ones that are listed on TMDB. It does an API call to | |
Radarr, Sonarr to check if the movie/series exists and grabs the IMDb id. As a last resort, it | |
falls back to the IMDb id in the filename.`, | |
Version: '1.3', // Incremented version | |
Tags: 'pre-processing,configurable', | |
Inputs: [ | |
{ | |
name: 'user_langs', | |
type: 'string', | |
defaultValue: '', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Input a comma-separated list of ISO-639-2 languages. It will still keep English and undefined tracks.' | |
+ '(https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes 639-2 column)' | |
+ '\\nExample:\\n' | |
+ 'ger,fre', | |
}, | |
{ | |
name: 'priority', | |
type: 'string', | |
defaultValue: 'radarr', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Priority for either Radarr or Sonarr. Leaving it empty defaults to Radarr first.' | |
+ '\\nExample:\\n' | |
+ 'sonarr', | |
}, | |
{ | |
name: 'api_key', | |
type: 'string', | |
defaultValue: '', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Input your TMDB api (v3) key here. (https://www.themoviedb.org/)', | |
}, | |
{ | |
name: 'radarr_api_key', | |
type: 'string', | |
defaultValue: '', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: 'Input your Radarr api key here.', | |
}, | |
{ | |
name: 'radarr_url', | |
type: 'string', | |
defaultValue: '192.168.1.2:7878', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Input your Radarr url here. (Without http://). Do include the port.' | |
+ '\\nExample:\\n' | |
+ '192.168.1.2:7878', | |
}, | |
{ | |
name: 'sonarr_api_key', | |
type: 'string', | |
defaultValue: '', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: 'Input your Sonarr api key here.', | |
}, | |
{ | |
name: 'sonarr_url', | |
type: 'string', | |
defaultValue: '192.168.1.2:8989', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Input your Sonarr url here. (Without http://). Do include the port.' | |
+ '\\nExample:\\n' | |
+ '192.168.1.2:8989', | |
}, | |
{ | |
name: 'commentary', | |
type: 'boolean', | |
defaultValue: false, | |
inputUI: { | |
type: 'dropdown', | |
options: [ | |
'false', | |
'true', | |
], | |
}, | |
tooltip: `Specify if audio tracks that contain commentary/description should be kept. | |
\\nExample:\\n | |
true | |
\\nExample:\\n | |
false`, | |
}, | |
{ | |
name: 'undefined_lang_tag', | |
type: 'string', | |
defaultValue: '', | |
inputUI: { | |
type: 'text', | |
}, | |
tooltip: | |
'Specify the language tag to use for undefined audio tracks. If empty, the original language tag will be used.', | |
}, | |
], | |
}); | |
const response = { | |
processFile: false, | |
preset: '', | |
container: '.', | |
handBrakeMode: false, | |
FFmpegMode: true, | |
reQueueAfter: false, | |
infoLog: '', | |
}; | |
const languageConverter = (tmdbLanguageCode) => { | |
const isoLang = require('@cospired/i18n-iso-languages'); | |
try { | |
// Convert TMDB language code to ISO-639-2 3-letter format | |
const convertedLanguageCode = isoLang.alpha2ToAlpha3B(tmdbLanguageCode); | |
// Log the converted language code | |
response.infoLog += `TMDB Language Code Return: ${convertedLanguageCode}\n`; | |
return convertedLanguageCode; | |
} catch (error) { | |
console.error('Error converting language code:', error.message); | |
response.infoLog += '☒Error converting language code.\n'; | |
return null; | |
} | |
}; | |
const parseArrResponse = (body, filePath, arr) => { | |
// eslint-disable-next-line default-case | |
switch (arr) { | |
case 'radarr': | |
return body.movie; | |
case 'sonarr': | |
return body.series; | |
} | |
}; | |
const processStreams = (result, file, userLangs, isSonarr, includeCommentary, undefinedLangTag) => { | |
const languages = require('@cospired/i18n-iso-languages'); | |
const tracks = { | |
keep: [], | |
remove: [], | |
remLangs: '', | |
metadata: '', | |
}; | |
let streamIndex = 0; | |
let shouldProcess = false; | |
// Convert the TMDB language code to ISO-639-2 3-letter format dynamically | |
const tmdbLanguageCode = result.original_language; | |
const convertedLanguageCode = languageConverter(tmdbLanguageCode) || tmdbLanguageCode; | |
response.infoLog += `Original language tag: ${convertedLanguageCode}\n`; | |
// Flag to indicate if any audio track matches the specified languages | |
let matchFound = false; | |
for (const stream of file.ffProbeData.streams) { | |
if (stream.codec_type === 'audio') { | |
if (!stream.tags || !stream.tags.language || stream.tags.language.toLowerCase() === 'und') { | |
// Explicitly identify undefined tracks | |
const tagLanguage = undefinedLangTag || convertedLanguageCode; | |
response.infoLog += `☒No language tag found on audio track ${streamIndex}. Tagging it with ${tagLanguage}.\n`; | |
// Tag the undefined audio track | |
tracks.metadata += `-metadata:s:a:${streamIndex} language=${tagLanguage} `; | |
tracks.keep.push(streamIndex); | |
response.infoLog += `☑Tagged audio track ${streamIndex} with ${tagLanguage}\n`; | |
matchFound = true; // Consider this a match since we are tagging it appropriately | |
shouldProcess = true; // Mark the file to be processed | |
} else if (stream.tags.title && isCommentaryTrack(stream.tags.title)) { | |
// Remove commentary tracks if includeCommentary is false | |
if (!includeCommentary) { | |
response.infoLog += `☒Removing commentary audio track: ${languages.getName(stream.tags.language, 'en')} (commentary) - ${stream.tags.title}\n`; | |
tracks.remove.push(streamIndex); | |
tracks.remLangs += `${languages.getName(stream.tags.language, 'en')} (commentary), `; | |
shouldProcess = true; // Mark the file to be processed | |
} else { | |
tracks.keep.push(streamIndex); | |
response.infoLog += `☑Keeping commentary audio track: ${languages.getName(stream.tags.language, 'en')} (commentary) - ${stream.tags.title}\n`; | |
matchFound = true; // At least one track matches the specified languages | |
} | |
} else if (stream.tags.language) { | |
// Check if the language is in the user-defined languages or it's the original language | |
const mappedLanguage = isSonarr ? mapSonarrLanguageToTMDB(stream.tags.language) : mapRadarrLanguageToTMDB(stream.tags.language); | |
if (userLangs.includes(mappedLanguage) || mappedLanguage === convertedLanguageCode) { | |
tracks.keep.push(streamIndex); | |
response.infoLog += `☑Keeping audio track with language: ${languages.getName(stream.tags.language, 'en')}\n`; | |
matchFound = true; // At least one track matches the specified languages | |
} else { | |
response.infoLog += `☒Removing audio track with language: ${languages.getName(stream.tags.language, 'en')}\n`; | |
tracks.remove.push(streamIndex); | |
tracks.remLangs += `${languages.getName(stream.tags.language, 'en')}, `; | |
shouldProcess = true; // Mark the file to be processed | |
} | |
} | |
streamIndex += 1; | |
} | |
} | |
// If no tracks are found to match the specified languages and none are kept, stop the plugin | |
if (!matchFound && tracks.keep.length === 0) { | |
response.infoLog += '☒Cancelling plugin because none of the audio tracks match the specified languages or are tagged as undefined. \n'; | |
response.processFile = false; | |
// Clear the removal tracks to prevent further deletion | |
tracks.remove = []; | |
} else { | |
response.processFile = shouldProcess; // Process the file if at least one track is kept or tagged | |
} | |
if (shouldProcess) { | |
response.preset = `, -map 0:v -c:v copy `; | |
for (const index of tracks.keep) { | |
response.preset += `-map 0:a:${index} `; | |
} | |
for (const index of tracks.remove) { | |
response.preset += `-map -0:a:${index} `; | |
} | |
response.preset += `${tracks.metadata} -c:a copy -max_muxing_queue_size 9999`; | |
} | |
return tracks; | |
}; | |
const mapRadarrLanguageToTMDB = (radarrLanguage) => { | |
const languageMappings = { | |
chi: 'cn', | |
// Add additional mapping if needed | |
}; | |
return languageMappings[radarrLanguage] || radarrLanguage; | |
}; | |
const mapSonarrLanguageToTMDB = (sonarrLanguage) => { | |
const languageMappings = { | |
// Add mappings for Sonarr languages if needed | |
}; | |
return languageMappings[sonarrLanguage] || sonarrLanguage; | |
}; | |
const tmdbApi = async (filename, api_key, axios) => { | |
let fileName; | |
if (filename) { | |
if (filename.slice(0, 2) === 'tt') { | |
fileName = filename; | |
} else { | |
const idRegex = /(tt\d{7,8})/; | |
const fileMatch = filename.match(idRegex); | |
if (fileMatch) { | |
fileName = fileMatch[1]; | |
} | |
} | |
} | |
if (fileName) { | |
try { | |
const result = await axios | |
.get( | |
`https://api.themoviedb.org/3/find/${fileName}?api_key=` | |
+ `${api_key}&language=en-US&external_source=imdb_id`, | |
) | |
.then((resp) => (resp.data.movie_results.length > 0 | |
? resp.data.movie_results[0] | |
: resp.data.tv_results[0])); | |
console.log('TMDB API Result:', result); | |
if (!result) { | |
response.infoLog += '☒No IMDb result was found. \n'; | |
} | |
if (result) { | |
const tmdbLanguageCode = languageConverter(result.original_language); | |
response.infoLog += `Converted TMDB Language Code: ${tmdbLanguageCode}\n`; | |
response.infoLog += `Language tag picked up by TMDB: ${tmdbLanguageCode}\n`; | |
} else { | |
response.infoLog += "☒Couldn't find the IMDb id of this file. Skipping. \n"; | |
} | |
return result; | |
} catch (error) { | |
console.error('Error fetching data from TMDB API:', error.message); | |
response.infoLog += '☒Error fetching data from TMDB API.\n'; | |
return null; | |
} | |
} | |
return null; | |
}; | |
const isCommentaryTrack = (title) => { | |
// Check if the title includes keywords indicating a commentary track | |
return title.toLowerCase().includes('commentary') | |
|| title.toLowerCase().includes('description') | |
|| title.toLowerCase().includes('sdh'); | |
}; | |
const plugin = async (file, librarySettings, inputs, otherArguments) => { | |
const lib = require('../methods/lib')(); | |
const axios = require('axios').default; | |
inputs = lib.loadDefaultValues(inputs, details); | |
response.container = `.${file.container}`; | |
let prio = ['radarr', 'sonarr']; | |
let radarrResult = null; | |
let sonarrResult = null; | |
let tmdbResult = null; | |
if (inputs.priority && inputs.priority === 'sonarr') { | |
prio = ['sonarr', 'radarr']; | |
} | |
const fileNameEncoded = encodeURIComponent(file.meta.FileName); | |
for (const arr of prio) { | |
let imdbId; | |
// Reset infoLog before each processing step (removes duplicated logs being displayed) | |
response.infoLog = ''; | |
switch (arr) { | |
case 'radarr': | |
if (tmdbResult) break; | |
if (inputs.radarr_api_key) { | |
radarrResult = parseArrResponse( | |
await axios | |
.get( | |
`http://${inputs.radarr_url}/api/v3/parse?apikey=${inputs.radarr_api_key}&title=${fileNameEncoded}`, | |
) | |
.then((resp) => resp.data), | |
fileNameEncoded, | |
'radarr', | |
); | |
if (radarrResult) { | |
imdbId = radarrResult.imdbId; | |
response.infoLog += `Grabbed ID (${imdbId}) from Radarr \n`; | |
const radarrLanguageTag = radarrResult.originalLanguage.name; | |
response.infoLog += `Language tag picked up by Radarr: ${radarrLanguageTag}\n`; | |
tmdbResult = await tmdbApi(imdbId, inputs.api_key, axios); | |
if (tmdbResult) { | |
const tmdbLanguageTag = languageConverter(tmdbResult.original_language) || tmdbResult.original_language; | |
response.infoLog += `Language tag picked up by TMDB: ${tmdbLanguageTag}\n`; | |
} | |
} else { | |
response.infoLog += "Couldn't grab ID from Radarr \n"; | |
imdbId = fileNameEncoded; | |
tmdbResult = await tmdbApi(imdbId, inputs.api_key, axios); | |
if (tmdbResult) { | |
const tmdbLanguageTag = languageConverter(tmdbResult.original_language) || tmdbResult.original_language; | |
response.infoLog += `Language tag picked up by TMDB: ${tmdbLanguageTag}\n`; | |
} | |
} | |
} | |
break; | |
case 'sonarr': | |
if (tmdbResult) break; | |
if (inputs.sonarr_api_key) { | |
sonarrResult = parseArrResponse( | |
await axios.get( | |
`http://${inputs.sonarr_url}/api/v3/parse?apikey=${inputs.sonarr_api_key}&title=${fileNameEncoded}`, | |
) | |
.then((resp) => resp.data), | |
file.meta.Directory, | |
'sonarr', | |
); | |
if (sonarrResult) { | |
imdbId = sonarrResult.imdbId; | |
response.infoLog += `Grabbed ID (${imdbId}) from Sonarr \n`; | |
tmdbResult = await tmdbApi(imdbId, inputs.api_key, axios); | |
if (tmdbResult) { | |
const sonarrTracks = processStreams(tmdbResult, file, inputs.user_langs ? inputs.user_langs.split(',') : '', true, inputs.commentary, inputs.undefined_lang_tag); | |
if (sonarrTracks.remove.length > 0) { | |
if (sonarrTracks.keep.length > 0) { | |
response.infoLog += `☑Removing tracks with languages: ${sonarrTracks.remLangs.slice( | |
0, | |
-2, | |
)}. \n`; | |
response.processFile = true; | |
response.infoLog += '\n'; | |
} else { | |
response.infoLog | |
+= '☒Cancelling plugin otherwise all audio tracks would be removed. \n'; | |
} | |
} else { | |
response.infoLog += '☒No audio tracks to be removed. \n'; | |
} | |
} else { | |
response.infoLog += "☒Couldn't find the IMDb id of this file. Skipping. \n"; | |
} | |
} | |
} | |
break; | |
} | |
} | |
if (tmdbResult) { | |
const userLanguages = inputs.user_langs ? inputs.user_langs.split(',') : []; | |
const originalLanguage = tmdbResult.original_language; | |
const originalLanguageIncluded = userLanguages.includes(originalLanguage); | |
const tracks = processStreams( | |
tmdbResult, | |
file, | |
userLanguages, | |
false, | |
inputs.commentary, | |
inputs.undefined_lang_tag, | |
); | |
console.log('Tracks:', tracks); | |
console.log('Original Language:', originalLanguage); | |
console.log('User Languages:', userLanguages); | |
console.log('Original Language Included:', originalLanguageIncluded); | |
console.log('User Languages Include Removed Languages:', userLanguages.includes(tracks.remLangs)); | |
// Check if no tracks match original or user-specified languages | |
const noMatchingTracks = tracks.keep.length === 0 && !originalLanguageIncluded && !userLanguages.includes(tracks.remLangs); | |
console.log('No Matching Tracks:', noMatchingTracks); | |
if (noMatchingTracks) { | |
response.infoLog += '☒Cancelling plugin because no audio tracks match the original language or user-specified languages. \n'; | |
return response; // Stop execution | |
} | |
// Continue processing audio tracks | |
if (tracks.remove.length > 0) { | |
if (tracks.keep.length > 0) { | |
response.infoLog += `☑Removing tracks with languages: ${tracks.remLangs.slice( | |
0, | |
-2, | |
)}. \n`; | |
response.processFile = true; | |
response.infoLog += '\n'; | |
} else { | |
response.infoLog += '☒Cancelling plugin otherwise all audio tracks would be removed. \n'; | |
} | |
} else { | |
response.infoLog += '☒No audio tracks to be removed. \n'; | |
} | |
} else { | |
response.infoLog += "☒Couldn't find the IMDb id of this file. Skipping. \n"; | |
} | |
return response; | |
}; | |
module.exports.details = details; | |
module.exports.plugin = plugin; |
For some reason, the plugin removes all subtitles from the movie.
I'm using latest docker image of Tdarr.
This is what I found in the logs:
[matroska,webm @ 0x55eac5fccf80] Could not find codec parameters for stream 4 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size 2024-12-22T14:01:32.886Z Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options 2024-12-22T14:01:32.886Z [matroska,webm @ 0x55eac5fccf80] Could not find codec parameters for stream 5 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
After that I see three streams copied over, the rest is ignored for some reason:
2024-12-22T14:01:32.886Z Stream mapping: 2024-12-22T14:01:32.886Z Stream #0:0 -> #0:0 (copy) 2024-12-22T14:01:32.886Z Stream #0:1 -> #0:1 (copy) 2024-12-22T14:01:32.886Z Stream #0:2 -> #0:2 (copy)
2024-12-22T14:01:32.886Z video:4814991kB audio:948259kB subtitle:0kB other streams:0kB global headers:3kB muxing overhead: 0.082985%
What could be the reason for this unexpected plugin behaviour please?
For some reason, the plugin removes all subtitles from the movie. I'm using latest docker image of Tdarr.
This is what I found in the logs:
[matroska,webm @ 0x55eac5fccf80] Could not find codec parameters for stream 4 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size 2024-12-22T14:01:32.886Z Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options 2024-12-22T14:01:32.886Z [matroska,webm @ 0x55eac5fccf80] Could not find codec parameters for stream 5 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
After that I see three streams copied over, the rest is ignored for some reason:
2024-12-22T14:01:32.886Z Stream mapping: 2024-12-22T14:01:32.886Z Stream #0:0 -> #0:0 (copy) 2024-12-22T14:01:32.886Z Stream #0:1 -> #0:1 (copy) 2024-12-22T14:01:32.886Z Stream #0:2 -> #0:2 (copy)
2024-12-22T14:01:32.886Z video:4814991kB audio:948259kB subtitle:0kB other streams:0kB global headers:3kB muxing overhead: 0.082985%
What could be the reason for this unexpected plugin behaviour please?
I am sorry for the late reply (holidays).
It's been a while since I've worked on this plugin, but will try to help as best as I can. For starters, the plugin doesn't handle subtitles - only audio tracks - and I haven't ran into the issue you are describing.
Would you mind sharing your plugin stack and full Tdarr logs? Perhaps I can try and replicate things on my end.
No worries, fully understand. :)
Yes, that is exactly what I thought. The plugin should leave all subtitle tracks intact. But for some reason, it doesn't and it removes them all.
Here's my flow:
{ "_id": "tCvLGQPX-", "name": "Test", "description": "Test", "tags": "", "flowPlugins": [ { "name": "Input File", "sourceRepo": "Community", "pluginName": "inputFile", "version": "1.0.0", "id": "gtZCtmY-l", "position": { "x": 648.6536861377089, "y": -82.45578042880155 }, "fpEnabled": true, "inputsDB": { "fileAccessChecks": "true" } }, { "name": "CheckHEVC", "sourceRepo": "Community", "pluginName": "checkVideoCodec", "version": "1.0.0", "id": "PpLF-5jxp", "position": { "x": 752.4065242952165, "y": 51.12406033129332 }, "fpEnabled": true }, { "name": "Replace Original File", "sourceRepo": "Community", "pluginName": "replaceOriginalFile", "version": "1.0.0", "id": "R0gX9B20d", "position": { "x": 1254.8245927603703, "y": 794.237280211442 }, "fpEnabled": true }, { "name": "KeepNativeEngCzeSlo", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "id": "eoWKnzTXP", "position": { "x": 1253.4279202634789, "y": 434.8292360884601 }, "fpEnabled": true, "inputsDB": { "pluginSourceId": "Local:Tdarr_Plugin_henk_Keep_Native_Lang_Plus_Eng", "commentary": "false", "user_langs": "eng,en,ces,cze,cz,slk,slo,sk", "api_key": "<redacted>", "radarr_api_key": "<redacted>", "radarr_url": "<redacted>", "sonarr_api_key": "<redacted>", "sonarr_url": "<redacted>" } }, { "name": "MigzImageRemoval", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "id": "chjsrPKGR", "position": { "x": 1249.6530739220775, "y": 256.2746302482324 }, "fpEnabled": true, "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_MC93_MigzImageRemoval" } }, { "name": "CheckH264", "sourceRepo": "Community", "pluginName": "checkVideoCodec", "version": "1.0.0", "id": "STdtYX6Uz", "position": { "x": 1230.3802603124673, "y": 64.9759069468966 }, "fpEnabled": true, "inputsDB": { "codec": "h264" } }, { "name": "ReorderStreams", "sourceRepo": "Community", "pluginName": "ffmpegCommandRorderStreams", "version": "1.0.0", "id": "zCPoUm97Y", "position": { "x": 1250.3866346826792, "y": 368.4893797537838 }, "fpEnabled": true }, { "name": "CleanSubs", "sourceRepo": "Community", "pluginName": "runClassicTranscodePlugin", "version": "2.0.0", "id": "nikQ2_m-M", "position": { "x": 1254.2140730609997, "y": 534.3905146082651 }, "fpEnabled": true, "inputsDB": { "pluginSourceId": "Community:Tdarr_Plugin_MC93_Migz4CleanSubs", "language": "eng,en,ces,cze,cz,slk,slo,sk" } }, { "name": "ReviewFilesize", "sourceRepo": "Community", "pluginName": "requireReview", "version": "1.0.0", "id": "huCCai3iZ", "position": { "x": 1453.365281594849, "y": 706.8664811983667 }, "fpEnabled": true }, { "name": "FilesizeRatio", "sourceRepo": "Community", "pluginName": "compareFileSizeRatio", "version": "2.0.0", "id": "fuaM-8QAs", "position": { "x": 1250.8288506657948, "y": 632.5022823009829 }, "fpEnabled": true, "inputsDB": { "lessThan": "105", "greaterThan": "70" } }, { "name": "ReviewCodec", "sourceRepo": "Community", "pluginName": "requireReview", "version": "1.0.0", "id": "DTFMwFD7e", "position": { "x": 1496.347248161808, "y": 142.39819281918466 }, "fpEnabled": true }, { "name": "Fail Flow", "sourceRepo": "Community", "pluginName": "failFlow", "version": "1.0.0", "id": "qKljJUfOC", "position": { "x": 1494.4249247324803, "y": 222.10190965590937 }, "fpEnabled": true }, { "name": "CheckAV1", "sourceRepo": "Community", "pluginName": "checkVideoCodec", "version": "1.0.0", "id": "aChUlx9if", "position": { "x": 1044.9791563079516, "y": 10.429252272318273 }, "fpEnabled": true, "inputsDB": { "codec": "av1" } }, { "name": "FFmpegBegin", "sourceRepo": "Community", "pluginName": "ffmpegCommandStart", "version": "1.0.0", "id": "NjpCAx2Ew", "position": { "x": 1526.7571611839783, "y": 297.1714054699728 }, "fpEnabled": true }, { "name": "FFmpegExecute", "sourceRepo": "Community", "pluginName": "ffmpegCommandExecute", "version": "1.0.0", "id": "ZhoIqK0Ao", "position": { "x": 1527.7571611839783, "y": 379.1714054699728 }, "fpEnabled": true } ], "flowEdges": [ { "source": "gtZCtmY-l", "sourceHandle": "1", "target": "PpLF-5jxp", "targetHandle": null, "id": "Cs5aBSUks" }, { "source": "fuaM-8QAs", "sourceHandle": "2", "target": "huCCai3iZ", "targetHandle": null, "id": "dE-DQNh1v" }, { "source": "fuaM-8QAs", "sourceHandle": "3", "target": "huCCai3iZ", "targetHandle": null, "id": "C6HFJyXla" }, { "source": "zCPoUm97Y", "sourceHandle": "1", "target": "eoWKnzTXP", "targetHandle": null, "id": "CtDyrUveh" }, { "source": "PpLF-5jxp", "sourceHandle": "1", "target": "chjsrPKGR", "targetHandle": null, "id": "uqzH-nvFB" }, { "source": "STdtYX6Uz", "sourceHandle": "1", "target": "chjsrPKGR", "targetHandle": null, "id": "OxAfx4gGH" }, { "source": "eoWKnzTXP", "sourceHandle": "1", "target": "nikQ2_m-M", "targetHandle": null, "id": "7t1vl9UOW" }, { "source": "nikQ2_m-M", "sourceHandle": "1", "target": "fuaM-8QAs", "targetHandle": null, "id": "a01Zri_ke" }, { "source": "STdtYX6Uz", "sourceHandle": "2", "target": "DTFMwFD7e", "targetHandle": null, "id": "pVL95VQ33" }, { "source": "huCCai3iZ", "sourceHandle": "1", "target": "R0gX9B20d", "targetHandle": null, "id": "XjMmZ5oBP" }, { "source": "DTFMwFD7e", "sourceHandle": "1", "target": "qKljJUfOC", "targetHandle": null, "id": "IW4yUuOFs" }, { "source": "PpLF-5jxp", "sourceHandle": "2", "target": "aChUlx9if", "targetHandle": null, "id": "yKqv0rTnu" }, { "source": "aChUlx9if", "sourceHandle": "1", "target": "chjsrPKGR", "targetHandle": null, "id": "iNLT0jTeF" }, { "source": "aChUlx9if", "sourceHandle": "2", "target": "STdtYX6Uz", "targetHandle": null, "id": "ygzMMi1dS" }, { "source": "chjsrPKGR", "sourceHandle": "1", "target": "NjpCAx2Ew", "targetHandle": null, "id": "G27skorfw" }, { "source": "chjsrPKGR", "sourceHandle": "2", "target": "NjpCAx2Ew", "targetHandle": null, "id": "H7M_fqU9x" }, { "source": "NjpCAx2Ew", "sourceHandle": "1", "target": "ZhoIqK0Ao", "targetHandle": null, "id": "ZtZCtLUxW" }, { "source": "ZhoIqK0Ao", "sourceHandle": "1", "target": "zCPoUm97Y", "targetHandle": null, "id": "UjnxDGAG1" }, { "source": "eoWKnzTXP", "sourceHandle": "2", "target": "nikQ2_m-M", "targetHandle": null, "id": "detlnS7_u" }, { "source": "nikQ2_m-M", "sourceHandle": "2", "target": "fuaM-8QAs", "targetHandle": null, "id": "Dw9AVmb07" }, { "source": "fuaM-8QAs", "sourceHandle": "1", "target": "R0gX9B20d", "targetHandle": null, "id": "dcpor_IGL" } ] }
Not sure if the logfile is uploaded correctly. Shared online: https://file.io/hStDXZjUWI7v
Fixed an issue that caused the commentary tracks to not be properly removed resulting in a loop/same arguments error.