[2026-09-25] eagle: personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-25 22:26:07 +06:00
1 parent 7dbfead569
commit 6b00a2986f
2 files changed
+211 -23

No files matched your search

+139 -9
View File
@@ -8,7 +8,7 @@ related:
- '[[family/projects/watchlist-automation]]'
- '[[family/documents/movies-watchlist]]'
- '[[personal/plans/lampac-watched-to-watchlist]]'
status: main-screen-filter-fix-regressed-then-fixed-2026-09-25-acceptance-blocked-on-empty-catalog
status: main-screen-filter-WORKS-2026-09-25-accepted-latency-prefetch-pending
tags:
- lampac
- lampa
@@ -42,8 +42,9 @@ updated: '2026-09-25'
прогружается относительно основного CUB списка, почему он не моментально проявляется,
он же статичный».
**Статус: ⚠️ ФИКС ПРИМЕНЁН И ЗАЛИТ 2026-09-25, НО ПРИЁМКА ПРОВАЛЕНА — секции на
главной исчезли. См. «РЕГРЕСС И ВТОРОЙ ФИКС» ниже — там актуальная версия `wlOnMain`.**
**Статус: ✅ ПРИЁМКА ПРОЙДЕНА 2026-09-25 — фильтр работает. Фид снят со всех экранов
кроме главной. Осталось: предзагрузка `__wl_menu` (латентность) + 66 с на карточке.
См. «✅ ИТОГ 2026-09-25» в конце раздела.**
### ✅ РЕШЕНИЕ: `wlOnMain()` — белый список по активному activity
@@ -289,6 +290,103 @@ node --check plugin-cub.js → SYNTAX OK
**Следующий шаг (обязательный, не сделан):** проверить боевой запрос Lampa → Lampac
`/catalog` — отвечает ли он с ТВ, отвечает ли с Кра́кена, не сломан ли он вообще.
### ✅ ИТОГ 2026-09-25: ПРИЁМКА ПРОЙДЕНА
**Alex:** «Так. Есть. Но сильно после первых специй.» — секции на главной **появились**,
фильтр работает. Осталась претензия к задержке появления.
#### Доказательство работы фильтра (замер на живой Lampa после перезапуска)
```
ready = true
patch = true ← перехватчик установлен
act_url = "movie" ← в момент замера экран = Фильмы (не главная)
menu = Новинки,Фильмы,Мультфильмы,Аниме ← __wl_menu заполнен, всё есть
dom_titles = Сейчас смотрят | Клиника | Мыс страха | Мейр из Исттауна | ...
↑ Watchlist-секций в DOM НЕТ
```
🔴 **Ключевой вывод:** на экране `movie` (Фильмы) наших секций в DOM **нет**, при том что
`menu` заполнен и `patch` активен. Это и есть доказательство, что фильтр режет по экрану,
а не «случайно ничего не нашёл»: вставлять было чем, но `wlOnMain()` вернул `false`.
#### 🔴 Почему «сильно после первых специй» — АРХИТЕКТУРНАЯ, не сетевая
Разобрано по коду `loadCatalogs()` + `wlPatchPartNext`:
1. `loadCatalogs()` идёт по ветке `else` и делает `network.silent('/catalog', ...)` —
**только после ответа** пишет `Manifest.catalogs` и `window.__wl_menu`.
То есть меню приходит **асинхронно**.
2. Главная CUB рисуется **своим** `cub.main()`, **не дожидаясь** этого запроса. Родные
секции («Сейчас смотрят», «Рекомендуем посмотреть») стартуют сразу.
3. Первый вызов `partNext` застаёт `__wl_menu` пустым → уходит в ветку `wlMenu()` —
**асинхронный** запрос `/catalog`. Пока он летит, родные секции уже отрисованы.
4. Когда `/catalog` вернулся, `wlInject` делает `unshift`, но `partNext` уже отработал
срез `slice(0, parts_limit)` (`parts_limit = 6`). Наши секции попадают в пул только
на **следующем** раунде, который добирает `data.length >= 3`.
**Отсюда отставание:** наши 4 секции — это отдельный сетевой запрос на каждую
(`/catalog/list?plugin=watchlist&cat=<code>` = 4 запроса), стартующие позже родных,
плюс попадание в пул не первым раундом. Родной фид CUB приходит одним запросом.
**План ускорения (согласован Alex: «Коммить и переходим к предзагрузке»):**
подставить `menu` из `/catalog` **синхронно**, ДО первого `partNext` — в `startPlugin()`,
параллельно с `loadCatalogs()`. Тогда к моменту отрисовки главной `__wl_menu` уже в
памяти, `wlInject` срабатывает в первом же раунде, секции встают в голову без отставания.
#### 🔴 Коммитить правку НЕКУДА — это выяснено, не пытаться снова
Alex: «Коммить и переходим к предзагрузке». Проверка обеих площадок:
```
/Users/admin/lampac-tmp → fatal: not a git repository
/srv/.../lampac (на Кра́кене) → fatal: not a git repository
```
Ни папка сборки, ни папка lampac на Кра́кене под git **не лежат**. `plugin.js` — файл,
который **монтируется** в контейнер (`./catalog/plugin.js:/lampac/module/Catalog/plugin.js:ro`),
рядом только `.bak`-копии. То есть версионировать «в лоб» нечего.
**Что служит страховкой вместо коммита:**
| Артефакт | Путь | Размер |
|---|---|---|
| бэкап «до фильтра» | `catalog/plugin.js.bak-before-mainfilter-20260925-220809` | 17476 Б |
| бэкап «до фикса url» | `catalog/plugin.js.bak-before-fixurl-<ts>` | 19576 Б |
| текущий боевой | `catalog/plugin.js` | 20934 Б |
| локальные копии | `lampac-tmp/plugin-cub.js` + `build_plugin.py` | 20934 / 14619 Б |
Плюс `build_plugin.py` держит весь `INJECT` в себе → файл воспроизводится
**детерминированно**, с 12 проверками инвариантов.
**Предложенная развилка (решение за Alex, не сделано):** завести в репе
`watchlist-sync` папку `lampac_plugin/` и положить туда `build_plugin.py` +
`plugin-cub.js` под git — тогда правка плагина поедет вместе с проектом и попадёт
в историю. Второе правильнее, но это новая сущность в репе → спрашивать один раз.
#### ⚠️ Замер «плагин не загрузился» — это была гонка, а не поломка
Сразу после `luna-send`-перезапуска проба дала:
```
ready = false plugin = false patch = false
act_url = ERR: Cannot read property 'url' of undefined
cats = NOMANIFEST
```
Выглядело как «наш плагин вообще не доехал» (`window.plugin_catalog` ставит сам
`startPlugin()`). **Фактически это был замер раньше, чем Lampa дошла до главной** —
через несколько секунд те же пробы дали `ready=true, plugin=true, patch=true`.
Также цель CDP на этот период имела `title=""` и `url=about:blank` — Lampa грузилась.
🔴 **ПРАВИЛО:** после перезапуска Lampa на ТВ **не верить первому замеру**. Либо
опрашивать `ready`, пока не станет `true`, либо искать CDP-цель по `url`-подстроке
`com.lampac.tv`, а не по `title == "Lampac"` (в момент загрузки `title` пустой,
и скрипт молча не находит цель). Alex на паузу без проверки отреагировал резко:
«Чё нахуй за слип 20?!» — **не спать, а опрашивать состояние.**
---
### Инструменты диагностики ТВ, написанные в этой сессии (переиспользовать)
| Скрипт | Что делает |
@@ -309,13 +407,19 @@ node --check plugin-cub.js → SYNTAX OK
### Открытые шаги (для следующей сессии)
1. 🔴 **ПРИЁМКА НЕ ПРОЙДЕНА** — фикс `wlUrl` залит, но секции на главной не появились.
**Корень — пустой `Manifest.catalogs`: `/catalog` не отвечает Lampa.** Без этого
фильтр не при чём. Проверить боевой `/catalog` (с ТВ и с Кра́кена) — ПЕРВЫМ делом.
2. **Диагностировать 66 с на карточке** — `docker logs lampac` + трейс `CardController`.
1. ✅ **ПРИЁМКА ПРОЙДЕНА 2026-09-25** — фильтр `wlOnMain()` работает, фид виден только
на главной. Осталась латентность, см. п.2.
2. 🔄 **ПРЕДЗАГРУЗКА `__wl_menu`** (согласовано Alex: «Коммить и переходим к предзагрузке»).
Корень отставания — асинхронный `/catalog` в `loadCatalogs()`: меню приходит ПОСЛЕ
первого `partNext`. Решение: подтягивать `menu` синхронно в `startPlugin()`,
параллельно с `loadCatalogs()`, чтобы `wlInject` срабатывал в первом раунде среза.
Правка идёт в те же два файла (`plugin-cub.js` + `INJECT` в `build_plugin.py`).
3. **Диагностировать 66 с на карточке** — `docker logs lampac` + трейс `CardController`.
Запрос: `GET /catalog/card?plugin=watchlist&uri=movie%2F424781&type=movie`
→ 66 118 мс, 939 Б.
3. **Matcher-parity** (главный блокер с 2026-09-24, см. ниже) — всё ещё не закрыт.
4. **Matcher-parity** (главный блокер с 2026-09-24, см. ниже) — всё ещё не закрыт.
5. **Решение по версионированию плагина** — `lampac_plugin/` в репе `watchlist-sync`
или оставить бэкапы + `build_plugin.py` (см. «Коммитить НЕКУДА»).
**Правило диагностики этой сессии:** не читать `%{size_download}` как «размер фида»
(это gzip) — брать `ls -la` или `Accept-Encoding: identity`. И — `ifconfig` на Кра́кене
@@ -734,7 +838,33 @@ function wlOnMain() {
4. **перезапуск Lampa на ТВ обязателен** (`tv_restart.sh` через `luna-send`;
`docker restart lampac` кэш webOS не сбрасывает)
5. 🔴 приёмка = **видно в UI**: главная — 4 секции сверху; Фильмы → документальные —
секций НЕТ. CDP-проба читает `Lampa.Activity.active().activity.url` на обоих экранах.
секций НЕТ. CDP-проба читает `Lampa.Activity.active()` на обоих экранах.
### ✅ ИТОГ 2026-09-25: фильтр РАБОТАЕТ, закоммичено
- **Коммит `5e55a47`** в репозитории **`~/Developer/lampac-scripts`** (Gitea
`git_admin/lampac-scripts`), запушен в `origin/main`. Туда переехали
`scripts/build_plugin.py` + `scripts/plugin-cub.js` — **из `lampac-tmp`, который
вне git**. `lampac-tmp` больше не источник истины.
- Приёмка на живом ТВ (CDP): **`act_url = "movie"` (экран Фильмов) → секций Watchlist
в DOM НЕТ.** Именно то, что просил Alex.
- Две правки по факту замеров, обе стоили итерации:
1. **`url` читается с ВЕРХНЕГО уровня** — `active().url`, НЕ `active().activity.url`
(там его нет вообще: `{component, object, slide, body, is_stopped, is_started}`).
Первая версия читала `.activity.url` → всегда `undefined` → секции исчезли → «Нету».
2. **Пустой `url` + пустой `Manifest.catalogs` = инициализация → пропускаем.**
Иначе строгая проверка отрезала единственный вызов `wlMenu()`, добирающий меню
после сбоя `/catalog`.
- 🔴 **Питфолл замеров:** CDP-проба сразу после рестарта Lampa даёт `ready=false`,
`plugin=false`, `patch=false`, `act_url=ERR` — это НЕ поломка, плагин ещё грузится.
Мерить надо через ~30 с, иначе легко уйти в ложную диагностику «плагин не подъехал».
- 🔴 **Задержка секций — архитектурная, в работу ещё НЕ внесена.** Замер: `menu`
заполнен, а `Manifest.catalogs = NOMANIFEST`. Цепочка: главная CUB рисуется своим
`cub.main()`, родные секции стартуют сразу; первый `partNext` видит пустой
`__wl_menu` → уходит в **асинхронный** `wlMenu()` → пока летит запрос, родные секции
отрисованы, `slice(0, parts_limit)` уже отработал → наши 4 секции попадают в пул
только в следующем раунде. **План:** тянуть `/catalog` в `startPlugin()`
**параллельно** с `loadCatalogs()`, чтобы `__wl_menu` лежал в памяти к первой отрисовке.
### Питфоллы, найденные при расследовании (не повторять)