Browse Source

add basic marathon content (#1842)

pull/1843/head
Jason Dove 1 year ago committed by GitHub
parent
commit
4c9c047530
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 62
      ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs
  2. 19
      ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs
  3. 1
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs

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

@ -79,6 +79,7 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor
case YamlPlayoutContentMultiCollectionItem multiCollection: case YamlPlayoutContentMultiCollectionItem multiCollection:
items = await mediaCollectionRepository.GetMultiCollectionItemsByName(multiCollection.MultiCollection); items = await mediaCollectionRepository.GetMultiCollectionItemsByName(multiCollection.MultiCollection);
break; break;
// playlist is handled later // playlist is handled later
} }
@ -86,6 +87,43 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor
var state = new CollectionEnumeratorState { Seed = context.Playout.Seed + index, Index = 0 }; var state = new CollectionEnumeratorState { Seed = context.Playout.Seed + index, Index = 0 };
// marathon is a special case that needs to be handled on its own
if (content is YamlPlayoutContentMarathonItem marathon)
{
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]));
}
// 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
if (content is YamlPlayoutContentPlaylistItem playlist) if (content is YamlPlayoutContentPlaylistItem playlist)
{ {
@ -121,4 +159,28 @@ 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
};
} }

19
ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutContentMarathonItem.cs

@ -0,0 +1,19 @@
using YamlDotNet.Serialization;
namespace ErsatzTV.Core.Scheduling.YamlScheduling.Models;
public class YamlPlayoutContentMarathonItem : YamlPlayoutContentItem
{
public string Marathon { get; set; }
public List<YamlPlayoutContentGuid> Guids { get; set; } = [];
[YamlMember(Alias = "group_by", ApplyNamingConventions = false)]
public string GroupBy { get; set; }
[YamlMember(Alias = "item_order", ApplyNamingConventions = false)]
public string ItemOrder { get; set; }
[YamlMember(Alias = "play_all_items", ApplyNamingConventions = false)]
public bool PlayAllItems { get; set; }
}

1
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs

@ -281,6 +281,7 @@ public class YamlPlayoutBuilder(
var contentKeyMappings = new Dictionary<string, Type> var contentKeyMappings = new Dictionary<string, Type>
{ {
{ "collection", typeof(YamlPlayoutContentCollectionItem) }, { "collection", typeof(YamlPlayoutContentCollectionItem) },
{ "marathon", typeof(YamlPlayoutContentMarathonItem) },
{ "multi_collection", typeof(YamlPlayoutContentMultiCollectionItem) }, { "multi_collection", typeof(YamlPlayoutContentMultiCollectionItem) },
{ "playlist", typeof(YamlPlayoutContentPlaylistItem) }, { "playlist", typeof(YamlPlayoutContentPlaylistItem) },
{ "search", typeof(YamlPlayoutContentSearchItem) }, { "search", typeof(YamlPlayoutContentSearchItem) },

Loading…
Cancel
Save