Created
June 1, 2020 08:39
-
-
Save Webreaper/d384a099f9898572a530eded8651df54 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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