186 lines
9.4 KiB
Markdown
186 lines
9.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, сессия 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.
|