[2026-09-22] eagle: personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
6746ac0990
commit
f8b9114105
1 file changed
+44
-18
@@ -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` их видит
|
||||
(одно замыкание), внешние пробы — нет.
|
||||
|
||||
## Питфоллы проверки на ТВ (сводка)
|
||||
|
||||
|
||||
Reference in new issue
Block a user