2026-05-14 media-toolbox-kraken: план обновлён — unresolved 24→8, решения по документалкам, баги 1-6

This commit is contained in:
Alexey Martemyanov
2026-05-14 17:40:48 +06:00
parent 491ead0f8e
commit 0a6fe19857
3 changed files with 276 additions and 110 deletions
+66 -44
View File
@@ -42,74 +42,94 @@ media-pipeline (~/Developer/media_files_db, ветка kraken-agent)
---
## Текущий статус (2026-05-14)
## Текущий статус (2026-05-14, сессия 5)
### Sync результаты (последний прогон)
### Sync результаты
| Категория | Папок | NFO | Статус |
|-----------|-------|-----|--------|
| movies | 127 | 127 | ✅ 100% |
| series | 45 | 238 (эпизоды) | ✅ хорошо |
| cartoons | 126 | ~30 | ⚠️ советские не резолвятся |
| documentaries | 35 | ~5 | ⚠️ |
| **Итого** | **317 regions** | **222 resolved** | **70%** |
| series | 45 | ✅ | ✅ |
| cartoons | 126 | ~119 | ✅ почти всё (8 через resolve-manual) |
| documentaries | 35 | ~27 | ⚠️ 8 остались (см. ниже) |
### Что работает
- ✅ 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 и т.д.)
- ✅ Сериалы: все resolved (Black Mirror, Ну погоди!, и др. — через resolve-manual)
- ✅ Кеш API-ответов: `/config/cache`, 30-дневный TTL
- ✅ Transmission download-complete hook установлен
-`resolve-manual` работает (форс-резолв по TMDb/KP ID)
-`resolve-manual` работает для movie/series/single-file
### Что не работает / в работе
- ⚠️ **Советские мультики**`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. 🔴 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` как первый аргумент = неизвестный subcommand → general help. Все прошлые dry-run не работали.
**Фикс:** `ENTRYPOINT ["media-pipeline"]` → правильный вызов `docker run ... sync ...`
`docker run ... media-pipeline:kraken media-pipeline sync` бинарь получал `media-pipeline` как аргумент.
**Фикс:** `ENTRYPOINT ["media-pipeline"]`
### Баг 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`
`encanto_2021_bdrip_by_dalemake` vs `Encanto`: lengthRatio=0.2 → rejected.
**Фикс:** Asymmetric scoring — candidate-coverage Jaccard когда query длиннее. Коммит `2704ce3`
### Баг 3: ProviderSearchStrategy.maxCallsPerRun = 8
**Проблема:** 8 API-вызовов на провайдер → 192 из 200 items никогда не искались.
### Баг 3: maxCallsPerRun = 8
8 API-вызовов → 192/200 items никогда не искались.
**Фикс:** 8 → 500. Коммит `2704ce3`
### Баг 4: Series-гипотезы для одиночных файлов
**Проблема:** `NumberedEpisodesHypothesisStrategy` и `NamedEpisodesHypothesisStrategy` генерировали series-гипотезы для одиночных `.avi`/`.mkv` без S/E маркеров → TMDb искал по `/search/tv` вместо `/search/movie`.
Одиночные `.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` → кеш удалялся при каждом запуске → тысячи дублирующих API запросов.
**Фикс:** Autodetect `/config` mount → `/config/cache` (persistent volume). Коммит `5a1053c`
`cacheDirectory = /usr/local/bin/cache` — удалялся при `docker run --rm`.
**Фикс:** Autodetect `/config` mount → `/config/cache`. Коммит `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)
### Баг 6: resolve-manual NFO path для single-файлов
`resolve-manual` писал NFO внутрь файла вместо рядом.
**Фикс:** Detect `isDirectory`, для файлов → `deletingPathExtension().appendingPathExtension("nfo")`. Коммит `c0fdc59`
---
@@ -119,7 +139,7 @@ media-pipeline (~/Developer/media_files_db, ветка kraken-agent)
/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 дней (после фикса)
├── cache/ ← HTTP кеш 30 дней
└── on-download-complete.sh
```
@@ -152,6 +172,7 @@ docker run --rm ... media-pipeline:kraken \
| 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) |
---
@@ -160,4 +181,5 @@ docker run --rm ... media-pipeline:kraken \
- **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. Кеш починен.
- **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.