diff --git a/wiki/tech/arr-stack-kraken.md b/wiki/tech/arr-stack-kraken.md index 52e91068..2fa383cd 100644 --- a/wiki/tech/arr-stack-kraken.md +++ b/wiki/tech/arr-stack-kraken.md @@ -1,13 +1,14 @@ --- title: Arr Stack — Kraken created: '2026-05-23' -updated: '2026-05-23' +updated: '2026-05-27' type: tech namespace: family tags: [arr, radarr, sonarr, prowlarr, transmission, jellyfin, infra, kraken] related: - "[[tech/jellyfin-config]]" - "[[tech/arr-stack-taiga]]" + - "[[concepts/kraken-media-stack]]" --- # Arr Stack — Kraken @@ -16,6 +17,76 @@ related: ``` Prowlarr → Radarr + Sonarr → Transmission → Jellyfin + ↓ + router.py (cron 10min) + ↓ + symlinks → /media/{movies,cartoons,series,documentaries,...}/ +``` + +Два параллельных пути поступления контента: + +1. **Radarr/Sonarr** → качают в `/media/movies-radarr/` и `/media/series-sonarr/` +2. **Transmission (ручные торренты)** → `on-download-complete.sh` → `sync.py` → `/media/{movies,cartoons,...}/` + +### router.py — жанровая маршрутизация + +`router.py` читает NFO-файлы (которые Radarr/Sonarr создают при загрузке), определяет жанр и возрастной рейтинг, и создаёт symlink в нужную Jellyfin-библиотеку: + +| Источник | Условие | Цель | +|---|---|---| +| movies-radarr/ | Documentary | `/media/documentaries/` | +| movies-radarr/ | Animation + !R/18+ | `/media/cartoons/` | +| movies-radarr/ | всё остальное | `/media/movies/` | +| series-sonarr/ | Documentary | `/media/documentaries-series/` | +| series-sonarr/ | Animation + !TV-MA | `/media/cartoons-series/` | +| series-sonarr/ | всё остальное | `/media/series/` | + +**Расположение:** `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline/router.py` +**Запуск:** `python3 router.py --dry-run` (проверка) / `python3 router.py --apply` (исполнение) + +### media-router.sh — cron-скрипт для Telegram-уведомлений + +Обёртка над `router.py`, которая: +- запускает `router.py --apply` +- если `Nothing to do` — **SILENT**, ничего не шлёт +- если созданы symlink'и или ошибка — отправляет отчёт в Telegram Kraken + +**Расположение:** рядом с `router.py` — `media-router.sh` +**Cron (Kraken crontab):** каждые 10 минут +**Telegram:** kraken_htpc_bot → чат @mallex87 + +### sync.py — обработка ручных торрентов (Transmission) + +`sync.py` работает внутри Transmission-контейнера. При завершении загрузки: +1. Определяет название через TMDB API +2. Определяет жанр +3. Перемещает файл в `/media/{movies,cartoons,series,documentaries}/` +4. Обновляет `downloadDir` в Transmission через RPC + +**Расположение:** `/srv/.../docker/media-pipeline/sync.py` +**Триггер:** `on-download-complete.sh` (смонтирован в Transmission как `/config/on-download-complete.sh:ro`) + +## Transmission + +- **download-dir:** `/downloads` (без `complete`) +- **incomplete-dir:** `/downloads/incomplete` +- **Язык:** отключён auth для локальных +- **RPC:** `localhost:9091` + +При перемещении файлов для уже завершённых торрентов: +1. Переименовать файл/папку под кейс торрента (Linux ext4 case-sensitive) +2. Вызвать `torrent-set-location` с `move=false` +3. Запустить торрент на сидирование + +## Cron'ы на Kraken (crontab) + +``` +0 * * * * bash ~/scripts/sync-vault.sh # Obsidian sync +0 * * * * pgs-to-srt.sh /media/downloads # PGS→SRT новые +0 3 * * * pgs-to-srt.sh /media # PGS→SRT вся библиотека +0 1 * * * bash ~/scripts/watchlist-nightly.sh # watchlist nightly +0 9 * * 0 bash ~/scripts/watchlist-discover.sh # watchlist discover +*/10 * * * * bash .../media-pipeline/media-router.sh # media router (Telegram) ``` ## API Keys @@ -40,7 +111,26 @@ All services accessible at `kraken:`: | Transmission | 9091 | | Jellyfin | 8096 | +## Jellyfin библиотеки + +| Библиотека | Тип | Путь | +|---|---|---| +| Movies | movies | `/media/movies` | +| Series | tvshows | `/media/series` | +| Cartoons | movies | `/media/cartoons` | +| Cartoon Series | tvshows | `/media/cartoons-series` | +| Documentaries | movies | `/media/documentaries` | +| Documentary Series | tvshows | `/media/documentaries-series` | + +> `movies-radarr` и `series-sonarr` НЕ добавлены в Jellyfin — router.py создаёт symlink'и из них в перечисленные пути. + +## Известные проблемы + +- **17 фильмов в Radarr `hasFile=False`** — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки. +- **Prowlarr** — если долго не находит релизы, проверить статус индексеров (`/api/v1/health`). + ## Notes - See [[arr-stack-taiga]] for Taiga (secondary) arr stack - Media pipeline pitfalls: [[media-pipeline-pitfalls]] +- Синтез: [[concepts/kraken-media-stack]] diff --git a/wiki/tech/media-pipeline-pitfalls.md b/wiki/tech/media-pipeline-pitfalls.md index d5e3d3c0..ad788003 100644 --- a/wiki/tech/media-pipeline-pitfalls.md +++ b/wiki/tech/media-pipeline-pitfalls.md @@ -18,6 +18,11 @@ Never rename torrent source files or folders while a torrent is active. Transmission tracks files by path. Renaming breaks the association and causes re-download or stalled seeding. +Правильный порядок (когда файл уже лежит в нужном месте, но с другим кейсом): +1. Переименовать файл/папку на диске (Linux ext4 case-sensitive) +2. Вызвать `torrent-set-location` с новым путём + `move=false` +3. Запустить торрент на сидирование + ## torrent-set-location Updates downloadDir `torrent-set-location` in the Transmission RPC updates `downloadDir` in @@ -50,7 +55,29 @@ Solution: `sync.py` (Python3, ~190 lines) in the same container: - Reads `config.json` for sorting rules + credentials (same file as linker container) - Queries TMDB for genre routing - Creates hardlinks + calls Transmission RPC `torrent-set-location` -Location: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline/sync.py` +Location: `/srv/.../docker/media-pipeline/sync.py` + +## Transmission download-dir — без /complete + +download-dir: `/downloads` (не `/downloads/complete`). +incomplete-dir: `/downloads/incomplete` (enabled). + +Менять через остановку Transmission → правка `settings.json` → запуск. + +## media-router.sh — Telegram-уведомления + +Скрипт-обёртка над `router.py`. Запускается из crontab каждые 10 минут. +- При `Nothing to do` — SILENT +- При активности — отправляет отчёт в Telegram Kraken (kraken_htpc_bot) +- `BOT_TOKEN` и `CHAT_ID` хардкодом в скрипте + +## Удаление дубликатов из downloads/complete + +После перемещения файлов в `/media/{movies,cartoons,series,...}/`: +1. Проверить, что файлы в movies — **реальные** (-rwx), не symlink'и +2. Проверить что inode разные (это копии, не один файл) +3. Удалить из `downloads/complete/` +4. Обновить путь в Transmission ## General Rules diff --git a/work/briefs/inbox/2026-05-27.md b/work/briefs/inbox/2026-05-27.md index 9ddabaf4..a9dfee68 100644 --- a/work/briefs/inbox/2026-05-27.md +++ b/work/briefs/inbox/2026-05-27.md @@ -2,6 +2,26 @@ _Note: Today is a holiday for Alex (Alex M AFK May/27, Wed). DB SSH not reachable; working from local snapshot (generated 04:08 UTC, covers through SINCE). MS365 calendar check skipped (unavailable)._ +<<<<<<< Updated upstream ### Nothing new Inbox quiet — nothing new since last triage (10:01 AM). Most recent Asana activity in snapshot is from 2026-05-27T04:00 UTC (1 min before SINCE). All recent comments are from 2026-05-26. +======= +_Note: @mention DB query unavailable (no /etc/ddg access from Eagle). Snapshot coverage: up to 10:10 AM Almaty. All recent comments and task changes predate SINCE._ + +--- + +## Inbox Triage — 2026-05-27 13:02 (since 2026-05-27T11:31:17) + +Inbox quiet — nothing new. + +_No tasks modified since SINCE (confirmed via Asana MCP). No active meetings (MS365 check clean). Nothing qualifies per scope filter._ + +--- + +## Inbox Triage — 2026-05-27 13:32 (since 2026-05-27T13:01:48) + +Inbox quiet — nothing new. + +_Snapshot generated at 13:31 local (after SINCE 13:01). No task changes or comments found after SINCE. No active meetings (MS365 clean). Not in deep focus._ +>>>>>>> Stashed changes