Build ErsatzTV Image / CI image pin matches docker/ci (pull_request) Successful in 8s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 12s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 7m33s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 13m11s
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 14m45s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 18m31s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 36m5s
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 6s
The guide/EPG grid (/app/guide) and the channels list (/app/channels) always drew the generated initials "bug" because the browse DTOs never carried a logo URL — GuideScreen/ChannelsScreen rendered <ChannelLogo> with no src. The logo data existed (it round-trips through the channel editor) but never reached these views. Add a rooted, directly-usable Logo URL to ChannelGuideChannelResponseModel and ChannelResponseModel, populated by a single Channels.Mapper.GetLogoUrl helper (#181 artwork convention): /iptv/logos/{file} for an uploaded logo, the absolute URL passed through for an external one, null when unset so the SPA keeps its generated-initials fallback. The guide query now includes Channel.Artwork. Regenerated OpenAPI + v1.d.ts; updated api-conventions.md + domain-model.md. fixes #464 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.0 KiB
C#
29 lines
1.0 KiB
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,
|
|
// Rooted, directly-usable logo URL for the SPA's <img src>; null when the channel has no logo
|
|
// (SPA then renders the generated initials fallback). See ErsatzTV.Application Channels.Mapper.GetLogoUrl.
|
|
string? Logo,
|
|
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);
|