Skip to content

Catalog YAML

immisterio edited this page Oct 26, 2025 · 2 revisions

Общая структура файла

Минимальный набор ключей определяет, будет ли провайдер подключён, как он отображается и где расположен:

enable: true             # включает или отключает источник
displayindex: 10         # порядковый номер в интерфейсе
displayname: HDRezka     # человекочитаемое имя каталога
host: https://rezka.ag   # базовый URL ресурса
timeout: 10              # таймаут HTTP-запроса в секундах
cache_time: 15           # время кэширования ответов (в минутах)
headers:                 # дополнительные заголовки HTTP (User-Agent и т. п.)
  referer: "{host}/"
  cookie: "user_id=666"
useproxy: true           # Использовать прокси-цепочку
proxy:
  list:
    - socks5://127.0.0.1:9050

Поиск (search)

Блок search настраивает запросы, отправляемые при поиске:

search:
  uri: search/?do=search&subaction=search&q={search}
  • uri — относительный путь с плейсхолдером {search}. Он подставляется в строку запроса (q={search}, query={search} и т. п.).
  • При необходимости добавляются параметры или меняется метод, но базовая запись остаётся строкой URI.

Категории и типы контента

movie_cats:
  - films
serial_cats:
  - series
catalog_key: Последние поступления
  • movie_cats и serial_cats — списки внутренних идентификаторов категорий. Они используются при построении ссылок (films, series, serials, animation, tv и др.).
  • catalog_key — ключ сортировки или коллекции, выбранный по умолчанию при загрузке каталога.

Меню (menu)

Меню описывает доступные фильтры и преобразование значений в адреса.

menu:
  - categories:
      Фильмы: films
      Сериалы: series
      Мультфильмы: cartoons
      Аниме: animation
    sort:
      Новинки: new
      Сейчас смотрят: watching
      Последние поступления: last
      Популярные: popular
    format:
      sort: |
        return sort != "new" ? $"{cat}/page/{page}/?filter={sort}" : $"new/page/{page}/?filter=last&genre={cat.Replace("films", "1").Replace("series", "2").Replace("cartoons", "3").Replace("animation", "82")}";
  • categories — отображаемые названия слева, внутренние ключи справа. Добавляйте дополнительные строки для телепередач, мультфильмов и других разделов.
  • sort — словарь «название сортировки → ключ». Сюда можно добавить значения вроде year, viewed_day, rating, kp_rating, imdb_rating и т. д.
  • format.sort — C#-выражение, преобразующее выбранные cat, sort и page в конечный путь. Распространённые сценарии:
    • Условная логика с заменой идентификаторов жанров, как в примере выше.

    • Построение строки запроса sort={sort}&page={page} только при наличии значений:

      string query = string.Empty;
      if (sort != "default")
          query = $"sort={sort}";
      if (page > 1)
          query = string.IsNullOrEmpty(query) ? $"page={page}" : $"{query}&page={page}";
      return string.IsNullOrEmpty(query) ? cat : $"{cat}?{query}";

Раздел content

Определяет, как распознаются карточки на страницах каталога.

content:
  serial_regex: "(Сериал|сезон|серии|серия)"
  nodes: //div[@class='b-content__inline_item']
  name:
    node: .//div[@class='b-content__inline_item-link']//a
    format: 'value.Split(" / ")[0]'
  href:
    node: .//a
    attribute: href
  image:
    node: .//img
    attribute: src
  year:
    node: .//div[@class='b-content__inline_item-link']//div
    format: "value.Trim().Split('-', ',', ' ')[0]"
  total_pages:
    node: //div[@class='b-navigation']/span[@class='nav_ext']/following-sibling::a[1]
  args:
    - name_arg: release_quality
      node: //span[@class='year']
      format: 'Regex.Match(value, "[0-9]+, (.*)").Groups[1].Value'
    - name_arg: vote_average
      node: //span[@class='rating']
      format: 'double.TryParse(value.Replace(".", ","), out double _r) ? _r : 0'
  • serial_regex — регулярное выражение для выявления сериалов. Вместо текста можно использовать проверку атрибутов (href="/serial/").
  • nodes — XPath-выражение, возвращающее элементы списка.
  • Вложенные блоки (name, href, image, year) содержат XPath и необязательные преобразования (format).
  • total_pages — XPath до ссылки на последнюю страницу.
  • args — дополнительные данные, собираемые из списка (качество релиза, текущий рейтинг и т. п.).

Раздел card_parse

Этот блок извлекает подробности с карточки конкретного тайтла.

card_parse:
  name:
    node: //h1[@itemprop='name']
    format: 'value.Split(" / ")[0]'
  original_name:
    node: //div[@itemprop='alternativeHeadline']
    format: 'value.Split(" / ")[0]'
  image:
    node: //img[@itemprop='image']
    attribute: src
  year:
    node: //table[@class='b-post__info']//tr[./td/h2[contains(text(), 'Дата выхода')]]/td[2]
    format: |
      using System.Globalization;
      if (DateTime.TryParseExact(value.Replace(" года", ""), ["d MMMM yyyy", "dd MMMM yyyy"], new CultureInfo("ru-RU"), DateTimeStyles.None, out var date))
        return date.ToString("yyyy-MM-dd");
      return string.Empty;
  description:
    node: //div[@class='b-post__description_text']
  • node — XPath до элемента, attribute — атрибут, если нужен.
  • format — фрагмент C#-кода для постобработки (например, очистка даты, выделение первой части названия или конвертация числа).
  • Любые дополнительные поля (альтернативное название, описание, постер) добавляются аналогично.

Дополнительные аргументы (card_args)

card_args дополняет карточку структурированными данными.

card_args:
  - name_arg: tagline
    node: //table[@class='b-post__info']//tr[./td/h2[contains(text(), 'Слоган')]]/td[2]
  - name_arg: runtime
    node: //td[@itemprop='duration']
    format: |
      return int.TryParse(value.TrimStart().Split(" ")[0], out int totalMinutes) ? totalMinutes : null;
  - name_arg: production_countries
    node: //table[@class='b-post__info']//tr[./td/h2[contains(text(), 'Страна')]]/td[2]//a
    format: 'new JArray(new JObject() { ["name"] = value.Trim() })'
  - name_arg: genres
    node: //div[@class='info_item'][div[@class='key']='Жанр']/div[@class='value']
    format: 'new JArray(value.Split(",").Select(name => new JObject() { ["name"] = name.Trim() }))'
  - name_arg: kp_rating
    node: //span[contains(@class,'rating_kp')]/following-sibling::a
  - name_arg: kinopoisk_id
    node: //span[contains(@class,'rating_kp')]/following-sibling::a
    attribute: href
    format: 'Regex.Match(value, "/([0-9]+)/?$").Groups[1].Value'
  - name_arg: imdb_rating
    node: //span[@class='b-post__info_rates imdb']//span
  - name_arg: imdb_id
    node: //span[@class='b-post__info_rates imdb']//a
    attribute: href
    format: |
      var segments = value.Split('/');
      string href = CrypTo.DecodeBase64(segments.Length > 2 ? segments[2] : "");
      return Regex.Match(HttpUtility.UrlDecode(href), "/(tt[0-9]+)").Groups[1].Value;

Распространённые сценарии обработки:

  • Преобразование длительности в минуты (включая формат «1 час 30 мин»).
  • Формирование массивов JArray для стран/жанров через LINQ или создание JObject вручную.
  • Извлечение идентификаторов из ссылок и декодирование Base64.
  • Парсинг рейтингов с заменой запятой и точки в числах.

Интеграция с TMDB (tmdb_injects)

Чтобы дополнить карточку данными из TMDB, перечислите нужные поля:

tmdb_injects:
  - backdrop_path
  - created_by
  - genres
  - production_companies
  - production_countries
  - content_ratings
  - episode_run_time
  - languages
  - number_of_episodes
  - number_of_seasons
  - origin_country
  - original_language
  - status
  - networks
  - seasons
  - type
  - budget

Список может быть сокращён или расширен в зависимости от возможностей конкретного сайта.

Практические рекомендации

  1. Скопируйте существующий YAML и адаптируйте значения домена, категорий и сортировок.
  2. Проверяйте XPath-выражения: структура HTML сайтов может отличаться на разных разделах.
  3. Используйте format для приведения данных к нужному виду (годы, рейтинги, массивы JSON, идентификаторы).
  4. Поддерживайте единый стиль именования аргументов (runtime, production_countries, kp_rating, imdb_id и т. п.), чтобы потребители API не зависели от конкретного провайдера.
  5. После обновления файла убедитесь, что все задействованные поля корректно парсятся в приложении.
Clone this wiki locally