using ErsatzTV.Core.Domain; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Infrastructure.Extensions; public static class PlayoutGuideQueryableExtensions { /// /// Eager-loads the full playout-item metadata graph needed to render guide programme /// titles/subtitles/categories/artwork. Shared by the XMLTV cache builder and the JSON guide /// query so both surfaces see identical data. Callers should apply AsSplitQuery(). /// public static IQueryable IncludeGuideMetadata(this IQueryable playouts) => playouts .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Episode).EpisodeMetadata) .ThenInclude(em => em.Guids) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Episode).EpisodeMetadata) .ThenInclude(em => em.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) .ThenInclude(sm => sm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) .ThenInclude(sm => sm.Genres) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) .ThenInclude(sm => sm.Guids) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Movie).MovieMetadata) .ThenInclude(mm => mm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Movie).MovieMetadata) .ThenInclude(mm => mm.Genres) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Movie).MovieMetadata) .ThenInclude(mm => mm.Guids) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .ThenInclude(mm => mm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .ThenInclude(mvm => mvm.Genres) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .ThenInclude(mvm => mvm.Studios) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .ThenInclude(mvm => mvm.Directors) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .ThenInclude(mvm => mvm.Artists) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).Artist) .ThenInclude(a => a.ArtistMetadata) .ThenInclude(am => am.Genres) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as OtherVideo).OtherVideoMetadata) .ThenInclude(vm => vm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as RemoteStream).RemoteStreamMetadata) .ThenInclude(vm => vm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Song).SongMetadata) .ThenInclude(vm => vm.Artwork) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Song).SongMetadata) .ThenInclude(sm => sm.Genres) .Include(p => p.Items) .ThenInclude(i => i.MediaItem) .ThenInclude(i => (i as Song).SongMetadata) .ThenInclude(sm => sm.Studios); }