Browse Source

group marathon by season (#1843)

pull/1844/head
Jason Dove 1 year ago committed by GitHub
parent
commit
a8cf22e43e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 58
      ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs
  2. 108
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs

58
ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs

@ -90,38 +90,8 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor
// marathon is a special case that needs to be handled on its own // marathon is a special case that needs to be handled on its own
if (content is YamlPlayoutContentMarathonItem marathon) if (content is YamlPlayoutContentMarathonItem marathon)
{ {
if (!Enum.TryParse(marathon.ItemOrder, true, out PlaybackOrder playbackOrder)) var helper = new YamlPlayoutMarathonHelper(mediaCollectionRepository);
{ return await helper.GetEnumerator(marathon, state, cancellationToken);
playbackOrder = PlaybackOrder.Shuffle;
}
var allMediaItems = new List<MediaItem>();
// grab items from each show guid
foreach (string showGuid in marathon.Guids.Map(g => $"{g.Source}://{g.Value}"))
{
allMediaItems.AddRange(await mediaCollectionRepository.GetShowItemsByShowGuids([showGuid]));
}
// TODO: support different group_by
var groups = allMediaItems
.GroupBy(MediaItemKeyByShow)
.ToList();
Dictionary<PlaylistItem, List<MediaItem>> itemMap = [];
foreach (IGrouping<int, MediaItem> group in groups)
{
PlaylistItem playlistItem = GroupToPlaylistItem(marathon, playbackOrder, group);
itemMap.Add(playlistItem, group.ToList());
}
return await PlaylistEnumerator.Create(
mediaCollectionRepository,
itemMap,
state,
cancellationToken);
} }
// playlist is a special case that needs to be handled on its own // playlist is a special case that needs to be handled on its own
@ -159,28 +129,4 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor
return Option<IMediaCollectionEnumerator>.None; return Option<IMediaCollectionEnumerator>.None;
} }
private int MediaItemKeyByShow(MediaItem mediaItem) =>
mediaItem switch
{
Episode e => e.Season?.ShowId ?? 0,
_ => 0
};
private static PlaylistItem GroupToPlaylistItem(
YamlPlayoutContentMarathonItem marathon,
PlaybackOrder playbackOrder,
IGrouping<int, MediaItem> group) =>
new()
{
Index = group.Key,
CollectionType = ProgramScheduleItemCollectionType.TelevisionShow,
MediaItemId = group.Key,
PlayAll = marathon.PlayAllItems,
PlaybackOrder = playbackOrder,
IncludeInProgramGuide = true
};
} }

108
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutMarathonHelper.cs

@ -0,0 +1,108 @@
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Core.Interfaces.Scheduling;
using ErsatzTV.Core.Scheduling.YamlScheduling.Models;
namespace ErsatzTV.Core.Scheduling.YamlScheduling;
public class YamlPlayoutMarathonHelper(IMediaCollectionRepository mediaCollectionRepository)
{
public async Task<Option<IMediaCollectionEnumerator>> GetEnumerator(
YamlPlayoutContentMarathonItem marathon,
CollectionEnumeratorState state,
CancellationToken cancellationToken)
{
if (!Enum.TryParse(marathon.ItemOrder, true, out PlaybackOrder playbackOrder))
{
playbackOrder = PlaybackOrder.Shuffle;
}
var allMediaItems = new List<MediaItem>();
// grab items from each show guid
foreach (string showGuid in marathon.Guids.Map(g => $"{g.Source}://{g.Value}"))
{
allMediaItems.AddRange(await mediaCollectionRepository.GetShowItemsByShowGuids([showGuid]));
}
List<IGrouping<GroupKey, MediaItem>> groups = [];
// group by show
if (string.Equals(marathon.GroupBy, "show", StringComparison.OrdinalIgnoreCase))
{
groups.AddRange(allMediaItems.GroupBy(MediaItemKeyByShow));
}
// group by season
else if (string.Equals(marathon.GroupBy, "season", StringComparison.OrdinalIgnoreCase))
{
groups.AddRange(allMediaItems.GroupBy(MediaItemKeyBySeason));
}
Dictionary<PlaylistItem, List<MediaItem>> itemMap = [];
for (var index = 0; index < groups.Count; index++)
{
IGrouping<GroupKey, MediaItem> group = groups[index];
PlaylistItem playlistItem = GroupToPlaylistItem(index, marathon, playbackOrder, group);
itemMap.Add(playlistItem, group.ToList());
}
return await PlaylistEnumerator.Create(
mediaCollectionRepository,
itemMap,
state,
cancellationToken);
}
private static GroupKey MediaItemKeyByShow(MediaItem mediaItem) =>
mediaItem switch
{
Episode e => new GroupKey(
ProgramScheduleItemCollectionType.TelevisionShow,
null,
null,
null,
e.Season?.ShowId ?? 0),
_ => new GroupKey(ProgramScheduleItemCollectionType.TelevisionShow, null, null, null, 0)
};
private static GroupKey MediaItemKeyBySeason(MediaItem mediaItem) =>
mediaItem switch
{
Episode e => new GroupKey(
ProgramScheduleItemCollectionType.TelevisionSeason,
null,
null,
null,
e.SeasonId),
_ => new GroupKey(ProgramScheduleItemCollectionType.TelevisionSeason, null, null, null, 0)
};
private static PlaylistItem GroupToPlaylistItem(
int index,
YamlPlayoutContentMarathonItem marathon,
PlaybackOrder playbackOrder,
IGrouping<GroupKey, MediaItem> group) =>
new()
{
Index = index,
CollectionType = group.Key.CollectionType,
CollectionId = group.Key.CollectionId,
MultiCollectionId = group.Key.MultiCollectionId,
SmartCollectionId = group.Key.SmartCollectionId,
MediaItemId = group.Key.MediaItemId,
PlayAll = marathon.PlayAllItems,
PlaybackOrder = playbackOrder,
IncludeInProgramGuide = true
};
private record GroupKey(
ProgramScheduleItemCollectionType CollectionType,
int? CollectionId,
int? MultiCollectionId,
int? SmartCollectionId,
int? MediaItemId);
}
Loading…
Cancel
Save