[2026-09-22] eagle: personal/plans/lampac-watchlist-plugin.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 16:02:13 +06:00
1 parent 5e85c81767
commit 9e1a06340f
1 file changed
+78
+78
View File
@@ -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-фиду.