158 lines
32 KiB
Markdown
158 lines
32 KiB
Markdown
# Enigma2 dla Jellyfin 12.2
|
||
|
||
Lokalne rozszerzenie wtyczki Enigma2 6.0.0.0, wersja 7.0.6.0. Zachowuje identyfikator wtyczki, nazwę usługi, konfigurację połączenia, natywne strumienie, nagrania i timery dekodera. Profile transkodowania pozostają na dekoderze.
|
||
|
||
## Funkcje
|
||
|
||
- Pełna lista 216 kanałów skonfigurowanego bukietu „Polskie”, z numerami, logo i wyszukiwaniem. Stronicowanie API obsługuje również większe listy.
|
||
- Ulubione, ukrywanie, kolejność i domyślny widok osobno dla każdego użytkownika. Ulubione synchronizują się z natywnym Jellyfinem. Ukrywanie i kolejność są nakładane także na natywny endpoint `/LiveTv/Channels`, po kontroli uprawnień i przed stronicowaniem; widok domyślny dotyczy strony dodatku.
|
||
- Globalny przełącznik **Obsługuj nagrania z Vu+ (Enigma2 Recordings)** w konfiguracji wtyczki Enigma2, domyślnie wyłączony. Wyłączenie nie rejestruje dostawcy biblioteki nagrań, pozostawia telewizję, EPG oraz timery i nie usuwa plików z dekodera. Zmiana wymaga restartu Jellyfina oraz odświeżenia kanałów dostawców. Nie jest to przełącznik na stronie kanałów.
|
||
- Widok audycji na najbliższe sześć godzin, przejścia do szczegółów kanału/audycji oraz natywnego przewodnika, nagrań i timerów.
|
||
- Rzeczywiste grafiki audycji z `https://epg.polishteam.one/guide.xml`, pobierane i buforowane przez Jellyfin. Brak generowania obrazków.
|
||
- Konserwatywne dopasowanie po jednoznacznym kanale, dokładnym znormalizowanym tytule oraz czasie rozpoczęcia ±7 minut. Brak zgadywania przy niejednoznacznych danych. Harmonogram i EIT do timerów pozostają z Enigmy.
|
||
- Stałe identyfikatory audycji: service reference, EIT i początek emisji, zamiast losowej liczby. Poprawiona deduplikacja i cache kanałów przy odczycie wielu bukietów.
|
||
|
||
## Otwieranie
|
||
|
||
Jellyfin Web → menu **Telewizja dekodera**. Bezpośrednio: `/DecoderIntegration/Channels` na tym samym serwerze i adresie, pod którym użytkownik loguje się do Jellyfina. Strona korzysta z zapisanej sesji Jellyfin Web; wymagane logowanie z opcją **Zapamiętaj mnie**. Nie ma oddzielnych kont ani haseł dodatku. Bez zapisanej sesji strona pokazuje odnośnik do logowania.
|
||
|
||
W Jellyfin 10.11 strony `configurationpage` są ograniczone do administratorów w routerze klienta. Dlatego dla wszystkich użytkowników użyto standardowego `menuLinks` w `/usr/share/jellyfin/web/config.json` i strony HTML serwowanej przez wtyczkę. API preferencji wymaga uprawnienia Live TV i identyfikuje użytkownika z uwierzytelnionych claims, bez przyjmowania dowolnego UserId od klienta. Administracyjny stan importu: `GET /DecoderIntegration/Status`.
|
||
|
||
Grafiki trafiają do natywnego EPG i są dostępne również w innych klientach Jellyfina. Własna strona i jej układ są funkcją przeglądarkową; nie zmieniają interfejsu aplikacji Android TV. Uprawnienia kanałów nadal egzekwuje natywne API Jellyfina.
|
||
|
||
## Źródła i ograniczenia
|
||
|
||
Sprawdzono 11.10.2026: [wydania autora](https://github.com/knackebrot/jellyfin-plugin-enigma2/releases) i [manifest](https://github.com/knackebrot/jellyfin-repo/blob/master/manifest.json) nadal wskazują **6.0.0.0, 22.06.2024**, jako najnowsze opublikowane wydanie. **7.0.0.0 jest wersją lokalną tego projektu**, nie oficjalnym wydaniem autora. Pochodzenie vendora: `UPSTREAM.txt`, licencja CC0.
|
||
|
||
Źródło grafik: PolishTeam. Dozwolone adresy obrazków to HTTPS na `ptv-prod.wphcdn.cloud` i `media.teleman.pl`; dane XML mają limit 128 MiB i zablokowane DTD/encje zewnętrzne. Brak pasującej grafiki pozostawia dotychczasowe dane Enigmy. Awaria importu nie blokuje telewizji. Feed jest odświeżany najwyżej co 6 h przy odświeżaniu przewodnika; po błędzie ponowna próba po 15 minutach, ostatni dobry cache ważny do 48 h. Cache feedu jest w pamięci, po restarcie pobiera się ponownie.
|
||
|
||
Nie wszystkie audycje mają zgodny tytuł i grafikę w źródle. Dostępność zewnętrznego feedu nie jest gwarantowana. Pełne odświeżanie EPG i cache zdjęć może potrwać; dopiero zakończone natywne Refresh Guide usuwa stare losowe identyfikatory audycji.
|
||
|
||
## Budowanie i wdrożenie
|
||
|
||
SDK .NET 10, `dotnet run --project Tests -c Release`. Projekt odwołuje się do Jellyfin 12.2. Testy konsolowe sprawdzają dopasowanie, niejednoznaczność, zakres czasu, alias HD, ograniczenia URL i walidację preferencji.
|
||
|
||
Budowano w izolowanym `mcr.microsoft.com/dotnet/sdk:10.0` na CT100195 z limitem dwóch CPU i osobnym katalogiem `/tmp/jellyfin-decoder-plugin`. Nie zmieniono usług serwera strumieniowego. Artefakt: `Jellyfin.Plugin.Enigma2/bin/Release/net10.0/Jellyfin.Plugin.Enigma2.dll`.
|
||
|
||
`deploy.py` uruchamia się w CT100191 po umieszczeniu DLL w `/tmp/Jellyfin.Plugin.Enigma2.dll`. Odmawia restartu przy aktywnym odtwarzaniu. Zachowuje stare katalogi wtyczki, konfigurację oraz web-config w `/var/lib/jellyfin/decoder-plugin-backups/<UTC>`, przenosi starą wersję poza katalog plugins i instaluje nową z zachowaniem tożsamości. Restartuje tylko Jellyfin, nie dekoder.
|
||
|
||
Powrót po aktualizacji serwera wymaga przywrócenia **pełnej kopii danych i konfiguracji sprzed migracji oraz pakietów Jellyfin 10.11.6**. Sama zamiana DLL nie cofa zmian bazy danych. W obrębie Jellyfina 12.2 można przywrócić poprzednią zgodną wersję dodatku z kopii wdrożenia. Wrapper FFmpeg i profile odbiornika są zachowane.
|
||
|
||
`verify.py` sprawdza aktywność wtyczki, kanały, timery, izolację preferencji dwóch kont i politykę administracyjną. Konta testowe usuwa w finally. `test-browser.cjs` sprawdza rzeczywisty Jellyfin Web w izolowanym Edge headless i usuwa własne konto. Nie drukuje tokenów ani haseł.
|
||
|
||
Kod jest także aktualizowany w `C:\Users\michal\git\jellyfin-plugin-enigma2` na gałęzi `codex/decoder-integration`. Dodatkowy remote `ekacprzak`: `ssh://git@git.e-kacprzak.eu:2222/michal/jellyfin-plugin-enigma2.git`. Zmiany wtyczki są wypychane wyłącznie do tego remote; GitHub origin pozostaje źródłem upstream.
|
||
|
||
Przed końcowym wyłączeniem dostawcy ukryto jego kafelek i ostatnio dodane na 19 istniejących kontach przez natywne MyMediaExcludes/LatestItemsExcludes (wyraźna zgoda użytkownika); kopia poprzednich ustawień: `/var/lib/jellyfin/decoder-plugin-backups/home-exclusions-20261011T104028Z.json`. `hide-recordings-home.py` dokumentuje ten jednorazowy krok. Nie jest mechanizmem przełącznika obsługi nagrań. Po ewentualnym ponownym włączeniu dostawcy użytkownicy mogą odznaczyć wykluczenie biblioteki w ustawieniach ekranu głównego.
|
||
|
||
|
||
## Aktualizacja serwera 11.10.2026
|
||
|
||
Jellyfin w CT100191 zaktualizowano z 10.11.6 do **12.2.0**, FFmpeg do **8.1.3**. Pełna kopia po zatrzymaniu serwera: `/var/backups/jellyfin-pre12-20261011T110237Z/data-config.tar` (9 465 702 400 bajtów). Migracje zakończyły się pomyślnie; zachowano 19 kont, 216 kanałów i 33 timery. LDAP 19/22 usunięto, SSO zachowano. Test inicjacji OIDC z Host `jellyfin.e-kacprzak.eu` zwrócił 302 do `login.e-kacprzak.eu`; adres techniczny nie jest dozwolonym callbackiem w Keycloak. Pełnego logowania użytkownika w Keycloak nie automatyzowano.
|
||
|
||
SSO autora nie ma jeszcze paczki ABI 12. Przygotowano lokalny build 4.0.0.4 z upstream `f1e157bac29e6d27a0844378f3e1d4a4fdaa577a`, .NET10 i zależnościami Jellyfin12.2. Usunięto starą referencję XML cryptography6, przypięto Pkcs10; build bez ostrzeżeń i błędów. Reprodukcja bez instalacji: `python3 compat/build-sso12.py` na Linuxie z Dockerem. Oficjalne dodatki: DLNA14, OpenSubtitles25, TVmaze14, Webhook22, SessionCleaner6. Kopia starych paczek: `/var/lib/jellyfin/decoder-plugin-backups/upgrade12-20261011T110701Z`.
|
||
|
||
Enigma7 aktywna. Obsługa nagrań Vu wyłączona w konfiguracji, lista dostawców `/Channels` pusta. Testy konsolowe obejmują także rejestrację przed utworzeniem Plugin.Instance i odpowiedzi przy Accept-Encoding gzip/br. Test API: preferencje dwóch kont, natywna lista/paginacja, uprawnienia administracyjne. Test Edge headless: 216 kanałów, ulubione, ukrywanie/przywracanie, EPG, brak błędów JS. Po aktualizacji uruchomiono pełny skan bibliotek i odświeżanie EPG.
|
||
|
||
|
||
## Odtwarzanie jednym kliknięciem
|
||
|
||
Wersja 7.0.1.0: kliknięcie nazwy kanału na stronie dodatku uruchamia natywny odtwarzacz Jellyfin Web. Osobny przycisk „Szczegóły” zachowuje dostęp do informacji i EPG. `web/decoder-channel-playback.js` korzysta ze wspieranego API dodatków window w Jellyfin Web (PluginManager przekazuje playbackManager). Kanał jest sprawdzany przez uwierzytelnione API użytkownika i musi mieć typ TvChannel. Grafiki przyszłych audycji nadal otwierają szczegóły.
|
||
|
||
Po skopiowaniu skryptu do `/tmp/decoder-channel-playback.js` uruchomić `install-web-playback.py` w CT100191; instalator zachowuje kopie index/config i wpisuje dodatek do istniejącej listy plugins. Po aktualizacji pakietu jellyfin-web trzeba ponownie uruchomić instalator. W otwartej przeglądarce wykonać Ctrl+Shift+R. Działanie dotyczy Jellyfin Web; natywne aplikacje Android TV mają własne sterowanie. Test Edge: wybór TVP INFO HD jednym kliknięciem, odpowiedź PlaybackInfo 200 i odtwarzanie video z rosnącym currentTime, bez przycisku Play.
|
||
|
||
Test `test-native-playback.cjs`: kliknięcie narożnika grafiki kanału TVP INFO HD w natywnym `/livetv?tab=2`, bez trafienia w przycisk Play, uruchamia wideo (PASS). Stanowisko: izolowany Edge headless, konto testowe usuwane w finally.
|
||
|
||
## Współdzielenie transmisji i błędy odtwarzania — 12.10.2026
|
||
|
||
Wersja 7.0.4.0 współdzieli jedno połączenie HTTP z odbiornikiem między analizą metadanych i odbiorcami danego kanału. Lokalny relay ma losowy identyfikator oraz akceptuje tylko połączenia loopback; zewnętrzne odtwarzacze korzystają z natywnego API Jellyfina. Bufor historii jest ograniczony do 2 MiB, kolejki klientów do 128 bloków, liczba klientów kanału do 16. Zakończenie jednego odbiorcy nie zatrzymuje pozostałych; po ostatnim połączeniu źródło jest zamykane po 15 sekundach.
|
||
|
||
Wtyczka wykonuje własne współdzielone badanie rzeczywistych metadanych strumienia. Limit 15 sekund kończy również uruchomiony przez wtyczkę ffprobe; wynik sukcesu jest buforowany 30 sekund, błędu 3 sekundy. MediaSourceInfo przekazuje natywnemu odtwarzaczowi zidentyfikowane indeksy i wyłącza kolejne probing. Nie zmienia się systemowych wrapperów ffmpeg/ffprobe ani konfiguracji Jellyfina.
|
||
|
||
Moduł web domyślnie otwiera Telewizję w zakładce Kanały (tab=2), zachowując jawnie wybraną zakładkę. Zapobiega podwójnemu uruchomieniu podczas oczekiwania, otwiera natywny OSD i udostępnia przycisk „Zatrzymaj i wróć do kanałów” oraz Escape. Brak obrazu przez 25 sekund kończy próbę i wraca do listy. Działanie przy błędzie nie stanowi potwierdzenia prawidłowej transmisji z odbiornika.
|
||
|
||
Do aktualizacji wyłącznie DLL używa się `deploy-plugin-only.py` w CT100191 po dostarczeniu artefaktu do `/tmp/Jellyfin.Plugin.Enigma2.dll`. Flaga `--maintenance-approved` pozwala wykonać uzgodniony restart przy aktywnym odtwarzaniu. Skrypt zachowuje poprzednią wtyczkę i sprawdza niezmienione hashe konfiguracji serwera, wrapperów oraz index/config web. Moduł JS aktualizuje się osobno w istniejącym `/usr/share/jellyfin/web/decoder-channel-playback.js`; nie uruchamiać ponownie instalatora web przy naprawie ograniczonej do wtyczki. Ostatnia kopia wdrożenia: `/var/lib/jellyfin/decoder-plugin-backups/plugin-only-20261012T183340Z`.
|
||
|
||
Testy konsolowe przeszły: współdzielenie probe, anulowanie pojedynczego odbiorcy, limit czasu, brak wideo, jeden upstream dla dwóch odbiorców relay, odmowa dostępu zewnętrznego oraz zwolnienie ostatniego połączenia. `test-web-bridge.cjs` sprawdza domyślną zakładkę, OSD, Escape, deduplikację i spóźnione zakończenie. `verify.py` potwierdził aktywną 7.0.4.0, 216 kanałów i izolację preferencji/uprawnień. `test-web-player.cjs` pozwala ustawić nazwę przez DECODER_TEST_CHANNEL i sprawdza rzeczywisty obraz oraz wyjście w Edge.
|
||
|
||
Bieżące próby TVP 1 HD i TVP 2 HD: domyślne Kanały i wyjście PASS, obraz NO_FRAME_FROM_SOURCE, bez błędów JS. Bezpośrednie żądanie TVP1 z CT100191 do portu 8001, z pominięciem wtyczki i odtwarzacza, otrzymało HTTP 200 i 0 bajtów po około 5,3 s. Dla TVP2 test web nie uzyskał obrazu; nie potwierdzono identycznej przyczyny. Bieżące service reference w natywnej bazie są zgodne z OpenWebif: TVP1 3ABD:514:13E oraz TVP2 C22:1E78:71. Dodatkową ręczną próbę 3D66:2C88:13E błędnie opisano jako TVP2; jest to TV PULS HD i nie stanowi dowodu dla TVP2. Nie potwierdzono przywrócenia obrazu. Odczyt logów dekodera wykazał dodatkowo zatrzymania GUI przez runlevel 4→3 o 20:44, 20:45, 20:47 i 20:48 CEST; Enigma obsługuje porty 80 i 8001, więc te przerwy wyjaśniają wcześniejsze Connection refused. Źródła poleceń restartów oraz przyczyny pustej transmisji nie przypisano do LNB ani OSCam bez dalszych dowodów. W ramach tej naprawy nie zmieniano ani nie restartowano odbiornika.
|
||
## E2E i poprawki odtwarzania — 12.10.2026, 7.0.6.0
|
||
|
||
Pełny test produkcyjny używa `test-e2e.cjs` oraz izolowanych kontekstów Edge i tymczasowych kont. `--ui-only` sprawdza interfejs, zapis po przeładowaniu, wyszukiwanie, ulubione, ukrywanie, kolejność w natywnym API, EPG, obrazki, domyślny widok, uprawnienia, brak dostawcy nagrań Vu i panel administracyjny. `--playback-only` sprawdza rzeczywiste klatki 4Fun.TV, TVP1, TVP2 i TVN, native OSD, dwuklik, dwa odtwarzacze i zwolnienie źródła. `--control-only` ogranicza odtwarzanie do 4Fun.TV, a `--config-only` nie otwiera transmisji TV. `--report=<ścieżka.json>` zapisuje wyniki bez tokenów i haseł. Testy są operacjami produkcyjnymi: konta są usuwane w finally; nie tworzą nagrań ani timerów i nie zapisują formularza konfiguracji wtyczki.
|
||
|
||
E2E wykrył dwa błędy po stronie wtyczki i sprawdził ich poprawki. Analiza nieskończonego TS zawierającego PID danych EPG mogła osiągać limit 15 s mimo poprawnego AV. Probe teraz pobiera przez ten sam relay próbkę do około 4 MiB / 4 sekund i analizuje skończony plik. Wybór programu po SID z service reference zapobiega uznaniu danych innego transpondera za oczekiwany kanał. Plik próbki jest usuwany także po błędzie; obserwacja po testach wykazała zero pozostałych próbek.
|
||
|
||
Drugi błąd: Jellyfin 12.2 w `EncodingHelper.FindIndex/GetMapArgs` mapuje pozycję na liście strumieni. Lista AV pozbawiona wcześniejszego PID EPG powodowała `-map 0:0 -map 0:1`, próbę zapisania EPG w MP4 i błąd HLS. Wtyczka przekazuje teraz kopię rzeczywistych metadanych AV z `Index=-1`, używając natywnego wariantu automatycznego wyboru AV, zamiast zgadywania indeksów. Oryginalny wynik probe nie jest zmieniany. Nie zmieniono kodu Jellyfina ani wrapperów. Przy takim mapowaniu wybór ścieżki audio pozostaje automatyczny; ręcznego wyboru alternatywnej ścieżki nie potwierdzono. Źródło zachowuje `SupportsProbing=false` i ustawia `AnalyzeDurationMs=1500`. Web OSD czeka na metadane wideo i obsługuje odrzuconą/anulowaną nawigację.
|
||
|
||
Wdrożona DLL: 7.0.6.0; backup `/var/lib/jellyfin/decoder-plugin-backups/plugin-only-20261012T192438Z`. Sprawdzone hashe konfiguracji/wrapperów/index/config bez zmian. Instalator dodatkowo czeka na aktywną wtyczkę w API po starcie usługi.
|
||
|
||
Wyniki w osobnych JSON: `e2e-ui-20261012.json`, `e2e-config-20261012.json`, `e2e-control-20261012.json`, `e2e-playback-20261012.json`, `e2e-guide-20261012.json`. Test interfejsu potwierdził 16 podstawowych kontroli, 216 kanałów, izolację dwóch użytkowników i 36 istniejących timerów. Zakończony świeży Refresh Guide dopasował 5302 grafiki audycji. Kontrolny playback 4Fun.TV zaliczył 9/9: rosnące zdekodowane klatki, dwa browsery / jedno fizyczne połączenie dekodera, zatrzymanie jednego bez przerwania drugiego i pełne zwolnienie źródła. Końcowy przebieg obejmował również pozytywny natywny kafelek i OSD.
|
||
|
||
Całego E2E nie uznano za zielony: TVP1, TVP2 i TVN nie uzyskały klatek; źródło dekodera było puste lub miało niewłaściwy program/transponder według równoległej diagnostyki natywnej. Przy błędach źródła Jellyfin Web nadal zgłosił nieobsłużone odrzucenia obietnic `undefined`; wyjście do kanałów przeszło. Administracyjna nawigacja konfiguracji dla tymczasowego konta jest raportowana osobno i nie wolno uznać jej za PASS na podstawie samego API HTML. Nie zmieniano konfiguracji tunerów, nie restartowano Vu ani nie omijano ochrony logowania administratora. Końcowe aktywne transmisje wstrzymano na prośbę zadania dekodera prowadzącego ponownie izolowane strojenie.
|
||
|
||
Zakres nie obejmuje Android TV, pełnego logowania SSO w Keycloak, tworzenia/wykonywania nowych nagrań ani wielogodzinnej stabilności. Wynik short E2E nie jest gwarancją tych funkcji.
|
||
## Analiza niezaliczonych punktów — 12.10.2026
|
||
|
||
Korekta raportu panelu administratora: wcześniejszy FAIL był fałszywym wynikiem scenariusza testowego. Test zmieniał uprawnienia po logowaniu oraz nawigował przed zakończeniem inicjalizacji sesji. Wydzielone konto administratora utworzone przed pierwszym logowaniem, oczekiwanie na zapisane credentials i zniknięcie formularza logowania oraz dopiero potem nawigacja pozwoliły otworzyć konfigurację. Z modułem web i z modułem wyłączonym wyłącznie w izolowanej przeglądarce formularz i API konfiguracji działały (HTTP 200, host192.168.10.20, port8001, nagraniaVu=false). Nie zmieniano konfiguracji dodatku ani serwera. Poprawiony `test-e2e.cjs --ui-only` zakończył się **17/17 PASS**, a `--config-only` **3/3 PASS**. Podane poprzednio przypisanie tego FAIL do konfiguracji wtyczki jest wycofane.
|
||
|
||
`diagnose-web.cjs` nie otwiera TV na odbiorniku: podstawia odpowiedzi PlaybackInfo i blokuje ewentualny endpoint otwarcia live. Porównuje moduł web z jego brakiem, oraz zapisuje typ/treść unhandledrejection i przebieg stop/powrotu. Wynik `web-analysis-20261012.json` potwierdza: sam błąd HTTP i anulowanie oczekującego żądania nie wywołały unhandledrejection; wyjście po błędzie, podczas zamykania komunikatu odtwarzacza, wywołało `undefined` także bez modułu wtyczki. Przy aktywnym module zarówno `playbackManager.stop()`, jak i `appRouter.show()` spełniły obietnice; samo dodanie catch do tych dwóch wywołań nie usuwa źródłowego odrzucenia.
|
||
|
||
Mechanizm pasujący do wyników: natywny [playbackmanager](https://github.com/jellyfin/jellyfin-web/blob/master/src/components/playback/playbackmanager.js) wywołuje `alert()` w showPlaybackInfoErrorMessage bez obsługi zwróconej obietnicy. [Dialog](https://github.com/jellyfin/jellyfin-web/blob/master/src/components/dialog/dialog.js) kończy się `Promise.reject()` bez argumentu, gdy zamknięto go bez wyniku przycisku. [dialogHelper](https://github.com/jellyfin/jellyfin-web/blob/master/src/components/dialogHelper/dialogHelper.js) zamyka dialogi przy zmianie historii. To tłumaczy undefined po opuszczeniu komunikatu; nie jest dowodem błędu zatrzymania strumienia ani diagnozą OSCam. W tym zadaniu analizy nie modyfikowano natywnego klienta lub produkcyjnego modułu web. Ewentualne obejście w module wtyczki powinno skoordynować domknięcie komunikatu i nawigację; nie należy globalnie tłumić unhandledrejection.
|
||
|
||
Brak obrazu na TVP1/TVP2/TVN nadal ma odrębne dowody: produkcyjne logi końcowego E2E zawierają POST PlaybackInfo z InvalidOperationException po HTTP502 z relay, a wcześniejsze odczyty bezpośrednie i diagnostyka odbiornika wykazały brak lub niewłaściwy program/transponder. Nie jest to błąd logowania do konfiguracji ani sam komunikat undefined. Odtwarzanie 4Fun, native OSD, współdzielenie i zwolnienie źródła pozostają potwierdzone wynikami E2E. Aktualne próby sterowania SCR są prowadzone wyłącznie przez zadanie odbiornika; ich wynik nie jest zakładany z góry.
|
||
|
||
## Skoordynowana próba ciągłego odbioru
|
||
|
||
`test-reception-trial.cjs` uruchamia się dopiero po wyraźnej wiadomości zadania odbiornika, że zaczyna się uzgodnione okno. Wymaga flagi `--coordinated`; bez niej kończy się przed logowaniem i otwarciem TV. Domyślnie TVP 1 HD: pierwszy klient od pierwszej rzeczywistej klatki przez 900 s, drugi dołącza po 300 s i kończy po 600 s. Parametry `--duration`, `--join`, `--leave` podaje się w sekundach i zmienia wyłącznie zgodnie z ustalonym oknem. Przykład po uzgodnieniu: `node test-reception-trial.cjs --coordinated --report=reception-trial.json`.
|
||
|
||
Co 5 s zapisuje postęp klatek i zegara, bufor, stan odtwarzacza, zdarzenia przerw i dostępny licznik zdekodowanego audio. Co około 30 s odczytuje administracyjny status wtyczki i listę istniejących klientów OpenWebif. Nie otwiera dodatkowej transmisji diagnostycznej. Wyniki JSON/JSONL rozróżniają jednoczesną liczbę fizycznych połączeń od globalnego licznika otwarć. `Consumers` nie jest utożsamiany z liczbą przeglądarek, ponieważ Jellyfin może współdzielić również własny pipeline. Brak licznika audio jest oznaczony UNVERIFIED; same metadane nie potwierdzają słyszalnego dźwięku.
|
||
|
||
Próba używa dwóch własnych kont, zamyka ich sesje i usuwa konta oraz preferencje w cleanup; po zakończeniu czeka 20 s na zwolnienie relay. Nie wymaga globalnego zera źródeł, jeżeli inni użytkownicy oglądają TV. Nie przełącza kanałów, nie zapisuje konfiguracji, nie tworzy nagrań i nie restartuje usług. Przy pierwszym nieudanym starcie kończy się z FAIL bez samodzielnego ponawiania odbioru.
|
||
|
||
Przebieg 12.10.2026, 21:31:43–21:47:13 UTC (23:31–23:47 CEST): TVP1 uruchomił się po 13,31 s. Główny klient działał przez uzgodnione 900 s, drugi w fazie 300–600 s; oba 1920×1080 i rosnące liczniki audio. **15/15 kontroli transportu, współdzielenia, wyjścia i zwolnienia źródła PASS**. W obu fazach dokładnie jeden fizyczny klient Jellyfina na odbiorniku, globalny licznik otwarć pozostał 18; relay Consumers 1→2→1→0. Pozostałe trzy źródła natywne należały do równoległego zadania dekodera i nie były zamykane przez test. Wtyczka produkcyjna 7.0.6.0, brak zmian konfiguracji lub restartów w tej próbie.
|
||
|
||
Ten przebieg **nie zaliczył płynności klienta Web**. Wyjście było AV1/AAC 1080p50; FFmpeg pracował około 0,997×, HLS bez błędów HTTP. Główny headless Edge: 894,873 s pomiaru, 713,581 s postępu filmu, 53,5% dropped, 188 oczekiwań po starcie / 181,144 s łącznie, bufor minimum 2,624 s. Drugi: 56% dropped i 65,198 s oczekiwań. Sam przyrost klatek nie jest kryterium płynności. Raport `reception-trial-20261012.json` zachowuje wyniki transportu, a `reception-summary-20261012.json` rozdziela je od jakości klienta. `analyze-reception-trial.cjs` liczy proporcję czasu, dropped oraz waiting→playing; progi dotyczą tego stanowiska testowego, nie wszystkich aplikacji.
|
||
|
||
`--bridge-file=<lokalny JS>` pozwala w świeżych izolowanych kontekstach podstawić wyłącznie skrypt wtyczki i odpowiedź polityki H264 dla dokładnego ID testowanego kanału. Nie zmienia plików ani konfiguracji serwera. Taka próba porównawcza potwierdza efekt negocjacji kodeka; rzeczywiste uprawnienia i kontrakt endpointu należy osobno sprawdzić po wdrożeniu DLL. Każde kolejne okno odbioru wymaga uzgodnienia z zadaniem dekodera.
|
||
|
||
## Przygotowana opcja H264 — 7.0.7.0
|
||
|
||
Kod zawiera opcję „Preferuj H264 przy transkodowaniu telewizji w przeglądarce”, domyślnie włączoną również po wczytaniu starszego XML. Endpoint `GET /DecoderIntegration/WebPlaybackPolicy?channelId=<guid>` wymaga dostępu LiveTV, rozpoznaje rzeczywistego użytkownika z claim oraz stosuje natywną widoczność kanału. Zwraca tylko `IsEnigmaChannel` i `PreferH264`; własność wymaga `LiveTvChannel.ServiceName == Enigma2`. Brak/obcy/niewidoczny item zwraca false/false, wyłączona opcja dla Enigma true/false. Odpowiedź nie jest buforowana. Nie przyjmuje userId jako źródła uprawnień.
|
||
|
||
Moduł window zawęża klon profilu transkodowania w `appHost.getDeviceProfile(item, options)` do H264 wyłącznie dla potwierdzonego kanału Enigma w zwykłym Web. Zachowuje audio, napisy, ograniczenia profilu i DirectPlay. Filmy, inne źródła TV, inny serwer, NativeShell i zdalny odtwarzacz pozostają bez zmiany. Brak H264 w oryginalnym profilu lub niedostępna polityka zachowuje natywną negocjację. Oczekiwanie na politykę jest ograniczone do 2 s; ten odczyt HTTP nie otwiera TV. JS i endpoint muszą być wdrożone razem; nie należy nadpisywać globalnych preferencji Jellyfina.
|
||
|
||
Wspólny build .NET10/ABI12.2 i testy backendu przeszły, w tym autoryzacja, własność i konfiguracja false. `test-web-bridge.cjs` potwierdził zakres H264, brak mutacji wspólnego profilu, zachowanie audio/warunków, fallback, retry i ochronę przed ponownym instalowaniem wrappera. **Na etapie zapisu tego punktu produkcja nadal używa 7.0.6.0; 7.0.7.0 nie wdrożono.** Próba A/B i kontrola rzeczywistego endpointu pozostają do wykonania po kolejnym sygnale zadania odbiornika. Wynik AV1 nie dowodzi problemu każdego klienta Web ani awarii anteny.
|
||
|
||
## A/B H264 i wdrożenie — 13.10.2026 CEST
|
||
|
||
Po kolejnym wyraźnym START zadania odbiornika wykonano pięć minut TVP1 z nowym JS wyłącznie w dwóch izolowanych kontekstach, przy produkcyjnej DLL nadal 7.0.6.0. Raporty `reception-h264-20261012.json` i `reception-h264-summary-20261012.json` używają daty UTC: firstframe 12.10 21:59:14.667 UTC / 23:59 CEST, cleanup 22:04:46.092 UTC / 13.10 00:04 CEST. Wyjście faktycznie H264/AAC 1080p50; polityka podmieniona tylko dla dokładnego ID TVP1. **15/15 kontroli transportu, dwóch odbiorców, audio, wyjścia i zwolnienia źródła PASS.** Pierwszy widz: 297,551 s pomiaru, postęp 295,088 s (ratio 0,992), dropped 1,4%, około 48,855 kl./s nieodrzuconych, trzy oczekiwania / 2,473 s. Drugi: ratio 1,000, dropped 0,1%, około 49,913 kl./s, zero oczekiwań po starcie. Jeden fizyczny klient Jellyfina przez całą fazę dwóch widzów; licznik otwarć 19 nie wzrósł. Końcowo brak klientów OpenWebif i relay 0/0. Oba stanowiska zaliczyły kryterium płynności klienta testowego. Nie jest to gwarancja innych urządzeń ani słyszalnego dźwięku.
|
||
|
||
Po zakończeniu uzgodnionego okna i potwierdzeniu zera odbiorców wdrożono **7.0.7.0**: DLL i skrypt wtyczki, z wcześniej zatwierdzonym restartem wyłącznie Jellyfina. Backup `/var/lib/jellyfin/decoder-plugin-backups/plugin-only-20261012T220741Z` zawiera poprzednią DLL/manifest oraz JS. Instalator potwierdził aktywną wersję i niezmienione hashe `/etc/default/jellyfin`, `encoding.xml`, wrapperów oraz `index.html/config.json` Web. Nie zmieniono odbiornika ani konfiguracji serwera. Preferencja H264 jest domyślną wartością nowego pola w konfiguracji dodatku; nie zapisywano globalnych ustawień klienta.
|
||
|
||
`verify.py` sprawdził rzeczywisty endpoint dla zwykłego użytkownika: kanał Enigma true/true, film i brak false/false, użytkownik bez uprawnień TV 403. Preferencje, izolacja, natywna paginacja i admin ACL PASS; 216 kanałów i 38 aktualnych timerów, bez tworzenia nowych timerów przez test. `test-e2e.cjs --ui-only` na produkcyjnej 7.0.7 zakończył się **17/17 PASS**, 500 audycji i 500 grafik w sprawdzanym EPG; nagrania Vu pozostają wyłączone. Po restarcie liczniki relay i dopasowań EPG zaczynają od zera; istniejące grafiki programów pozostały w natywnych danych i przeszły test ładowania. Na tym etapie nie uruchamiano dodatkowej TV po wdrożeniu: krótka kontrola odtwarzania bez podmian wymaga kolejnego uzgodnionego okna. W przeglądarkach z wcześniejszym JS należy wymusić odświeżenie (Ctrl+F5).
|
||
|
||
Parametr `--frame=<plik.png>` w próbie ciągłej może zapisać jeden kadr aktywnego wideo dla kontroli wizualnej. Jest opcjonalny; sam licznik klatek nie potwierdza obrazu na ekranie człowieka ani jakości odsłuchu.
|
||
|
||
## Końcowe odtwarzanie produkcyjne 7.0.7 — 13.10.2026 CEST
|
||
|
||
Po osobnym START zadania odbiornika wykonano uzgodnione 90 s TVP1 z produkcyjną DLL i JS **bez żadnych podmian**. `reception-production-7.0.7-20261013.json`: firstframe 22:14:02.849 UTC / 00:14 CEST, cleanup 22:16:02.627 UTC / 00:16 CEST; **15/15 PASS**. Rzeczywiste H264/AAC, 1920×1080, tor audio dekodowany i licznik rosnący. Główny widz: 82,787 s próbkowania, postęp filmu 82,791 s, około 49,887 kl./s nieodrzuconych, dropped 0,2%, zero waiting po starcie. Drugi: około 49,948 kl./s, zero dropped i waiting w sprawdzonym oknie; ze względu na startup drugi klient był mierzony przez 11,452 s w zaplanowanej fazie 30–60 s. Starty obu, domyślne Kanały i powrót po zatrzymaniu PASS. Jeden fizyczny strumień odbiornika, relay Consumers 1→2→1→0, globalny licznik otwarć pozostawał 1 po restarcie. `reception-production-summary-7.0.7-20261013.json` oddziela kontrolę płynności od transportu.
|
||
|
||
Kadr `frame-7.0.7-20261013.png` obejrzano: rzeczywista transmisja wideo, nie picon ani plansza. Nie wykonywano odsłuchu przez człowieka; potwierdzenie audio dotyczy dekodowania. Końcowy niezależny odczyt: aktywna 7.0.7, zero źródeł, zero odbiorców relay, zero tymczasowych kont i zero plików `enigma-probe-*.ts`. Zakończenie przekazano zadaniu odbiornika; nie pozostawiono własnych sesji ani procesów próbnych. Testy TV po tej kontroli są zakończone. Nie sprawdzono w tej fazie wszystkich 216 kanałów, Android TV ani wielogodzinnej stabilności.
|
||
|
||
### Uzupełnienie zadania odbiornika — 13.10.2026, 00:23 CEST
|
||
|
||
Zadanie odbiornika przekazało wynik osobnej końcowej próby zakończonej 12.10 22:23:25 UTC: dodanie cache MPEG APID TVP1 `c:01027a` (PID 634) poprawiło inicjalizację audio. W tym samym układzie czterech TCP / trzech transponderów TVN24 i TVP2 video-only oraz dwie sesje TVP1 (pierwsze audio i jawny PID634) ukończyły 30 s z exit0 w 33–35 s; TVP1 729 klatek i MP2 48 kHz stereo 192 kb/s / 30 s PCM. Przed poprawką obie próby TVP1 przekraczały 65 s i rozpoznawały pierwsze audio jako MP3 / zero kanałów. Według przekazania zachowano AC3, CA i wybór audio oraz wykonano backup przed zmianą. Szczegółowe dowody, wdrożenie i odtworzenie cache należą do raportu/handoff zadania odbiornika; tutaj nie wykonywano ani niezależnie nie powtarzano tego testu.
|
||
|
||
Ta informacja rozdziela dwa potwierdzone zagadnienia: inicjalizację źródła/audio dekodera oraz płynność AV1 w kliencie Web. Wtyczka 7.0.7 i końcowe testy H264 pozostają aktualne. Nie należy zamieniać niezaliczonej wcześniejszej długiej próby natywnej w PASS na podstawie tej krótkiej kontroli; po poprawce cache nie ponawiano wielogodzinnego odbioru.
|
||
|
||
### ARTE — do uwzględnienia przy następnej aktualizacji kanałów
|
||
|
||
Podczas późniejszego sześciogodzinnego testu zadanie odbiornika przekazało naprawę dwóch dokładnych wpisów ARTE w `userbouquet.canalPL.tv` i `userbouquet.polsatbox.tv`: stare SID133 / TSID3E1C / 11681H zastąpiono sprawdzoną referencją `1:0:1:51B:2E7C:13F:820000:0:0:0:` na 10892H. Backup na odbiorniku: `/etc/enigma2/arte-reference-repair-20261012T232930Z-bcdb983f`. Według przekazania zastosowano PAUSE, sprawdzono brak strumieni i zajętych timerów, wykonano oficjalny reload listy i weryfikację, a następnie wznowiono test; picony i pozostałe wpisy zachowano.
|
||
|
||
Nową referencję należy uwzględnić przy następnej uzgodnionej aktualizacji mapy kanałów Jellyfina. W tym zadaniu zapisano wyłącznie tę informację: nie odświeżono produkcyjnych kanałów/EPG, nie otwarto TV i nie zmieniono serwera. Odbiornik jest zarezerwowany do 13.10.2026 07:25:06 CEST (05:25:06 UTC). Przy późniejszym odświeżeniu należy sprawdzić ARTE oraz zachowanie ulubionych/kolejności dla ewentualnie zmienionego ID kanału; nie wykonywać tego podczas trwającej próby.
|
||
|
||
### Korekta PMT i korelacji OSCam podczas próby 6h
|
||
|
||
Zadanie odbiornika później skorygowało indeks cache PMT w TVN24, TVP1, TVP2 i Polsat Sport1: zapis w lamedb używa dziesiętnego indeksu w formacie `%02d%x`, więc cPMTPID16 oznacza prefiks `c:16…`, a nie wcześniejszy `c:10…`. Backup `/etc/enigma2/pmt-cache-correction-20261012T235336Z-e6ccd7aa`; według przekazania sprawdzono zero strumieni/nagrań, oficjalny reload i weryfikację, po czym wznowiono test. Nie kopiować błędnych tokenów ze starszych opisów. W tym zadaniu nie wykonywano zmian cache ani aktualizacji mapy Jellyfina.
|
||
|
||
Odczyt OSCam dla trzech incydentów CC/decode nie wykazał timeoutów ECM ani błędów czytników/sieci. Po uwzględnieniu przekazanej różnicy zegarów (serwer195 przed odbiornikiem około1,94 s, granice1,28–2,59 s) zatrzymanie dekodowania BBC wystąpiło po wcześniejszych CC/decode, a STOP TVP Sport jest spójny z zamknięciem workera po błędzie. Zdarzenia STOP nie dowodzą przyczyny CA. Dowody i korekta: `../oscam-soak-correlation-20261013.json`; szczegółowy packet timeline i wynik6h należą do zadania odbiornika. Nie zmieniano OSCam ani nie otwierano transmisji do tej analizy.
|