function details() { return { id: "Tdarr_Plugin_MC93_Migz2CleanTitle", Stage: "Pre-processing", Name: "Migz-Clean title metadata", Type: "Video", Operation: "Clean", Description: `This plugin removes title metadata from video/audio/subtitles, if it exists. Video checking is mandatory, audio and subtitles are optional.\n\n`, Version: "1.2", Link: "https://github.com/HaveAGitGat/Tdarr_Plugins/blob/master/Community/Tdarr_Plugin_MC93_Migz2CleanTitle.js", Tags: 'pre-processing,ffmpeg,configurable', Inputs: [{ name: 'clean_audio', tooltip: `Specify if audio titles should be checked & cleaned. Optional. \\nExample:\\n true \\nExample:\\n false` }, { name: 'clean_subtitles', tooltip: `Specify if subtitle titles should be checked & cleaned. Optional. \\nExample:\\n true \\nExample:\\n false` }, ] } } function plugin(file, librarySettings, inputs) { var response = { processFile: false, preset: '', container: '.' + file.container, handBrakeMode: false, FFmpegMode: true, reQueueAfter: false, infoLog: '', } // Set up required variables. var ffmpegCommandInsert = '' var videoIdx = 0 var audioIdx = 0 var subtitleIdx = 0 var convert = false // Check if file is a video. If it isn't then exit plugin. if (file.fileMedium !== "video") { console.log("File is not video") response.infoLog += "☒File is not video \n" response.processFile = false; return response } // Check if overall file metadata title is not empty, if it's not empty set to "". if (typeof file.meta.Title != 'undefined') try { ffmpegCommandInsert += ` -metadata title="" ` convert = true } catch (err) {} // Go through each stream in the file. for (var i = 0; i < file.ffProbeData.streams.length; i++) try { // Check if stream is a video. if (file.ffProbeData.streams[i].codec_type.toLowerCase() == "video") { // Check if stream title is not empty, if it's nto empty set to "". if (typeof file.ffProbeData.streams[i].tags.title != 'undefined') { response.infoLog += `☒Video stream title is not empty, most likely junk metadata. Removing title from stream ${i} \n` ffmpegCommandInsert += ` -metadata:s:v:${videoIdx} title="" ` convert = true } // Increment videoIdx. videoIdx++ } // Check if title metadata of audio stream has more then 3 full stops. If so then it's likely to be junk metadata so remove. if (file.ffProbeData.streams[i].codec_type.toLowerCase() == "audio" && inputs.clean_audio.toLowerCase() == "true") { if (file.ffProbeData.streams[i].tags.title.split('.').length - 1 > 3) { response.infoLog += `☒More then 3 full stops detected in audio title, likely to be junk metadata. Removing title from stream ${i} \n` ffmpegCommandInsert += ` -metadata:s:a:${audioIdx} title="" ` convert = true } // Increment audioIdx. audioIdx++ } // Check if title metadata of subtitle stream has more then 3 full stops. If so then it's likely to be junk metadata so remove. if (file.ffProbeData.streams[i].codec_type.toLowerCase() == "subtitle" && inputs.clean_subtitles.toLowerCase() == "true") { if (file.ffProbeData.streams[i].tags.title.split('.').length - 1 > 3) { response.infoLog += `☒More then 3 full stops detected in subtitle title, likely to be junk metadata. Removing title from stream ${i} \n` ffmpegCommandInsert += ` -metadata:s:s:${subtitleIdx} title="" ` convert = true } // Increment subtitleIdx. subtitleIdx++ } } catch (err) {} // Convert file if convert variable is set to true. if (convert == true) { response.infoLog += "☒File has title metadata. Removing \n" response.preset = `,${ffmpegCommandInsert} -c copy -map 0 -max_muxing_queue_size 4096` response.reQueueAfter = true; response.processFile = true; } else { response.infoLog += "☑File has no title metadata \n" } return response } module.exports.details = details; module.exports.plugin = plugin;