Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Webreaper/d384a099f9898572a530eded8651df54 to your computer and use it in GitHub Desktop.
Save Webreaper/d384a099f9898572a530eded8651df54 to your computer and use it in GitHub Desktop.
function details() {
return {
id: "Tdarr_Plugin_4000kbps_h264_conversion",
Stage: "Pre-processing",
Name: "TheRealShadoh FFmpeg Subs Medium, video MP4, audio AAC, keep subs. ",
Type: "Video",
Description: `[Contains built-in filter] This plugin transcodes into H264 using FFmpeg's 'Medium' preset if the file is > 4000kbps, regardless of input codec. It maintains all subtitles. It removes metadata (if a title exists), and maintains all audio tracks. The output container is MP4. \n\n
`,
Version: "1.00",
Link: "blah",
Tags:'pre-processing,ffmpeg,h264',
}
}
function plugin(file) {
//Must return this object
var response = {
processFile : false,
preset : '',
container : '.mp4',
handBrakeMode : false,
FFmpegMode : false,
reQueueAfter : false,
infoLog : '',
}
if (file.fileMedium !== "video"){
console.log("File is not video")
response.infoLog += "☒File is not video \n"
response.processFile = false;
return response
} else {
var min_bitrate = 4000000 //4000kbps , tdarr will not transcode if the file's bitrate is lower than this amount.
var jsonString = JSON.stringify(file)
var hasSubs = false
var bitrate = 0
var codec_name = ''
for (var i = 0; i < file.ffProbeData.streams.length; i++)
{
try {
let streamData = file.ffProbeData.streams[i];
if (file.ffProbeData.streams[i].codec_type == 'video'){
codec_name = file.ffProbeData.streams[i].codec_name
bitrate = file.ffProbeData.streams[i].bit_rate
}
if(streamData.codec_type.toLowerCase() == "subtitle" && streamData.codec_name != "mov_text"){
hasSubs = true
}
} catch (err) { }
}
response.infoLog += "Info: Codec = " + codec_name + ", Bit Rate = " + (bitrate / 1000) + " \n"
if(codec_name != 'h264'){
response.infoLog += "☒File is not in h264! (codec: " + codec_name + ") \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset medium -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}else{
response.infoLog += "☑File is already in h264! \n"
}
if( bitrate == undefined || bitrate == 0 ) {
response.infoLog += `No bitrate for this file. Checking size. \n`
// Bigger than 5GB? Re-encode
if( file.file_size / 1000 > 5 )
{
response.infoLog += "☒File size (" + (file.file_size / 1000) + "GB) exceeds 5GB so will be re-encoded! \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset medium -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
} else {
response.infoLog += "☒File size (" + (file.file_size / 1000) + "GB) under 5GB so nothing to do! \n"
}
}else {
if (bitrate > min_bitrate) {
response.infoLog += "☒File bitrate (" + (bitrate / 1000) + "kbps) exceeds max bitrate (" + (min_bitrate / 1000) + "kbps) so will be re-encoded! \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v libx264 -preset medium -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}else{
response.infoLog += "☑File bitrate (" + bitrate + "kbps) is less than max bitrate (" + min_bitrate + "kbps), so nothing to do.\n"
}
}
///
if((file.meta.Title != undefined) && !jsonString.includes("aac") && hasSubs){
response.infoLog += "☒File has title metadata and no aac and subs \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}
if(!jsonString.includes("aac") && hasSubs){
response.infoLog += "☒File has no aac track and has subs \n"
response.preset = ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}
if(file.meta.Title != undefined && hasSubs){
response.infoLog += "☒File has title and has subs \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}
///
if(file.meta.Title != undefined ){
response.infoLog += "☒File has title metadata \n"
response.preset = ', -map_metadata -1 -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}else{
response.infoLog += "☑File has no title metadata \n"
}
if(!jsonString.includes("aac")){
response.infoLog += "☒File has no aac track \n"
response.preset = ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a aac -c:s mov_text'
response.reQueueAfter = true;
response.processFile = true;
response.FFmpegMode = true
return response
}else{
response.infoLog += "☑File has aac track \n"
}
if(hasSubs){
response.infoLog += "☒File has incompatible subs \n"
response.preset = ', -map 0:v -map 0:s? -map 0:a -c:v copy -c:a copy -c:s mov_text'
response.processFile = true;
response.FFmpegMode = true
return response
}else{
response.infoLog += "☑File has no/compatible subs \n"
}
response.infoLog += "☑File meets conditions! \n"
return response
}
}
module.exports.details = details;
module.exports.plugin = plugin;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment