Blog o webu a IT.
Znáte to: je zkouškové, večer před zkouškou a hledáte jakoukoliv příležitost prokrastinace. Rozhodnete se, že ještě než začnete s učením, tak byste si mohli pustit pár dílů nějakého seriálu. Bohužel na disku máte seriály jen v originále a bez titulků. Co se dá dělat, napsat si program na jejich hromadné stahování je to správné řešení. Jste nejspíš ajťák a přece nebudete nikdy dělat stejnou činnost víc jak 3x... Tak nějak by se dal popsat vznik tohoto scriptu.
Základem scriptu se stal můj školní projekt do předmětu ISJ - Skriptovací jazyky. To je také jediný důvod, proč jsem pro řešení použil Python i přesto, jak ho nemám rád. Zadáním bylo napsat script, který dostane jako argument adresu k titulkům na opensubtitles, stahne i ostatní titulky ke stejnému filmu v jiném jazyce a bude hledat odpovídající si fráze. Ve výsledku celkem zajímavý projekt, kde se mi nejvíce vyplatilo jet postupně po frázích a provádět korekci pomocí "!" a "?". Co je ovšem podstatnější, tak jsem projekt rozšířil o další zajímavou funkčnost - možnost specifikovat cestu k video souboru z něhož se spočte hash a podle něj se vyhledají správně časované titulky.
Výsledkem je Python script, který umožňuje jednoduché stahování titulků i k více video souborům. Po celou dobu psaní jsem se maximálně snažil vyhnout jakýmkoliv nepřenosným konstrukcím a script by tedy měl fungovat nejen na Linxu, kde byl testován, ale i na Windows, OS X, nebo třeba BSD...
Prvně budete potřebovat Python interpret. Ten je ve většině linuxových distribucí přítomen již ve výchozím stavu. Pro systémy OS X, Windows apod. je možné ho stáhnout z webu www.python.org. Poté už stačí jen získat soubor subs.py a umístit ho do adresáře odkud ho budete spouštět - mě se osvědčilo udělat si symlink z gitu pomocí ln -s ~/git/subs/subs.py /usr/local/bin/subs
.
Úplně základní použití pak vypadá jako subs Movie.avi
. Nic obtížného, nebo nezapamatovatelného. V takovém případě bude spočten hash, detekován jazyk operačního systému (v případě selhání se zvolí angličtina) a vyhledají se titulky k konkrétnímu video souboru. Titulky se stáhnou v zip archívu do dočasného adresáře, z něj se vyberou pouze titulky (zahodí se .txt a .info soubory) a ty se uloží do stejného adresáře k filmu pojmenované stejným jménem s příponou odpovídající formátu titulků - .srt/sub/ass, pak už jen automaticky smazat všechny dočasné soubory... Všechny ty otravné kroky během okamžiku.
Co, když budu chtít titulky v jiném jazyce, než v jakém je můj systém, nebo ještě nejsou dostupné a chci je třeba v angličtině, nebo němčině? Od toho je přidaný přepínač -l lang
, takže pro angličtinu mi stačí zadat -l eng
, pro češtinu -l cze
a mohl bych pokračovat. Může se stát, že stahujete titulky třeba k celé sérii a pro některé díly třeba ještě nejsou české titulky. Můžu pak zvolit víc jazyků a oddělit je čárkou, takže napíšu třeba -l cze,svk,eng
.
Jak už jsem nakousl v předchozím odstavci, tak je možné stahovat titulky třeba pro celou sérii. Prostě se názvy souborů napíšou jako jednotlivé argumenty za sebe oddělené mezerou tj. subs Movie1.avi Movie2.avi
. Samozřejmě pro ještě větší zjednodušení je možné použít bash expansion a stahovat titulky třeba pomocí subs S01/*.mp4
.
$subs -a Death\ Note\ -\ 3*.avi OK cze Death Note - 30 - Justice.avi OK cze Death Note - 31 - Transfer.avi OK cze Death Note - 32 - Selection.avi OK cze Death Note - 33 - Scorn.avi OK cze Death Note - 34 - Vigilance.avi OK cze Death Note - 35 - Malice.avi OK cze Death Note - 36 - 1.28 {C_P}.avi OK cze Death Note - 37 - New World {C_P}.avi
V ukázce jste si mohli všimnout další volby -a
. Ta je zatím v experimentálním stavu, ale nezaznamenal jsem s ní zatím žádné obtíže. Znáte rozšíření AdBlock? Tak tohle je volba co dělá něco obdobného. V poslední době se ve spoustě titulků objevují vložené reklamy na warez servery, file hosting apod. Tahle volba se prostě pokusí při stahování z titulků tyto reklamy odstranit. Podporované je odstranění reklam z formátů .srt, .sub i .ass. Pro správné fungování je potřeba vybudovat nejprve databázi takových reklam, což může být ještě práce. V scriptu je definován základní seznam. Tato funkce je v současné době unikátní.
Někdy se může stát, že titulky nebudete chtít ukládat do stejného adresáře k filmům, ale do nějakého specifického, z kterého vám je třeba servíruje na vyžádání DLNA. Jistě, žádný problém - od toho tu máme volbu -d directory
. Asi není třeba příliš rozepisovat. Cesty ať už pro cílový adresář titulků, nebo vstupních souborů je možné specifikovat nejen relativně, ale i absolutně.
Všechny zde uvedené volby je samozřejmě možné kombinovat a případně si nechat poradit nápovědou dostupnou pod přepínačem -h
.
V současné době si pohrávám s myšlenkou možnosti automatické konverze kódování a formátu souborů. Bohužel česká titulková scéna používá stále Windows-1250 a v cizině to je většinou obdobné místní kódování. V dnešní době UTF-8 pomerně nepříjemné štelovat ve VLC kódování titulků. Takový přepínač pro převod do UTF-8 by byl více než dobrý. Bohužel je docela problematické detekovat v Pythonu spolehlivě kódování souboru a tak zůstává jen u plánu. Obnobné je to u převodů mezi formáty .sub, .srt a .ass. Zejména s posledně jmenovaným si spousta televizí neporadí a převod by tento problém vyřešil. Otázkou je, zda by už nebylo lepší takovou funkci oddělit do vlastního scriptu.
Jistě bych rád v budoucnu přidal podporu i pro další zdroje titulků a nespoléhal se pouze na opensubtitles.org. Tím však script naroste a bude vhodné provést jeho rozdělení do modulů.