-
Notifications
You must be signed in to change notification settings - Fork 108
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:
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:
- 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:
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:
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:
- 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:
- 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Список может быть сокращён или расширен в зависимости от возможностей конкретного сайта.
- Скопируйте существующий YAML и адаптируйте значения домена, категорий и сортировок.
- Проверяйте XPath-выражения: структура HTML сайтов может отличаться на разных разделах.
- Используйте
formatдля приведения данных к нужному виду (годы, рейтинги, массивы JSON, идентификаторы). - Поддерживайте единый стиль именования аргументов (
runtime,production_countries,kp_rating,imdb_idи т. п.), чтобы потребители API не зависели от конкретного провайдера. - После обновления файла убедитесь, что все задействованные поля корректно парсятся в приложении.