# 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