add yaml marathon search content source (#1845)
* use search queries to populate marathons * group marathon by artist * add marathon group by album
This commit is contained in:
@@ -24,7 +24,9 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
|
||||
|
||||
public CollectionEnumeratorState State { get; private set; }
|
||||
|
||||
public Option<MediaItem> Current => _sortedEnumerators[_enumeratorIndex].Current;
|
||||
public Option<MediaItem> Current => _sortedEnumerators.Count > 0
|
||||
? _sortedEnumerators[_enumeratorIndex].Current
|
||||
: Option<MediaItem>.None;
|
||||
|
||||
public Option<bool> CurrentIncludeInProgramGuide
|
||||
{
|
||||
|
||||
@@ -8,6 +8,8 @@ public class YamlPlayoutContentMarathonItem : YamlPlayoutContentItem
|
||||
|
||||
public List<YamlPlayoutContentGuid> Guids { get; set; } = [];
|
||||
|
||||
public List<string> Searches { get; set; } = [];
|
||||
|
||||
[YamlMember(Alias = "group_by", ApplyNamingConventions = false)]
|
||||
public string GroupBy { get; set; }
|
||||
|
||||
|
||||
@@ -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<IGrouping<GroupKey, MediaItem>> 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<PlaylistItem, List<MediaItem>> 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,
|
||||
|
||||
Reference in New Issue
Block a user