Поиск по нескольким названиям при сверке с базой (recognition)

Сверка с метабазой промахивалась на иностранных фильмах с русским
релиз-именем (кейс «Тёмный рыцарь»): поиск шёл по одной строке
provider_hint||title и игнорировал original_title, а базы индексированы
прежде всего по оригинальным названиям.

- matchMetadata ищет по ключам original_title → title → provider_hint с
  ранним стопом на первом единичном сильном матче; пустые и
  нормализованно-дублирующие ключи пропускаются, кандидаты для review
  копятся из всех заходов.
- Промпт требует всегда заполнять title и original_title (дублировать при
  отсутствии оригинала / российском контенте; при неуверенности дублировать,
  не выдумывать). Разбор остаётся мягким к пустому original_title.
- TMDB-поиск передаёт language (по умолчанию ru-RU, настраивается
  [metadata.tmdb].language); original_title не зависит от локали.
- Нормализация названий сводит ё→е.

Инварианты не ослаблены: авто только при подтверждённом единичном матче +
структурной валидации + согласованности сигналов.

Capability recognition впервые перенесена в OpenSpec; change архивирован.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
av
2026-06-29 12:16:47 +03:00
co-authored by Claude Opus 4.8
parent cc7e51b3a4
commit 4fc8c41b3a
15 changed files with 611 additions and 58 deletions
+17 -1
View File
@@ -38,6 +38,20 @@
названию+году, берём официальный id и каноническое имя, собираем
кандидатов. TVMaze — без ключа, только сериалы; внешний id
(TVDB/IMDb) из `externals` идёт в имя папки.
- **Поиск по нескольким названиям** в порядке убывания силы ключа:
`original_title` → локализованное `title``provider_hint`. Базы
индексированы прежде всего по оригинальным названиям, поэтому
оригинал — первым; останавливаемся, как только очередной ключ дал
единичный сильный матч. Пустые и нормализованно-дублирующие ключи
пропускаем (русский фильм, где оригинал = локализованное, дёргает
базу один раз). Кандидатов для review копим из всех заходов.
- **Локаль TMDB:** запрос передаёт `language` (по умолчанию `ru-RU`,
настраивается `[metadata.tmdb].language`). Влияет только на
локализованный `Title`/`Name`; `original_title`/`original_name`
остаётся на языке оригинала, поэтому оригинальная сторона сравнения
не страдает, а русская — сходится.
- **Нормализация названий** при сравнении сводит `ё``е` («Тёмный» и
«Темный» — одно название).
4. **Оценка уверенности** и решение: авто или review.
## Структура ответа LLM (предварительная)
@@ -45,7 +59,9 @@
```
type movie | series
title каноническое название
original_title оригинальное название (если есть)
original_title оригинальное (обычно англ.) название — заполняется всегда:
нет отдельного / российский контент → дублирует title;
при неуверенности дублируем, а не выдумываем
year год
provider_hint строка для поиска в базе (НЕ итоговый id)
files[] { src, role: main|episode|subtitle|extra|sample|ignore,