diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md index f013ecd0..426b7c0d 100644 --- a/personal/plans/lampac-watchlist-plugin.md +++ b/personal/plans/lampac-watchlist-plugin.md @@ -2015,3 +2015,81 @@ Lampa на ТВ **кэширует манифест и ответы**. Посл - Доклады по карточке — [[personal/tech/lampac-deployment]] (конец файла). ## Связанные + +## ✅ РАБОТАЕТ НА ТВ (2026-09-22, вечер) — подтверждено Alex + +**«Фильмы из списка Watchlist теперь открываются и проигрываются.»** + +### 🔴🔴 КОРНЕВАЯ ПРИЧИНА «ЗДЕСЬ ПУСТО» — РУССКИЙ КЛЮЧ ПЛАГИНА + +Поймано tcpdump'ом на Кра́кене, запрос с ТВ: + +``` +GET /catalog/card?plugin=%D0%9C%D0%BE%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA&uri=movie%2F1280015&type=movie +HTTP/1.1 400 Bad Request +``` + +`plugin=Мой список` — ключ каталога брался из `displayname`. + +`ModInit.goInit` (строки 51-52): + +```csharp +site = site.ToLowerAndTrim(); +site = Regex.Replace(site, "[^a-z0-9\\-]", "", RegexOptions.IgnoreCase); +``` + +**Кириллица вырезается ЦЕЛИКОМ** → `site = ""` → +`File.Exists("/sites/.yaml")` = false → +`FindSiteByDisplayName("")` тоже мимо (пустой site не совпадёт с displayname) → +`return null` → **`init not found`** → HTTP 400 → в Lampa «ЗДЕСЬ ПУСТО». + +🔴 **Fallback по `displayname` НЕ РАБОТАЕТ с кириллицей** — regex убивает имя +раньше, чем запускается поиск. Это баг/особенность lampac-nextgen. + +**ФИКС:** задать `plugin: watchlist` в YAML. Строка `ApiController.cs:136`: +```csharp +string siteKey = !string.IsNullOrEmpty(init.plugin) ? init.plugin : init.displayname ?? site; +``` +заданный `plugin` переопределяет ключ каталога → ТВ зовёт `plugin=watchlist` → файл находится. + +**Приёмка:** +| Ключ | Ответ | +|---|---| +| `plugin=Мой список` | 400 `init not found` | +| `plugin=watchlist` | 200, `tmdb_id: 424781`, `source: "movie"` | + +⚠️ **МЕТОДОЛОГИЧЕСКИЙ ВЫВОД (важно):** я проверял карточку своим `curl`'ом с +`plugin=watchlist` и был уверен, что всё работает. **Надо было ловить РЕАЛЬНЫЙ +запрос с устройства** (tcpdump на порту сервиса). Урок: при «сервер отвечает 200, +а в UI пусто» — первым делом снять трафик между устройством и сервером. + +### Что сделано в этом заходе + +1. `plugin: watchlist` в `sites/watchlist.yaml` — ключ каталога латиницей. +2. `card_args` с `format` для числовых полей: + `tmdb_id` → `long.TryParse`, `runtime` → `long.TryParse`, + `vote_average` → `double.TryParse`. + Причина: `ModInit.cs:285` `nodeValue` возвращает ЛЮБОЙ `JValue` как строку, а + `plugin.js` делает `if(json.tmdb_id)` — нужен настоящий `long`. +3. `deploy_lampac.py`: проверка ключа `watchlist` (не «Мой список»), проверка карточек + по `/catalog/card`, заливка `cards/` через tar. +4. `gen_watchlist_v2.py`: `tmdb_id` числом; дубли ключей + (`name`+`title`, `original`+`original_title`, `poster`+`img`). + +## ⏳ ОСТАЛОСЬ ДОБИТЬ + +1. **Несколько фильмов всё ещё «здесь ничего нет»** — «Рассекая волны», «Хамнет». + Похоже, для них нет `card-movie-NNN.json` (TMDB не нашёл / Кинопоиск-фолбэк + без tmdb id) → `initUrl` ведёт на несуществующий файл. + Лечить: фолбэк-карточка с тем, что есть (название+постер+поиск торрента), + либо дотягивать tmdb_id по точному названию+году. +2. **~51 фильм без постера** — TMDB не нашёл ни напрямую, ни через Кинопоиск. + Разобрать поштучно: возможно, помогают альтернативные названия (`original_title`). +3. **Секции CUB.** В «Мой список» только 3 секции (Фильмы/Мультфильмы/Аниме), + «Новинки» куда-то делись? И главное — **фильмов из CUB-фида в списке нет**. + Требование Alex: **секции должны быть ВНУТРИ CUB**, без ручного переключения + источника. Механизм: хук `Listener.follow('menu')` в `plugin.js` (строка 59) + перехватывает `movie`/`cartoon`/`anime`/`tv`/`relise` и делает `e.abort()`, + НО работает только когда активен наш источник (`Api.getCatalog()` читает + манифест текущего источника). Нужно доделать так, чтобы при источнике CUB + наши секции добавлялись к CUB-фиду.