feat(stalker): full Live TV channel list for complete search, count badges, and all-channels grid (#1209)

Load the complete ITV channel list once per portal (Ministra get_all_channels with a paged crawl fallback) and use it for: full local search across every channel, per-genre category count badges, an all-channels paginated grid on Live TV entry, and eager bulk EPG so row previews appear without playing a channel. Censored (adult) genres absent from get_all_channels fall back to the legacy paged flow and show no badge. Includes mock-server support, unit + E2E coverage, and architecture docs.
This commit is contained in:
4gray authored and GitHub committed 2026-07-23 23:31:49 +02:00
1 parent e53adcbeaf
commit b3e130aa65
56 files changed
+3044 -63

No files matched your search

+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "هذا المحتوى غير متاح على هذا الخادم",
"PLAYBACK_ERROR": "فشل الحصول على رابط التشغيل",
"LOADING_SEASONS": "جارٍ تحميل المواسم...",
"LOADING_ALL_CHANNELS": "جارٍ تحميل قائمة القنوات الكاملة…",
"REFRESH_CHANNEL_LIST": "تحديث قائمة القنوات",
"NO_CHANNELS_IN_CATEGORY": "لا توجد قنوات في هذه الفئة",
"ITEM": "عنصر",
"ITEMS": "عناصر",
"NO_EPISODES": "لا توجد حلقات متاحة",
"ALL_RADIO": "كل الراديو"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "هاد المحتوى ما متوفرش على هاد السيرفر",
"PLAYBACK_ERROR": "فشل جلب رابط التشغيل",
"LOADING_SEASONS": "جاري تشريج المواسم...",
"LOADING_ALL_CHANNELS": "كيتم تحميل لائحة القنوات كاملة…",
"REFRESH_CHANNEL_LIST": "تحديث لائحة القنوات",
"NO_CHANNELS_IN_CATEGORY": "ماكاينش قنوات فهاد الصنف",
"ITEM": "عنصر",
"ITEMS": "عناصر",
"NO_EPISODES": "ما كاينش حلقات متوفرة",
"ALL_RADIO": "All radio"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Гэты кантэнт недаступны на дадзеным серверы",
"PLAYBACK_ERROR": "Не ўдалося атрымаць URL для прайгравання",
"LOADING_SEASONS": "Загрузка сезонаў...",
"LOADING_ALL_CHANNELS": "Загрузка поўнага спісу каналаў…",
"REFRESH_CHANNEL_LIST": "Абнавіць спіс каналаў",
"NO_CHANNELS_IN_CATEGORY": "У гэтай катэгорыі няма каналаў",
"ITEM": "элемент",
"ITEMS": "элементаў",
"NO_EPISODES": "Няма даступных эпізодаў",
"ALL_RADIO": "Усе радыё"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Dieser Inhalt ist auf diesem Server nicht verfügbar",
"PLAYBACK_ERROR": "Wiedergabe-URL konnte nicht abgerufen werden",
"LOADING_SEASONS": "Staffeln werden geladen …",
"LOADING_ALL_CHANNELS": "Vollständige Senderliste wird geladen…",
"REFRESH_CHANNEL_LIST": "Senderliste aktualisieren",
"NO_CHANNELS_IN_CATEGORY": "Keine Sender in dieser Kategorie",
"ITEM": "Element",
"ITEMS": "Elemente",
"NO_EPISODES": "Keine Episoden verfügbar",
"ALL_RADIO": "Alle Radiosender"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Αυτό το περιεχόμενο δεν είναι διαθέσιμο σε αυτόν τον διακομιστή",
"PLAYBACK_ERROR": "Αποτυχία λήψης διεύθυνσης URL αναπαραγωγής",
"LOADING_SEASONS": "Φόρτωση σεζόν...",
"LOADING_ALL_CHANNELS": "Φόρτωση πλήρους λίστας καναλιών…",
"REFRESH_CHANNEL_LIST": "Ανανέωση λίστας καναλιών",
"NO_CHANNELS_IN_CATEGORY": "Δεν υπάρχουν κανάλια σε αυτήν την κατηγορία",
"ITEM": "στοιχείο",
"ITEMS": "στοιχεία",
"NO_EPISODES": "Δεν υπάρχουν διαθέσιμα επεισόδια",
"ALL_RADIO": "Όλα τα ραδιόφωνα"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "This content is not available on this server",
"PLAYBACK_ERROR": "Failed to get playback URL",
"LOADING_SEASONS": "Loading seasons...",
"LOADING_ALL_CHANNELS": "Loading full channel list…",
"REFRESH_CHANNEL_LIST": "Refresh channel list",
"NO_CHANNELS_IN_CATEGORY": "No channels in this category",
"ITEM": "item",
"ITEMS": "items",
"NO_EPISODES": "No episodes available",
"ALL_RADIO": "All radio"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Este contenido no está disponible en este servidor",
"PLAYBACK_ERROR": "No se pudo obtener la URL de reproducción",
"LOADING_SEASONS": "Cargando temporadas…",
"LOADING_ALL_CHANNELS": "Cargando la lista completa de canales…",
"REFRESH_CHANNEL_LIST": "Actualizar lista de canales",
"NO_CHANNELS_IN_CATEGORY": "No hay canales en esta categoría",
"ITEM": "elemento",
"ITEMS": "elementos",
"NO_EPISODES": "No hay episodios disponibles",
"ALL_RADIO": "Todas las radios"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Ce contenu n'est pas disponible sur ce serveur",
"PLAYBACK_ERROR": "Échec de l'obtention de l'URL de lecture",
"LOADING_SEASONS": "Chargement des saisons…",
"LOADING_ALL_CHANNELS": "Chargement de la liste complète des chaînes…",
"REFRESH_CHANNEL_LIST": "Actualiser la liste des chaînes",
"NO_CHANNELS_IN_CATEGORY": "Aucune chaîne dans cette catégorie",
"ITEM": "élément",
"ITEMS": "éléments",
"NO_EPISODES": "Aucun épisode disponible",
"ALL_RADIO": "Toutes les radios"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Questo contenuto non è disponibile su questo server",
"PLAYBACK_ERROR": "Impossibile ottenere l'URL di riproduzione",
"LOADING_SEASONS": "Caricamento stagioni...",
"LOADING_ALL_CHANNELS": "Caricamento dell'elenco completo dei canali…",
"REFRESH_CHANNEL_LIST": "Aggiorna elenco canali",
"NO_CHANNELS_IN_CATEGORY": "Nessun canale in questa categoria",
"ITEM": "elemento",
"ITEMS": "elementi",
"NO_EPISODES": "Nessun episodio disponibile",
"ALL_RADIO": "Tutte le radio"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "このコンテンツはこのサーバーでは利用できません",
"PLAYBACK_ERROR": "再生URLの取得に失敗しました",
"LOADING_SEASONS": "シーズンを読み込み中...",
"LOADING_ALL_CHANNELS": "全チャンネルリストを読み込み中…",
"REFRESH_CHANNEL_LIST": "チャンネルリストを更新",
"NO_CHANNELS_IN_CATEGORY": "このカテゴリーにチャンネルがありません",
"ITEM": "件",
"ITEMS": "件",
"NO_EPISODES": "利用可能なエピソードはありません",
"ALL_RADIO": "すべてのラジオ"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "이 서버에서는 이 콘텐츠를 사용할 수 없습니다",
"PLAYBACK_ERROR": "재생 URL을 가져오지 못했습니다",
"LOADING_SEASONS": "시즌을 불러오는 중...",
"LOADING_ALL_CHANNELS": "전체 채널 목록 불러오는 중…",
"REFRESH_CHANNEL_LIST": "채널 목록 새로고침",
"NO_CHANNELS_IN_CATEGORY": "이 카테고리에 채널이 없습니다",
"ITEM": "개",
"ITEMS": "개",
"NO_EPISODES": "사용 가능한 에피소드가 없습니다",
"ALL_RADIO": "모든 라디오"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Deze inhoud is niet beschikbaar op deze server",
"PLAYBACK_ERROR": "Ophalen van afspeel-URL mislukt",
"LOADING_SEASONS": "Seizoenen laden...",
"LOADING_ALL_CHANNELS": "Volledige zenderlijst wordt geladen…",
"REFRESH_CHANNEL_LIST": "Zenderlijst vernieuwen",
"NO_CHANNELS_IN_CATEGORY": "Geen zenders in deze categorie",
"ITEM": "item",
"ITEMS": "items",
"NO_EPISODES": "Geen afleveringen beschikbaar",
"ALL_RADIO": "Alle radio"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Ta treść jest niedostępna na tym serwerze",
"PLAYBACK_ERROR": "Nie udało się uzyskać URL odtwarzania",
"LOADING_SEASONS": "Ładowanie sezonów...",
"LOADING_ALL_CHANNELS": "Ładowanie pełnej listy kanałów…",
"REFRESH_CHANNEL_LIST": "Odśwież listę kanałów",
"NO_CHANNELS_IN_CATEGORY": "Brak kanałów w tej kategorii",
"ITEM": "pozycja",
"ITEMS": "pozycji",
"NO_EPISODES": "Brak dostępnych odcinków",
"ALL_RADIO": "Wszystkie radia"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Este conteúdo não está disponível neste servidor",
"PLAYBACK_ERROR": "Falha ao obter URL de reprodução",
"LOADING_SEASONS": "Carregando temporadas...",
"LOADING_ALL_CHANNELS": "A carregar a lista completa de canais…",
"REFRESH_CHANNEL_LIST": "Atualizar lista de canais",
"NO_CHANNELS_IN_CATEGORY": "Nenhum canal nesta categoria",
"ITEM": "item",
"ITEMS": "itens",
"NO_EPISODES": "Nenhum episódio disponível",
"ALL_RADIO": "Todas as rádios"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Этот контент недоступен на этом сервере",
"PLAYBACK_ERROR": "Не удалось получить URL для воспроизведения",
"LOADING_SEASONS": "Загрузка сезонов…",
"LOADING_ALL_CHANNELS": "Загрузка полного списка каналов…",
"REFRESH_CHANNEL_LIST": "Обновить список каналов",
"NO_CHANNELS_IN_CATEGORY": "В этой категории нет каналов",
"ITEM": "элемент",
"ITEMS": "элементов",
"NO_EPISODES": "Нет доступных эпизодов",
"ALL_RADIO": "Все радио"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "Bu içerik bu sunucuda mevcut değil",
"PLAYBACK_ERROR": "Oynatma URL'si alınamadı",
"LOADING_SEASONS": "Sezonlar yükleniyor...",
"LOADING_ALL_CHANNELS": "Tüm kanal listesi yükleniyor…",
"REFRESH_CHANNEL_LIST": "Kanal listesini yenile",
"NO_CHANNELS_IN_CATEGORY": "Bu kategoride kanal yok",
"ITEM": "öğe",
"ITEMS": "öğe",
"NO_EPISODES": "Bölüm mevcut değil",
"ALL_RADIO": "Tüm radyolar"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "此服务器上没有此内容",
"PLAYBACK_ERROR": "获取播放 URL 失败",
"LOADING_SEASONS": "正在加载季…",
"LOADING_ALL_CHANNELS": "正在加载完整频道列表…",
"REFRESH_CHANNEL_LIST": "刷新频道列表",
"NO_CHANNELS_IN_CATEGORY": "此分类中没有频道",
"ITEM": "项",
"ITEMS": "项",
"NO_EPISODES": "没有可用的剧集",
"ALL_RADIO": "所有广播"
},
+5
View File
@@ -968,6 +968,11 @@
"CONTENT_NOT_AVAILABLE": "此伺服器上未提供此內容",
"PLAYBACK_ERROR": "無法取得播放網址",
"LOADING_SEASONS": "正在載入季數...",
"LOADING_ALL_CHANNELS": "正在載入完整頻道清單…",
"REFRESH_CHANNEL_LIST": "重新整理頻道清單",
"NO_CHANNELS_IN_CATEGORY": "此分類中沒有頻道",
"ITEM": "項",
"ITEMS": "項",
"NO_EPISODES": "沒有可用的集數",
"ALL_RADIO": "所有廣播"
},