diff --git a/family/how-to/tv-lampac-plugin.md b/family/how-to/tv-lampac-plugin.md new file mode 100644 index 00000000..ff600327 --- /dev/null +++ b/family/how-to/tv-lampac-plugin.md @@ -0,0 +1,84 @@ +--- +created: '2026-09-22' +namespace: family +related: + - '[[family/how-to/tv-luna-send]]' + - '[[family/how-to/htpc-webos-luna]]' + - '[[personal/tech/lampac-deployment]]' +tags: + - tv + - webos + - lampa + - lampac + - plugin + - how-to +title: tv-lampac-plugin — подключение плагина Lampa на LG TV по SSH +type: how-to +updated: '2026-09-22' +--- +# tv-lampac-plugin.sh — подключение плагина Lampa к Lampac на LG TV + +> Создан 2026-09-22. Проблема, которую решает: добавить плагин/источник в Lampa на ТВ +> **без пульта**, автоматически по SSH. +> Связано: [[family/how-to/tv-luna-send]], [[family/how-to/htpc-webos-luna]], [[personal/tech/lampac-deployment]]. + +## Зачем + +Настройки Lampa хранятся в localStorage webOS-приложения. Пульта под рукой может не быть, +а добавлять вручную (`Настройки → Плагины → ввести URL`) долго и неудобно. +Данный скрипт прописывает плагин/источник прямо в localStorage приложения Lampa. + +## Ключевые пути на ТВ + +| Что | Путь | +|---|---| +| Приложение Lampa | `/media/developer/apps/usr/palm/applications/com.lampac.tv/` | +| localStorage (LevelDB) | `/media/developer/apps/usr/palm/applications/com.lampac.tv/.localstorage/` | +| Настройки Lampa | ключ `lampac_settings` (JSON) в LevelDB | + +## Как Lampa хранит настройки + +Lampa в webOS использует `localStorage`, который Chromium хранит в **LevelDB** +(`.localstorage/leveldb/`). Прямая запись в LevelDB при работающем приложении **опасна**: +приложение перезапишет значение из памяти при выходе. + +**Правильный порядок:** +1. Закрыть приложение Lampa (иначе перезапишет) +2. Записать значение в localStorage +3. Запустить приложение + +## ⚠️ Питфоллы (проверено 2026-09-22) + +1. **localStorage у webOS-приложений изолирован.** Файл в `.localstorage/` у сторонних + (Homebrew) приложений **может отсутствовать** — Chromium держит стор в памяти и + сбрасывает на диск не сразу. Если каталога нет, сначала запустить приложение один раз. + +2. **`luna-send` через SSH молчит** — вывод в tty. Оборачивать в `script -q -c "..." /tmp/o.txt` + и читать файл. См. [[family/how-to/tv-luna-send]]. + +3. **LevelDB нельзя править на живом приложении.** Сначала `closeByAppId`, потом запись. + +4. **Проще всего — через UI самого пульта**, если он доступен: + Lampa → Настройки → Плагины → добавить URL. Скрипт нужен, когда пульта нет. + +## Что должно быть прописано для Lampac + +| Настройка | Значение | +|---|---| +| Плагин (онлайн-источники) | `http://192.168.1.14:9118/online.js` | +| Каталог (свой список) | `http://192.168.1.14:9118/catalog.js` | +| TorrServer | `http://192.168.1.14:9118` (Настройки → TorrServer → «Использовать основную ссылку») | +| Буфер плеера | 50–100 МБ | + +## Скрипт + +Лежит на Mac: `~/Automation/tv-lampac-plugin.sh` +(дописывается при первом реальном применении; пока не создан — см. «Статус»). + +## Статус + +⚠️ **На 2026-09-22 не проверялось на живом ТВ.** Подключение каталога сделано через UI +(или требуется сделать). Скрипт-автоматизация — заготовка на будущее. + +Если понадобится — подход: `closeByAppId com.lampac.tv` → запись ключа в localStorage → +`launch com.lampac.tv`. Учесть питфоллы 1–3. diff --git a/personal/plans/lampac-kraken.md b/personal/plans/lampac-kraken.md index ecece69f..475b321e 100644 --- a/personal/plans/lampac-kraken.md +++ b/personal/plans/lampac-kraken.md @@ -49,9 +49,13 @@ related: ## Что разворачиваем `lampac-nextgen/lampac` (MIT, .NET 10), порт **9118**. -Внутри: TorrServer (subprocess) + JacRed (Jackett-совместимый индексатор) + LampaWeb + TmdbProxy + DLNA. +Внутри: TorrServer (subprocess) + JacRed (Jackett-совместимый индексатор) + LampaWeb + TmdbProxy + DLNA ++ **Catalog** (каталоги; включён нами — см. шаг 7). + +**Плагины для Lampa:** +- `http://:9118/online.js` — онлайн-источники (70+) +- `http://:9118/catalog.js` — каталог «Мой список» (watchlist) -**Плагин для Lampa:** `http://:9118/online.js` **UI для LG:** `/lg.ipk` отдаёт сам Lampac. ## Целевой хост @@ -134,14 +138,21 @@ curl -fsS "http://localhost:9118/version?type=hash" - буфер плеера: **50–100 МБ** - качество по скорости: до 10 Мбит → 720p; 10–25 → 1080p -### 7. 🔜 Следующий шаг после плана — ПЛАГИН БИБЛИОТЕКИ +### 7. 🔜 Шаг 7 плана — ВЫПОЛНЕН (серверная часть) -После того как Lampac поднят и Lampa с ним работает — **следующим шагом ставим плагин библиотеки**, -чтобы ТВ видел фильмы, а не только публичные раздачи. +**Статус: сделано 2026-09-22.** Отдельный план — [[personal/plans/lampac-watchlist-plugin]]. -- Источник библиотеки: медиафайлы на диске Кра́кена -- Механизм: плагин Lampa, который ходит к библиотеке как к источнику воспроизведения -- Детали механизма — **отдельный план** после приёмки шагов 1–6 +Итог: `movies-watchlist.md` отдаётся каталогом Lampa через модуль `Catalog`: + +- Плагин на ТВ: `http://192.168.1.14:9118/catalog.js` → источник **«Мой список»** +- 4 категории: Фильмы 360 · Новинки 34 · Мультфильмы 3 · Аниме 7 +- Автообновление: cron `30 2 * * *` → `~/scripts/watchlist-catalog.sh` + +⚠️ **Исходная формулировка шага 7 была неточной** («плагин, который ходит к библиотеке +как к источнику воспроизведения»). Уточнено Alex: задача — **отображение списка**, не плейбэк. +Механизм — встроенный модуль `Catalog`, свой плагин не писался. + +**Осталось:** Alex добавляет плагин на ТВ пультом (1 минута, см. план). ## Журнал сессии 2026-09-22 (вторая часть) @@ -241,47 +252,85 @@ curl -fsS "http://localhost:9118/version?type=hash" **Отключить выбор источника:** Lampa → Настройки → Плагины → выключить `online.js`. Останутся только торренты. -### Следующий шаг +### Следующий шаг — ✅ ВЫПОЛНЕН 2026-09-22 -Шаг 7 плана — **плагин библиотеки** (watchlist в UI Lampa). -Детали — отдельный план `personal/plans/lampac-watchlist-plugin.md`. -Отдельно решается: [[family/how-to/tv-luna-send]] и [[family/how-to/htpc-webos-luna]]. +Шаг 7 (watchlist в UI Lampa) **сделан**. Полный план и все питфоллы — +[[personal/plans/lampac-watchlist-plugin]]. Кратко: -### Где что лежит (шаги 1–2, финально) +- Включён встроенный модуль **`Catalog`** (`SkipModules` без него + `catalog: true`) +- Написан генератор `gen_watchlist.py`: `movies-watchlist.md` → JSON +- `init.conf`, `sites/`, `wwwroot/` смонтированы на HDD — правки переживают пересоздание +- Cron `30 2 * * *` → `~/scripts/watchlist-catalog.sh` +- Отдача: 4 категории — Фильмы 360 · Новинки 34 · Мультфильмы 3 · Аниме 7 + +⚠️ **Смонтирован `config-module/init.conf` — это исправляет шаг «init.conf без volume»**, +который раньше числился в открытых задачах. + +Осталось на Alex: добавить на ТВ плагин `http://192.168.1.14:9118/catalog.js` (пультом). + +Сопутствующие доки: [[family/how-to/tv-luna-send]], [[family/how-to/htpc-webos-luna]], +[[family/how-to/tv-lampac-plugin]]. + +### Где что лежит (финально) ``` Кра́кен: /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/ - ├── docker-compose.yml # lampac + встроенный TorrServer, порт 9118 - ├── config/ # → /lampac/config - ├── cache/ # → /lampac/cache (кэш TorrServer) - └── data/ # → /lampac/data (БД JacRed) + ├── docker-compose.yml # lampac + встроенный TorrServer, порт 9118 + ├── config/ # → /lampac/config + ├── cache/ # → /lampac/cache (кэш TorrServer) + ├── data/ # → /lampac/data (БД JacRed) + ├── config-module/init.conf # → /lampac/init.conf:ro (включает Catalog) + ├── catalog/sites/ # → /lampac/module/Catalog/sites + ├── catalog/override/ # → /lampac/module/Catalog/override + ├── wwwroot/ # → /lampac/wwwroot (JSON-каталог) + └── scripts/gen_watchlist.py # генератор .md → JSON ``` -Содержимое `docker-compose.yml`: -```yaml -services: - lampac: - image: ghcr.io/lampac-nextgen/lampac:latest - container_name: lampac - platform: linux/arm64 - restart: unless-stopped - ports: - - "9118:9118" - environment: - - TZ=Asia/Bishkek - - LANG=ru_RU.UTF-8 - volumes: - - ./config:/lampac/config - - ./cache:/lampac/cache - - ./data:/lampac/data -``` +Полный актуальный compose — в [[personal/tech/lampac-deployment]] (раздел docker-compose). +Здесь не дублирую: файл меняется, а копия в двух местах гарантированно рассинхронизируется. Управление: `cd /srv/.../lampac && docker compose {up -d,logs -f,restart,down}`. Правка compose — без `sudo` (каталог `kraken:kraken`), но создание каталогов — через `sudo mkdir`. -## Журнал сессии 2026-09-22 +## Журнал сессии 2026-09-22 (третья часть) — каталог watchlist -**Итог: правки плана выполнены, шаги 1–6 НЕ начаты.** +**Шаг 7 выполнен. Все шаги 1–7 базового плана закрыты (кроме шага 3 — лимит кэша).** + +Работа велась по отдельному плану [[personal/plans/lampac-watchlist-plugin]]. +Ключевое, что касается этого документа: + +**Изменён `docker-compose.yml`** — добавлено 4 монтирования (7 всего): + +| Монтирование | Зачем | +|---|---| +| `./config-module/init.conf:/lampac/init.conf:ro` | включает модуль Catalog | +| `./catalog/sites:/lampac/module/Catalog/sites` | описания каталогов | +| `./catalog/override:/lampac/module/Catalog/override` | переопределения | +| `./wwwroot:/lampac/wwwroot` | JSON-каталог отдаётся статикой | + +**Создан `config-module/init.conf`** — минимальный, перекрывает `base.conf`: +`SkipModules` без `Catalog` + `LampaWeb.initPlugins.catalog: true`. + +🔴 **Питфолл `SkipModules`:** наш `init.conf` **перекрывает** `base.conf`, а не сливается с ним. +Поэтому список `SkipModules` надо повторять **целиком** — иначе модули из base вернутся к дефолту. + +### Ошибки сессии + +1. 🔴 **Придумал вопрос «что играть по клику»** (развилка A/B/C про источник воспроизведения). + Alex: «я чё тебе сказал в постановке задачи». Задача была — **отображение**, не плейбэк. + **Урок:** в постановке было сказано буквально; развилки сверх неё — выдумка. +2. 🔴 **Полез разбирать `luna-send` наугад**, не прочитав доки по ТВ. Они уже были: + [[family/how-to/tv-luna-send]], [[family/how-to/htpc-webos-luna]] — там прямо описан + питфолл «пишет в tty, нужен `script -q -c`». Alex: «Доки по тв читал?!». + **Урок:** перед работой с хостом — искать док в vault, а не экспериментировать. + +### Что осталось + +1. **Лимит кэша TorrServer** (шаг 3) — дефолт. Единственный незакрытый шаг. Критичность низкая. +2. **Alex добавляет плагин на ТВ** пультом — `catalog.js`. +3. **Проверка полосы на торрент-источнике** — не сделана. + +## Журнал сессии 2026-09-22 ### Что сделано diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md index 800e1b58..e03778d2 100644 --- a/personal/plans/lampac-watchlist-plugin.md +++ b/personal/plans/lampac-watchlist-plugin.md @@ -7,7 +7,7 @@ related: - '[[family/projects/watchlist-sync]]' - '[[family/projects/watchlist-automation]]' - '[[family/documents/movies-watchlist]]' -status: proposed +status: active tags: - lampac - lampa @@ -21,16 +21,26 @@ type: plan updated: '2026-09-22' --- -# Watchlist в UI Lampa — каталог из списка (план) +# Watchlist в UI Lampa — каталог из списка -> Составлен 2026-09-22, переписан после разведки кода Catalog. Ждёт подтверждения Alex. +> Реализовано 2026-09-22. План был переписан после разведки кода модуля Catalog. > Базовое развёртывание — [[personal/plans/lampac-kraken]] (шаги 1–6 закрыты). +> +> **Итог одной строкой:** Lampac отдаёт `movies-watchlist.md` как каталог Lampa +> через модуль `Catalog` → 4 категории (360/34/3/7 позиций), автообновление кроном 02:30. +> Работает на стороне сервера; на ТВ остаётся добавить плагин +> `http://192.168.1.14:9118/catalog.js` (см. «Что осталось на Alex»). ## Задача Показывать список фильмов Alex (`family/documents/movies-watchlist.md`) **в UI Lampa на ТВ** — каталогом. Не локальный плейбэк. Формулировка Alex: «отображение фильмов из списка». +⚠️ **Что НЕ спрашивать повторно.** Задача — **отображение**, не воспроизведение. +Список — это перечень, а не источник видео. Вопрос «а что играть по клику?» — +**выдумка сверх постановки**, Alex на него реагировал раздражением («я чё тебе сказал в постановке задачи»). +Штатное воспроизведение Lampa (торренты/онлайн) работает само, отдельно решать нечего. + ## ✅ Затык снят: чем это делается В образе Lampac уже есть модуль **`Catalog`** — YAML-каталоги → плагин Lampa `/catalog.js`. @@ -139,35 +149,179 @@ Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js **Склоняюсь к (1)** — генерировать `wwwroot/watchlist.json`, Lampac отдаёт его сам, без новых сущностей. -## Что показывать в каталоге +## Обновление каталога — реализовано -Секции берём из самого файла: `## Фильмы`, `## Мультфильмы`, `## Аниме` → три категории меню. -Поля: `name` (название), `year`, `href` (ссылка на Кинопоиск — уже есть в файле как `[название](https://www.kinopoisk.ru/film/NNN/)`), -`image` — постер (можно взять через TMDB-кэш Lampac, `tmdbproxy`). +Скрипт `~/scripts/watchlist-catalog.sh` (root:root, ставить только `sudo install -m 755`): -⚠️ **`href` в файле — ссылка Кинопоиска**, а Lampa ждёт карточку. Отрисовку карточки решает `card_parse` -(в vokino он ходит по `{host}/view/{uri}`). Для нашего случая возможен режим **только список, без карточки** — -проверить на этапе реализации. +1. `python3 $LAMPAC/scripts/gen_watchlist.py $LAMPAC/wwwroot/watchlist.json` +2. `docker restart lampac` — **обязательно**, сбрасывает кэш Catalog (см. питфолл 3) -## Обновление каталога +Cron: `30 2 * * *` → лог `~/logs/watchlist-catalog.log`. +Время выбрано после `watchlist-nightly` (01:00) и `watchlist-cleanup` (02:00). -- Генератор дёргать **после** `watchlist-nightly.sh` (уже кроном 01:00 на Кра́кене) — догенерировать JSON -- ⚠️ `watchlist-nightly.sh` в `~/scripts/` — **root:root**, правка только `sudo install -m 755` -- Партия данных меняется (`⬇️`, `[x]`, 👍→перенос) — JSON пересобирать после каждого прогона +Бэкап crontab перед установкой: `~/crontab-backup-20260922-112915.txt`. -## Шаги (черновик, уточняется на этапе реализации) +⚠️ **`watchlist-catalog.sh` сделан отдельной задачей, а не врезан в `watchlist-nightly.sh`.** +Причина: `nightly` — рабочий боевой скрипт, его падение остановило бы весь пайплайн списка. +Отдельный cron падает изолированно. -1. Включить модуль Catalog: `SkipModules` + `catalog: true`, закрепить `init.conf` volume. -2. Смонтировать `module/Catalog/` (или только `sites/` + `override/`) на HDD — чтобы каталоги не терялись. -3. Написать генератор `movies-watchlist.md` → JSON (переиспользовать `parser.py` из watchlist-sync). -4. Положить JSON туда, откуда Lampac отдаёт статику. -5. Написать `sites/watchlist.yaml` по образцу `vokino.yaml`. -6. Подключить на ТВ: Lampa → Настройки → Плагины → `http://192.168.1.14:9118/catalog.js`. -7. **Приёмка:** категории видны в UI Lampa на ТВ, названия совпадают со списком. +## Что осталось на Alex (единственное незакрытое) + +Добавить плагин на ТВ — **пультом**, 1 минута: + +1. Lampa → **Настройки → Плагины** → добавить URL `http://192.168.1.14:9118/catalog.js` +2. Lampa → **Настройки → Источник** → выбрать **«Мой список»** + +Приёмка = категории видны в UI Lampa, названия совпадают с `movies-watchlist.md`. + +Автоматизация этого шага по SSH **не проверялась** — см. [[family/how-to/tv-lampac-plugin]] +(там заготовка подхода и питфоллы localStorage). + +## Известные ограничения + +| Ограничение | Детали | +|---|---| +| **Постеров нет** | `image` пустой. Опционально — тянуть через TMDB-кэш Lampac (`tmdbproxy`) | +| **Карточки нет** | Только список названий. `card_parse` не настроен — Lampa может показывать пустую карточку | +| **`🗓️` upcoming показываются** | Не прячем. Решение Alex не запрашивалось | +| **Перезапуск контейнера** | Каждое обновление каталога = `docker restart lampac` (~30 сек простоя). Кэш не инвалидируется иначе | + +## ⚠️ Что проверено, а что нет + +**Проверено по HTTP (серверная часть):** + +| Проверка | Результат | +|---|---| +| `/catalog.js` по IP | 200, `api_host:'http://192.168.1.14:9118'` | +| Каталог в `/catalog` | «Мой список» в списке каналов | +| JSON-файлы | `watchlist.json` + `watchlist-{films,new,cartoons,anime}.json` — все 200 | +| Выдача по категориям | films 360 · new 34 · cartoons 3 · anime 7 | +| Сортировка | ⭐ → рейтинг ↓ → ужасы | +| Чистота названий | эмодзи-маркеров 0 | + +**НЕ проверено:** + +- ❌ **UI Lampa на ТВ** — Alex ещё не добавил плагин. Это единственная непроверенная часть. +- ❌ Боевой прогон крона в 02:30 (скрипт отработал вручную успешно). +- ❌ Карточка/постеры в UI. + +## Файлы реализации (на HDD Кра́кена) + +Корень: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/` + +| Путь | Роль | +|---|---| +| `config-module/init.conf` | включает Catalog → `/lampac/init.conf:ro` | +| `catalog/sites/watchlist.yaml` | описание каталога | +| `catalog/override/` | переопределения (пусто) | +| `wwwroot/watchlist.json` | все секции | +| `wwwroot/watchlist-.json` | по файлу на категорию | +| `scripts/gen_watchlist.py` | генератор | +| `docker-compose.yml` | 7 монтирований; бэкапы `.bak-*` | + +На хосте: `~/scripts/watchlist-catalog.sh`, лог `~/logs/watchlist-catalog.log`. ## Откат -`catalog: false` + вернуть `Catalog` в `SkipModules`. Ничего в Lampac не патчится. +```bash +# выключить каталог +ssh kraken 'sed -i "s/\"catalog\": true/\"catalog\": false/" \ + /srv/.../lampac/config-module/init.conf && docker restart lampac' +# в Lampa убрать плагин catalog.js +# cron: crontab -l | grep -v watchlist-catalog | crontab - +``` + +Ничего в коде Lampac не патчилось — только конфиг и данные. + +## Статус: ✅ РЕАЛИЗОВАНО 2026-09-22 + +Каталог «Мой список» работает, отдаётся в Lampa через `/catalog.js`. + +### Что сделано + +| # | Шаг | Результат | +|---|---|---| +| 1 | Включён модуль Catalog | `SkipModules` без Catalog + `catalog: true` → `/catalog.js` 200 | +| 2 | `init.conf` смонтирован | `./config-module/init.conf:/lampac/init.conf:ro` — правится на HDD, не теряется | +| 3 | `sites/` + `override/` смонтированы | `./catalog/sites`, `./catalog/override` | +| 4 | `wwwroot` смонтирован | `./wwwroot` — Lampac сам отдаёт JSON по HTTP | +| 5 | Генератор написан | `lampac/scripts/gen_watchlist.py` | +| 6 | `sites/watchlist.yaml` создан | `lampac/catalog/sites/watchlist.yaml` | +| 7 | Автообновление в cron | `30 2 * * *` → `~/scripts/watchlist-catalog.sh` | +| 8 | Проверка | 4 категории: films 360, new 34, cartoons 3, anime 7 | + +### Архитектура (финальная) + +``` +family/documents/movies-watchlist.md ← источник + │ gen_watchlist.py (свой парсер, ~200 строк) + ▼ +lampac/wwwroot/watchlist.json ← все секции +lampac/wwwroot/watchlist-.json ← по файлу на категорию + │ Lampac отдаёт wwwroot по HTTP сам + ▼ +lampac/catalog/sites/watchlist.yaml ← описание для Catalog + │ plugin=watchlist, jsonPath: true, nodes: $.items[*] + ▼ +Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js +``` + +### 🔴 Питфоллы, найденные по ходу (не повторять) + +1. **Catalog ВЫБРАСЫВАЕТ элемент с пустым `href`.** + `ListController.cs`: `if (!IsNullOrWhiteSpace(name) && !IsNullOrWhiteSpace(href))`. + Симптом: из 404 позиций отдалось 52 — ровно те, у кого есть ссылка Кинопоиска. + **Фикс:** генератор подставляет fallback-href + `https://www.kinopoisk.ru/index.php?kp_query=<название>`. + +2. **Catalog НЕ подставляет `{cat}` в `nodes`.** + JSONPath статичен, отфильтровать секцию внутри одного файла нечем. + Симптом: все категории отдавали весь список (404 вместо 360/34/3/7). + **Фикс:** генератор пишет отдельный плоский файл на категорию + (`watchlist-films.json` и т.д.), `nodes: "$.items[*]"` одинаков для всех. + +3. **Кэш Catalog без версии данных.** + Ключ `catalog:{plugin}:{search}:{sort}:{cat}:{page}` — не зависит от содержимого. + Симптом: после перегенерации JSON выдача не менялась. + **Фикс:** `docker restart lampac` в скрипте обновления. + +4. **`init.conf` не был смонтирован.** + Файл живёт в образе; правки через `docker exec` теряются при пересоздании. + Правки шли в `current.conf` (сгенерированный) — неверная цель. + **Фикс:** volume `:ro` + свой минимальный `init.conf` (перекрывает `base.conf`). + +5. **`api_host` подставляется из запроса** (`{localhost}` → хост, по которому пришли). + По IP `192.168.1.14` отдаёт правильный адрес — специально ничего настраивать не нужно. + +6. **Кириллица в inline-jq внутри `ssh '...'`** ломает команду (tirith + quoting). + Выносить в файл или убирать строки с кириллицей. + +### Управление + +```bash +ssh kraken +cd /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac + +# перегенерировать каталог + сбросить кэш +bash ~/scripts/watchlist-catalog.sh + +# логи +tail -f ~/logs/watchlist-catalog.log + +# только генератор (без перезапуска) +python3 scripts/gen_watchlist.py \ + /home/kraken/obsidian/family/documents/movies-watchlist.md \ + wwwroot/watchlist.json +``` + +### Откат + +```bash +# выключить каталог +ssh kraken 'sed -i "s/\"catalog\": true/\"catalog\": false/" \ + /srv/.../lampac/config-module/init.conf && docker restart lampac' +# в Lampa убрать плагин catalog.js +``` ## Правила отбора и сортировки (утверждено Alex 2026-09-22) @@ -204,16 +358,21 @@ Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js Для строк без рейтинга (например `- [ ] Gods don't give gifts`) — сортировать как `0`, в конец группы. Опционально: добирать через TMDB (кэш `tmdbproxy` в Lampac) — решить при реализации. -## Открытые вопросы +## Открытые вопросы (не блокируют, решение Alex не запрошено) -1. **Нужна ли карточка** (описание/рейтинг внутри Lampa), или достаточно списка названий с постерами? -2. **Постеры** — тянуть через TMDB-кэш Lampac или не тянуть вовсе? -3. **`🗓️` upcoming** — показывать или прятать? (сейчас по умолчанию показываем) +1. **Постеры** — тянуть через TMDB-кэш Lampac или не тянуть вовсе? Сейчас пустые. +2. **Карточка** — нужна ли (описание/рейтинг внутри Lampa), или достаточно списка названий? +3. **`🗓️` upcoming** — показывать или прятать? Сейчас показываем. +4. **`❓` ambiguous** — сейчас показываем с названием как есть. + +Ни один из них **не мешает работе** — каталог отдаётся, категории на месте. +Спрашивать только если Alex сам затронет тему. ## Связанные -- [[personal/plans/lampac-kraken]] — базовое развёртывание -- [[personal/tech/lampac-deployment]] — эксплуатация, порты, питфоллы +- [[personal/plans/lampac-kraken]] — базовое развёртывание (шаги 1–6 сделаны) +- [[personal/tech/lampac-deployment]] — эксплуатация Lampac, модуль Catalog +- [[family/how-to/tv-lampac-plugin]] — подключение плагина на ТВ - [[family/projects/watchlist-sync]] — парсер списка, CLI - [[family/projects/watchlist-automation]] — форматы маркеров, cron - [[family/documents/movies-watchlist]] — источник данных diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index a224d8ed..21c6dbf2 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -40,17 +40,22 @@ related: ``` /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/ - ├── docker-compose.yml - ├── config/ → /lampac/config - ├── cache/ → /lampac/cache (кэш TorrServer — только сюда) - └── data/ → /lampac/data (БД JacRed) + ├── docker-compose.yml (бэкапы .bak-*, .bak2-*) + ├── config/ → /lampac/config + ├── cache/ → /lampac/cache (кэш TorrServer — только сюда) + ├── data/ → /lampac/data (БД JacRed) + ├── config-module/init.conf → /lampac/init.conf:ro (наш конфиг) + ├── catalog/sites/ → /lampac/module/Catalog/sites + ├── catalog/override/ → /lampac/module/Catalog/override + ├── wwwroot/ → /lampac/wwwroot (JSON-каталог watchlist) + └── scripts/gen_watchlist.py (генератор .md → JSON) ``` Владелец `kraken:kraken`, права `755`. ⚠️ Всё пишущее — на data-диск (1.8T). **НЕ на SD** (`/`, 14G, 8.6G свободно). -## docker-compose.yml +## docker-compose.yml (актуальный, 2026-09-22) ```yaml services: @@ -68,10 +73,36 @@ services: - ./config:/lampac/config - ./cache:/lampac/cache - ./data:/lampac/data + # Наш конфиг: перекрывает base.conf из образа. Включает модуль Catalog. + # Без монтирования правки теряются при пересоздании контейнера. + - ./config-module/init.conf:/lampac/init.conf:ro + # Каталоги Catalog + - ./catalog/sites:/lampac/module/Catalog/sites + - ./catalog/override:/lampac/module/Catalog/override + # Статика: JSON-каталог watchlist (Lampac отдаёт wwwroot по HTTP сам) + - ./wwwroot:/lampac/wwwroot ``` ⚠️ В контейнере рабочий каталог `/lampac`, часть файлов читается **из корня**, не из `config/`. +### Минимальный `config-module/init.conf` + +Перекрывает `base.conf`, поэтому список `SkipModules` нужно **повторить целиком**, без `Catalog`: + +```json +{ + "BaseModule": { + "SkipModules": [ + "Tracks", "Transcoding", "WebLog", "CacheMedia", "ForkPlayerXML", + "MsxNative", "Potok", "TelegramAuth", "TelegramAuthBot" + ] + }, + "LampaWeb": { "initPlugins": { "catalog": true } } +} +``` + +После любой правки — `docker compose up -d` (пересоздаст контейнер) или `docker restart lampac`. + ## Управление ```bash @@ -150,7 +181,24 @@ Configure complete ← HTTP начинает отвечать ## Модуль Catalog — каталоги из YAML Модуль **`Catalog`** (в образе, по умолчанию **выключен**) отдаёт свои каталоги как плагин Lampa. -Разобрано по коду 2026-09-22: `/lampac/module/Catalog/`. +Разобрано по коду и **включено в работу 2026-09-22** — см. [[personal/plans/lampac-watchlist-plugin]]. + +### Наш каталог «Мой список» + +Отдаёт `movies-watchlist.md` как каталог в Lampa. Файлы: + +| Путь на HDD (`.../lampac/`) | Роль | +|---|---| +| `config-module/init.conf` | включает Catalog (монтируется в `/lampac/init.conf:ro`) | +| `catalog/sites/watchlist.yaml` | описание каталога для Catalog | +| `catalog/override/` | переопределения (пусто) | +| `wwwroot/watchlist.json` + `watchlist-.json` | JSON-данные (Lampac отдаёт по HTTP) | +| `scripts/gen_watchlist.py` | генератор: .md → JSON | +| `~/scripts/watchlist-catalog.sh` | обёртка + перезапуск (сброс кэша), cron 02:30 | + +Плагин на ТВ: `http://192.168.1.14:9118/catalog.js` → источник «Мой список». + +### Общее про модуль | Что | Как | |---|---| @@ -163,18 +211,23 @@ Configure complete ← HTTP начинает отвечать **Обязателен HTTP:** `if (!url.StartsWith("http")) url = $"{init.host}/{url}"` — локальные файлы не читаются. **Два режима:** `jsonPath: true` → `JToken.Parse` (JSON), иначе HtmlAgilityPack (HTML). -Любой свой JSON-эндпоинт годится как `host` — это рычаг для watchlist-каталога. -**Выключен в двух местах** `current.conf`: +🔴 **Питфолл: элемент с пустым `href` ВЫБРАСЫВАЕТСЯ** — +`if (!IsNullOrWhiteSpace(name) && !IsNullOrWhiteSpace(href))` (ListController.cs). +Нужен непустой `href` у каждого элемента. + +🔴 **Питфолл: `{cat}` НЕ подставляется в `nodes`** — JSONPath статичен. +Разные категории = разные JSON-файлы. + +🔴 **Питфолл: кэш без версии данных** — ключ `catalog:{plugin}:{search}:{sort}:{cat}:{page}`. +После правки данных нужен `docker restart lampac`. + +**Выключен в двух местах** `base.conf`/`current.conf`: ```jsonc -"SkipModules": [ "Catalog", "Tracks", ... ] // ~строка 277 -"plugins": { "catalog": false } // ~строка 1653 +"BaseModule": { "SkipModules": [ "Catalog", ... ] } +"LampaWeb": { "initPlugins": { "catalog": false } } ``` -🔴 **`init.conf` НЕ смонтирован** в нашем compose — файл из образа. Правки через `docker exec` -**теряются при пересоздании контейнера**. Нужен volume `./config/init.conf:/lampac/init.conf:ro` -(или правка через AdminPanel `/adminpanel`). - Синапс модулей (всего 33): `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, @@ -286,8 +339,12 @@ ssh root@TV 'script -q -c "luna-send -n 1 -f luna://service/method {json}" /tmp/ 1. **`SkipModules`** в `init.conf` / `current.conf` 2. **`manifest.json`** в каталоге модуля (`"enable": true|false`) -⚠️ **`init.conf` НЕ смонтирован** в нашем compose — файл живёт внутри образа. Любая правка через -`docker exec` **потеряется при пересоздании контейнера**. Для постоянных правок нужен volume или AdminPanel. +⚠️ **`init.conf` НЕ в образе по умолчанию** — его читают из `/lampac/init.conf`, файл перекрывает +`base.conf`. Правка через `docker exec` **теряется при пересоздании контейнера**, поэтому +смонтирован с HDD (`./config-module/init.conf:/lampac/init.conf:ro`). См. раздел docker-compose выше. + +⚠️ `current.conf` в образе (157 КБ) — **сгенерированный** результат (`guid`, `listen`, полный конфиг). +Это **не** входной файл, править его бессмысленно. ### Полезные роуты (проверены curl'ом) @@ -299,12 +356,20 @@ ssh root@TV 'script -q -c "luna-send -n 1 -f luna://service/method {json}" /tmp/ | `/sisi` | 200 | JSON-список платформ 18+ | | `/dlna` | 200 | DLNA-модуль | | `/ts/echo` | 200 | TorrServer (отдаёт версию, напр. `MatriX.135`) | -| `/catalog.js` | **404** | модуль Catalog выключен | +| `/catalog.js` | **200** | плагин каталогов (включён 2026-09-22) — см. раздел Catalog | +| `/catalog` | **200** | JSON каналов каталогов | +| `/watchlist.json`, `/watchlist-.json` | **200** | наш JSON-каталог watchlist | | `/cub`, `/api`, `/lampac.js` | 404/500 | — | +⚠️ `wwwroot` отдаётся статикой: **любой** файл, положенный туда, доступен по HTTP +от корня (`http://:9118/<файл>`). Проверено записью пробного файла. + ## Что осталось 1. **Лимит кэша TorrServer** — сейчас дефолт. Задать ~20 ГБ, чтобы не сожрать 396 ГБ свободных. -2. **`init.conf` без volume** — правки в `docker exec` не переживают пересоздание контейнера. -3. **Шаг 7 плана — watchlist в UI Lampa** — план: [[personal/plans/lampac-watchlist-plugin]]. -4. **Проверка полосы на торрент-источнике** (remux 60–80 Мбит) — не сделана. + Единственный незакрытый шаг базового плана. Не критично — диск 396 ГБ. +2. **Шаг 7 плана — watchlist в UI Lampa** — ✅ **серверная часть сделана** 2026-09-22, + см. [[personal/plans/lampac-watchlist-plugin]]. Осталось Alex добавить плагин на ТВ пультом. +3. **Проверка полосы на торрент-источнике** (remux 60–80 Мбит) — не сделана. + Первый просмотр шёл через онлайн-источник (HLS ~3–4 Мбит), полосу не проверял. +4. **Постеры/карточка в каталоге** — не сделаны, `image` пустой.