diff --git a/AnimeON/AnimeONInvoke.cs b/AnimeON/AnimeONInvoke.cs index 514b1e3..7f68469 100644 --- a/AnimeON/AnimeONInvoke.cs +++ b/AnimeON/AnimeONInvoke.cs @@ -35,7 +35,7 @@ namespace AnimeON return ApnHelper.WrapUrl(_init, url); } - public async Task> Search(string imdb_id, long kinopoisk_id, string title, string original_title, int year) + public async Task> Search(string imdb_id, long kinopoisk_id, string title, string original_title, int year, int serial) { string memKey = $"AnimeON:search:{kinopoisk_id}:{imdb_id}"; if (_hybridCache.TryGetValue(memKey, out List res)) @@ -44,7 +44,7 @@ namespace AnimeON try { var headers = new List() { new HeadersModel("User-Agent", "Mozilla/5.0"), new HeadersModel("Referer", _init.host) }; - + async Task> FindAnime(string query) { if (string.IsNullOrEmpty(query)) @@ -64,7 +64,24 @@ namespace AnimeON var searchResults = await FindAnime(title) ?? await FindAnime(original_title); if (searchResults == null) return null; - + + if (serial == 1 && searchResults.Count > 0) + { + string fallbackTitleEn = searchResults.FirstOrDefault()?.TitleEn; + if (!string.IsNullOrWhiteSpace(fallbackTitleEn)) + { + var extraResults = await FindAnime(fallbackTitleEn); + if (extraResults != null && extraResults.Count > 0) + { + searchResults = searchResults + .Concat(extraResults) + .GroupBy(a => a.Id) + .Select(g => g.First()) + .ToList(); + } + } + } + if (!string.IsNullOrEmpty(imdb_id)) { var seasons = searchResults.Where(a => a.ImdbId == imdb_id).ToList(); @@ -74,7 +91,7 @@ namespace AnimeON return seasons; } } - + // Fallback to first result if no imdb match var firstResult = searchResults.FirstOrDefault(); if (firstResult != null) diff --git a/AnimeON/Controller.cs b/AnimeON/Controller.cs index 0c1b7df..153915b 100644 --- a/AnimeON/Controller.cs +++ b/AnimeON/Controller.cs @@ -39,7 +39,7 @@ namespace AnimeON.Controllers var invoke = new AnimeONInvoke(init, hybridCache, OnLog, proxyManager); OnLog($"AnimeON Index: title={title}, original_title={original_title}, serial={serial}, s={s}, t={t}, year={year}, imdb_id={imdb_id}, kp={kinopoisk_id}"); - var seasons = await invoke.Search(imdb_id, kinopoisk_id, title, original_title, year); + var seasons = await invoke.Search(imdb_id, kinopoisk_id, title, original_title, year, serial); OnLog($"AnimeON: search results = {seasons?.Count ?? 0}"); if (seasons == null || seasons.Count == 0) return OnError("animeon", proxyManager); @@ -102,17 +102,29 @@ namespace AnimeON.Controllers return OnError("animeon", proxyManager); OnLog($"AnimeON: voices found = {structure.Voices.Count}"); + var voiceItems = structure.Voices + .Select(v => + { + string display = v.Value?.DisplayName; + if (string.IsNullOrWhiteSpace(display)) + display = v.Key; + if (string.IsNullOrWhiteSpace(display)) + display = "Озвучка"; + return new { Key = v.Key, Display = display }; + }) + .ToList(); + // Автовибір першої озвучки якщо t не задано if (string.IsNullOrEmpty(t)) - t = structure.Voices.Keys.First(); + t = voiceItems.First().Key; // Формуємо список озвучок var voice_tpl = new VoiceTpl(); - foreach (var voice in structure.Voices) + foreach (var voice in voiceItems) { string voiceLink = $"{host}/animeon?imdb_id={imdb_id}&kinopoisk_id={kinopoisk_id}&title={HttpUtility.UrlEncode(title)}&original_title={HttpUtility.UrlEncode(original_title)}&year={year}&serial=1&s={s}&t={HttpUtility.UrlEncode(voice.Key)}"; bool isActive = voice.Key == t; - voice_tpl.Append(voice.Key, isActive, voiceLink); + voice_tpl.Append(voice.Display, isActive, voiceLink); } // Перевірка вибраної озвучки