Mac workflow: HandBrake gyípaci

Preface: mielőtt szerzői jogos hisztibe kezdene bárki – az alábbi post természetesen a saját, avi-ba konvertált, ám korábban legálisan vásárolt DVD gyűjteményem transzkódolásáról szól. Na ugorgyunk! A tegnapi házimozis workflowból kimaradt az eFis bonus: a coder véremnek muszáj hozzátennie valamit a media centeres Nirvánához. Miután egy Perl-ben írt batch DVD konverter scriptet találtam még tegnap este a HandBrake-hez (az van linkelve az előző post-ba), agyaltam egy kicsit tovább, hogy hogy lehetne a kényelmet fokozni. Jöttek egyre vadabb ötletek, amikből készült egy röpke feature lista, aztán ern0 barátomtól jól eltanulva nagy lendülettel dobáltam ki a fancybbnél fancybb dolgokat belőle. Ennek az lett az eredménye, hogy három Excel makró tesztfutás közben megírtam egy scriptet ajándékba. Elmesélem, hogy miket dobált elő az agyam implementálandó featureként. Az alapötlet az volt, hogy csinálok egy HandBrakeCLI-t hajtó shell scriptet, ami kihasználja a 0.9.4-es release soft subtitle opcióját és jól belegyógyítja a felirat{ok}at a transzkódolt mp4 fileokba. Ez volt a bázis, innen jött az így utólag szerintem tanulságos agymenés:

  • A HandBrakeCLI csak SRT feliratokat támogat. Nem minden felirat SRT, úgyhogy jó lenne a többi, non-SRT feliratot SRT formátumúra konvertálni.
  • Ha már ilyen okos feliratkitalációs script lesz, akkor miért ne találná ki magától, hogy milyen nyelvű a felirat?! Mi sem egyszerűbb, a Google Translate tud ilyet, van is demo oldal a language detectionról!
  • Biztos lesz egy csomó avi, amihez nem lesz felirat – ezekhez de jó lenne automatikusan keresni a neten! Hopsz, az opensubtitles.org-nak pont nyitott az API-ja, majd használjuk azt jól!
Miután ern0s vehemenciával kihúztam három izmos dolgot, elkezdtem agyalni, hogy azért valami okosság csak kellene egy rekurzív find híváson túl. Így jött az ötlet, hogy a script megkeresi, hogy van-e az avi file-ok mellé felirat és ha van, akkor bele is rámoltatja őket a készülő mp4-be. Az algoritmus azt feltételezi, hogy a HandBrakeCLI számára használható subtitle file-ok .srt kiterjesztésűek, bázisnevük (=basename) megegyezik az avi file nevével, illetve opcionálisan a bázisnév kiegészülhetett {-en|-eng} és {-hu|-hun} tagokkal. Magyarul mondva egy példán keresztül az anyámtyúkja.avi-hoz az alábbi subtitle file-okat találja meg a script:
  • anyámtyúkja.srt
  • anyámtyúkja-hu.srt
  • anyámtyúkja-hun.srt
  • anyámtyúkja-en.srt
  • anyámtyúkja-eng.srt
A basename végéhez csapott utótag alapján dönti el a script, hogy a felirat angol vagy magyar nyelvű-e és ennek megfelelően ISO-8859-1, illetve Windows-1250 codepage-dzsel renderelteti bele a készítendő mp4 file-ba. Amennyiben az avi basename-mel megegyező nevű (=utótag nélküli) feliratfile-t talál, azt magyarnak tekinti. Az alábbi scriptben csak három darab echo szerepel, hogy a transzkódolás megindítása nélkül kipróbálhasd a scriptet – ha transzkódoltatni akarsz, az echo-kat értelemszerűen dobáld ki. A kis minimalista toolt fds Mester lektorálta, amiért ezúton is jár a hála és a köszönet. Have fun:
#!/bin/sh
#
# Handbrake gyipaci
# lmdate 2010.07.05
#
# Végigmegy rekurzívan egy könytáron és megkeresi a filmcim-hu{n}.srt, filmcim-en{g}.srt feliratfile-okat,
# aztán ha igazán akarod, csinál neked soft subtitle-os mp4-eket az avi-jaidból.
#
# A script feltételezi, hogy ha csak egy, az avi file-lal megegyező nevű srt file-t talál, akkor abban magyar
# subtitle lakik.
#
getsubs() {
	film="$*"
	base="${film%.*}"
	srt="$base".srt
	hu="$base"-hu.srt
	hun="$base"-hun.srt
	en="$base"-en.srt
	eng="$base"-eng.srt
	srthuc=0
	srthu=""
	if [ -e "$srt" ];	then
		srthuc=1
		srthu="$srt"
	elif [ -e "$hu" ]; then
		srthuc=1
		srthu="$hu"
	elif [ -e "$hun" ]; then
		srthuc=1
		srthu="$hun"
	fi
	srtenc=0
	srten=""
	if [ -e "$en" ]; then
		srtenc=1
		srten="$en"
	elif [ -e "$eng" ]; then
		srtenc=1
		srten="$eng"
	fi
	let srtc=$srthuc+$srtenc
	srtfiles=""
	srtcodes=""
	srtlangs=""
	case $srtc in
		0 ) ;;
		1 )
			if [ -s "$srthu" ]; then
				srtfiles="$srthu"
				srtcodes="WINDOWS-1250"
				srtlangs="hun"
			else
				srtfiles="$srten"
				srtcodes="ISO-8859-1"
				srtlangs="eng"
			fi
			;;
		2 )
			srtfiles="$srthu","$srten"
			srtcodes="WINDOWS-1250,ISO-8859-1"
			srtlangs="hun,eng"
			;;
	esac
	if [ $srtc -ne 0 ]; then
		echo Found $srtc subtitles:
		echo "$srtfiles"
		echo "$srtcodes"
		echo "$srtlangs"
	else
		echo No subtitles found.
	fi
	case $srtc in
		0 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha felirat nélkül is konvertálnál
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium
			;;
		1 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha konvertálnád a home videód akkor is, ha csak a default magyar felirat van meg hozzá
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
			;;
		2 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha konvertálnád a home videód mind az angol, mind a magyar felirat birtokában a kétnyelvű családod számára
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
		 ;;
	esac
	return
}
find . -type f -iname '*.avi' -print0 | while read -rd $'\0' f
do
	getsubs ${f}
	echo .
done
Végül, de nem utolsósorban kiemelnék pár apró tuningot, mely a Mester nélkül nem került volna a scriptbe:
find . -type f -iname '*.avi' -print0 | while read -rd $'\0' f
A bash-ba intergrált read parancs -rd $’\0′ paramétere az egyik szépség:
  • A -r nem hagyja az escape karaktereknek a “szökést”, azaz pl. az Anyám\Tyúkja.avi filenéven sem bukik el a find.
  • A -d $’\0′ pedig egy nulla byte-ot deklarál delimiternek, így egy buzi \n sem okoz{na} gondot a filenévben.
Szintén a Mestertől jött, hogy a magyar feliratfile-oknak ne ISO-8859-2 codepage-et definiáljak, hanem jobb lesz helyette a Windows-1250 (btw a használható codepage-ek listáját egy iconv -l mondja meg, ahogy arról a HandBrakeCLI -h is említést tesz). Ahogy ő indokolja:
ISO-8859-2-ben nincs pl „ ” vagy …
Jogos. ]]>

2 thoughts on “Mac workflow: HandBrake gyípaci

  1. adrianszpi

    megint egy jó kis poszt volt.
    handbreak-et használom ezer éve, a többi nem kell.
    de azért tanultam megint 🙂

    Reply

Leave a Reply to adrianszpi Cancel reply

Your email address will not be published. Required fields are marked *