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!
- anyámtyúkja.srt
- anyámtyúkja-hu.srt
- anyámtyúkja-hun.srt
- anyámtyúkja-en.srt
- anyámtyúkja-eng.srt
#!/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
find . -type f -iname '*.avi' -print0 | while read -rd $'\0' f
- 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.
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. ]]>
megint egy jó kis poszt volt.
handbreak-et használom ezer éve, a többi nem kell.
de azért tanultam megint 🙂
Már megérte megcsinálni a scriptet 🙂