@ -2,20 +2,24 @@
export LC_ALL = C.UTF-8
export LANG = C.UTF-8
TITLESHORT = "VPP"
scriptVersion = 1.0.18
scriptVersion = 1.0.19
set -e
set -o pipefail
touch "/config/scripts/logs/video-pp.txt"
chmod 666 "/config/scripts/logs/video-pp.txt"
exec & > >( tee -a "/config/scripts/logs/video-pp.txt" )
function Configuration {
log " ##### SABnzbd Job: $jobname "
log " ##### SABnzbd Category: $category "
log " ##### DOCKER: $TITLE "
log " ##### SCRIPT: Video Post Processor ($TITLESHORT ) "
log " ##### SCRIPT VERSION: $scriptVersion "
log " ##### DOCKER VERSION: $VERSION "
log "##### CONFIGURATION VERIFICATION "
log " SABnzbd Job: $jobname "
log " SABnzbd Category: $category "
log " DOCKER: $TITLE "
log " DOCKER VERSION: $VERSION "
log " SCRIPT: Video Post Processor ($TITLESHORT ) "
log " CONFIGURATION VERIFICATION "
log "##### ##################### "
log " $TITLESHORT : Required Audio/Subtitle Language: ${ VIDEO_LANG } "
if [ ${ VIDEO_MKVCLEANER } = TRUE ] ; then
@ -44,7 +48,7 @@ function Configuration {
function log {
m_time = ` date "+%F %T" `
echo $m_time " "$1
echo $m_time " :: $scriptVersion :: "$1
}
@ -57,12 +61,6 @@ function Main {
Configuration
if [ ${ VIDEO_SMA } = TRUE ] ; then
touch " $1 /sma-conversion-check "
elif [ ${ VIDEO_MKVCLEANER } = TRUE ] ; then
touch " $1 /sma-conversion-check "
fi
# check for video files
if find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" | read; then
sleep 0.1
@ -71,329 +69,85 @@ function Main {
exit 1
fi
filecount = $( find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" | wc -l)
log " Processing ${ filecount } video files... "
count = 0
find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" -print0 | while IFS = read -r -d '' video; do
fileCount = $( find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" | wc -l)
log " Processing ${ fileCount } video files... "
find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" -print0 | while IFS = read -r -d '' file; do
count = $(( $count + 1 ))
log ""
log "===================================================="
basefilename = " ${ video %.* } "
filename = " $( basename " $video " ) "
extension = " ${ filename ##*. } "
log " Begin processing $count of $filecount : $filename "
log "Checking for audio/subtitle tracks"
tracks = $( ffprobe -v quiet -print_format json -show_streams " $video " )
if [ ! -z " ${ tracks } " ] ; then
# video tracks
VideoTrack = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"video\") | .index" )
VideoTrackCount = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"video\") | .index" | wc -l)
# video preferred language
VideoTrackLanguage = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"video\") | select(.tags.language==\" ${ VIDEO_LANG } \") | .index " )
# audio tracks
AudioTracks = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | .index" )
AudioTracksCount = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | .index" | wc -l)
# audio preferred language
AudioTracksLanguage = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"audio\") | select(.tags.language==\" ${ VIDEO_LANG } \") | .index " )
AudioTracksLanguageCount = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"audio\") | select(.tags.language==\" ${ VIDEO_LANG } \") | .index " | wc -l)
AudioTracksLanguageFound = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | .tags.language" )
# audio unkown laguage
AudioTracksLanguageUND = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | select(.tags.language==\"und\") | .index" )
AudioTracksLanguageUNDCount = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | select(.tags.language==\"und\") | .index" | wc -l)
AudioTracksLanguageNull = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | select(.tags.language==null) | .index" )
AudioTracksLanguageNullCount = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"audio\") | select(.tags.language==null) | .index" | wc -l)
# audio foreign language
AudioTracksLanguageForeignCount = $( echo " ${ tracks } " | jq " .streams[] | select(.codec_type==\"audio\") | select(.tags.language!=\" ${ VIDEO_LANG } \") | .index " | wc -l)
# subtitle tracks
SubtitleTracks = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"subtitle\") | .index" )
SubtitleTracksCount = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"subtitle\") | .index" | wc -l)
# subtitle preferred langauge
SubtitleTracksLanguage = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"subtitle\") | select(.tags.language==\" ${ VIDEO_LANG } \") | .index " )
SubtitleTracksLanguageCount = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"subtitle\") | select(.tags.language==\" ${ VIDEO_LANG } \") | .index " | wc -l)
SubtitleTracksLanguageFound = $( echo " ${ tracks } " | jq -r ".streams[] | select(.codec_type==\"subtitle\") | .tags.language" )
# check for forced subs
SubtitleTracksLanguageForced = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"subtitle\") | select(.tags.language==\" ${ VIDEO_LANG } \") | select(.disposition.forced== " 1") | .index" )
SubtitleTracksLanguageForcedCount = $( echo " ${ tracks } " | jq -r " .streams[] | select(.codec_type==\"subtitle\") | select(.tags.language==\" ${ VIDEO_LANG } \") | select(.disposition.forced== " 1") | .index" | wc -l)
else
log "ERROR: ffprobe failed to read tracks and set values"
rm " $video " && log " INFO: deleted: $video "
fi
# Check for video track
if [ -z " ${ VideoTrack } " ] ; then
log "ERROR: no video track found"
rm " $video " && log " INFO: deleted: $filename "
continue
else
log " $VideoTrackCount video track found! "
fi
# Check for audio track
if [ -z " ${ AudioTracks } " ] ; then
log "ERROR: no audio tracks found"
rm " $video " && log " INFO: deleted: $filename "
continue
else
log " $AudioTracksCount audio tracks found! "
fi
# Check for audio track
if [ ! -z " ${ SubtitleTracks } " ] ; then
log " $SubtitleTracksCount subtitle tracks found! "
fi
log " Checking for \" ${ VIDEO_LANG } \" video/audio/subtitle tracks "
if [ ! -z " $AudioTracksLanguage " ] || [ ! -z " $SubtitleTracksLanguage " ] ; then
if [ ! -z " ${ AudioTracksLanguage } " ] ; then
log " $AudioTracksLanguageCount \" ${ VIDEO_LANG } \" audio track found! "
fi
if [ ! -z " ${ SubtitleTracksLanguage } " ] ; then
log " $SubtitleTracksLanguageCount \" ${ VIDEO_LANG } \" subtitle track found! "
fi
if [ ! -z " ${ SubtitleTracksLanguageForced } " ] ; then
log " $SubtitleTracksLanguageForcedCount \" ${ VIDEO_LANG } \" forced subtitle track found! "
fi
else
if [ ${ VIDEO_MKVCLEANER } = TRUE ] || [ ${ VIDEO_SMA } = TRUE ] ; then
if [ ! -z " $AudioTracksLanguageUND " ] || [ ! -z " $AudioTracksLanguageNull " ] ; then
if [ ! -z " ${ AudioTracksLanguageUND } " ] ; then
log " $AudioTracksLanguageUNDCount \"und\" audio tracks found! "
fi
if [ ! -z " ${ AudioTracksLanguageNull } " ] ; then
log " $AudioTracksLanguageNullCount \"unknown\" audio tracks found! "
fi
else
log " ERROR: No \" ${ VIDEO_LANG } \" or \"Unknown\" audio tracks found... "
log " ERROR: No \" ${ VIDEO_LANG } \" subtitle tracks found... "
rm " $video "
log " INFO: deleted: $filename "
continue
fi
elif [ " ${ RequireLanguage } " = "true" ] ; then
log " ERROR: No \" ${ VIDEO_LANG } \" audio or subtitle tracks found... "
rm " $video "
log " INFO: deleted: $filename "
continue
fi
fi
if [ ${ VIDEO_MKVCLEANER } = TRUE ] ; then
log "Begin processing with MKV Cleaner..."
log " Checking for \" ${ VIDEO_LANG } \" video/audio/subtitle tracks "
# Check for unwanted audio tracks and remove/re-label as needed...
if [ ! -z " $AudioTracksLanguage " ] || [ ! -z " $AudioTracksLanguageUND " ] || [ ! -z " $AudioTracksLanguageNull " ] ; then
if [ $AudioTracksCount -ne $AudioTracksLanguageCount ] ; then
RemoveAudioTracks = "true"
if [ ! -z " $AudioTracksLanguage " ] ; then
MKVaudio = " -a ${ VIDEO_LANG } "
log " $AudioTracksLanguageCount audio tracks found! "
unwantedaudiocount = $(( $AudioTracksCount - $AudioTracksLanguageCount ))
if [ $AudioTracksLanguageCount -ne $AudioTracksCount ] ; then
unwantedaudio = "true"
fi
elif [ ! -z " $AudioTracksLanguageUND " ] ; then
for I in $AudioTracksLanguageUND
do
OUT = $OUT " -a $I --language $I : ${ VIDEO_LANG } "
done
MKVaudio = " $OUT "
log " $AudioTracksLanguageUNDCount \"unknown\" audio tracks found, re-tagging as \" ${ VIDEO_LANG } \" "
unwantedaudiocount = $(( $AudioTracksCount - $AudioTracksLanguageUNDCount ))
if [ $AudioTracksLanguageUNDCount -ne $AudioTracksCount ] ; then
unwantedaudio = "true"
fi
elif [ ! -z " $AudioTracksLanguageNull " ] ; then
for I in $AudioTracksLanguageNull
do
OUT = $OUT " -a $I --language $I : ${ VIDEO_LANG } "
done
MKVaudio = " $OUT "
log " $AudioTracksLanguageNullCount \"unknown\" audio tracks found, re-tagging as \" ${ VIDEO_LANG } \" "
unwantedaudiocount = $(( $AudioTracksCount - $AudioTracksLanguageNullCount ))
if [ $AudioTracksLanguageNullCount -ne $AudioTracksCount ] ; then
unwantedaudio = "true"
fi
fi
else
log " $AudioTracksLanguageCount audio tracks found! "
RemoveAudioTracks = "false"
MKVaudio = ""
fi
elif [ -z " $SubtitleTracksLanguage " ] ; then
if [ ! -z " ${ AudioTracks } " ] ; then
log " INFO: ${ AudioTracksLanguageFound } audio track found! "
fi
if [ ! -z " ${ SubtitleTracks } " ] ; then
log " INFO: ${ SubtitleTracksLanguageFound } subtitle track found! "
fi
log " ERROR: no \" ${ VIDEO_LANG } \" audio/subtitle tracks found! "
# rm "$video" && echo "INFO: deleted: $filename"
exit 1
else
foreignaudio = "true"
RemoveAudioTracks = "false"
MKVaudio = ""
fi
# Check for unwanted subtitle tracks...
if [ ! -z " $SubtitleTracks " ] ; then
if [ $SubtitleTracksCount -ne $SubtitleTracksLanguageCount ] ; then
RemoveSubtitleTracks = "true"
MKVSubtitle = " -s ${ VIDEO_LANG } "
if [ ! -z " $SubtitleTracksLanguage " ] ; then
log " $SubtitleTracksLanguageCount subtitle tracks found! "
fi
unwantedsubtitlecount = $(( $SubtitleTracksCount - $SubtitleTracksLanguageCount ))
if [ $SubtitleTracksLanguageCount -ne $SubtitleTracksCount ] ; then
unwantedsubtitle = "true"
fi
else
log " $SubtitleTracksLanguageCount subtitle tracks found! "
RemoveSubtitleTracks = "false"
MKVSubtitle = ""
fi
else
RemoveSubtitleTracks = "false"
MKVSubtitle = ""
fi
# Correct video language, if needed...
if [ -z " $VideoTrackLanguage " ] ; then
if [ ! -z " $AudioTracksLanguage " ] || [ ! -z " $AudioTracksLanguageUND " ] || [ ! -z " $AudioTracksLanguageNull " ] ; then
SetVideoLanguage = "true"
if [ " ${ RemoveAudioTracks } " = true ] || [ " ${ RemoveSubtitleTracks } " = true ] ; then
log " $VideoTrackCount \"unknown\" video language track found, re-tagging as \" ${ VIDEO_LANG } \" "
fi
MKVvideo = " -d ${ VideoTrack } --language ${ VideoTrack } : ${ VIDEO_LANG } "
else
foreignvideo = "true"
SetVideoLanguage = "false"
MKVvideo = ""
fi
else
log " $VideoTrackCount video track found! "
SetVideoLanguage = "false"
MKVvideo = ""
fi
# Display foreign audio track counts
if [ " $foreignaudio " = true ] || [ " $foreignvideo " = true ] ; then
log "Checking for \"foreign\" audio/video tracks"
if [ " $foreignvideo " = true ] ; then
log " $VideoTrackCount video track found! "
foreignvideo = "false"
fi
if [ " $foreignaudio " = true ] ; then
log " $AudioTracksLanguageForeignCount audio tracks found! "
foreignaudio = "false"
fi
fi
# Display unwanted audio/subtitle track counts
if [ " $unwantedaudio " = true ] || [ " $unwantedsubtitle " = true ] ; then
log " Checking for unwanted \"not: ${ VIDEO_LANG } \" audio/subtitle tracks "
if [ " $unwantedaudio " = true ] ; then
log " $unwantedaudiocount audio tracks to remove... "
unwantedaudio = "false"
fi
if [ " $unwantedsubtitle " = true ] ; then
log " $unwantedsubtitlecount subtitle tracks to remove... "
unwantedsubtitle = "false"
fi
fi
skip = "false"
if [ " ${ RemoveAudioTracks } " = false ] && [ " ${ RemoveSubtitleTracks } " = false ] ; then
if find " $video " -type f -iname "*.mkv" | read; then
log "INFO: Video passed all checks, no processing needed"
touch " $video "
if [ ${ VIDEO_SMA } = TRUE ] ; then
skip = "true"
fi
else
log "INFO: Video passed all checks, but is in the incorrect container, repackaging as mkv..."
MKVvideo = " -d ${ VideoTrack } --language ${ VideoTrack } : ${ VIDEO_LANG } "
MKVaudio = " -a ${ VIDEO_LANG } "
MKVSubtitle = " -s ${ VIDEO_LANG } "
fi
fi
if [ $skip = false ] ; then
if mkvmerge --no-global-tags --title "" -o " ${ basefilename } .merged.mkv " ${ MKVvideo } ${ MKVaudio } ${ MKVSubtitle } " $video " ; then
log "SUCCESS: mkvmerge complete"
log " INFO: Options used: ${ MKVvideo } ${ MKVaudio } ${ MKVSubtitle } "
# cleanup temp files and rename
mv " $video " " $video .original " && log "INFO: Renamed source file"
mv " ${ basefilename } .merged.mkv " " ${ basefilename } .mkv " && log "INFO: Renamed temp file"
rm " $video .original " && log "INFO: Deleted source file"
extension = "mkv"
else
log "ERROR: mkvmerge failed"
rm " $video " && log " INFO: deleted: $video "
rm " ${ basefilename } .merged.mkv " && log " INFO: deleted: ${ basefilename } .merged.mkv "
continue
baseFileName = " ${ file %.* } "
fileName = " $( basename " $file " ) "
extension = " ${ fileName ##*. } "
log " $count of $fileCount :: Processing $fileName "
videoData = $( ffprobe -v quiet -print_format json -show_streams " $file " )
videoAudioLanguages = $( echo " ${ videoData } " | jq -r ".streams[] | select(.codec_type==\"audio\") | .tags.language" )
videoAudioTracksCount = $( echo " ${ videoData } " | jq -r ".streams[] | select(.codec_type==\"audio\") | .index" | wc -l)
videoSubtitleLanguages = $( echo " ${ videoData } " | jq -r ".streams[] | select(.codec_type==\"subtitle\") | .tags.language" )
videoSubtitleTracksCount = $( echo " ${ videoData } " | jq -r ".streams[] | select(.codec_type==\"subtitle\") | .index" | wc -l)
log " $count of $fileCount :: $videoAudioTracksCount Audio Tracks Found! "
log " $count of $fileCount :: $videoSubtitleTracksCount Subtitle Tracks Found! "
# Language Check
log " $count of $fileCount :: Checking for preferred languages \" $VIDEO_LANG \" "
preferredLanguage = false
IFS = ',' read -r -a filters <<< " $VIDEO_LANG "
for filter in " ${ filters [@] } "
do
videoAudioTracksLanguageCount = $( echo " ${ videoData } " | jq -r " .streams[] | select(.codec_type==\"audio\") | select(.tags.language==\" ${ filter } \") | .index " | wc -l)
videoSubtitleTracksLanguageCount = $( echo " ${ videoData } " | jq -r " .streams[] | select(.codec_type==\"subtitle\") | select(.tags.language==\" ${ filter } \") | .index " | wc -l)
log " $count of $fileCount :: $videoAudioTracksLanguageCount \" $filter \" Audio Tracks Found! "
log " $count of $fileCount :: $videoSubtitleTracksLanguageCount \" $filter \" Subtitle Tracks Found! "
if [ " $preferredLanguage " = = "false" ] ; then
if echo " $videoAudioLanguages " | grep -i " $filter " | read; then
preferredLanguage = true
elif echo " $videoSubtitleLanguages " | grep -i " $filter " | read; then
preferredLanguage = true
fi
fi
done
if [ " $preferredLanguage " = = "false" ] ; then
log " $count of $fileCount :: ERROR :: No matching languages found in $(( $videoAudioTracksCount + $videoSubtitleTracksCount )) Audio/Subtitle tracks "
rm " $file " && log " INFO: deleted: $fileName "
fi
if [ ${ VIDEO_SMA } = TRUE ] ; then
if [ -f " ${ basefilename } . ${ extension } " ] ; then
if [ -f " $file " ] ; then
if [ -f /usr/local/sma/config/sma.log ] ; then
rm /usr/local/sma/config/sma.log
fi
# use forced config if found
if [ -f " /config/scripts/configs/ $5 -sma-forced.ini " ] ; then
if [ ! -z " ${ SubtitleTracksLanguageForced } " ] ; then
smaconfig = " /config/scripts/configs/ $5 -sma-forced.ini "
log " $count of $fileCount :: Processing with SMA... "
if [ -f " /config/scripts/configs/ $5 -sma.ini " ] ; then
# Manual run of Sickbeard MP4 Automator
if python3 /usr/local/sma/manual.py --config " /config/scripts/configs/ $5 -sma.ini " -i " $file " $tagging ; then
log " $count of $fileCount :: Complete! "
else
smaconfig = " /config/scripts/configs/ $5 -sma.ini "
log " $count of $fileCount :: ERROR :: SMA Processing Error "
rm " $file " && log " INFO: deleted: $fileName "
fi
else
smaconfig = " /config/scripts/configs/ $5 -sma.ini "
log " $count of $fileCount :: ERROR :: SMA Processing Error "
log " $count of $fileCount :: ERROR :: \"/config/scripts/configs/ $5 -sma.ini\" configuration file is missing... "
rm " $file " && log " INFO: deleted: $fileName "
fi
log "===START SMA"
# Manual run of Sickbeard MP4 Automator
if python3 /usr/local/sma/manual.py --config " $smaconfig " -i " ${ basefilename } . ${ extension } " $tagging ; then
sleep 0.01
else
log "ERROR: SMA Processing Error"
rm " $video " && log " INFO: deleted: $filename "
fi
log "===STOP SMA"
fi
fi
log " Processing complete for: ${ filename } ! "
done
log " $count of $fileCount :: Processing complete for: ${ fileName } ! "
if [ ${ VIDEO_SMA } = TRUE ] || [ ${ VIDEO_MKVCLEANER } = TRUE ] ; then
find " $1 " -type f ! -newer " $1 /sma-conversion-check " ! -name "sma-conversion-check" -delete
# check for video files
if find " $1 " -type f -regex ".*/.*\.\(mkv\|mp4\)" | read; then
log "Post Processing Complete!"
else
log "ERROR: Post Processing failed, no video files found..."
exit 1
fi
if [ -f " $1 /sma-conversion-check " ] ; then
rm " $1 /sma-conversion-check "
fi
done
if find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" | read; then
duration = $SECONDS
echo " Post Processing Completed in $(( $duration / 60 )) minutes and $(( $duration % 60 )) seconds! "
else
if find " $1 " -type f -regex ".*/.*\.\(wmv\|mkv\|mp4\|avi\)" | read; then
log "Post Processing Complete!"
else
log "ERROR: Post Processing failed, no video files found..."
exit 1
fi
log "ERROR :: Post Processing failed, no video files found..."
exit 1
fi
duration = $SECONDS
echo " Post Processing Completed in $(( $duration / 60 )) minutes and $(( $duration % 60 )) seconds! "
}
Main " $@ " | tee -a /config/scripts/logs/video-pp.log
chmod 666 /config/scripts/logs/video-pp.log
chown abc:abc /config/scripts/logs/video-pp.log
Main " $@ "
exit $?