## ADDED Requirements ### Requirement: Кандидат несёт URL для внешней проверки Каждый кандидат внешней базы метаданных (`metadata.Candidate`) SHALL нести поле `URL` — ссылку на страницу элемента (фильма/сериала) на сайте провайдера. URL SHALL формироваться клиентом провайдера при поиске (`Search`) и сохраняться в таблице `metadata_candidate`. На странице ревью URL SHALL отображаться кликабельной ссылкой, открывающейся в новой вкладке браузера. Формат URL для каждого провайдера: - **TMDB**: `https://www.themoviedb.org/movie/{id}` (фильм) или `https://www.themoviedb.org/tv/{id}` (сериал) — тип контента известен из запроса `Query.Type` - **TVDB**: `https://www.thetvdb.com/dereferrer/series/{id}` - **TVMaze**: `https://www.tvmaze.com/shows/{id}` — URL SHALL использовать нативный id TVMaze, а не внешний тег (TVDB/IMDb), чтобы ссылка вела на TVMaze-страницу #### Scenario: Кандидат TMDB с корректной ссылкой - **GIVEN** TMDB найден кандидат-фильм с id `603` («Матрица») - **WHEN** клиент TMDB формирует Candidate - **THEN** `URL` = `https://www.themoviedb.org/movie/603` #### Scenario: Кандидат TVMaze с нативной ссылкой - **GIVEN** TVMaze найден сериал с id `169` («Фарго»), внешний тег — TVDB id `269613` - **WHEN** клиент TVMaze формирует Candidate - **THEN** `URL` = `https://www.tvmaze.com/shows/169` - **AND** `TagProvider`/`TagID` остаются `tvdb`/`269613` (тег папки Jellyfin не меняется) #### Scenario: Ссылка в интерфейсе ревью - **GIVEN** загрузка в состоянии `review` с кандидатами, у которых заполнен `url` - **WHEN** рендерится страница ревью - **THEN** в таблице кандидатов каждый кандидат SHALL отображаться со ссылкой на внешний сайт - **AND** ссылка открывается в новой вкладке (`target="_blank"`) - **AND** текстом ссылки служит провайдер или сокращённый url #### Scenario: URL сохраняется в БД - **GIVEN** результат поиска с кандидатами - **WHEN** кандидаты сохраняются в таблицу `metadata_candidate` - **THEN** значение `url` SHALL быть записано в колонку `url` - **AND** при последующей загрузке данных ревью url доступен без повторной генерации