using Jackett; using Newtonsoft.Json.Linq; using System.Text; using Shared.Models.JacRed.Tracks; namespace JacRed.Engine { public static class WebApi { #region Indexers async public static Task> Indexers(string query, string title, string title_original, int year, int is_serial, Dictionary category) { var queryString = new StringBuilder(); if (!string.IsNullOrEmpty(title)) queryString.Append($"&title={HttpUtility.UrlEncode(title)}"); if (!string.IsNullOrEmpty(title_original)) queryString.Append($"&title_original={HttpUtility.UrlEncode(title_original)}"); if (year > 0) queryString.Append($"&year={year}"); if (is_serial > 0) queryString.Append($"&is_serial={is_serial}"); if (category != null && category.Count > 0) queryString.Append($"&category[]={category.First().Value}"); var root = await Http.Get($"{ModInit.conf.webApiHost}/api/v2.0/indexers/all/results?query={HttpUtility.UrlEncode(query)}" + queryString.ToString(), timeoutSeconds: 8); if (root == null) return new List(); var results = root.GetValue("Results")?.ToObject(); if (results == null || results.Count == 0) return new List(); var torrents = new List(results.Count); foreach (var torrent in results) { try { string name = torrent.Value("Title"); string tracker = torrent.Value("Tracker"); if (ModInit.conf.Red.trackers != null) { if (!tracker.Contains(",")) { if (!ModInit.conf.Red.trackers.Contains(tracker)) continue; } else { /* * Этот код фильтрует результаты поиска торрентов по списку разрешённых трекеров, который хранится в ModInit.conf.Red.trackers. * Если у торрента в поле Tracker указано несколько трекеров через запятую, то он будет допущен только в том случае, если хотя бы один из этих трекеров есть в разрешённом списке. */ var trackers = tracker.Split(','); if (!ModInit.conf.Red.trackers.Any(t => trackers.Contains(t))) continue; } } if (!string.IsNullOrEmpty(ModInit.conf.filter) && !Regex.IsMatch(name, ModInit.conf.filter, RegexOptions.IgnoreCase)) continue; if (!string.IsNullOrEmpty(ModInit.conf.filter_ignore) && Regex.IsMatch(name, ModInit.conf.filter_ignore, RegexOptions.IgnoreCase)) continue; torrents.Add(new TorrentDetails() { trackerName = tracker, url = torrent.Value("Details"), title = name, sid = torrent.Value("Seeders"), pir = torrent.Value("Peers"), size = torrent.Value("Size"), magnet = torrent.Value("MagnetUri"), createTime = torrent.Value("PublishDate"), ffprobe = torrent["ffprobe"]?.ToObject>() }); } catch { } } return torrents; } #endregion #region Api public static Task> Api(string search) { return Indexers(search, null, null, 0, 0, null); } #endregion } }