[2026-09-25] eagle: personal/plans/lampac-watchlist-plugin.md
This commit is contained in:
1 parent
7bf5d22101
commit
1d5408abe6
1 file changed
+118
-2
@@ -8,7 +8,7 @@ related:
|
|||||||
- '[[family/projects/watchlist-automation]]'
|
- '[[family/projects/watchlist-automation]]'
|
||||||
- '[[family/documents/movies-watchlist]]'
|
- '[[family/documents/movies-watchlist]]'
|
||||||
- '[[personal/plans/lampac-watched-to-watchlist]]'
|
- '[[personal/plans/lampac-watched-to-watchlist]]'
|
||||||
status: sync-down-feed-implemented-matcher-parity-blocked
|
status: investigation-2026-09-25-all-screens-feed-and-latency
|
||||||
tags:
|
tags:
|
||||||
- lampac
|
- lampac
|
||||||
- lampa
|
- lampa
|
||||||
@@ -24,13 +24,129 @@ tags:
|
|||||||
- card-parse
|
- card-parse
|
||||||
- feed
|
- feed
|
||||||
- matcher-parity
|
- matcher-parity
|
||||||
|
- partnext
|
||||||
|
- latency
|
||||||
title: Watchlist в UI Lampa — каталог из списка
|
title: Watchlist в UI Lampa — каталог из списка
|
||||||
type: plan
|
type: plan
|
||||||
updated: '2026-09-24'
|
updated: '2026-09-25'
|
||||||
---
|
---
|
||||||
|
|
||||||
# Watchlist в UI Lampa — каталог из списка
|
# Watchlist в UI Lampa — каталог из списка
|
||||||
|
|
||||||
|
## 🔍 2026-09-25: РАССЛЕДОВАНИЕ — фид виден на всех экранах + «долго грузится»
|
||||||
|
|
||||||
|
**Жалоба Alex (дословно):** «есть проблема с watchlist фидом в лампе: он отображается
|
||||||
|
не только на "главной" но даже когда я выбираю категорию например "документальные"
|
||||||
|
в разделе Фильмы, то есть независимо от активного экрана. и он как будто долго
|
||||||
|
прогружается относительно основного CUB списка, почему он не моментально проявляется,
|
||||||
|
он же статичный».
|
||||||
|
|
||||||
|
**Статус: расследование завершено, причина установлена, фикс НЕ применён (ждёт апрува).**
|
||||||
|
|
||||||
|
### Причина 1 — фид на всех экранах: в `plugin-cub.js` НЕТ фильтра по экрану
|
||||||
|
|
||||||
|
Файл: `/Users/admin/lampac-tmp/plugin-cub.js` (196 строк, сборка `build_plugin.py`;
|
||||||
|
это тот же файл, что залит в Lampac как `module/Catalog/plugin.js`).
|
||||||
|
|
||||||
|
`wlPatchPartNext()` (строки 155–193) — перехват глобального `Lampa.Api.partNext`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
Lampa.Api.partNext = function (parts, parts_limit, partLoaded, partEmpty) {
|
||||||
|
try {
|
||||||
|
if (Lampa.Arrays.isArray(parts) && !parts.__wl_done) {
|
||||||
|
var menu = window.__wl_menu;
|
||||||
|
if (menu && Object.keys(menu).length) {
|
||||||
|
parts.__wl_done = true;
|
||||||
|
wlInject(parts, menu); // ← БЕЗУСЛОВНАЯ вставка
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ни одного обращения к активному экрану** — нет проверки `Lampa.Activity.active()`,
|
||||||
|
`activity.url`, `Lampa.Storage.field('source')` или чего-либо подобного.
|
||||||
|
|
||||||
|
Механика: `partNext` — глобальный API, через него строят страницу ВСЕ источники.
|
||||||
|
`plugin.js:30` (`main()`) и `plugin.js:36` (`category()`) **оба** вызывают
|
||||||
|
`Lampa.Api.partNext(parts_data, parts_limit, ...)`. Отсюда:
|
||||||
|
- CUB рисует главную → перехват срабатывает → наши 4 секции сверху;
|
||||||
|
- вход в категорию («документальные» внутри Фильмов) → Lampa перестраивает страницу
|
||||||
|
через **тот же** `partNext` → перехват срабатывает снова → фид снова сверху.
|
||||||
|
|
||||||
|
`wlInject()` (строки 121–127) кладёт секции через `unshift` в **начало** пула, поэтому
|
||||||
|
они рисуются поверх содержимого любой категории — ровно то, на что жалуется Alex.
|
||||||
|
|
||||||
|
### Причина 2 — «долго грузится»: замеры (не догадки)
|
||||||
|
|
||||||
|
Всё замерено `curl` на Кра́кене по `127.0.0.1:9118` (порт только изнутри хоста):
|
||||||
|
|
||||||
|
| Запрос | Время | `size_download` |
|
||||||
|
|---|---|---|
|
||||||
|
| `GET /catalog/list?plugin=watchlist&cat=films` — повторный | **4 мс** | 107 640 |
|
||||||
|
| тот же — **первый (холодный кэш)** | **2 250 мс** | 107 640 |
|
||||||
|
| `GET /watchlist-films.json` — чистая статика мимо Catalog | **1 мс** | 88 156 |
|
||||||
|
| `GET /catalog/list?plugin=watchlist&cat=new` | 2–147 мс | 8 512 |
|
||||||
|
| **`GET /catalog/card?plugin=watchlist&uri=movie%2F424781&type=movie`** | **66 118 мс** | 939 |
|
||||||
|
|
||||||
|
🔴 **ПИТФОЛЛ ЗАМЕРА: `curl -w '%{size_download}'` показывает размер СЖАТОГО тела.**
|
||||||
|
Я сначала прочитал 107 640 как «фид всего 105 КБ, грузиться нечему» — это ошибка.
|
||||||
|
Реальные размеры: `watchlist-films.json` = **88 156 несжатых** при 347 позициях,
|
||||||
|
`cards.json` = **548 219** (данные `ls -la` на Кра́кене). Для замеров объёма брать
|
||||||
|
`ls -la` или `%{size_download}` вместе с `Accept-Encoding: identity`.
|
||||||
|
|
||||||
|
**Что из этого следует:**
|
||||||
|
|
||||||
|
1. **4 мс на прогретом кэше** — данные отдаются мгновенно, «статичный» — правда.
|
||||||
|
2. **2.25 с на ПЕРВОМ холодном запросе категории** — это парсинг JSON парсерами
|
||||||
|
модуля Catalog (`content.nodes`, `args`) при пустом `hybridCache`. Дальше — кэш.
|
||||||
|
Отсюда ощущение «не моментально проявляется»: категория, которую давно не открывали,
|
||||||
|
платит 2+ секунды, а родной CUB-список тем временем уже отрисован.
|
||||||
|
3. **66 секунд на карточке фильма** — отдельный, более серьёзный баг. 66 с на файл
|
||||||
|
939 байт из локального каталога — это не диск. `card_parse.initUrl` исполняется как
|
||||||
|
C#, `node: card`, читается `wwwroot/cards/card-movie-NNN.json`. Внутри
|
||||||
|
`CardController` что-то ждёт (таймаут внешнего вызова / `reactionsGet` к cub).
|
||||||
|
**Не диагностировано до конца — следующий шаг.**
|
||||||
|
4. **Наши секции стартуют позже родных:** `partNext` собирает пул, `parts_limit = 6`,
|
||||||
|
наши секции идут через `unshift` и грузятся отдельным HTTP-запросом на каждую
|
||||||
|
(`/catalog/list?plugin=watchlist&cat=<code>`) — 4 запроса. Родной фид CUB приходит
|
||||||
|
одним запросом, поэтому «проявляется» раньше.
|
||||||
|
|
||||||
|
### Контракт Lampac (проверено, НЕ трогать без причины)
|
||||||
|
|
||||||
|
`catalog/sites/watchlist.yaml` на Кра́кене
|
||||||
|
(`/srv/dev-disk-by-uuid-6194539b-.../lampac/catalog/sites/watchlist.yaml`):
|
||||||
|
|
||||||
|
- `plugin: watchlist` (🔴 без него ключ = `displayname` = «Мой список» → `ModInit.goInit`
|
||||||
|
вырезает кириллицу регуляркой `[^a-z0-9\-]` → site="" → HTTP 400 → «ЗДЕСЬ ПУСТО»).
|
||||||
|
- `host: http://127.0.0.1:9118`, категории `Новинки/Films/Мультфильмы/Аниме`.
|
||||||
|
- 🔴 **Первая категория в списке ИГНОРИРУЕТ `format`** и берёт `list.uri` напрямую —
|
||||||
|
поэтому первой стоит «Новинки» (`list.uri: watchlist-new.json`).
|
||||||
|
- `card_parse.initUrl` конвертирует `uri` `movie/424781` → `cards/card-movie-424781.json`,
|
||||||
|
`node: card`. `card_args.tmdb_id` обязан быть **числом** (через `format: long.TryParse`),
|
||||||
|
иначе карточка = «здесь пусто».
|
||||||
|
|
||||||
|
**Nightly-пайплайн** (`/home/kraken/scripts/watchlist-nightly.sh`, крон `0 1 * * *`,
|
||||||
|
пользователь `kraken` НА КРА́КЕНЕ): `sync-vault pull` → `process-thumbs --apply` →
|
||||||
|
`resolve --recheck --apply` → **`sync-down --apply`** (сборка фида, `LAMPAC_ROOT=`UUID-путь)
|
||||||
|
→ `sync-up --apply` → backup `TimeCode.sql` (`sqlite3 .backup`) → `sync-from-lampac --apply`
|
||||||
|
→ `sync-vault push`. Рестарта lampac в скрипте НЕТ и он не нужен (`wwwroot/` bind-mount,
|
||||||
|
тот же inode) — но при залипшем каталоге в UI помогает обновление страницы / переключение
|
||||||
|
категории. На 2026-09-25 `watchlist-catalog.sh` уже убран в `.bak-removed-20260924-181942`,
|
||||||
|
отдельной строки крона `30 2 * * *` в crontab **нет** (п.2 из списка незакрытого — закрыт).
|
||||||
|
|
||||||
|
### Открытые шаги (для следующей сессии)
|
||||||
|
|
||||||
|
1. **Фикс «фид на всех экранах»:** добавить в `wlPatchPartNext` проверку активного экрана —
|
||||||
|
инжектить только когда `Lampa.Activity.active()` указывает на главную, иначе
|
||||||
|
пропускать. Точный предикат определить CDP-пробой на живом ТВ (`probe_ui.py`):
|
||||||
|
прочитать `Lampa.Activity.active()` на главной и внутри категории, сравнить.
|
||||||
|
2. **Диагностировать 66 с на карточке** — `docker logs lampac` + трейс `CardController`.
|
||||||
|
3. **Matcher-parity** (главный блокер с 2026-09-24, см. ниже) — всё ещё не закрыт.
|
||||||
|
|
||||||
|
**Правило диагностики этой сессии:** не читать `%{size_download}` как «размер фида»
|
||||||
|
(это gzip). И — `ifconfig` на Кра́кене отсутствует, ssh-команды через `bash -c` иначе
|
||||||
|
падают шумом.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🔴 2026-09-24 (вечер): ПЕРЕПИСЫВАНИЕ — один sync-скрипт вместо отдельного генератора
|
## 🔴 2026-09-24 (вечер): ПЕРЕПИСЫВАНИЕ — один sync-скрипт вместо отдельного генератора
|
||||||
|
|
||||||
**Требование Alex:** «перепиши по нормальному чтобы не отдельный скрипт на лампу был
|
**Требование Alex:** «перепиши по нормальному чтобы не отдельный скрипт на лампу был
|
||||||
|
|||||||
Reference in new issue
Block a user