Blog.nechutny.net

Blog o webu a IT.

subs.py - Stahování titulků jednoduše

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...

Jak to použít?

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.

Co očekávat?

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ů.