[2026-05-27] arr-stack kraken media pipeline expansion, transmission pitfalls update, daily brief inbox triage

This commit is contained in:
Alexey Martemyanov
2026-05-27 14:02:31 +06:00
parent bc0f79f24f
commit 37f9fb584b
3 changed files with 139 additions and 2 deletions
+91 -1
View File
@@ -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:<port>`:
| 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]]
+28 -1
View File
@@ -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
+20
View File
@@ -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