164 lines
8.4 KiB
Markdown
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. Кеш починен.
|