--- title: Arr Stack — Kraken created: '2026-05-23' updated: '2026-09-04' 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 ## Pipeline ``` 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 | Service | API Key | |-------------|----------------------| | Radarr | `cbcb8ec3...` | | Sonarr | `15fbec32...` | | Prowlarr | `134ac38a...` | (Full keys truncated — retrieve from each service's settings page.) ## Ports (default Docker network) All services accessible at `kraken:`: | Service | Port | |--------------|------| | Radarr | 7878 | | Sonarr | 8989 | | Prowlarr | 9696 | | 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`). - **🔴 2026-09-04: 4K UHD Remux при Direct Play подтормаживает на ТВ (webOS).** Симптом у `Неистовый (Unhinged 2020)` — 60.9GB `...Remux.2160p.mkv` avg ~99 Мбит/с. После фикса eth0 Kraken → 1G (был 100M, см. [[kraken-network]]) торможение **сохранилось**. Подтверждено по логу Jellyfin `log_20260904.log`: сессия 10:18→10:28 «Jellyfin for WebOS 1.2.2», Stop at 400916ms (~6:40), **ни одной строки transcode → это Direct Play**, не CPU-рендер субтитров. - **🔴🔴 2026-09-04 (уточнение, важно): тормозит Direct Play даже лёгкого 4K → причина в клиенте webOS, НЕ в сети/диске.** Вживую при воспроизведении `Project Hail Mary (2026)` (`...2160p.iT.WEB-DL...mkv`, HEVC Main10 4K HDR10+, avg ~24.5-25.7 Мбит/с, 30.2GB, Direct Play) подёргивание **сохранилось**, хотя: транскода нет (0 ffmpeg, CPU Kraken load 0.1), сервер отдаёт всего ~21 Мбит/с, Wi-Fi ТВ чист (0 CRC / 0 retries за стрим, -53 dBm), все линки с запасом ×10+. **Значит низкоуровневая причина — программный декодер/буфер «Jellyfin for WebOS 1.2.2» при Direct Play 4K HEVC 10-bit HDR, не инфраструктура.** Вывод для стратегии качества: даже лёгкий 4K Direct Play не гарантирует плавности на этом ТВ-клиенте — вопрос не столько в remux, сколько в клиенте. Кандидаты фикса: настройки буфера/декодера клиента, DirectStream (ремукс), тянуть через HTPC/Kodi на HDMI, либо транскод аудио. **Решение НЕ принято — продолжить в след. сессии.** ## Radarr Quality Profiles на Kraken (проверено 2026-09-04) Via `http://kraken:7878/radarr/api/v3/qualityprofile` (X-Api-Key из config.xml; **UrlBase=`/radarr`**). Radarr v6.1.1.10360, Linuxserver image, net `docker_default`. | id | Профиль | Разрешённые качества | Cutoff | |----|---------|----------------------|--------| | 1 | **Any** | весь диапазон CAM..BR-DISK, вкл. все 2160p | Remux-1080p | | 2 | SD | до Bluray-576p | — | | 3 | HD-720p | до Bluray-720p | — | | 4 | HD-1080p | HDTV/Bluray/Remux-1080p | Bluray-1080p | | 5 | **Ultra-HD** | HDTV/Bluray/**Remux-2160p** (BR-DISK не allowed) | **Remux-2160p** | | 6 | HD-720p/1080p | 1080p и ниже | — | - **Корень «почему новые качаются в любой жир»:** `watchlist-sync` (который добавляет фильмы/сериалы из watchlist в Radarr/Sonarr) жёстко прописывает `"qualityProfileId": 1` (= профиль `Any`) в `arr.py`: - Реальный путь репо: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/watchlist-sync` (НЕ `~/Developer/watchlist-sync`, хотя симлинк `~/Developer/watchlist-sync` → `.../49e8.../watchlist-sync` есть; 49e8 — симлинк на 6194). - `watchlist_sync/arr.py` → `radarr_add()` (~стр 77) и `sonarr_add()` (~стр 112), обе `"qualityProfileId": 1`. Radarr POST `/api/v3/movie` c `addOptions.searchForMovie:true`; Sonarr POST `/api/v3/series`. - **Как изменить «качество для новых фильмов» глобально:** сменить зашитый `qualityProfileId` в `arr.py` на другой профиль (напр. id=5 Ultra-HD), ИЛИ создать профиль «2160p без Remux» и указать его. Это правка кода репо watchlist-sync на Кракене + профили в Radarr API. ⚠️ Алекс ещё НЕ утвердил направление (4K лёгкий vs 1080p, и нужно ли для сериалов). НЕ менять без явного ok. - ⚠️ **Решение по стратегии качества (пользователь прошлые строки уточнял) НЕ принято — продолжить в след. сессии.** Приоритет — разобраться, что делает webOS-клиент на Direct Play лёгкого 4K (см. «Известные проблемы»), т.к. если клиент виноват, смена профиля Radarr не решит подёргивание. ### Реальный состав жирного remux (пример Unhinged, ffprobe 2026-09-04) Важно для понимания «что даёт remux» перед выбором профиля. Файл `Неистовый.2020.UHD.Blu-Ray.Remux.2160p.mkv` = **60.9GB, 1:31:05, контейнер 89.17 Мбит/с средний**. FFprobe потоки: | idx | тип | кодек | каналы | язык / роль | |----|-----|-------|--------|------| | 0 | video | **HEVC Main10, 3840×2160, 24fps** | — | HDR10 (BT.2020, PQ smpte2084) | | 1 | audio | AC3 | 5.1(side) 384k | rus «Dub, iTunes» | | 2 | audio | **DTS-HD MA** | 7.1 | rus «Д. Есарев» | | 3 | audio | **TrueHD** | 7.1 | eng | | 4 | audio | AC3 | 5.1 640k | eng | | 5 | audio | DTS | stereo 320k | eng Commentary (реж. Деррик Борте) | | 6-8 | sub | SRT/SPU | — | rus / eng full / eng SDH | Вывод: размер 60GB раздувает НЕ видео (HDR10 HEVC-часть типичная), а **множество звуковых дорожек (lossless DTS-HD MA + TrueHD) + аудиокомментарий**. «Что даёт remux» на бытовом ТВ: видео-выигрыш против аккуратного 4K-рипа почти незаметен с дивана; бонус реализуется только при lossless-прокачке звука (AVR/eARC). Если ТВ играет через собственные динамики/стерео или делает audio-transcode — плюс remux теряется, а вес/сеть/лаг остаются. Это аргумент за профиль «2160p без Remux» для бытового просмотра на webOS-TB. ### Бенчмарк WEB-4K (замерено по библиотеке Kraken, 2026-09-04) «Поддерживаемое качество» для сравнения с жирным remux — это кодированные 2160p. Замер файлов с `WEB`+`2160` в имени в `/media`: - Полнометражки (2ч): `Project Hail Mary` 28.1GB, `The Drama` 19.2GB, `The Crow` 17.4GB, `They Will Kill You` 17.2GB, `Кот в сапогах` 19.9GB → **range 17–28GB, медиана ~19GB**. - 45-50 мин эпизоды док-сериалов (`prehistoric.planet` s01): ~7.2–7.7GB каждый. - Статсводка по всем 10 файлам: min 7.2 / median 12.5 / mean 13.9 / max 28.1 GB. Средний битрейт ~20–40 Мбит/с. - **Практичный floor benchmark: «нормальная» копия 4K для этого ТВ ≈ 17–28GB/фильм** (в 2.5–3× меньше remux). ⚠️ Однако см. «Известные проблемы»: даже такой лёгкий 4K Direct Play у webOS-клиента может подёргиваться — дело в клиенте, а не в размере файла. ## Notes - See [[arr-stack-taiga]] for Taiga (secondary) arr stack - Media pipeline pitfalls: [[media-pipeline-pitfalls]] - Синтез: [[concepts/kraken-media-stack]]