1.0.19 - Modernization, removing features, adding features...

- #15 - Supports multi-language (set language setting to: `<language_code>,<language_code>` for multi-language format)
- Removed MKVCLEANER feature, SMA is able to accomplish the same tasks.
- Script code cleanup and simplification
master
RandomNinjaAtk 2 years ago committed by GitHub
parent f2d2661841
commit ed67f98fd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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 $?

Loading…
Cancel
Save