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

164 lines
8.4 KiB
Markdown

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