2026-05-14 media-toolbox-kraken: план обновлён — unresolved 24→8, решения по документалкам, баги 1-6
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user