You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Tdarr_Plugins/Community/Tdarr_Plugin_MP01_MichPasCl...

145 lines
4.9 KiB

/* eslint-disable */
const details = () => {
return {
id: "Tdarr_Plugin_MP01_MichPasCleanSubsAndAudioCodecs",
Stage: "Pre-processing",
Name: "MichPass-Remove subtitle and audio streams with certain codecs",
Type: "Any",
Operation: 'Transcode',
Description: `This plugin removed specified codecs from subtitle and audio tracks. Helpful to remove bitmap subtitles (pgs,vobsub) or audio codec (truehd), which can cause Plex to start transcoding. Based on Migz4 Plugin. Thanks \n\n`,
Version: "1.0",
Tags: "pre-processing,ffmpeg,subtitle, audio,configurable",
Inputs: [
{
name: "tag_subtitle_codecs",
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip: `Specify key words here for subtitle tracks you'd like to have removed.
\\nExample:\\n
hdmv_pgs_subtitle
\\nExample:\\n
hdmv_pgs_subtitle,dvd_subtitle`,
},
{
name: "tag_audio_codecs",
type: 'string',
defaultValue: '',
inputUI: {
type: 'text',
},
tooltip: `Specify all audio codecs you'd like to have removed.
\\nExample:\\n
truehd
\\nExample:\\n
xxx,yyy`,
},
],
};
}
// eslint-disable-next-line no-unused-vars
const plugin = (file, librarySettings, inputs, otherArguments) => {
// eslint-disable-next-line global-require
const lib = require('../methods/lib')();
// eslint-disable-next-line no-unused-vars,no-param-reassign
inputs = lib.loadDefaultValues(inputs, details);
var response = {
processFile: false,
preset: "",
container: "." + file.container,
handBrakeMode: false,
FFmpegMode: true,
reQueueAfter: false,
infoLog: "",
};
// 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;
}
// Set up required variables.
var tag_subtitle_codecs = inputs.tag_subtitle_codecs.split(",");
var tag_audio_codecs = inputs.tag_audio_codecs.split(",");
var ffmpegCommandInsert = "";
var subtitleIdx = 0;
var audioIdx = 0;
var convert = false;
// Go through each stream in the file.
for (var i = 0; i < file.ffProbeData.streams.length; i++) {
// Catch error here incase the title metadata is completely missing.
try {
// Check stream is subtitle AND stream codec contains certain words, removing these streams .
if (
file.ffProbeData.streams[i].codec_type.toLowerCase() == "subtitle" &&
tag_subtitle_codecs.indexOf(file.ffProbeData.streams[i].codec_name.toLowerCase()
) > -1
) {
ffmpegCommandInsert += `-map -0:s:${subtitleIdx} `;
response.infoLog += `☒Subtitle stream detected as unwanted. removing subtitle stream 0:s:${subtitleIdx} - ${file.ffProbeData.streams[i].tags.title} - ${file.ffProbeData.streams[i].codec_name}. \n`;
convert = true;
}
} catch (err) {}
// For debugging
// response.infoLog += `☒test tags codectype title - ${file.ffProbeData.streams[i].codec_type}. \n`;
// response.infoLog += `☒test tag name - ${file.ffProbeData.streams[i].codec_name}. \n`;
// response.infoLog += `☒test tags long name - ${file.ffProbeData.streams[i].codec_long_name}. \n`;
try {
// Check if stream is audio .
if (
file.ffProbeData.streams[i].codec_type.toLowerCase() == "audio" &&
tag_audio_codecs.indexOf(file.ffProbeData.streams[i].codec_name.toLowerCase()
) > -1
) {
ffmpegCommandInsert += `-map -0:a:${audioIdx} `;
response.infoLog += `☒audio stream detected as unwanted. removing audio stream 0:a:${audioIdx} - ${file.ffProbeData.streams[i].tags.title} - ${file.ffProbeData.streams[i].codec_name} \n`;
convert = true;
}
} catch (err) {}
// Check if stream type is audio and increment audioIdx if true.
if (file.ffProbeData.streams[i].codec_type.toLowerCase() == "audio") {
audioIdx++;
}
// Check if stream type is subtitle and increment subtitleIdx if true.
if (file.ffProbeData.streams[i].codec_type.toLowerCase() == "subtitle") {
subtitleIdx++;
}
}
// Convert file if convert variable is set to true.
if (convert === true) {
response.processFile = true;
response.preset = `, -map 0 ${ffmpegCommandInsert} -c copy -max_muxing_queue_size 4096`;
response.container = "." + file.container;
response.reQueueAfter = true;
} else {
response.processFile = false;
response.infoLog +=
"☑File doesn't contain subtitle or audio codecs which were unwanted or that require tagging.\n";
}
return response;
}
module.exports.details = details;
module.exports.plugin = plugin;