[2026-09-22] eagle: family/how-to/tv-lampac-plugin.md personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
97237168a0
commit
e1256f18b9
3 files changed
+349
-31
No files matched your search
@@ -47,21 +47,102 @@ Lampa в webOS использует `localStorage`, который Chromium хр
|
||||
2. Записать значение в localStorage
|
||||
3. Запустить приложение
|
||||
|
||||
## 🔴 НЕ СУЩЕСТВУЕТ пункта «Настройки → Источник» (проверено 2026-09-22)
|
||||
## 🔴 Пункта «Настройки → Источник» НЕ СУЩЕСТВУЕТ (проверено 2026-09-22)
|
||||
|
||||
**Не повторять эту ошибку — Alex дважды сказал, что пункта нет.**
|
||||
Я его выдумал, отвечая «как увидеть списки». Правильный путь ниже — **и он не сработает,
|
||||
пока не исправлен баг `plugin.js`** (см. следующий раздел).
|
||||
|
||||
В Lampa **нет** отдельного пункта меню для выбора источника каталога. Источник переключается
|
||||
**прямо из меню каталогов на главной**:
|
||||
|
||||
1. Открыть Lampa на главной странице
|
||||
2. Встать на любой ряд каталога и нажать **влево** на пульте
|
||||
3. Слева выедет **панель со списком источников** (Rezka, Kinobase, FilmixApp, VoKino,
|
||||
Eneyida, KinoUkr, «Мой список», …)
|
||||
3. Слева выедет **панель со списком источников**
|
||||
4. Выбрать **«Мой список»** и нажать OK
|
||||
5. Каталог перестроится на watchlist
|
||||
|
||||
Скриншота/подтверждения от Alex ещё нет — он не дошёл до этого шага.
|
||||
🔴 **НО:** UI Lampa строит этот список через `Object.keys(Lampa.Api.sources)`.
|
||||
Плагин Lampac регистрирует источник **не-enumerable** → в панели его **нет**.
|
||||
Alex именно это и увидел: «Ни на главной ни в Фильмах нет».
|
||||
|
||||
## 🔴 БАГ: источник не виден в панели (`enumerable: false`)
|
||||
|
||||
**Найдено 2026-09-22** диагностикой через Chrome DevTools ТВ (см. раздел ниже).
|
||||
|
||||
Факты с живого ТВ:
|
||||
|
||||
| Замер | Значение | Смысл |
|
||||
|---|---|---|
|
||||
| `Lampa.Storage.field('source')` | `'Мой список'` | источник **уже выбран** |
|
||||
| `Object.keys(Lampa.Api.sources)` | `'tmdb|cub'` | ❌ источника нет в перечислении |
|
||||
| `Lampa.Api.sources['Мой список'].getCatalog()` | `search, movie, cartoons, anime, menu, main` | ✅ каталог доступен напрямую |
|
||||
| `Object.getOwnPropertyDescriptor(Lampa.Api.sources,'Мой список')` | `{"enumerable":false,"configurable":false}` | ← **корень** |
|
||||
|
||||
Причина в `/lampac/module/Catalog/plugin.js`, строка 59 (`loadCatalogs()`, **два вхождения**):
|
||||
|
||||
```js
|
||||
// БЫЛО (баг)
|
||||
Object.defineProperty(Lampa.Api.sources, key, { get: function(){ return Api; } });
|
||||
|
||||
// НАДО
|
||||
Object.defineProperty(Lampa.Api.sources, key,
|
||||
{ get: function(){ return Api; }, enumerable: true, configurable: true });
|
||||
```
|
||||
|
||||
**`plugin.js` живёт в ОБРАЗЕ, не на HDD** (`docker inspect` показывает монтирования только
|
||||
на `catalog/sites` и `catalog/override`). Правка через `docker exec` исчезнет при обновлении.
|
||||
|
||||
Фикс — смонтировать поправленный файл через compose:
|
||||
`./catalog/plugin.js:/lampac/module/Catalog/plugin.js:ro`.
|
||||
Полные команды и откат — [[personal/plans/lampac-watchlist-plugin]], раздел «ГЛАВНЫЙ ПИТФОЛЛ».
|
||||
|
||||
**Статус: фикс НЕ применён, ждёт апрува Alex (2026-09-22).**
|
||||
|
||||
## 🛠 Диагностика ТВ через Chrome DevTools (главный инструмент, найден 2026-09-22)
|
||||
|
||||
**Ключевое открытие: webOS отдаёт Chrome DevTools Protocol на порту 9998.**
|
||||
У процессов `WebAppMgr` в аргументах есть `--remote-debugging-port=9998`.
|
||||
Это даёт **чтение состояния живой Lampa** — то, чего не дают ни логи, ни tcpdump.
|
||||
|
||||
```bash
|
||||
# 1. Список отлаживаемых страниц + URL приложения
|
||||
curl -s --max-time 8 "http://192.168.1.70:9998/json" | /usr/bin/jq -r '.[] | "\(.type): \(.url)"'
|
||||
|
||||
# 2. Проверка сети до Lampac (на ТВ!)
|
||||
ssh root@192.168.1.70 'curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \
|
||||
--max-time 8 http://192.168.1.14:9118/catalog'
|
||||
|
||||
# 3. Живые соединения с Lampac (смотреть на ТВ, НЕ на сервере)
|
||||
ssh root@192.168.1.70 'netstat -tn 2>/dev/null | grep 9118'
|
||||
|
||||
# 4. Что запущено сейчас
|
||||
ssh root@192.168.1.70 'script -q -c "luna-send -n 1 -f \
|
||||
luna://com.webos.applicationManager/getForegroundAppInfo {}" /dev/null'
|
||||
|
||||
# 5. Перезапустить приложение (JSON экранирован И обёрнут в двойные кавычки!)
|
||||
ssh root@192.168.1.70 'script -q -c "luna-send -n 1 -f \
|
||||
luna://com.webos.applicationManager/launch \"{\\\"id\\\":\\\"com.lampac.tv\\\"}\"" /dev/null'
|
||||
```
|
||||
|
||||
Чтение переменных Lampa — через `websocket-client` + `Runtime.evaluate`:
|
||||
готовые скрипты `/tmp/lampa_probe.py` и `/tmp/lampa_probe3.py` (см. план).
|
||||
|
||||
### Ловушки диагностики (проверено на живом ТВ)
|
||||
|
||||
⚠️ **Момент замера.** `sudo ss -tn | grep :9118` на Кра́кене сразу после старта дал **0 соединений** —
|
||||
я сделал ложный вывод «ТВ не ходит на сервер». Через 30 с на ТВ:
|
||||
**1 ESTABLISHED + 6 TIME_WAIT** — всё работает. Смотреть соединения **на ТВ**, не на сервере.
|
||||
|
||||
⚠️ **`launch` через luna требует экранированного JSON в кавычках.** Без кавычек —
|
||||
`errorCode: 2, invalid parameters` (молча падает). `getForegroundAppInfo {}` работает без кавычек.
|
||||
|
||||
⚠️ **`tcpdump` на Кра́кене НЕТ.** Не ставили — DevTools-подход дал больше (состояние JS, а не пакеты).
|
||||
|
||||
⚠️ **`luna://com.webos.service.capture/takeScreenShot` не существует** на этом ТВ
|
||||
(`Unknown method "takeScreenShot"`). Скриншот так не снять.
|
||||
|
||||
⚠️ **Логи HTTP Lampac не ведёт** — `docker logs` не покажет запросы ТВ. Не искать там.
|
||||
|
||||
## Как плагин `catalog.js` регистрирует источник (механика)
|
||||
|
||||
@@ -74,7 +155,9 @@ Lampa.Utils.account(Manifest.api_host + '/catalog', function(json){
|
||||
Manifest.catalogs = json; // все каталоги с сервера
|
||||
keys.forEach(function(key){
|
||||
Lampa.Params.values.source[key] = key; // регистрирует источник
|
||||
Lampa.Api.sources[key] = Api; // подменяет API
|
||||
Object.defineProperty(Lampa.Api.sources, key, { // ← ЗДЕСЬ БАГ
|
||||
get: function(){ return Api; } // нет enumerable:true
|
||||
});
|
||||
if (Manifest.catalogs[key].search)
|
||||
Lampa.Search.addSource(Api.discovery(key)); // добавляет в поиск
|
||||
});
|
||||
@@ -83,6 +166,9 @@ Lampa.Utils.account(Manifest.api_host + '/catalog', function(json){
|
||||
Lampa.Listener.follow('menu', ...)
|
||||
```
|
||||
|
||||
⚠️ Свойство ставится через `defineProperty` **без `enumerable: true`** → `Object.keys()` его
|
||||
не видит → источник не появляется в панели выбора (разбор бага — выше).
|
||||
|
||||
Отсюда следует:
|
||||
- Отдельного переключателя в настройках нет **by design** — источник выбирается панелью слева.
|
||||
- Плагин **подтягивает каталоги только при старте приложения**. Если добавить плагин и не
|
||||
@@ -136,10 +222,19 @@ var plugins_add = [
|
||||
(монтируется в `/lampac/init.conf:ro`). Искать там, а не по `lampac/init.conf`
|
||||
— иначе получишь ложный «файл пропал».
|
||||
|
||||
5. **После добавления плагина обязательно полный перезапуск Lampa** — иначе `/catalog`
|
||||
не запрашивается, и источник не появляется (соединений с `:9118` будет **ноль**).
|
||||
5. **После добавления плагина обязательно полный перезапуск Lampa** — каталоги регистрируются
|
||||
только на старте. ⚠️ Но **не делай из «нуля соединений» вывод о поломке**: сразу после старта
|
||||
соединений действительно 0, через ~30 с появляются. Смотреть **с ТВ** (`netstat -tn | grep 9118`).
|
||||
|
||||
6. **Проще всего — через UI самого пульта**, если он доступен:
|
||||
6. **`plugin.js` лежит в ОБРАЗЕ, а не на HDD.** Монтируются только `catalog/sites` и
|
||||
`catalog/override`. Правки `/lampac/module/Catalog/plugin.js` через `docker exec` **теряются
|
||||
при обновлении образа** — нужен bind-mount через compose.
|
||||
|
||||
7. **Не верить `Object.keys()` на слово — проверять `getOwnPropertyDescriptor`.** Свойство может
|
||||
существовать (доступно напрямую) и при этом не быть enumerable. `Object.keys` вернёт список
|
||||
без него, и это выглядит как «источника нет», хотя он есть.
|
||||
|
||||
8. **Проще всего — через UI самого пульта**, если он доступен:
|
||||
Lampa → Настройки → Плагины → добавить URL. Скрипт нужен, когда пульта нет.
|
||||
|
||||
## Что должно быть прописано для Lampac
|
||||
@@ -158,8 +253,21 @@ var plugins_add = [
|
||||
|
||||
## Статус
|
||||
|
||||
⚠️ **На 2026-09-22 не проверялось на живом ТВ.** Подключение каталога сделано через UI
|
||||
(или требуется сделать). Скрипт-автоматизация — заготовка на будущее.
|
||||
**Проверено на живом ТВ 2026-09-22** (диагностика через DevTools, порт 9998).
|
||||
|
||||
Если понадобится — подход: `closeByAppId com.lampac.tv` → запись ключа в localStorage →
|
||||
`launch com.lampac.tv`. Учесть питфоллы 1–3.
|
||||
**Что установлено точно:**
|
||||
- ТВ достаёт Кра́кен (`/catalog` 200 за 0.26 с), Lampa ходит на сервер (ESTABLISHED).
|
||||
- Плагин `catalog.js` **добавлен**, `window.plugin_catalog = true`, `appready = true`.
|
||||
- `Storage.field('source')` = `'Мой список'` — источник **выбран**.
|
||||
- `Lampa.Api.sources['Мой список']` **существует** и отдаёт каталог
|
||||
(`search, movie, cartoons, anime, menu, main`) — **пользоваться каталогом можно**.
|
||||
- ❌ В панели выбора источника его **нет** — `plugin.js` регистрирует свойство
|
||||
без `enumerable: true`. **Баг в Lampac, не в нашей настройке.**
|
||||
|
||||
**Осталось:** смонтировать поправленный `plugin.js` через compose (ждёт апрува Alex).
|
||||
Полный разбор — [[personal/plans/lampac-watchlist-plugin]], раздел «ГЛАВНЫЙ ПИТФОЛЛ».
|
||||
|
||||
**Скрипт-автоматизация по-прежнему не создана.** Прямая запись в localStorage **не нужна**:
|
||||
проблема оказалась не в настройках Lampa, а в коде плагина. Если автоматизация понадобится —
|
||||
подход: `closeByAppId com.lampac.tv` → запись ключа в localStorage → `launch com.lampac.tv`
|
||||
(учесть питфоллы 1–3). Но сначала — фикс `plugin.js`.
|
||||
Reference in new issue
Block a user