fix(uaflix): skip probing unreleased premiere episodes

Mark season episodes whose description title contains «Прем'єра» and skip player probing for them. This avoids unnecessary HTTP requests for episodes that have not aired yet.
This commit is contained in:
Felix 2026-06-15 08:46:19 +03:00
parent 3ee62e24f6
commit e695121444
2 changed files with 54 additions and 9 deletions

View File

@ -19,5 +19,12 @@ namespace LME.Uaflix.Models
/// Перший елемент відповідає iframeUrl, наступні — додаткові плеєри (напр. з субтитрами)
/// </summary>
public List<string> zetvideoIframeUrls { get; set; }
/// <summary>
/// Епізод позначено як «Прем'єра» (ще не вийшов) на сторінці сезону.
/// У таких епізодів у vi-desc → vi-title зазначено "Прем'єра. ДД.ММ.РРРР".
/// ProbeSeasonPlayer не робитиме зайвого HTTP-запиту для таких епізодів.
/// </summary>
public bool IsPremiere { get; set; }
}
}

View File

@ -361,6 +361,14 @@ namespace LME.Uaflix
if (episode == null || string.IsNullOrWhiteSpace(episode.url))
continue;
// Пропускаємо епізоди, позначені як «Прем'єра» — вони ще не вийшли,
// робити зайвий HTTP-запит на сторінку епізоду не потрібно.
if (episode.IsPremiere)
{
_onLog($"ProbeSeasonPlayer: Пропускаю епізод {episode.episode} — позначено як прем'єра");
continue;
}
var probed = await ProbeEpisodePlayer(episode.url);
if (probed == null)
continue;
@ -1084,13 +1092,28 @@ namespace LME.Uaflix
parsedEpisode = episodeFromUrl;
}
episodes.Add(new EpisodeLinkInfo
var episode = new EpisodeLinkInfo
{
url = episodeUrl,
title = episodeNode.SelectSingleNode(".//div[@class='vi-rate']")?.InnerText.Trim() ?? $"Епізод {parsedEpisode}",
season = parsedSeason,
episode = parsedEpisode
});
};
// Перевірка на «Прем'єра» — епізод ще не вийшов, плеєра немає
var viDesc = episodeNode.SelectSingleNode(".//div[contains(@class, 'vi-desc')]");
if (viDesc != null)
{
var viTitle = viDesc.SelectSingleNode(".//div[contains(@class, 'vi-title')]");
string descText = viTitle?.InnerText?.Trim() ?? string.Empty;
if (descText.IndexOf("Прем'єра", StringComparison.OrdinalIgnoreCase) >= 0)
{
episode.IsPremiere = true;
_onLog($"ParseSeasonEpisodesFromHtml: Серія {parsedEpisode} позначена як прем'єра: '{descText}'");
}
}
episodes.Add(episode);
fallbackEpisode = Math.Max(fallbackEpisode, parsedEpisode + 1);
}
@ -1955,13 +1978,28 @@ namespace LME.Uaflix
var match = Regex.Match(episodeUrl, @"season-(\d+).*?episode-(\d+)");
if (match.Success)
{
allEpisodes.Add(new EpisodeLinkInfo
var ep = new EpisodeLinkInfo
{
url = episodeUrl,
title = episodeNode.SelectSingleNode(".//div[@class='vi-rate']")?.InnerText.Trim() ?? $"Епізод {match.Groups[2].Value}",
season = int.Parse(match.Groups[1].Value),
episode = int.Parse(match.Groups[2].Value)
});
};
// Перевірка на «Прем'єра» — епізод ще не вийшов
var viDesc = episodeNode.SelectSingleNode(".//div[contains(@class, 'vi-desc')]");
if (viDesc != null)
{
var viTitle = viDesc.SelectSingleNode(".//div[contains(@class, 'vi-title')]");
string descText = viTitle?.InnerText?.Trim() ?? string.Empty;
if (descText.IndexOf("Прем'єра", StringComparison.OrdinalIgnoreCase) >= 0)
{
ep.IsPremiere = true;
_onLog($"GetPaginationInfo: Серія {ep.episode} позначена як прем'єра: '{descText}'");
}
}
allEpisodes.Add(ep);
}
}
}