From f8b911410509503643b3da4c081a5e0e613bb779 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 22 Sep 2026 16:42:56 +0600 Subject: [PATCH] [2026-09-22] eagle: personal/tech/lampac-deployment.md --- personal/tech/lampac-deployment.md | 62 +++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 18fd978d..fc61ddaf 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -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` их видит +(одно замыкание), внешние пробы — нет. ## Питфоллы проверки на ТВ (сводка)