#nullable enable using ErsatzTV.Application.Artworks; using ErsatzTV.Application.Channels; using ErsatzTV.Core.Api.Channels; using ErsatzTV.Core.Api.LibraryBrowse; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Scheduling; namespace ErsatzTV.Controllers.Api.Requests; /// /// Composite request to create a channel, its generated schedule/playlist and a classic playout in one call. /// Template defaults are stamped at create time; any value set in overrides the template. /// A single-item lineup references its target directly; a multi-item lineup is played in order via a generated /// system playlist. /// public record CreateChannelFromLineupRequest( string Name, string Number, string Group, string Categories, ArtworkContentTypeModel Logo, bool IsEnabled, bool ShowInEpg, int TemplateId, CreateChannelFromLineupAdvancedOptionsRequest? Advanced, List Lineup) { public CreateChannelFromLineup ToCommand() => new( Name, Number, Group, Categories, (Logo ?? ArtworkContentTypeModel.None).Sanitized(), IsEnabled, ShowInEpg, TemplateId, Advanced?.ToCommand() ?? new CreateChannelFromLineupAdvancedOptions(), Lineup.Map(i => i.ToCommand()).ToList()); } public record CreateChannelFromLineupAdvancedOptionsRequest( PlaybackOrder? PlaybackOrder = null, int? FFmpegProfileId = null, int? WatermarkId = null, int? FallbackFillerId = null, int? PreRollFillerId = null, int? MidRollFillerId = null, int? PostRollFillerId = null, ChannelStreamSelectorMode? StreamSelectorMode = null, string? StreamSelector = null, string? PreferredAudioLanguageCode = null, string? PreferredAudioTitle = null, ChannelPlayoutSource? PlayoutSource = null, ChannelPlayoutMode? PlayoutMode = null, StreamingMode? StreamingMode = null, string? PreferredSubtitleLanguageCode = null, ChannelSubtitleMode? SubtitleMode = null, ChannelMusicVideoCreditsMode? MusicVideoCreditsMode = null, string? MusicVideoCreditsTemplate = null, ChannelSongVideoMode? SongVideoMode = null, ChannelTranscodeMode? TranscodeMode = null, ChannelIdleBehavior? IdleBehavior = null, bool? ShuffleScheduleItems = null, bool? RandomStartPoint = null, FixedStartTimeBehavior? FixedStartTimeBehavior = null, List? Clear = null) { public CreateChannelFromLineupAdvancedOptions ToCommand() => new( PlaybackOrder, FFmpegProfileId, WatermarkId, FallbackFillerId, PreRollFillerId, MidRollFillerId, PostRollFillerId, StreamSelectorMode, StreamSelector, PreferredAudioLanguageCode, PreferredAudioTitle, PlayoutSource, PlayoutMode, StreamingMode, PreferredSubtitleLanguageCode, SubtitleMode, MusicVideoCreditsMode, MusicVideoCreditsTemplate, SongVideoMode, TranscodeMode, IdleBehavior, ShuffleScheduleItems, RandomStartPoint, FixedStartTimeBehavior, Clear); } public record CreateChannelFromLineupItemRequest( LibraryBrowseMediaType MediaType, CollectionType CollectionType, int? CollectionId, int? MultiCollectionId, int? SmartCollectionId, int? RerunCollectionId, int? MediaItemId, int? PlaylistId) { public CreateChannelFromLineupItem ToCommand() => new( MediaType, CollectionType, CollectionId, MultiCollectionId, SmartCollectionId, RerunCollectionId, MediaItemId, PlaylistId); }