[2026-09-22] eagle: personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 15:06:13 +06:00
1 parent f53eea7a6f
commit 6f63bc8810
2 files changed
+215 -6

No files matched your search

+106 -2
View File
@@ -48,7 +48,7 @@ related:
├── catalog/sites/ → /lampac/module/Catalog/sites
├── catalog/override/ → /lampac/module/Catalog/override
├── catalog/plugin.js → /lampac/module/Catalog/plugin.js:ro (ПАТЧ, см. ниже)
├── wwwroot/ → /lampac/wwwroot (JSON-каталог watchlist)
├── wwwroot/ → /lampac/wwwroot (JSON-каталог watchlist + cards/)
└── scripts/gen_watchlist.py (генератор .md → JSON)
```
@@ -56,7 +56,22 @@ related:
`gen_watchlist_v2.py`, `patch_plugin.py`, `plugin-patched.js`, `watchlist.yaml`,
`docker-compose.yml`, `deploy_lampac.py`.
Владелец `kraken:kraken`, права `755`.
🔴 **Права на файлы в `wwwroot/` — владелец `1000:1000` (= пользователь `lampac`
в контейнере), каталоги `755`, файлы `644`.** Не `kraken:kraken` — контейнер ходит
не под хост-пользователем. Если файл окажется `root:root 600`, dotnet ответит
`Permission denied`, а веб-сервер **молча отдаст 404** — отсутствие прав выглядит
снаружи как «файла нет».
### Раздача статики из `wwwroot/`
- Всё, что положено в `/lampac/wwwroot/`, доступно **по корню**:
`wwwroot/watchlist-films.json` → `GET /watchlist-films.json` (**200**).
- `UseStaticFiles` — в `Core.dll` (серверное ядро), настраивать не нужно.
- 🔴 **`/lampac/wwwroot` ≠ `/lampac/current.conf`**: статика ядра, а не модуль.
Проверять наличие файла надо `docker exec lampac ls ...`, а **доступность** —
обязательно через `curl`, потому что это разные вещи (см. права выше).
- ⚠️ Веб-корень отдаёт **только** `wwwroot/`. Пути вида `/cards/...` работают,
но `/card` — это **не** статика (см. ниже).
⚠️ Всё пишущее — на data-диск (1.8T). **НЕ на SD** (`/`, 14G, 8.6G свободно).
@@ -1267,3 +1282,92 @@ prowlarr · sonarr · watchtower · rclone · xray-reverse-bridge · hermes-krak
5. **Автоскачка Radarr + Sonarr** — 45 monitored / очередь 6 у Radarr,
13 monitored / очередь 19 у Sonarr. План отключения на апруве
([[personal/plans/lampac-watchlist-plugin]], «ПЕРЕДЕЛКА 2»).
## Карточка фильма в модуле Catalog — рабочая схема (проверено 2026-09-22)
Модуль `Catalog` (в образе `/lampac/module/Catalog/`). Каталог watchlist:
`sites/watchlist.yaml` + JSON в `wwwroot/`.
### Списки
```yaml
menu:
- categories:
Новинки: new # ПЕРВОЙ — она игнорирует format, берёт list.uri
Фильмы: films
Мультфильмы: cartoons
Аниме: anime
format:
"-": |
return $"http://127.0.0.1:9118/watchlist-{cat}.json";
list:
uri: watchlist-new.json # ← сюда смотрит первая категория
content:
nodes: "$.items[*]"
href: { attribute: href } # href = TMDB URL → id = "movie/NNN"
```
### Карточка
`CardController.Index(plugin, uri, type)` — **`cat` не принимает**.
- `url = $"{init.host}/{uri}"` — дефолт, даёт `http://127.0.0.1:9118/movie/424781` → 500.
- `card_parse.initUrl` **исполняется как C#** (`CSharpEval`, объект
`CatalogInitUrlCard(host, args, uri, query, type)`) → можно собрать динамический URL.
- `card_parse.node` — **статичный JSONPath** (`json.SelectToken(node)`),
подстановок нет; `/` = вложенность.
Рабочая конфигурация:
```yaml
card_parse:
initUrl: |
return $"{host}/cards/card-{uri.Replace("/", "-")}.json";
node: card
name: { attribute: name }
original_name: { attribute: original }
year: { attribute: year }
image: { attribute: poster }
description: { attribute: overview }
```
Файл `wwwroot/cards/card-movie-424781.json`:
```json
{ "card": { "name": "...", "title": "...", "original": "...", "original_title": "...",
"year": "...", "rating": "...", "poster": "...", "img": "...",
"overview": "...", "genres": "...", "cast": "...", "runtime": 116 } }
```
Ключи дублируются (`name`+`title`, `poster`+`img`): `CardController` отдаёт
`title`/`original_title`, а `card_parse` ищет `name`/`original`.
### Эндпоинты
| Запрос | Назначение |
|---|---|
| `GET /catalog` | список каналов; `main` = категории |
| `GET /catalog/list?plugin=watchlist&cat=films&page=1` | элементы секции |
| `GET /catalog/card?plugin=watchlist&uri=movie/424781` | **карточка** |
🔴 **Не по `/card`** — там 404 и ложный вывод «карточка сломана».
### Файлы и права
- Статика раздаётся из `/lampac/wwwroot/` (`core` UseStaticFiles).
- Владделец — `1000:1000` (пользователь `lampac` в контейнере), каталоги `755`,
файлы `644`. Иначе `Permission denied` → **404**.
- macOS `tar` → AppleDouble `._*`, добавлять `--no-mac-metadata`.
### Деплой
```bash
python3 gen_watchlist_v2.py movies-watchlist.md /tmp/wl-out/watchlist.json
python3 deploy_lampac.py /tmp/wl-out --skip-plugin
```
Скрипты: `/Users/admin/lampac-tmp/`. Логика заливки — tar+scp+sudo,
`ssh -t` для sudo (без tty `sudo` требует пароль), каждая команда отдельным
вызовом (`&&`-цепочка рвёт tty).
### Связанные