--- 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) ### Sync результаты (последний прогон) | Категория | Папок | NFO | Статус | |-----------|-------|-----|--------| | movies | 127 | 127 | ✅ 100% | | series | 45 | 238 (эпизоды) | ✅ хорошо | | cartoons | 126 | ~30 | ⚠️ советские не резолвятся | | documentaries | 35 | ~5 | ⚠️ | | **Итого** | **317 regions** | **222 resolved** | **70%** | ### Что работает - ✅ Docker образ `media-pipeline:kraken` задеплоен (ветка `kraken-agent`) - ✅ `sync` корректно вызывается (был баг: двойное `media-pipeline media-pipeline`) - ✅ Кеш API-ответов: теперь `/config/cache` (persistent), 30-дневный TTL - ✅ Фильмы: 127/127 NFO - ✅ Сериалы: хорошо (Black Mirror, Queens Gambit, Good Omens и т.д.) - ✅ Transmission download-complete hook установлен - ✅ `resolve-manual` работает (форс-резолв по TMDb/KP ID) ### Что не работает / в работе - ⚠️ **Советские мультики** — `bremenskie.muzykanty`, `budilnik`, `ёжик в тумане` и ~50 других не резолвятся автоматически. Legacy Go-код справлялся — нужно разобраться в чём разница - ⚠️ **Часть Disney/Pixar** в batch-режиме не проходят arbiter (Encanto, Lightyear, Inside Out) — одиночно через `resolve-manual` работают - 🔲 Jellyfin библиотеки — не настроены - 🔲 torrent-fix для 7 старых торрентов с путями `D:/Movies` - 🔲 Hermes cron на Кракене --- ## Исправленные баги ### Баг 1: Двойной вызов binary (КРИТИЧЕСКИЙ) **Проблема:** `docker run ... media-pipeline:kraken media-pipeline sync` — бинарь получал `media-pipeline` как первый аргумент = неизвестный subcommand → general help. Все прошлые dry-run не работали. **Фикс:** `ENTRYPOINT ["media-pipeline"]` → правильный вызов `docker run ... sync ...` ### Баг 2: TitleSimilarity — симметричный Jaccard **Проблема:** `encanto_2021_bdrip_by_dalemake` vs `Encanto`: `lengthRatio = 1/5 = 0.2` → confidence ≈ 0.05 → rejected. Noise-токены (bdrip, 1080p, год) убивали матч. **Фикс:** Asymmetric scoring — когда query длиннее candidate, переключаемся на candidate-coverage Jaccard (покрытие кандидата запросом). `lengthRatio = 1.0` когда query длиннее. **Коммит:** `2704ce3` ### Баг 3: ProviderSearchStrategy.maxCallsPerRun = 8 **Проблема:** 8 API-вызовов на провайдер → 192 из 200 items никогда не искались. **Фикс:** 8 → 500. Коммит `2704ce3` ### Баг 4: Series-гипотезы для одиночных файлов **Проблема:** `NumberedEpisodesHypothesisStrategy` и `NamedEpisodesHypothesisStrategy` генерировали series-гипотезы для одиночных `.avi`/`.mkv` без S/E маркеров → TMDb искал по `/search/tv` вместо `/search/movie`. **Фикс:** `videos.count < 2 && !hasAnyEpisodeMarkers → return nil`. Коммит `17c2ddc` ### Баг 5: HTTP кеш не персистился **Проблема:** `cacheDirectory = /usr/local/bin/cache` внутри контейнера. `docker run --rm` → кеш удалялся при каждом запуске → тысячи дублирующих API запросов. **Фикс:** Autodetect `/config` mount → `/config/cache` (persistent volume). Коммит `5a1053c` --- ## Следующий шаг: советские мультики **Задача:** понять почему `bremenskie.muzykanty`, `budilnik 1984`, `ёжик в тумане` и ~50 других советских мультиков не резолвятся, хотя легаси Go-код справлялся. **Гипотезы:** 1. Транслитерация → KP не ищет по Latin `bremenskie` → нужна Cyrillic варианты в query 2. NameTokenization не генерирует качественную обратную транслит для советских названий 3. KP API возвращает результаты, но TitleSimilarity не матчит (разные скрипты) 4. TMDb `dual` search по `bremenskie muzykanty` → нет результатов → нужен только KP **Что делать:** - Проверить что именно возвращает KP для `bremenskie muzykanty` - Проверить что variant'ы генерирует NameTokenization для этих файлов - Если проблема в transliteration accuracy — починить в TitleSimilarity (cross-script fuzzy match) --- ## Конфиг на Кракене ``` /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) | --- ## Журнал - **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. Кеш починен.