Refactor GroupCatalog and enhance media preview functionality in ShowDetail and AddEpisodesDialog
ci / build-backend (push) Successful in 1m17s
ci / build-frontend (push) Successful in 39s
ci / tests (push) Successful in 3m41s
ci / sonar (push) Successful in 3m33s

Updated the GroupCatalog class to streamline the determination of the dominant show kind by introducing a new method, DominantKindOf, which improves code clarity. Enhanced the AddEpisodesDialog and ShowDetail components to integrate a media preview feature, allowing users to preview media assets directly within the dialog. This includes the addition of a preview state and corresponding UI elements for a better user experience. Updated localization strings to support the new preview functionality.
This commit is contained in:
Leonid Pershin
2026-07-30 23:30:34 +03:00
parent bee655ec1c
commit 01ba48e163
3 changed files with 90 additions and 22 deletions
@@ -113,14 +113,6 @@ public sealed class GroupCatalog(
if (units == 0)
return null;
// У коллекции своего типа нет: франшиза — это почти всегда полнометражки.
var seriesUnits = resolved.Where(r => r.ShowKind == ShowKind.Series).Sum(r => r.UnitCount);
// Ролики распознаются первыми: группа рекламы даёт сотни коротких единиц, то есть самый
// большой UnitCount из всех, и записанная «полным метром» она побеждала бы по баллам
// в любой полосе без предпочтения по типу — в эфир уходила бы полоса рекламы.
var interstitialUnits = resolved
.Where(r => r.ShowKind == ShowKind.Interstitial)
.Sum(r => r.UnitCount);
var duration = resolved.Aggregate(TimeSpan.Zero, (sum, r) => sum + r.TotalDuration);
return new GroupCandidate(
@@ -129,11 +121,30 @@ public sealed class GroupCatalog(
composition.Count,
units,
resolved.Max(r => r.Audience),
interstitialUnits * 2 >= units ? ShowKind.Interstitial
: seriesUnits * 2 >= units ? ShowKind.Series
: ShowKind.Single,
DominantKindOf(resolved, units),
duration.TotalMinutes / units,
primaryGenreId
);
}
/// <summary>
/// Чем группа является по составу — по единицам, а не по позициям: полоса собирается под длину
/// того, что в ней играет.
///
/// Ролики проверяются первыми: группа рекламы даёт сотни коротких единиц, то есть самый большой
/// <c>UnitCount</c> на канале, и записанная «полным метром» она побеждала бы по баллам в любой
/// полосе без предпочтения по типу — в эфир уходила бы полоса рекламы. У коллекции своего типа
/// нет: франшиза — это почти всегда полнометражки.
/// </summary>
private static ShowKind DominantKindOf(IReadOnlyList<GroupElementInfo> resolved, int units)
{
var interstitialUnits = resolved
.Where(r => r.ShowKind == ShowKind.Interstitial)
.Sum(r => r.UnitCount);
if (interstitialUnits * 2 >= units)
return ShowKind.Interstitial;
var seriesUnits = resolved.Where(r => r.ShowKind == ShowKind.Series).Sum(r => r.UnitCount);
return seriesUnits * 2 >= units ? ShowKind.Series : ShowKind.Single;
}
}