10 KiB
created, updated, status, tags
| created | updated | status | tags | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 2026-05-13 | 2026-05-14 | in-progress |
|
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-fixsubcommand
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
Баг 7: Tier 4 (web search) не запускался для контента не в TMDb/KP
Проблема: MediaPlanner гейтил Tier 4 на hasLiveUnresolved() — но когда TMDb/KP возвращают 0 кандидатов, арбитр фаерит provider-not-found, который прунит все гипотезы. После этого hasLiveUnresolved=false → Tier 4 никогда не запускался.
Фикс:
MediaPlanner: Tier 4/5 теперь гейтятся на!hasWinner(нет.winningгипотезы), а неhasLiveUnresolvedProviderSearchStrategy: добавлен флагincludePrunedHypotheses— когдаtrue, поиск идёт и по.prunedветкамиWebSearchStrategy.webSearchDefaults:includePrunedHypotheses=trueКоммит:115f757
Баг 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:
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) |
| 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.