diff --git a/family/how-to/htpc-webos-luna.md b/family/how-to/htpc-webos-luna.md index f9bfa7ae..236f3097 100644 --- a/family/how-to/htpc-webos-luna.md +++ b/family/how-to/htpc-webos-luna.md @@ -42,3 +42,61 @@ ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.applica - `ares-install/ares-launch` — требует dev mode (порт 9922) - `listRunningApps` — нет метода, правильно: `running` - `applicationManager/remove` — нет, правильно: `appInstallService/dev/remove` +- ⚠️ **`luna-send -a '{"appId":...}'`** — на прошивке ТВ `5.4.2` флаг `-a` не парсится, отдаёт хелп-экран. AppId только первым аргументом. + +## Установка IPK — рабочий рецепт (проверено 2026-09-22) + +Установлено приложение Lampa (`com.lampac.tv`) на ТВ `192.168.1.70`. Полный проход: + +```bash +# 1. Скачать ipk прямо на ТВ (без scp с Mac) +ssh root@192.168.1.70 'curl -sS --max-time 60 -o /tmp/app.ipk "http://192.168.1.14:9118/lg.ipk"' +# → 6896874 байт; формат ar (!), НЕ tar/gzip + +# 2. Установить — обёртка script ОБЯЗАТЕЛЬНА +ssh root@192.168.1.70 'rm -f /tmp/i.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.appInstallService/dev/install \ + {\"id\":\"org.lampa.tv\",\"ipkUrl\":\"/tmp/app.ipk\",\"subscribe\":true}" /tmp/i.txt; cat /tmp/i.txt' +# → {"subscribed":true,"returnValue":true} + +# 3. Проверить — appId из appinfo.json, НЕ из запроса +ssh root@192.168.1.70 'ls /media/developer/apps/usr/palm/applications/' +# → com.lampac.tv + +# 4. Запустить +ssh root@192.168.1.70 'rm -f /tmp/l.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.applicationManager/launch {\"id\":\"com.lampac.tv\"}" /tmp/l.txt' +``` + +🔴 **Поле `"id"` в `dev/install` — произвольная метка.** Реальный appId берётся из `appinfo.json` +внутри ipk. В нашем случае запрос ушёл с `org.lampa.tv`, а установилось `com.lampac.tv`. + +**Проверка, что приложение реально открылось** (а не просто «команда вернула true»): +```bash +ssh root@192.168.1.70 'rm -f /tmp/f.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.applicationManager/getForegroundAppInfo {}" /tmp/f.txt; grep appId /tmp/f.txt' +# → "appId": "com.lampac.tv" +``` + +## Альтернативный путь, который НЕ сработал + +`org.webosbrew.hbchannel.service/install` — метод в образе есть (`service.js`, `register("install",...)`), +но `luna-send` через SSH его не дёрнул. Используй `com.webos.appInstallService/dev/install`. + +## Текущий ТВ (2026-09-22) + +| Параметр | Значение | +|---|---| +| IP | `192.168.1.70` (проводной eth0); старый `.75` больше не отвечает | +| SSH | `root@192.168.1.70`, ключ `~/.ssh/konka_webos`, `StrictHostKeyChecking no` | +| Порты | `22` SSH, `3000`/`3001` Luna | +| webOS | **5.4.2**, ядро `4.4.84`, image `starfish-dvb-secured`, build 2602 | +| Кастомные приложения | `org.webosbrew.hbchannel` 0.7.2, `org.webosbrew.inputhook`, `me.wouterdek.magic4pc`, **`com.lampac.tv`** | + +⚠️ SSH печатает `post-quantum key exchange` warning — **это норма**, не ошибка. + +## Связанные заметки + +- [[family/how-to/tv-luna-send]] — враппер `~/Automation/tv-luna-send.sh` +- [[personal/tech/lampac-deployment]] — что именно ставили на ТВ и зачем +- [[family/how-to/kraken-network]] — сеть Кра́кена и ТВ diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md new file mode 100644 index 00000000..741a80c6 --- /dev/null +++ b/personal/plans/lampac-watchlist-plugin.md @@ -0,0 +1,131 @@ +--- +created: '2026-09-22' +namespace: personal +related: + - '[[personal/plans/lampac-kraken]]' + - '[[personal/tech/lampac-deployment]]' + - '[[family/projects/watchlist-sync]]' + - '[[family/projects/watchlist-automation]]' + - '[[family/documents/movies-watchlist]]' +status: proposed +tags: + - lampac + - lampa + - watchlist + - catalog + - webos + - plugin + - kraken +title: Watchlist в UI Lampa — плагин отображения +type: plan +updated: '2026-09-22' +--- + +# Watchlist в UI Lampa — плагин отображения (план) + +> Составлен 2026-09-22. Ждёт подтверждения Alex. +> Предыдущий шаг (Lampac на Кра́кене) — [[personal/plans/lampac-kraken]], шаги 1–6 закрыты. + +## Задача + +Показывать **список фильмов Alex** (`family/documents/movies-watchlist.md`) прямо в UI Lampa на ТВ — +как каталог для просмотра. **Не локальный плейбэк**, а отображение списка. + +Уточнение Alex: «это не локальный плейбэк а отображение фильмов из списка». + +## Что НЕ так понято (зафиксировать, чтобы не переделывать) + +| Толкование | Верно? | +|---|---| +| Показать **свой список** (`movies-watchlist.md`) в UI | ✅ **да, это задача** | +| Показать **файлы библиотеки** с диска Кра́кена (Jellyfin-подобное) | ❌ нет — это шаг 7 старого плана, **другое** | +| Локальный плейбэк (раздача торрента с диска Кра́кена) | ❌ нет | + +## Что нашлось в Lampac (разведка 2026-09-22) + +В образе `ghcr.io/lampac-nextgen/lampac` 33 модуля (`/lampac/module/`). Релевантные три: + +| Модуль | Что делает | Статус | Подходит? | +|---|---|---|---| +| **Catalog** | **YAML-каталоги → плагин `/catalog.js`** | ⛔ выключен | ✅ **главный кандидат** | +| DLNA | DLNA/UPnP, локальные файлы, торрент-менеджмент | ✅ включён | ⚠️ это про файлы, не про список | +| Online | 70+ онлайн-источников → `/online.js` | ✅ включён | уже используется | + +### Модуль Catalog — детали + +- **Роут:** `/catalog.js` (плагин Lampa), внутренние — `/catalog/` +- **Данные:** YAML-файлы в `/sites/.yaml` +- **Имя файла** — только `[a-z0-9-]`, иначе `Regex.Replace` срежет +- **Есть lookup по `displayname`** внутри `*.yaml`, если файла по имени нет +- **WAF-лимит:** `^/catalog/` → 10 запросов/сек +- **`ModuleBaseConf`** с `limit_map`, класс `CatalogSettings`, есть `IEnumerable`-итерация + +**Почему выключен:** +```jsonc +// current.conf +"SkipModules": [ "Catalog", "Tracks", "Transcoding", ... ] +"catalog": false // в блоке плагинов LampaWeb +``` +Оба надо включить. + +⚠️ **Питфолл:** `init.conf` монтируется **не был** — у нас в compose нет volume на `/lampac/init.conf`. +Файл живёт внутри образа. Правки через `docker exec` **потеряются при пересоздании контейнера**. +Значит: либо добавить volume, либо править через AdminPanel, либо `docker cp` + mount. + +## Развилка архитектуры — нужно решение Alex + +Отображение списка и воспроизведение — **разные вещи**. Список отдаём, но по клику что играть? + +| # | Вариант | Как работает | Плюсы | Минусы | +|---|---|---|---|---| +| **A** | **Каталог → TMDB → торренты** | `/catalog.js` отдаёт названия, Lampa ищет их в TMDB, по клику — TorrServer/онлайн | Просто. Список = то, что уже есть. Работает сегодня | Каталог отдельно от «Избранного» Lampa | +| **B** | **Генератор Lampa-«Избранного»** | Отдаём `movies-watchlist.md` как JSON — Lampa кладёт его в свою папку «Буду смотреть» | Из коробки в UI, без плагина | Лимит **50** у `kinopoisk.js`; формат Lampa-специфичный | +| **C** | **Catalog + свои ссылки** | YAML с ссылками на торренты с диска Кра́кена — это уже **локальный плейбэк** | Прямой запуск | ❌ **Alex сказал — не это** | + +**Рекомендация: A.** Список показываем, воспроизведение оставляем штатным (торренты/онлайн). Это ровно +«отображение фильмов из списка», без изобретения плейбэка. + +## Что нужно выяснить до кодирования + +1. **Формат YAML** — читать `Catalog/Controllers` в образе, узнать схему `CatalogSettings` + (поля: `displayname`, иконка, источник элементов, `tmdb`-режим?). +2. **Есть ли готовый Konopoisk/TMDB-режим** — если Catalog умеет принимать TMDB-коллекцию, + задача сводится к генерации YAML из watchlist. +3. **Как обновлять каталог** — watchlist меняется (Radarr, ⬇️, `[x]`), нужен генератор + hook. +4. **Фильтры** — показывать только `[ ]` (не просмотренные)? Прятать `👎`? Секции (`Фильмы`/`Аниме`/`Мультфильмы`)? +5. **`init.conf`** — как правки не потерять: volume vs AdminPanel. + +## Черновик шагов (уточнится после разведки формата) + +1. Включить модуль: убрать `Catalog` из `SkipModules`, поставить `"catalog": true`. +2. Разобрать схему YAML по кодe `Catalog/Controllers/*.cs` (в контейнере). +3. Написать генератор: `movies-watchlist.md` → `sites/.yaml`. + - Источник данных — **vault** (`family/documents/movies-watchlist.md`), git-синхронизирован + - Уже есть готовый парсер: `watchlist-sync/parser.py` (см. [[family/projects/watchlist-sync]]) +4. Смонтировать `sites/` в контейнер. +5. Плагин на ТВ: Lampa → Настройки → Плагины → `http://192.168.1.14:9118/catalog.js`. +6. **Приёмка:** список виден в UI Lampa на ТВ, названия совпадают с `movies-watchlist.md`. + +## Как обновлять + +Варианты (выбрать после шага 2): +- hook в `watchlist-nightly.sh` (уже кроном 01:00 на Кра́кене) — догенерировать YAML после прогона +- отдельный cron-скрипт +- ручной запуск генератора + +⚠️ `watchlist-nightly.sh` живёт в `~/scripts/` — **root:root**, правка только `sudo install -m 755`. + +## Открытые вопросы к Alex + +1. **Развилка A/B/C** — согласен на A (каталог → TMDB → штатное воспроизведение)? +2. **Что показывать:** только непросмотренные `[ ]`? Или всё? +3. **Секции:** как в файле (`Фильмы`, `Мультфильмы`, `Аниме`) или одним списком? +4. **`👎` и `🗓️`** — прятать? + +## Связанные + +- [[personal/plans/lampac-kraken]] — базовое развёртывание (шаги 1–6 сделаны) +- [[personal/tech/lampac-deployment]] — эксплуатация Lampac +- [[family/projects/watchlist-sync]] — парсер списка, CLI, cron +- [[family/projects/watchlist-automation]] — полный flow, форматы маркеров +- [[family/documents/movies-watchlist]] — источник данных diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 6805f63c..c28e5ff8 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -13,8 +13,10 @@ tags: - webos related: - '[[personal/plans/lampac-kraken]]' + - '[[personal/plans/lampac-watchlist-plugin]]' - '[[personal/tech/multistream-single-flow-limit]]' - '[[family/how-to/kraken-network]]' + - '[[family/how-to/tv-luna-send]]' --- # Lampac — развёртывание и эксплуатация (Кра́кен) @@ -152,24 +154,123 @@ Configure complete ← HTTP начинает отвечать Выбор порта — `docker compose config` + `sudo ss -tlnp` перед деплоем. -## Интеграция с Lampa (ТВ) +## Интеграция с Lampa (ТВ) — ✅ СДЕЛАНО 2026-09-22 - Плагин: `http://192.168.1.14:9118/online.js` - TorrServer в Lampa: Настройки → TorrServer → «Использовать основную ссылку» → `http://192.168.1.14:9118` - Буфер плеера: 50–100 МБ -- UE на LG: `.ipk` с флешки на розничных телевизорах **не работает** → ставить через **Media Station X** -- `/lg.ipk` отдаёт сам Lampac +- `/lg.ipk` отдаёт сам Lampac (проверено: HTTP **200**) -## Откат +### Установка клиента на LG webOS — по SSH, без флешки + +🔴 **`Media Station X` и `.ipk` с флешки — НЕ нужны.** ТВ имеет SSH-доступ (root), установка делается с Mac. + +**ТВ:** `root@192.168.1.70`, ключ `~/.ssh/konka_webos`, webOS **5.4.2** (ядро 4.4.84, image `starfish-dvb-secured`, build 2602, `webos_build_datetime 20230405092501`). +Порты открыты: `22` (SSH), `3000`/`3001` (Luna). Из кастомного уже стоит: `org.webosbrew.hbchannel` 0.7.2, `org.webosbrew.inputhook`, `me.wouterdek.magic4pc`. + +**Порядок установки:** ```bash -cd /srv/.../lampac && docker compose down -sudo rm -rf /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac +# 1. Скачать .ipk от Lampac прямо на ТВ +ssh root@192.168.1.70 'curl -sS --max-time 60 -o /tmp/lampa.ipk "http://192.168.1.14:9118/lg.ipk"' +# → 6 896 874 байт, формат ar (!), НЕ tar/gzip + +# 2. Установить (обязательна обёртка script — см. питфолл ниже) +ssh root@192.168.1.70 'rm -f /tmp/inst.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.appInstallService/dev/install \ + {\"id\":\"org.lampa.tv\",\"ipkUrl\":\"/tmp/lampa.ipk\",\"subscribe\":true}" \ + /tmp/inst.txt >/dev/null 2>&1; cat /tmp/inst.txt' +# → {"subscribed":true,"returnValue":true} + +# 3. Проверить, что установилось +ssh root@192.168.1.70 'ls /media/developer/apps/usr/palm/applications/' +# → com.lampac.tv ← имя приложения Lampa, НЕ org.lampa.tv + +# 4. Запустить +ssh root@192.168.1.70 'rm -f /tmp/l.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.applicationManager/launch {\"id\":\"com.lampac.tv\"}" /tmp/l.txt' + +# 5. Убедиться, что открылось +ssh root@192.168.1.70 'rm -f /tmp/f.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.applicationManager/getForegroundAppInfo {}" /tmp/f.txt; grep appId /tmp/f.txt' +# → "appId": "com.lampac.tv" ``` -Lampac изолирован — остальной стек Кра́кена не затрагивается. +**Фактический ID приложения — `com.lampac.tv`** (vendor Lampac, version 1.0.0, type web). +⚠️ В `luna-send ... dev/install` поле `"id"` — **произвольная метка**; реальный appId берётся из `appinfo.json` внутри ipk. Ошибиться здесь не страшно, но искать приложение надо по фактическому ID. + +### 🔴 Питфолл: `luna-send` по SSH молчит + +**Симптом:** любой вызов `luna-send` через `ssh root@TV "luna-send ..."` печатает **хелп-экран**, а не результат. С `-t` (PTY) — тоже. С `-a '{"json"}'` — тоже. + +**Причина:** `luna-send` детектирует TTY и отказывается писать в pipe. + +**Решение:** обернуть в `script(1)`, который аллоцирует псевдо-TTY, и прочитать временный файл: +```bash +ssh root@TV 'script -q -c "luna-send -n 1 -f luna://service/method {json}" /tmp/o.txt; cat /tmp/o.txt' +``` + +Готовый враппер: `~/Automation/tv-luna-send.sh` (`TV_HOST` переопределяет таргет). +Доки: [[family/how-to/tv-luna-send]], [[family/how-to/htpc-webos-luna]]. + +⚠️ **Установка идёт через `com.webos.appInstallService/dev/install`**, а НЕ через +`org.webosbrew.hbchannel.service/install` (последний в образе есть, но `luna-send` его не дёрнул чисто). + +⚠️ `luna-send -i` (subscribe, бесконечный) через враппер **не работает** — нужен polling. + +### Первый просмотр — проверено 2026-09-22 + +Фильм запущен, **не дёргается**. Alex: «Вроде стабильно, не делается». + +| Факт | Значение | +|---|---| +| Соединения ТВ → Lampac | 3 × ESTABLISHED `192.168.1.70 → 192.168.1.14:9118` | +| Нагрузка контейнера | `lampac` CPU 57%, NET 168 МБ ↓ / 132 МБ ↑ | +| Битрейт на eth0 | **~3–4 Мбит/с** | + +⚠️ **Почему всего 3–4 Мбит, а не 15:** выбран источник **«Смотреть онлайн (lampac 1.18…)»** — встроенный +плагин `online.js`, HLS-поток. Lampac отдаёт **ссылку**, ТВ тянет видео напрямую из CDN (в `/proc/net/tcp` +ТВ видны внешние адреса на `:443`/`:8443`). Тяжёлый remux с торрента не участвует — поэтому и не дёргается. + +🔴 **Следствие:** этот просмотр **не проверяет**, держит ли сеть remux 60–80 Мбит. +Тест функциональности, не полосы. Полосу проверять на торрент-источнике. + +**Как убрать выбор источника:** Lampa → Настройки → Плагины → выключить `online.js`. Останутся только торренты. + +## Внутреннее устройство Lampac (разведка 2026-09-22) + +**33 модуля** в образе (`/lampac/module/`): +`AdminPanel`, `Adult`, **`Catalog`**, `Community`, **`DLNA`**, `DatabaseEditor`, `ExternalBind`, +`ForkPlayerXML`, `GStreamer`, `JacRed`, `Kit`, `LampaWeb`, `LampacApk`, `LogUserRequest-Lite`, +`MsxNative`, `Music`, `NextHUB`, **`Online`**, `OnlineAnime`, `OnlineENG`, `OnlineGEO`, `OnlinePaid`, +`OnlineRUS`, `OnlineUKR`, `PidTor`, `Potok`, `Proxy`, `SISI`, `Sync`, `Telemetry` (+ остальные). + +**Конфиг — `current.conf`** внутри образа (`/lampac/current.conf`, 157 КБ, генерируется из `base.conf` + +`init.conf`). Рабочий каталог `/lampac`, файлы читаются **из корня**, не из `config/`. + +Выключение модуля — двумя механизмами: +1. **`SkipModules`** в `init.conf` / `current.conf` +2. **`manifest.json`** в каталоге модуля (`"enable": true|false`) + +⚠️ **`init.conf` НЕ смонтирован** в нашем compose — файл живёт внутри образа. Любая правка через +`docker exec` **потеряется при пересоздании контейнера**. Для постоянных правок нужен volume или AdminPanel. + +### Полезные роуты (проверены curl'ом) + +| Роут | Код | Что | +|---|---|---| +| `/` | 200 | LampaWeb (UI, ``) | +| `/online.js` | 200 | плагин VOD — 70+ онлайн-источников | +| `/lg.ipk` | 200 | установщик клиента для LG (6.9 МБ) | +| `/sisi` | 200 | JSON-список платформ 18+ | +| `/dlna` | 200 | DLNA-модуль | +| `/ts/echo` | 200 | TorrServer (отдаёт версию, напр. `MatriX.135`) | +| `/catalog.js` | **404** | модуль Catalog выключен | +| `/cub`, `/api`, `/lampac.js` | 404/500 | — | ## Что осталось 1. **Лимит кэша TorrServer** — сейчас дефолт. Задать ~20 ГБ, чтобы не сожрать 396 ГБ свободных. -2. **Подключение Lampa на ТВ** — шаг 6 плана, на стороне Alex. +2. **`init.conf` без volume** — правки в `docker exec` не переживают пересоздание контейнера. +3. **Шаг 7 плана — watchlist в UI Lampa** — план: [[personal/plans/lampac-watchlist-plugin]]. +4. **Проверка полосы на торрент-источнике** (remux 60–80 Мбит) — не сделана. diff --git a/personal/tech/skill-lampac-kraken-deploy.md b/personal/tech/skill-lampac-kraken-deploy.md index 717a66b4..6cbbeb77 100644 --- a/personal/tech/skill-lampac-kraken-deploy.md +++ b/personal/tech/skill-lampac-kraken-deploy.md @@ -13,6 +13,7 @@ tags: related: - '[[personal/tech/lampac-deployment]]' - '[[personal/plans/lampac-kraken]]' + - '[[family/how-to/tv-luna-send]]' --- # Skill: `lampac-kraken-deploy` @@ -40,6 +41,27 @@ related: 6. `docker manifest inspect` с Mac → `denied`; проверять **из Кра́кена**. 7. `docker compose` только как плагин (v5.1.3), не `docker-compose`. 8. Приёмка = играет 5+ минут на ТВ, а не «API отвечает». +9. 🔴 **Lampa на ТВ ставится по SSH, флешка и Media Station X НЕ нужны.** См. [[personal/tech/lampac-deployment]]. +10. 🔴 **`luna-send` по SSH печатает хелп вместо ответа** — обернуть в `script -q -c "..." /tmp/o.txt`. +11. Фактический appId Lampa на ТВ — **`com.lampac.tv`** (не `org.lampa.tv` из запроса установки). + +## Установка Lampa на ТВ (сжато) + +```bash +# скачать ipk на ТВ +ssh root@192.168.1.70 'curl -sS -o /tmp/lampa.ipk "http://192.168.1.14:9118/lg.ipk"' + +# установить (только через com.webos.appInstallService + обёртку script) +ssh root@192.168.1.70 'rm -f /tmp/i.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.appInstallService/dev/install \ + {\"id\":\"org.lampa.tv\",\"ipkUrl\":\"/tmp/lampa.ipk\",\"subscribe\":true}" /tmp/i.txt; cat /tmp/i.txt' + +# запустить +ssh root@192.168.1.70 'rm -f /tmp/l.txt; script -q -c \ + "luna-send -n 1 -f luna://com.webos.applicationManager/launch {\"id\":\"com.lampac.tv\"}" /tmp/l.txt' +``` + +ТВ: `root@192.168.1.70`, ключ `~/.ssh/konka_webos`, webOS 5.4.2, порты `22`/`3000`/`3001`. ## Проверка @@ -59,3 +81,13 @@ ssh kraken 'sudo rm -rf /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e8 ## Не закрыто - Лимит кэша TorrServer — дефолт. Рекомендуется ~20 ГБ. +- `init.conf` не смонтирован — правки через `docker exec` не переживают пересоздание контейнера. +- Шаг 7 — watchlist в UI Lampa: [[personal/plans/lampac-watchlist-plugin]]. + +## Реальный скилл (файл) + +`~/.hermes/hermes-whale/skills/devops/lampac-kraken-deploy/SKILL.md` + +⚠️ **Скилл в файловой системе отстал от этой заметки** — в нём нет пунктов 9–11 +(установка Lampa на ТВ по SSH, питфолл `luna-send`+`script`, фактический appId `com.lampac.tv`). +При следующей загрузке скилла — подтянуть из [[personal/tech/lampac-deployment]].