Files
obsidian-vault/family/projects/media-toolbox-kraken.md
T

8.4 KiB

created, updated, status, tags
created updated status tags
2026-05-13 2026-05-14 in-progress
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:

docker run --rm \
  -v /srv/.../media:/media \
  -v /srv/.../docker/media-pipeline:/config \
  media-pipeline:kraken \
  sync --config /config/config.json

Force-resolve одного item:

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. Кеш починен.