using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; namespace ErsatzTV.Core.Scheduling; /// /// Builds the shuffle "source" for a collection key — the grouped media items fed to /// and the per-collection lists fed to /// . /// /// Extracted from PlayoutBuilder (issue #380) so both the Classic builder and /// share ONE stateless place to construct shuffle sources, /// eliminating 's cross-engine reach-in into /// PlayoutBuilder's statics. Kept as a static helper (dependencies passed as parameters) /// to match the sibling / /// (also public static) and because is itself a /// static factory. /// /// public static class ShuffleSourceBuilder { public static async Task> GetGroupedMediaItemsForShuffle( IMediaCollectionRepository mediaCollectionRepository, bool keepMultiPartEpisodesTogether, bool treatCollectionsAsShows, List mediaItems, CollectionKey collectionKey, CancellationToken cancellationToken) { if (collectionKey.MultiCollectionId != null) { List collections = await mediaCollectionRepository .GetMultiCollectionCollections(collectionKey.MultiCollectionId.Value, cancellationToken); return MultiCollectionGrouper.GroupMediaItems(collections); } return keepMultiPartEpisodesTogether ? MultiPartEpisodeGrouper.GroupMediaItems(mediaItems, treatCollectionsAsShows) : mediaItems.Map(mi => new GroupedMediaItem(mi, null)).ToList(); } public static async Task> GetCollectionItemsForShuffleInOrder( IMediaCollectionRepository mediaCollectionRepository, CollectionKey collectionKey, CancellationToken cancellationToken) { List result; if (collectionKey.MultiCollectionId != null) { result = await mediaCollectionRepository.GetMultiCollectionCollections( collectionKey.MultiCollectionId.Value, cancellationToken); } else { result = await mediaCollectionRepository.GetFakeMultiCollectionCollections( collectionKey.CollectionId, collectionKey.SmartCollectionId, cancellationToken); } return result; } }