Единый источник полей отображаемого имени и один рендер полного ярлыка на всех путях (старт и «Обновить имя»/авто-перелив). Раньше старт давал полный «Название (режиссёр, год). Сезон N» но выбрасывал структуру, а перелив по распознаванию — усечённый «Title (Year)». - Слоистое разрешение скаляров имени: override → recognition(+match) → новый базовый слой «контекст» (download.parsed_context, JSON naming.Fields). - naming: публичные Fields/Label/Derive, вынесен единый рендер; удалён FormatTitleYear. Сводка сезонов вынесена в recognize.SeasonSummary. - Режиссёр из метабазы (решение A2): TMDB/TVDB credits через опциональный metadata.DirectorProvider; авто-матч кладёт в plan.Director, ручной выбор кандидата тянет credits и пиннит ovrDirector. Метабаза бьёт контекст. - refreshDisplayNameLocked строит полный ярлык из эффективных полей; инфо-панель ревью показывает загруженного режиссёра. - Миграция 0011_parsed_context + ER-схема. Всё косметика: на пути/раскладку не влияет, приём/вывод имени не валятся (best-effort). Закрывает беклог-задачу «Кнопка „Обновить имя“: полный формат ярлыка». OpenSpec: archive/2026-07-11-field-resolution-display-name (ingest, recognition, metadata-match, review). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
60 lines
4.6 KiB
Markdown
60 lines
4.6 KiB
Markdown
# metadata-match Specification
|
|
|
|
## MODIFIED Requirements
|
|
|
|
### Requirement: Подтверждение матча и каноническое имя
|
|
|
|
При единичном сильном матче система SHALL брать из записи базы официальный
|
|
`provider` (`tmdb`|`tvdb`|`tvmaze`) и `provider_id`, а также каноническое название
|
|
и год, и подменять ими соответствующие поля плана (для сериала — с учётом внешнего
|
|
тега TVDB/IMDb из `externals`, идущего в имя папки). Матч SHALL считаться
|
|
подтверждённым только при ровно одном сильном кандидате; при нуле или нескольких
|
|
кандидатах подтверждённого матча быть SHALL NOT (авто-раскладка не разрешается,
|
|
кандидаты уходят в review). Работа с базами опциональна: при выключенных базах
|
|
сверка не выполняется и подтверждённого матча нет.
|
|
|
|
При подтверждённом матче система SHALL дополнительно попытаться получить из базы
|
|
**режиссёра** (TMDB/TVDB credits) и вложить его в план (`director`) как
|
|
недоверенное косметическое значение для вывода отображаемого имени. Тот же способ
|
|
выборки режиссёра по `provider:id` SHALL быть доступен при закреплении вручную
|
|
выбранного в ревью кандидата (см. `review`), т.к. основной путь подтверждения
|
|
матча — ручной выбор, а не авто. Выборка режиссёра SHALL быть best-effort: её
|
|
недоступность, отсутствие в базе или провайдер без режиссёра (напр. TVMaze) SHALL
|
|
NOT проваливать распознавание/матч/выбор — `director` остаётся пустым, а имя
|
|
выводится без режиссёра или из более низкого слоя (сохранённый контекст). Режиссёр
|
|
из метабазы SHALL иметь приоритет над режиссёром из контекста (более проверенный
|
|
источник).
|
|
|
|
Режиссёр — недоверенное человекочитаемое поле: он SHALL NOT участвовать в
|
|
структурной валидации/гейте авто-раскладки, а его очистка (управляющие символы,
|
|
пробелы, лимит длины) применяется при рендере отображаемого имени, а не в
|
|
plan-санитайзинге.
|
|
|
|
#### Scenario: Единичный матч даёт id и каноническое имя
|
|
|
|
- **GIVEN** поиск вернул ровно одного сильного кандидата TMDB для фильма
|
|
- **WHEN** матч подтверждается
|
|
- **THEN** план получает `provider`=`tmdb`, `provider_id`, каноническое название и год
|
|
|
|
#### Scenario: Матч подтягивает режиссёра
|
|
|
|
- **GIVEN** подтверждённый единичный матч TMDB для фильма, у которого в credits
|
|
указан режиссёр
|
|
- **WHEN** матч подтверждается
|
|
- **THEN** в план вкладывается `director` из credits
|
|
- **AND** отображаемое имя может использовать этого режиссёра
|
|
|
|
#### Scenario: Режиссёр недоступен — матч не ломается
|
|
|
|
- **GIVEN** подтверждённый матч, для которого выборка режиссёра недоступна или
|
|
провайдер режиссёра не отдаёт
|
|
- **WHEN** матч подтверждается
|
|
- **THEN** `director` остаётся пустым
|
|
- **AND** матч подтверждён, распознавание не проваливается
|
|
|
|
#### Scenario: Несколько кандидатов — матч не подтверждён
|
|
|
|
- **GIVEN** поиск вернул более одного подходящего кандидата
|
|
- **WHEN** оценивается матч
|
|
- **THEN** подтверждённого матча нет, кандидаты собираются для выбора в review
|