[2026-09-22] eagle: personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 16:42:56 +06:00
1 parent 6746ac0990
commit f8b9114105
1 file changed
+44 -18
+44 -18
View File
@@ -54,7 +54,9 @@ related:
Локальные копии рабочих артефактов (на Mac, `/Users/admin/lampac-tmp/`):
`gen_watchlist_v2.py`, `patch_plugin.py`, `plugin-patched.js`, `watchlist.yaml`,
`docker-compose.yml`, `deploy_lampac.py`.
`docker-compose.yml`, `deploy_lampac.py`, **`build_plugin.py`** (сборщик патча секций),
**`plugin-cub.js`** (результат), `deploy_cub.py`, `tv_restart.sh`, `restart_lampa.sh`,
**`probe_*.py`** (CDP-пробы рантайма Lampa на ТВ).
🔴 **Права на файлы в `wwwroot/` — владелец `1000:1000` (= пользователь `lampac`
в контейнере), каталоги `755`, файлы `644`.** Не `kraken:kraken` — контейнер ходит
@@ -743,7 +745,7 @@ http://127.0.0.1:9118/http://127.0.0.1:9118/watchlist-films.json
раздела** (наблюдение Alex). Если перезагрузка не нужна — убрать `format` из `menu`,
оставить только `categories`.
### 🎯 Как добиться «CUB + мой список сверху» — варианты (решение Alex, не принято)
### 🎯 Как добиться «CUB + мой список сверху» — ✅ РЕШЕНО 2026-09-22
Родной CUB и «Мой список» — это **два источника Lampa**, переключаются в
«остальное → основной источник». Одновременно показать нельзя без вмешательства:
@@ -752,8 +754,13 @@ http://127.0.0.1:9118/http://127.0.0.1:9118/watchlist-films.json
|---|---|
| Блок `main` в YAML | ❌ **невозможно** — ломает парсинг |
| Оставить `menu` как есть | ⚠️ источник работает, но разделы подменяются, пока он выбран |
| Патч `plugin.js` | ⚠️ убрать `Listener.follow('menu')` → перехвата нет, но и секции сверху **не появятся** |
| Написать свой плагин | ✅ единственный путь для «сверху», объём работы |
| Патч `plugin.js` — обёртка `cub.main` | ❌ **тупик:** `cub.main` невызываем извне (`permit` в замыкании) |
| **Патч `plugin.js` — перехват `Lampa.Api.partNext`** | ✅ **РАБОТАЕТ** — проверено на живом ТВ через CDP |
✅ **Итоговое решение — `wlPatchPartNext()`.** `partNext` глобальный, принимает пул
функций-секций; наши добавляются в тот же пул, что и родные CUB. Работает на любой
странице, независимо от источника. Реализация, питфоллы и probe-скрипты —
раздел **«🔴🔴 СЕДЬМАЯ СЕССИЯ: как РЕАЛЬНО внедрить секции в главную CUB»** выше.
### ⚠️ Баг Lampac: источник не виден в списке выбора
@@ -2062,15 +2069,26 @@ function wlEnsureMenu(cb) {
### Перезапуск Lampa на ТВ — правильный `luna-send`
🔴 **`luna-send` через `ssh 'script -q -c "luna-send … -a \"{...}\""'` НЕ парсит аргументы** —
печатает help. Кавычки в кавычках рвутся. Рабочая форма — **одинарные кавычки внутри
`script -c`**, файлом (не inline):
печатает help. Кавычки в кавычках рвутся. **Самая надёжная форма — скрипт ФАЙЛОМ на ТВ:**
```bash
ssh $TV 'script -q -c "luna-send -n 1 -f luna://com.webos.applicationManager/close -a '"'"'{"id":"com.lampac.tv"}'"'"'" /dev/null'
sleep 4
ssh $TV 'script -q -c "luna-send -n 1 -f luna://com.webos.applicationManager/launch -a '"'"'{"id":"com.lampac.tv"}'"'"'" /dev/null'
# 1. положить файл на ТВ
scp tv_restart.sh root@192.168.1.70:/tmp/
# 2. выполнить одной командой (без вложенных кавычек)
ssh root@192.168.1.70 'sh /tmp/tv_restart.sh'
```
Скрипт: `/Users/admin/lampac-tmp/restart_lampa.sh` (закрыть → пауза 4с → запустить → 20с → показать devtools).
```sh
#!/bin/sh
# /tmp/tv_restart.sh — выполняется НА ТВ
luna-send -n 1 -f luna://com.webos.applicationManager/close '{"id":"com.lampac.tv"}'
sleep 5
luna-send -n 1 -f luna://com.webos.applicationManager/launch '{"id":"com.lampac.tv"}'
```
⚠️ **Вариант с `'"'"'` (расшивка кавычек) НЕ сработал** — luna-send всё равно печатал
help-экран («`-a` send specified appId in message (default is none)»). Скрипт-файл —
единственный проверенный путь. Локальная копия: `/Users/admin/lampac-tmp/tv_restart.sh`.
⚠️ **`docker restart lampac` НЕ перезагружает плагин на ТВ.** После заливки `plugin.js`
ТВ продолжает держать **старую версию в памяти** — `cubMainSrc` через CDP показывает
@@ -2079,22 +2097,30 @@ ssh $TV 'script -q -c "luna-send -n 1 -f luna://com.webos.applicationManager/lau
### Диагностика рантайма Lampa через CDP (websocket-client)
⚠️ Модуля `ws` в Node нет, `websockets` в Python нет → использовать **`websocket-client`**
(установлен). Скрипты `/Users/admin/lampac-tmp/probe_tv.py`, `probe_cub_main.py`.
(установлен). Скрипты в `/Users/admin/lampac-tmp/`: `probe_tv.py`, `probe_globals.py`,
`probe_cache.py`, `probe_cub_main.py`, `probe_inject.py`, `probe_wait.py`, `probe_calls.py`,
**`probe_ui.py`** (финальная приёмка — читает заголовки секций из DOM).
```python
```bash
WS=$(curl -s "http://192.168.1.70:9998/json/list" | jq -r '.[] | select(.title=="Lampac") | .webSocketDebuggerUrl' | head -1)
python3 probe_cub_main.py "$WS"
python3 probe_ui.py "$WS"
```
`probe_cub_main.py` вызывает `Lampa.Api.sources.cub.main({}, cb)` и печатает
`titles` секций — **единственный надёжный способ увидеть, что реально отдаёт обёртка**.
Успех = 8 секций (4 родные CUB + 4 наши).
🔴 **`probe_cub_main.py` (вызов `cub.main`) НЕ годится как приёмка** — этот метод
невызываем извне (см. «СЕДЬМАЯ СЕССИЯ» в разделе механики) и всегда возвращает
`pending`/4 родные секции, **даже когда секции реально работают в UI**.
**Приёмка только через `probe_ui.py`** — переход `Lampa.Router.call('main')` + чтение
`document.querySelectorAll('.items-line__title')`.
Полезные поля пробы `probe_tv.py`: `Lampa.Storage.field('source')`,
`Object.keys(Lampa.Api.sources)`, `Lampa.Api.sources.cub.__wl_injected`,
`typeof Lampa.Api.sources.cub.main`.
⚠️ `Manifest` внутри `Runtime.evaluate` **тоже не виден** (`ReferenceError: Manifest is not defined`) —
он в замыкании плагина. Не использовать в пробах.
⚠️ `Manifest` / `Utils` / `network` внутри `Runtime.evaluate` **не видны**
(`ReferenceError`) — они в замыкании плагина. Не использовать в пробах.
⚠️ **`eval(pluginCode)` внутри IIFE не создаёт глобальных функций** — `wlHost()`,
`wlAbs()` снаружи дают `ReferenceError`. Это нормально: `cub.main` их видит
(одно замыкание), внешние пробы — нет.
## Питфоллы проверки на ТВ (сводка)