--- created: '2026-05-13' updated: '2026-05-14' status: in-progress tags: - kraken - media - jellyfin - transmission - swift - project --- # Media Toolbox на Кракене > Цель: полноценный медиасервер на Кракене (RPi 5) — перенос библиотеки с HTPC, автосортировка через media-pipeline (Swift), Jellyfin, торренты. --- ## Архитектура (целевая) ``` HTPC (Bazzite 192.168.1.86) └── rsync → Kraken HDD /srv/.../media/ Kraken (RPi 5, 192.168.1.14) ├── /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/media/ │ ├── movies/ ← фильмы (127 папок) │ ├── cartoons/ ← мультфильмы (126 папок) │ ├── series/ ← сериалы (45 папок) │ ├── documentaries/ ← документальные (35 папок) │ └── downloads/complete ← Transmission ├── Docker: Transmission (128 торрентов, порт 9091) ├── Jellyfin native (порт 8096) └── Docker: media-pipeline:kraken (Swift CLI, arm64) media-pipeline (~/Developer/media_files_db, ветка kraken-agent) ├── scan → resolve → apply (sync) ├── NFO-файлы для Jellyfin/Kodi ├── Transmission RPC для обновления путей └── unresolved.json — реестр нераспознанных ``` --- ## Текущий статус (2026-05-14, сессия 5) ### Sync результаты | Категория | Папок | NFO | Статус | |-----------|-------|-----|--------| | movies | 127 | 127 | ✅ 100% | | series | 45 | ✅ | ✅ | | cartoons | 126 | ~119 | ✅ почти всё (8 через resolve-manual) | | documentaries | 35 | ~27 | ⚠️ 8 остались (см. ниже) | ### Что работает - ✅ Docker образ `media-pipeline:kraken` задеплоен (ветка `kraken-agent`) - ✅ Фильмы: 127/127 NFO - ✅ Сериалы: все resolved (Black Mirror, Ну погоди!, и др. — через resolve-manual) - ✅ Кеш API-ответов: `/config/cache`, 30-дневный TTL - ✅ Transmission download-complete hook установлен - ✅ `resolve-manual` работает для movie/series/single-file ### Открытые задачи #### 1. 🔴 Web search path для документалок и специфичного контента **Принятое решение:** ничто из библиотеки не должно оставаться в unresolved. Если TMDb/KP не находят — должен срабатывать web search (IMDb HTML scrape, Tier 4). Сейчас `webSearch.enabled=true` в config.json, но 8 документалок всё равно в unresolved. **8 оставшихся:** - `/media/cartoons/25е - первый день` - `/media/documentaries/bbc. the real jungle book bear 2012` - `/media/documentaries/bbc. секреты собак` - `/media/documentaries/penguin meet the family (2020)` - `/media/documentaries/бегемоты - жизнь в воде` - `/media/documentaries/гиганты моря 2011` - `/media/documentaries/таинственная жизнь собак (hdtvrip 720p, 2013)` - `/media/documentaries/тайная жизнь собак (2016г)` **Что нужно сделать:** - Запустить sync с `--debug` или отследить почему web search не помогает для этих item'ов - IMDbSearchProvider (Tier 4) должен находить BBC документалки по названию - Если IMDb тоже не находит — включить AIAgent (Tier 5) с OpenAI key, или добавить fallback: если все тиры вернули 0 кандидатов и папка содержит хотя бы один видеофайл → запускать web search по Google/IMDb с более агрессивными вариантами запроса - Цель: `unresolved.json` после sync = пустой #### 2. 🟡 torrent-fix для 7 старых торрентов с путями `D:/Movies` - Transmission хранит old paths `D:/Movies/...` — нужен `torrent-fix` subcommand #### 3. 🟡 Jellyfin библиотеки - Настроить библиотеки в Jellyfin (http://192.168.1.14:8096) - NFO файлы готовы, Jellyfin должен их подхватить #### 4. 🟢 Hermes cron на Кракене - Периодический запуск sync (новые загрузки через Transmission) --- ## Принятые решения (архитектурные) | Решение | Описание | |---------|----------| | **Unresolved = 0** | Цель — ничто из библиотеки не должно оставаться в unresolved после sync. Web search (Tier 4) и AI agent (Tier 5) — последние резервы перед тем как считать item нераспознанным | | **Web search enabled** | `providers.webSearch.enabled=true` в config.json. IMDb scrape как Tier 4 для всего, что не нашли TMDb/KP | | **Документалки приоритет KP** | BBC/Discovery документалки плохо индексированы в TMDb. KP часто знает их под русскими названиями. Стратегия: сначала KP с русским названием из папки, потом IMDb | | **resolve-manual** | Только для экстренных случаев, не как регулярный процесс | | **Single-file NFO** | Для `.mkv`/`.m4v` файлов NFO создаётся рядом (`film.nfo`), не внутри | --- ## Исправленные баги ### Баг 1: Двойной вызов binary (КРИТИЧЕСКИЙ) `docker run ... media-pipeline:kraken media-pipeline sync` → бинарь получал `media-pipeline` как аргумент. **Фикс:** `ENTRYPOINT ["media-pipeline"]` ### Баг 2: TitleSimilarity — симметричный Jaccard `encanto_2021_bdrip_by_dalemake` vs `Encanto`: lengthRatio=0.2 → rejected. **Фикс:** Asymmetric scoring — candidate-coverage Jaccard когда query длиннее. Коммит `2704ce3` ### Баг 3: maxCallsPerRun = 8 8 API-вызовов → 192/200 items никогда не искались. **Фикс:** 8 → 500. Коммит `2704ce3` ### Баг 4: Series-гипотезы для одиночных файлов Одиночные `.avi`/`.mkv` без S/E маркеров получали series-гипотезу → TMDb искал по `/search/tv`. **Фикс:** `videos.count < 2 && !hasAnyEpisodeMarkers → return nil`. Коммит `17c2ddc` ### Баг 5: HTTP кеш не персистился `cacheDirectory = /usr/local/bin/cache` — удалялся при `docker run --rm`. **Фикс:** Autodetect `/config` mount → `/config/cache`. Коммит `5a1053c` ### Баг 6: resolve-manual NFO path для single-файлов `resolve-manual` писал NFO внутрь файла вместо рядом. **Фикс:** Detect `isDirectory`, для файлов → `deletingPathExtension().appendingPathExtension("nfo")`. Коммит `c0fdc59` --- ## Конфиг на Кракене ``` /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline/ ├── config.json ← TMDb/KP ключи, Transmission RPC, directories ├── unresolved.json ← реестр нераспознанных (создаётся автоматически) ├── cache/ ← HTTP кеш 30 дней └── on-download-complete.sh ``` **Запуск sync:** ```bash docker run --rm \ -v /srv/.../media:/media \ -v /srv/.../docker/media-pipeline:/config \ media-pipeline:kraken \ sync --config /config/config.json ``` **Force-resolve одного item:** ```bash docker run --rm ... media-pipeline:kraken \ resolve-manual --config /config/config.json \ --media-path '/media/cartoons/bremenskie.muzykanty' \ --tmdb 14327 ``` --- ## Технические детали | | | |--|--| | HTPC | `bazzite@192.168.1.86`, Data: `/run/media/bazzite/Data/`, WoL: `B0:6E:BF:60:6D:64` | | Кракен | `kraken@192.168.1.14`, HDD: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/` | | Jellyfin | http://192.168.1.14:8096 | | Transmission | http://192.168.1.14:9091 | | Исходники | `~/Developer/media_files_db/`, ветка `kraken-agent` | | Docker образ | `media-pipeline:kraken` (arm64, Colima 24GB) | | kraken-ssh | `ssh kraken-ssh` → 10.99.1.2:22 через WireGuard (обновлено 2026-05-14) | --- ## Журнал - **2026-05-13 сессия 1:** HTPC разбужен, rsync запущен (~1.3TB), торрент-база импортирована (128 торрентов) - **2026-05-13 сессия 2:** Docker build arm64, deploy на Кракен, first sync - **2026-05-13 сессия 3:** `kraken-agent` ветка: UnresolvedStore, resolve-manual, agent, torrent-fix subcommands - **2026-05-14 сессия 4:** 5 системных багов исправлены. Sync: 222/317 resolved (70%). - **2026-05-14 сессия 5:** resolve-manual для 13 items (movies/cartoons/series/documentaries). unresolved: 24 → 8. Исправлен баг NFO path для single-файлов. kraken-ssh переключён на WireGuard.