Add GET /api/guide returning a per-channel EPG grid (ChannelGuideResponseModel). start defaults to now, end defaults to now + XmltvDaysToBuild. Extract the guide-group/filler-merge projection (ChannelGuideProjector) and programme-metadata resolution (ChannelGuideMetadata) plus the metadata eager-load (IncludeGuideMetadata) out of RefreshChannelDataHandler so the XMLTV cache builder and the JSON guide share one source of truth and cannot drift. XMLTV output is unchanged (ChannelGuideGoldenTests pass without regeneration). The JSON handler mirrors XMLTV semantics: ShowInEpg-only channels, decimal channel ordering, ExternalJson playouts skipped, mirror playout offset applied to copies (never mutating the loaded entities). SubTitle/Category are nullable. refs #102 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26 lines
834 B
C#
26 lines
834 B
C#
#nullable enable
|
|
using ErsatzTV.Core.Domain.Filler;
|
|
|
|
namespace ErsatzTV.Core.Api.Channels;
|
|
|
|
/// <summary>A single guide programme for the JSON EPG grid.</summary>
|
|
public record ChannelGuideProgrammeResponseModel(
|
|
DateTimeOffset Start,
|
|
DateTimeOffset Stop,
|
|
string Title,
|
|
string? SubTitle,
|
|
string? Category,
|
|
FillerKind FillerKind);
|
|
|
|
/// <summary>One channel's guide programmes for the requested window.</summary>
|
|
public record ChannelGuideChannelResponseModel(
|
|
string Number,
|
|
string Name,
|
|
List<ChannelGuideProgrammeResponseModel> Programmes);
|
|
|
|
/// <summary>The JSON channel-guide response: the resolved window plus per-channel programme arrays.</summary>
|
|
public record ChannelGuideResponseModel(
|
|
DateTimeOffset Start,
|
|
DateTimeOffset End,
|
|
List<ChannelGuideChannelResponseModel> Channels);
|