#!/bin/bash # Includes . $(miniade) || { echo "${0##*/}: ERROR: miniade failed (hint: run 'miniade' to see error)" >&2; exit 1; } # Configurable stuff # PASS#1: report unknowns only # PASS#2: drop data streams # PASS#3: convert subtitles to srt or leave them alone if bitmaps and change container to mkv PASS=3 # Other globals main() { while read F; do #echo "${F##*/} ..." if ! [[ $F =~ \.mp4$ ]]; then notanmp4 "$F" continue fi SUBTITLE_TYPE="$(ffmpeg -nostdin -i "$F" 2>&1 | grep Stream | egrep -v 'Stream #[0-9]+:[0-9]+(\(...\)|): (Audio|Video):' | paste -s -d' ')" #echo "[$SUBTITLE_TYPE]" if [[ X$SUBTITLE_TYPE = X ]]; then nosubs "$F" elif [[ $SUBTITLE_TYPE =~ .*\ Data:\ (bin_data|none)\ .* ]]; then dropdata "$F" elif [[ $SUBTITLE_TYPE =~ ^\ \ \ \ Stream\ \#0:[0-9]+(\([a-z]{3}\)|):\ Subtitle:\ mov_text\ \(tx3g\ /\ 0x67337874\).*$ ]]; then srtcompat "$F" elif [[ $SUBTITLE_TYPE =~ ^\ \ \ \ Stream\ \#0:[0-9]+(\([a-z]{3}\)|):\ Subtitle:\ dvd_subtitle\ \(mp4s\ /\ 0x7334706D\).*$ ]]; then copycompat "$F" else #echo "$F: $SUBTITLE_TYPE" unknown "$F" fi done } nosubs() { : } notanmp4() { echo "$1: not an mp4!" } srtcompat() { if [ $PASS = 1 ]; then : elif [ $PASS = 2 ]; then : elif [ $PASS = 3 ]; then SRC=$1 BN="${1##*/}" DN="${1%/*}" $SIMULATE_FLAG || echo "$BN ..." miniade_evaler "mv \"$SRC\" /mnt/done" miniade_evaler "ffmpeg -nostdin -loglevel fatal -i \"/mnt/done/$BN\" -map 0:v -map 0:a -map 0:s? -vcodec copy -acodec copy -scodec srt \"${SRC%.mp4}.mkv\"" fi } copycompat() { if [ $PASS = 1 ]; then : elif [ $PASS = 2 ]; then : elif [ $PASS = 3 ]; then SRC=$1 BN="${1##*/}" DN="${1%/*}" $SIMULATE_FLAG || echo "$BN ..." miniade_evaler "mv \"$SRC\" /mnt/done" miniade_evaler "ffmpeg -nostdin -loglevel fatal -i \"/mnt/done/$BN\" -map 0:v -map 0:a -map 0:s? -vcodec copy -acodec copy -scodec copy \"${SRC%.mp4}.mkv\"" fi } dropdata() { if [ $PASS = 1 ]; then : elif [ $PASS = 2 ]; then SRC=$1 BN="${1##*/}" DN="${1%/*}" $SIMULATE_FLAG || echo "$BN ..." miniade_evaler "mv \"$SRC\" /mnt/done" # '?' on '-map 0:s?' means don't cause fatal error if no subtitles. miniade_evaler "ffmpeg -nostdin -loglevel fatal -i \"/mnt/done/$BN\" -map 0:v -map 0:a -map 0:s? -vcodec copy -acodec copy -scodec copy -map_chapters -1 \"$SRC\"" elif [ $PASS = 3 ]; then : fi } unknown() { echo "$1: unknown subtitle stream combination" } main "$@"