Ten przewodnik opisuje dodawanie obsługi nowych serwisów wideo oraz poprawianie istniejących modułów. Zakłada podstawową znajomość Pythona i konsoli NVDA.
Otwórz film z napisami w serwisie, który chcesz obsłużyć. Gdy pojawi się kwestia dialogowa, zatrzymaj odtwarzanie i spróbuj znaleźć jej tekst w trybie przeglądania NVDA. Jeśli tekst jest dostępny w drzewie obiektów strony, dodatek prawdopodobnie będzie mógł go odczytywać. Jeśli nie, potrzebny będzie inny sposób udostępnienia napisów NVDA.
Przeglądarka oparta na Chromium jest dobrym punktem wyjścia. Przed zakończeniem pracy sprawdź jednak działanie w tych przeglądarkach, które chcesz zadeklarować jako obsługiwane.
Utwórz plik w katalogu addon/globalPlugins/subtitle_reader/subtitleExtractors/. Możesz skopiować niewielki istniejący moduł, na przykład netflix.py, i nadać kopii nazwę odpowiadającą serwisowi, na przykład myPlatform.py.
W pliku zdefiniuj klasę dziedziczącą po SubtitleExtractor, na przykład:
class MyPlatform(SubtitleExtractor):
...
Klasy są wykrywane automatycznie przy wczytywaniu dodatku. Nie trzeba dopisywać ich do osobnego rejestru. Nowy plik zostanie też uwzględniony przez wzorzec źródeł w buildVars.py.
Pole info zawiera nazwę pokazywaną w menu, adres serwisu i stan obsługi. Przykład:
info = {
'name': 'My Platform',
'url': 'https://example.org/',
'status': SupportStatus.supported,
}
Ustaw SupportStatus.supported po sprawdzeniu działania. Jeśli nazwa pokazywana w menu wymaga tłumaczenia, oznacz ją funkcją _() i zainicjuj tłumaczenie dodatku w module przez addonHandler.initTranslation().
Wybierz wzorzec windowTitle albo url. Tytuł okna bywa pewniejszy, ponieważ odczytanie adresu strony nie zawsze się udaje. Wzorzec powinien rozpoznawać serwis przy różnych filmach.
Jeśli tytuł okna wygląda tak:
Mój film - My Platform
możesz użyć:
windowTitle = '.+ - My Platform'
Wyrażenie .+ oznacza co najmniej jeden dowolny znak. Jeśli nie ma stabilnego fragmentu tytułu, użyj wzorca url.
Przenieś fokus na przycisk odtwarzania lub inny element odtwarzacza. Otwórz konsolę Pythona skrótem NVDA+Ctrl+Z. Zmienne focus i nav wskazują odpowiednio obiekt z fokusem oraz obiekt nawigacyjny.
Sprawdzaj właściwości .parent, .firstChild, .previous i .next. W IA2Attributes szukaj stabilnych wartości id lub class, które pozwolą rozpoznać odtwarzacz. Przy prostych stronach pomocna może być również rola role('document').
W metodzie getVideoPlayer() zacznij od self.main.focusObject i znajdź właściwy obiekt funkcją find. Przykład:
obj = find(self.main.focusObject, 'parent', 'id', 'movie_player')
return obj
Gdy find zwróci None, dodatek uzna, że nie znaleziono odtwarzacza. Dla atrybutu class wystarczy stabilny fragment nazwy klasy: find sprawdza, czy występuje on w pełnej wartości.
Obiekt odtwarzacza jest dostępny jako self.main.videoPlayer. Wróć do strony z filmem i użyj nawigacji po obiektach NVDA, aby przejść od odtwarzacza do tekstu napisów. Zapisz kolejność wykonanych kroków.
Może pomóc wyłączenie prostego trybu przeglądu w ustawieniach kursora przeglądu NVDA. Wówczas nawigacja po obiektach odpowiada bliżej przechodzeniu przez .parent, .next i inne właściwości drzewa.
Zatrzymaj film na kwestii z napisami, wybierz obiekt tuż nad ich tekstem i zapisz go w konsoli do zmiennej. Wznów odtwarzanie, poczekaj na następną kwestię i znów zatrzymaj film. Jeśli rola zapisanego obiektu zmieni się na UNKNOWN, obiekt został zastąpiony przez stronę. Powtórz próbę na obiekcie o jeden poziom wyżej. Szukaj obiektu, który pozostaje ważny przy zmianie tekstu napisów, i zwróć go z getSubtitleContainer().
Kontener jest dostępny jako self.main.subtitleContainer. Jeśli tekst napisów znajduje się bezpośrednio pod kontenerem, możesz skorzystać z metody klasy bazowej:
return super().getSubtitle(obj)
Jeśli tekst leży głębiej w drzewie, przejdź do jego rodzica i przekaż ten obiekt do getSubtitle(). Sprawdź, czy przy zmianie kwestii odczytywany jest nowy tekst i czy dodatek nie powtarza poprzedniej kwestii.
Teksty widoczne dla użytkownika oznaczaj funkcją _() i dodawaj przed nimi komentarz # Translators: z opisem kontekstu. Językiem źródłowym projektu jest tradycyjny chiński (zh_TW). Tłumaczenia znajdują się w addon/locale/<język>/LC_MESSAGES/nvda.po, a ich źródła są określone w buildVars.py.
Po zmianie kodu wygeneruj aktualny szablon poleceniem scons pot, uzupełnij właściwe pliki .po, a następnie zbuduj paczkę poleceniem scons. Do budowania potrzebne są Python, SCons, biblioteka Markdown oraz narzędzia gettext. Ostatecznie sprawdź dodatek w uruchomionym NVDA; same moduły korzystają z API NVDA i nie uruchomią się w zwykłym interpreterze Pythona.