feat(portal): season thumbnails in the season dropdown + PR #1628 follow-ups (#1633)

* feat(portal): season thumbnails in the season dropdown + PR #1628 follow-ups

Follow-ups to the season posters shipped in #1628:

- The >6-seasons dropdown (`SeasonTabsComponent`) now carries a 28×42
  season thumbnail at the start of each menu row that has a poster and in
  the closed trigger for the selected season, fed by a new `seasonPosters`
  input from the season container and the fullscreen episode panel. Rows
  without a poster get no placeholder, a failed image is dropped, and the
  pill row stays text-only as the design review decided.
- The fullscreen season strip's episode count uses its own
  `PORTALS.EPISODE_COUNT_ONE/OTHER` keys instead of borrowing the download
  manager's; all 18 locales filled through the i18n merger from their
  existing `DOWNLOADS.EPISODE_COUNT_*` translations.
- The Stalker mock's serve targets no longer pin `PORT` (an nx:run-commands
  `env` entry overrides the shell), and `main.ts` resolves `PORT`, then the
  Playwright-side `MOCK_PORT` alias, then 3210 — so `MOCK_PORT=3310` now
  relocates the whole E2E run. The Xtream mock honours `XTREAM_MOCK_PORT`
  the same way.
- `resolveAutoSelectedSeason` gets a direct spec covering every branch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(xtream-mock): mint marketing asset URLs on the port the server bound

Greptile P1 on #1633: the listener honoured `XTREAM_MOCK_PORT`, but
`marketingAssetOrigin()` still read `PORT` alone, so a run relocated only
through the alias sent every poster/backdrop/logo/episode URL to 3211.

One resolver (`resolveXtreamMockPortString` in `mock-port.ts`: `PORT`,
then `XTREAM_MOCK_PORT`, then 3211) now feeds the environment parser, the
marketing asset origin and the demo-guide origin fallback. A spec pins the
precedence and that `marketingAssetUrl` follows the bound port.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5.1 authored and GitHub committed 2026-09-19 14:54:54 +02:00
1 parent 01c423ac43
commit 4cce4acaad
43 files changed
+699 -32

No files matched your search

+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "نبذة",
"SEASONS_AND_EPISODES": "المواسم والحلقات",
"SEASON_TAB": "الموسم {{number}}",
"EPISODE_COUNT_ONE": "حلقة واحدة",
"EPISODE_COUNT_OTHER": "{{count}} حلقات",
"BACK_TO_PLAYING_EPISODE": "العودة إلى الحلقة قيد التشغيل",
"GRID_VIEW": "عرض شبكي",
"LIST_VIEW": "عرض قائمة",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "حول",
"SEASONS_AND_EPISODES": "المواسم والحلقات",
"SEASON_TAB": "الموسم {{number}}",
"EPISODE_COUNT_ONE": "حلقة وحدة",
"EPISODE_COUNT_OTHER": "{{count}} حلقات",
"BACK_TO_PLAYING_EPISODE": "رجوع للحلقة اللي كتشغل",
"GRID_VIEW": "عرض الشبكة",
"LIST_VIEW": "عرض اللائحة",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Пра фільм",
"SEASONS_AND_EPISODES": "Сезоны і эпізоды",
"SEASON_TAB": "Сезон {{number}}",
"EPISODE_COUNT_ONE": "1 эпізод",
"EPISODE_COUNT_OTHER": "{{count}} эпізодаў",
"BACK_TO_PLAYING_EPISODE": "Назад да бягучага эпізоду",
"GRID_VIEW": "Выгляд сеткай",
"LIST_VIEW": "Выгляд спісам",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Info",
"SEASONS_AND_EPISODES": "Staffeln und Folgen",
"SEASON_TAB": "Staffel {{number}}",
"EPISODE_COUNT_ONE": "1 Episode",
"EPISODE_COUNT_OTHER": "{{count}} Episoden",
"BACK_TO_PLAYING_EPISODE": "Zurück zur laufenden Folge",
"GRID_VIEW": "Rasteransicht",
"LIST_VIEW": "Listenansicht",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Σχετικά",
"SEASONS_AND_EPISODES": "Σεζόν και επεισόδια",
"SEASON_TAB": "Σεζόν {{number}}",
"EPISODE_COUNT_ONE": "1 επεισόδιο",
"EPISODE_COUNT_OTHER": "{{count}} επεισόδια",
"BACK_TO_PLAYING_EPISODE": "Πίσω στο επεισόδιο που παίζει",
"GRID_VIEW": "Προβολή πλέγματος",
"LIST_VIEW": "Προβολή λίστας",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "About",
"SEASONS_AND_EPISODES": "Seasons and Episodes",
"SEASON_TAB": "Season {{number}}",
"EPISODE_COUNT_ONE": "1 episode",
"EPISODE_COUNT_OTHER": "{{count}} episodes",
"BACK_TO_PLAYING_EPISODE": "Back to playing episode",
"GRID_VIEW": "Grid view",
"LIST_VIEW": "List view",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Acerca de",
"SEASONS_AND_EPISODES": "Temporadas y episodios",
"SEASON_TAB": "Temporada {{number}}",
"EPISODE_COUNT_ONE": "1 episodio",
"EPISODE_COUNT_OTHER": "{{count}} episodios",
"BACK_TO_PLAYING_EPISODE": "Volver al episodio en reproducción",
"GRID_VIEW": "Vista de cuadrícula",
"LIST_VIEW": "Vista de lista",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "À propos",
"SEASONS_AND_EPISODES": "Saisons et épisodes",
"SEASON_TAB": "Saison {{number}}",
"EPISODE_COUNT_ONE": "1 épisode",
"EPISODE_COUNT_OTHER": "{{count}} épisodes",
"BACK_TO_PLAYING_EPISODE": "Retour à l'épisode en cours",
"GRID_VIEW": "Vue en grille",
"LIST_VIEW": "Vue en liste",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Ismertető",
"SEASONS_AND_EPISODES": "Évadok és epizódok",
"SEASON_TAB": "{{number}}. évad",
"EPISODE_COUNT_ONE": "1 epizód",
"EPISODE_COUNT_OTHER": "{{count}} epizód",
"BACK_TO_PLAYING_EPISODE": "Vissza a lejátszás alatt álló epizódhoz",
"GRID_VIEW": "Rácsnézet",
"LIST_VIEW": "Listanézet",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Info",
"SEASONS_AND_EPISODES": "Stagioni ed episodi",
"SEASON_TAB": "Stagione {{number}}",
"EPISODE_COUNT_ONE": "1 episodio",
"EPISODE_COUNT_OTHER": "{{count}} episodi",
"BACK_TO_PLAYING_EPISODE": "Torna all'episodio in riproduzione",
"GRID_VIEW": "Vista griglia",
"LIST_VIEW": "Vista elenco",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "概要",
"SEASONS_AND_EPISODES": "シーズンとエピソード",
"SEASON_TAB": "シーズン{{number}}",
"EPISODE_COUNT_ONE": "1 エピソード",
"EPISODE_COUNT_OTHER": "{{count}} エピソード",
"BACK_TO_PLAYING_EPISODE": "再生中のエピソードに戻る",
"GRID_VIEW": "グリッド表示",
"LIST_VIEW": "リスト表示",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "정보",
"SEASONS_AND_EPISODES": "시즌 및 에피소드",
"SEASON_TAB": "시즌 {{number}}",
"EPISODE_COUNT_ONE": "에피소드 1개",
"EPISODE_COUNT_OTHER": "에피소드 {{count}}개",
"BACK_TO_PLAYING_EPISODE": "재생 중인 에피소드로 돌아가기",
"GRID_VIEW": "그리드 보기",
"LIST_VIEW": "목록 보기",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Over",
"SEASONS_AND_EPISODES": "Seizoenen en afleveringen",
"SEASON_TAB": "Seizoen {{number}}",
"EPISODE_COUNT_ONE": "1 aflevering",
"EPISODE_COUNT_OTHER": "{{count}} afleveringen",
"BACK_TO_PLAYING_EPISODE": "Terug naar lopende aflevering",
"GRID_VIEW": "Rasterweergave",
"LIST_VIEW": "Lijstweergave",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Informacje",
"SEASONS_AND_EPISODES": "Sezony i odcinki",
"SEASON_TAB": "Sezon {{number}}",
"EPISODE_COUNT_ONE": "1 odcinek",
"EPISODE_COUNT_OTHER": "{{count}} odcinków",
"BACK_TO_PLAYING_EPISODE": "Wróć do odtwarzanego odcinka",
"GRID_VIEW": "Widok siatki",
"LIST_VIEW": "Widok listy",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Sobre",
"SEASONS_AND_EPISODES": "Temporadas e episódios",
"SEASON_TAB": "Temporada {{number}}",
"EPISODE_COUNT_ONE": "1 episódio",
"EPISODE_COUNT_OTHER": "{{count}} episódios",
"BACK_TO_PLAYING_EPISODE": "Voltar ao episódio em reprodução",
"GRID_VIEW": "Visualização em grade",
"LIST_VIEW": "Visualização em lista",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Об этом",
"SEASONS_AND_EPISODES": "Сезоны и эпизоды",
"SEASON_TAB": "Сезон {{number}}",
"EPISODE_COUNT_ONE": "1 эпизод",
"EPISODE_COUNT_OTHER": "{{count}} эпизодов",
"BACK_TO_PLAYING_EPISODE": "Вернуться к воспроизводимому эпизоду",
"GRID_VIEW": "Вид сеткой",
"LIST_VIEW": "Вид списком",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "Hakkında",
"SEASONS_AND_EPISODES": "Sezonlar ve Bölümler",
"SEASON_TAB": "{{number}}. Sezon",
"EPISODE_COUNT_ONE": "1 bölüm",
"EPISODE_COUNT_OTHER": "{{count}} bölüm",
"BACK_TO_PLAYING_EPISODE": "Oynatılan bölüme dön",
"GRID_VIEW": "Izgara görünümü",
"LIST_VIEW": "Liste görünümü",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "简介",
"SEASONS_AND_EPISODES": "季与集",
"SEASON_TAB": "第 {{number}} 季",
"EPISODE_COUNT_ONE": "1 集",
"EPISODE_COUNT_OTHER": "{{count}} 集",
"BACK_TO_PLAYING_EPISODE": "返回正在播放的剧集",
"GRID_VIEW": "网格视图",
"LIST_VIEW": "列表视图",
+2
View File
@@ -1249,6 +1249,8 @@
"ABOUT": "簡介",
"SEASONS_AND_EPISODES": "季數與集數",
"SEASON_TAB": "第 {{number}} 季",
"EPISODE_COUNT_ONE": "1 集",
"EPISODE_COUNT_OTHER": "{{count}} 集",
"BACK_TO_PLAYING_EPISODE": "返回正在播放的集數",
"GRID_VIEW": "格狀檢視",
"LIST_VIEW": "清單檢視",