From 521e4eac411fd0004bffbb860ffe92b5da00f7a2 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Tue, 30 Jul 2024 20:30:13 -0500 Subject: [PATCH] add yaml marathon search content source (#1845) * use search queries to populate marathons * group marathon by artist * add marathon group by album --- .../Scheduling/PlaylistEnumerator.cs | 4 +- .../Models/YamlPlayoutContentMarathonItem.cs | 2 + .../YamlPlayoutMarathonHelper.cs | 40 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs index 4a9ce562..de06d728 100644 --- a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs @@ -24,7 +24,9 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator public CollectionEnumeratorState State { get; private set; } - public Option Current => _sortedEnumerators[_enumeratorIndex].Current; + public Option Current => _sortedEnumerators.Count > 0 + ? _sortedEnumerators[_enumeratorIndex].Current + : Option.None; public Option CurrentIncludeInProgramGuide { diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs index 153e5bf5..92ecac73 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs @@ -8,6 +8,8 @@ public class YamlPlayoutContentMarathonItem : YamlPlayoutContentItem public List Guids { get; set; } = []; + public List Searches { get; set; } = []; + [YamlMember(Alias = "group_by", ApplyNamingConventions = false)] public string GroupBy { get; set; } diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs index 4e3269f0..22ae3906 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs @@ -25,6 +25,12 @@ public class YamlPlayoutMarathonHelper(IMediaCollectionRepository mediaCollectio allMediaItems.AddRange(await mediaCollectionRepository.GetShowItemsByShowGuids([showGuid])); } + // grab items from each search + foreach (string query in marathon.Searches) + { + allMediaItems.AddRange(await mediaCollectionRepository.GetSmartCollectionItems(query)); + } + List> groups = []; // group by show @@ -37,6 +43,16 @@ public class YamlPlayoutMarathonHelper(IMediaCollectionRepository mediaCollectio { groups.AddRange(allMediaItems.GroupBy(MediaItemKeyBySeason)); } + // group by artist + else if (string.Equals(marathon.GroupBy, "artist", StringComparison.OrdinalIgnoreCase)) + { + groups.AddRange(allMediaItems.GroupBy(MediaItemKeyByArtist)); + } + // group by album + else if (string.Equals(marathon.GroupBy, "album", StringComparison.OrdinalIgnoreCase)) + { + groups.AddRange(allMediaItems.GroupBy(MediaItemKeyByAlbum)); + } Dictionary> itemMap = []; @@ -78,6 +94,30 @@ public class YamlPlayoutMarathonHelper(IMediaCollectionRepository mediaCollectio _ => new GroupKey(ProgramScheduleItemCollectionType.TelevisionSeason, null, null, null, 0) }; + private static GroupKey MediaItemKeyByArtist(MediaItem mediaItem) => + mediaItem switch + { + MusicVideo mv => new GroupKey( + ProgramScheduleItemCollectionType.Artist, + null, + null, + null, + mv.ArtistId), + _ => new GroupKey(ProgramScheduleItemCollectionType.Artist, null, null, null, 0) + }; + + private static GroupKey MediaItemKeyByAlbum(MediaItem mediaItem) => + mediaItem switch + { + Song s => new GroupKey( + ProgramScheduleItemCollectionType.Collection, + s.SongMetadata.HeadOrNone().Map(sm => sm.Album.GetHashCode()).IfNone(0), + null, + null, + null), + _ => new GroupKey(ProgramScheduleItemCollectionType.Collection, 0, null, null, null) + }; + private static PlaylistItem GroupToPlaylistItem( int index, YamlPlayoutContentMarathonItem marathon,