SubConvert 0.8.2

Pomysł na stworzenie własnego programu do konwersji napisów do filmów pojawił się w mojej głowie już jakiś czas temu i był spowodowany problemami z synchronizacją napisów w formacie klatkowym (w tym w bodaj najpopularniejszym formacie Micro DVD) do filmów odtwarzanych na kupionym przeze mnie jakiś czas temu telewizorze. Tak się bowiem złożyło, że mój Samsung akceptuje bez bólu jedynie napisy w formacie czasowym, konkretnie zaś SubRip. OK, konwersja między tymi formatami jest możliwa, ale co gdybym miał do przerobienia np. 6 sezonów jakiegoś serialu, i to pod Linuksem (chociaż pod Windowsem również nie znam żadnego narzędzia, które umożliwiałoby szybkie i stosunkowo bezbolesne przeprowadzenie takiej operacji)?

I tutaj właśnie pojawia się SubConvert - moje pisane w Pythonie już bodaj drugi miesiąc dziecko. Dziś w nocy (niestety, pracuję po godzinach, ale to nie szkodzi, bo projekt jest już dość zaawansowany i z reguły nie wymaga dużych zmian) wydana została wersja 0.8.2, z drobną poprawką do skryptu instalacyjnego wprowadzoną dosłownie przed chwilą.

Możliwości programu

Co zatem potrafi SubConvert? Całkiem sporo! Przede wszystkim wspieranych jest 5 różnych formatów napisów (Micro DVD, SubRIP, TMP, SubViewer oraz nowy w obecnym releasie MPL2), które są przez program automatycznie rozpoznawane, a konwersja może następować między nimi w dowolny sposób. Wspieranych jest mnóstwo kodowań plików tekstowych (pełna lista), które program może spróbować sam odgadywać, a także automatyczne pobieranie ilości klatek na sekundę (FPS), gdy tylko dostępny jest film o nazwie takiej jak plik z napisami. Ta ostatnia funkcja jest jednak opcjonalna i realizowana przy pomocy wyjścia MPlayera (więc jeśli nie jest on zainstalowany, a FPS-y nie są podane explicitly, przyjęta zostanie wartość domyślna). SubConvert pozostaje przy tym dość lekki i szybki - konwersja ważącego 60KB pliku Micro DVD trwa nieco ponad pół sekundy na netbooku (Intel Atom 1.67 GHz).

Najważniejsze jest jednak to, że tworzenie parserów dla nowych formatów napisów jest dziecinnie proste i sprowadza się do stworzenia klasy dziedziczącej po parserze generycznym, a w niej utworzenia kilku wyrażeń regularnych oraz zaimplementowaniu dwóch czy trzech metod (plus konstruktora, który w Pythonie nie jest dziedziczony), nazwijmy je - wirtualnych, które mają za zadanie przetłumaczenie formatowania napisów na wewnętrzne formatowanie SubConverta (i na odwrót). Napisanie parsera dla MPL2 zajęło mi pół godziny. To znacznie mniej niż stworzenie dla niego testów, a następnie poddanie go nim.

SubConvert doczekał się również interfejsu graficznego napisanego w Qt4. Nie jestem najlepszym projektantem tego typu interfejsów, jednak wydaje mi się, że jest on w miarę przejrzysty i zawiera wszystkie niezbędne opcje.

Plany na przyszłość

Ciągle zastanawiam się nad wykorzystaniem API serwisu opensubtitles.org (lub innego) i zaimplementowaniu ściągania napisów do filmów wraz z ich automatyczną konwersją do podanego formatu. Chociaż wówczas SubConvert (w moim odczcuciu) byłby jednym z najciekawszych programów tego typu na rynku, to odchodziłby w pewnym stopniu od swojego podstawowego zadania (innymi słowy, stałby się zbyt przeładowany). Być może lepszym pomysłem byłoby stworzenie w tym celu oddzielnego, dedykowanego programu, który łatwo by się spinał z SubConvertem (chociaż spięcie go z QNapi to góra trzylinijkowy skrypt w Bashu, jednak znacznie mniejsza frajda).

Tymczasem planowane jest na 29. stycznia wydanie 0.8.3 (lub 0.9 jeśli stwierdzę, że zaistnieje potrzeba przyspieszenia numerkologii1). Obecnie do listy poprawek i ulepszeń dopisuję kolejne punkty, z których jednym z ważniejszych będzie stworzenie polskiego tłumaczenia (obecnie SubConvert dostępny jest jedynie po angielsku). Stąd też nazwa następnego wydania - Talkative Hiker. :)

SubConvert dostępny jest również poprzez repozytorium PyPI. Wydany jest na licencji GPLv3+.


  1. po prawdzie to ogrom nowych funkcji i poprawek w wydaniu 0.8.2 (w stosunku do poprzednich wersji) całkowicie by usprawiedliwiał nazwanie tego wydania 0.9, jednak ta ósemka pośrodku wydaje się jakaś milsza dla oka ;) ↩︎