2026-05-16 media-toolbox: баг 12, exhaustive test plan, актуальный unresolved (6 шт)

This commit is contained in:
Alexey Martemyanov
2026-05-16 11:26:45 +06:00
parent dcb41ce001
commit 2470024950
+57 -23
View File
@@ -1,6 +1,6 @@
---
created: '2026-05-13'
updated: '2026-05-14'
updated: '2026-05-16'
status: in-progress
tags:
- kraken
@@ -176,6 +176,16 @@ media-pipeline (~/Developer/media_files_db, ветка kraken-agent)
`NameTokenization` генерировал `transliteratedToLatin` variant для кириллических имён → `Миграция``Migratsiya` → TMDb/KP не знают транслит, 0 результатов, только занимают cache-слоты. Оригинальный Go-sync делал только Latin→Cyrillic.
**Фикс:** Убран `transliteratedToLatin` из query variants в `NameTokenization.swift`. Коммит `10d64da`.
### Баг 12: TitleParser `_year_` — `\b` не срабатывает на underscore-границах
**Проблема:** `bezumnyj_maks_3_pod_kupolom_groma_1985_[torrents.ru]` — год `1985` окружён `_`, а `_` является `\w` в Swift regex. Поэтому `\b1985\b` не срабатывает → `year=nil`, `1985` остаётся в title → TMDb запрос содержит `1985` в строке вместо `year=` параметра → 0 результатов.
**Следствие:** заголовок `безумный макс 3 под куполом грома 1985` → TokenParser видит `1985` как токен → вариант обрезается по digit-граничному паттерну → появляется мусорный вариант `безумный мак` (truncated).
**Фикс:** в `TitleParser.cleanupTitleAndYear` заменён `\b(\d{4})\b` на `(?<![0-9])((?:19|20)\d\d)(?![0-9])` — игнорирует `_` как boundary, проверяет только цифровые границы.
**Тест:** `NameTokenizationTests.yearInUnderscores` + `titleParserYearInUnderscores` — оба GREEN.
**Коммит:** `61be066` (заодно с NFO sidecar fix, фактически в коде с TitleParser.swift line 39).
### Баг 6: resolve-manual NFO path для single-файлов
`resolve-manual` писал NFO внутрь файла вместо рядом.
**Фикс:** Detect `isDirectory`, для файлов → `deletingPathExtension().appendingPathExtension("nfo")`. Коммит `c0fdc59`
@@ -328,7 +338,8 @@ docker run --rm \
- **2026-05-15 сессия 7:** Торренты: 467 скопированы с HTPC, 323 добавлены в Transmission (294 итого после удаления 50 игр/нон-медиа). rsync: movies + мультфильмы + BBC документалки. Фиксы в коде: (1) best-effort collapse при исчерпании tierов, (2) дедупликация dir+file регионов в RegionPartitioner, (3) strip .aka./full.screen из TitleParser, (4) scanner пропускает canonical dirs по маркеру `.media-pipeline-canonical`, (5) Roman numerals в транслитерации (Ампир V). Финал: 19 unresolved.
- **2026-05-16 сессия 8:** Обнаружен корневой баг: KP API переехал `api.kinopoisk.dev``api.poiskkino.dev` (301 redirect, Swift теряет X-API-KEY). Исправлен URL. Удалены 359 невалидных KP-кеш записей. Добавлен leet-speak decode (`4``ch`: ni4ego→nichego, muzh4iny→muzhchiny). Починен кеш: KP пустые `docs:[]` больше не кешируются (были причиной повторных промахов после rate-limit/redirect). **Текущий unresolved: 22. Завтра KP лимит сбросится → ожидаем ≤5.**
- **2026-05-16 сессия 9:** Добавлен жанровый роутинг (cartoons/documentaries — только по genres из провайдера, не по source path). Фикс `nfoMeta priority` (provider genres > local empty NFO). Фикс парсинга года `2023г` (русский суффикс). TMDb genres передаются из config. **Убран Cyr→Lat query variant** (не соответствует оригинальному Go-sync, TMDb не ищет по транслиту). Порядок провайдеров подтверждён: TMDb → KP → IMDb (short-circuit после каждого). KP — настоящий fallback (40 запросов vs 8428 TMDb). Текущий unresolved: 30 (ждём сброса KP rate limit).
- **2026-05-16 сессия 1011 (продолжение):** Серия кодовых фиксов + NFO-файлы. **278 applied, 3 skipped (98.9%).** Три оставшихся — genuinely absent в TMDb/KP (см. ниже).
- **2026-05-16 сессия 1011 (продолжение):** Серия кодовых фиксов. **278 applied, 3 skipped (98.9%).** Созданы ручные NFO для 11 тайтлов (нарушение принципа — удалены в сессии 12).
- **2026-05-16 сессия 12:** Удалены 15 ручных NFO. Подтверждён и задокументирован Баг 12 (`_1985_` year extraction). TitleParser регекс исправлен на `(?<![0-9])…(?![0-9])`. Тесты `yearInUnderscores` + `titleParserYearInUnderscores` — GREEN. Текущий unresolved на Кракене: **6** (2 standalone-дубля + папка bezumnyj + 3 BBC/доки genuinely absent). **Следующий шаг:** exhaustive тесты для всех проблемных тайтлов → deploy → agentic flow для оставшихся.
### Фиксы сессий 10–11 (код)
-**double-counting fix**`HypothesisArbiter`: `penalizedZeroProviders` в `HypothesisFact`, только newly-zero провайдеры пенализируются за проход. Серебряные коньки resolved.
@@ -337,26 +348,49 @@ docker run --rm \
-**NFO reverse-prefix match**`HypothesisGenerator`: sidecar `Generation.P.nfo` теперь матчится к `Generation.P.BDRip-AVC.mkv` через `stemPrefix` проверку.
-**FileScanner sibling sidecar** — для file-region (не директория) сканируются сиблинги в parent dir → NFO рядом с mkv подхватывается. Stiratel resolved.
### NFO-файлы созданы вручную (эта сессия)
| Файл | TMDb ID | Название |
|------|---------|----------|
| `budil'nik 1984/budil'nik 1984.nfo` | 460558 | Будильник (1984) |
| `novogodn'aya_pesenka.../...nfo` | 144593 | Новогодняя песенка Деда Мороза (1982) |
| `таинственная жизнь собак.../...nfo` | 290570 | The Secret Life of Dogs (2013) |
| `шпион в снегах 2018/...nfo` | 715926 | Spy in the Snow (2018) |
| `супер белки (2018)/...nfo` | 921088 | The Super Squirrels (2018) |
| `penguin meet the family (2020)/...nfo` | 781278 | Penguins: Meet the Family (2020) |
| `dolina.ekho.2025.atvp.../...nfo` | 1097311 | Echo Valley (2025) |
| `Stiratel.1996.nfo` | 9268 | Eraser (1996) |
| `The.Frozen.Kingdom.../...nfo` | 783095 | Le Royaume du léopard des neiges (2020) |
| `bezumnyj_maks_3.../...nfo` | 9355 | Mad Max Beyond Thunderdome (1985) |
| `Generation.P.nfo` | 63375 | Generation П (2011) |
### 6 оставшихся unresolved (на Кракене, актуально)
### 3 оставшихся — genuinely absent
| Файл | Причина |
|------|---------|
| `bbc. the real jungle book bear 2012` | Нет в TMDb и KP |
| `bbc. секреты собак` | Нет в TMDb и KP |
| `бегемоты - жизнь в воде` | Нет в TMDb и KP |
**Группа A — standalone-дубли (2 шт.):**
Папки с тем же контентом уже resolved. Standalone-файлы pipeline не резолвит потому что дубль.
- `/media/movies/Bezumnyj_Maks_3_Pod_Kupolom_Groma_1985_[torrents.ru].mkv`
- `/media/cartoons/Nehochuha.XVid.DVDRip.avi`
Эти три документалки можно считать финальным пределом автоматического резолва.
**Группа B — genuinely absent в TMDb и KP (3 шт.):**
- `/media/documentaries/bbc. the real jungle book bear 2012`
- `/media/documentaries/bbc. секреты собак`
- `/media/documentaries/бегемоты - жизнь в воде`
**Группа C — папка (дубль resolved-папки):**
- `/media/movies/bezumnyj_maks_3_pod_kupolom_groma_1985_[torrents.ru]`
Группы A и C — устранить через дедупликацию scanner'а (пропускать standalone если есть resolved canonical папка с тем же контентом).
Группа B — Tier 5 (agentic flow) или manual resolve как последний resort.
### Следующий шаг: exhaustive tests → deploy → agentic flow
**Задача:** написать exhaustive тесты валидирующие каждый шаг парсинга для **всех** проблемных тайтлов — как незарезолвленных, так и тех, где создавались ручные NFO. Никаких ручных NFO не создавать — тул должен всё находить автоматически.
**Тайтлы для exhaustive тестов:**
| Filename | Ожидаемый title | Ожидаемый year | Проблема/баг |
|----------|----------------|----------------|-------------|
| `bezumnyj_maks_3_pod_kupolom_groma_1985_[torrents.ru]` | `bezumnyj maks 3 pod kupolom groma` | 1985 | Баг 12: `_year_` |
| `Nehochuha.XVid.DVDRip.avi` | `nehochuha` | nil | — |
| `budil'nik 1984` | `budilnik` | 1984 | апостроф soft-sign |
| `novogodn'aya_pesenka_deda_moroza_1982` | `novogodnyaya pesenka deda moroza` | 1982 | апостроф + год в underscore |
| `таинственная жизнь собак (HDTVRip 720p, 2013)` | `таинственная жизнь собак` | 2013 | год в скобках со стороссей |
| `шпион в снегах 2018` | `шпион в снегах` | 2018 | год в конце |
| `супер белки (2018)` | `супер белки` | 2018 | год в скобках |
| `penguin meet the family (2020)` | `penguin meet the family` | 2020 | год в скобках |
| `dolina.ekho.2025.atvp.web-dlrip.avc` | `dolina ekho` | 2025 | качество-маркеры |
| `Stiratel.1996` | `stiratel` | 1996 | год через точку |
| `The.Frozen.Kingdom.of.the.Snow.Leopard.(2020)` | `the frozen kingdom of the snow leopard` | 2020 | точки как разделители |
| `Generation.P.BDRip-AVC` | `generation p` | nil | буква как часть названия |
| `Ni4ego_horoshego_v_otele_El_Royal_2018` | `nichego horoshego v otele el royal` | 2018 | leet-speak + год |
| `O_4em_govoryat_muzh4iny_2010` | `o chem govoryat muzhchiny` | 2010 | leet-speak |
| `Serebryanye_konki_2020` | `serebryanye konki` | 2020 | год в underscore |
| `bbc. the real jungle book bear 2012` | `the real jungle book bear` | 2012 | BBC prefix + год |
| `bbc. секреты собак` | `секреты собак` | nil | BBC prefix кириллица |
| `Миграция. 2023г.mkv` | `миграция` | 2023 | Баг 10: кирилл. суффикс `г` |
| `рики тики тави 1965` | `рики тики тави` | 1965 | — |
| `25е - первый день` | `первый день` | nil | числовой префикс |