diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ecaa77c7..e3eebe7b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Fix updating (re-adding) Trakt lists to properly use new metadata ids that were not present when originally added +### Changed +- Use Poster artwork for XMLTV if available + - If Poster artwork is unavailable, use Thumbnail + ## [0.7.6-beta] - 2023-03-24 ### Added - Add `Troubleshooting` page with aggregated settings/hardware accel info for easy reference diff --git a/ErsatzTV.Core/Iptv/ChannelGuide.cs b/ErsatzTV.Core/Iptv/ChannelGuide.cs index 6b6251802..d22065649 100644 --- a/ErsatzTV.Core/Iptv/ChannelGuide.cs +++ b/ErsatzTV.Core/Iptv/ChannelGuide.cs @@ -257,15 +257,11 @@ public class ChannelGuide } } - string thumbnail = Optional(metadata.Artwork).Flatten() - .Filter(a => a.ArtworkKind == ArtworkKind.Thumbnail) - .HeadOrNone() - .Match(a => GetArtworkUrl(a, ArtworkKind.Thumbnail), () => string.Empty); - - if (!string.IsNullOrWhiteSpace(thumbnail)) + string artworkPath = GetPrioritizedArtworkPath(metadata); + if (!string.IsNullOrWhiteSpace(artworkPath)) { xml.WriteStartElement("icon"); - xml.WriteAttributeString("src", thumbnail); + xml.WriteAttributeString("src", artworkPath); xml.WriteEndElement(); // icon } } @@ -280,15 +276,11 @@ public class ChannelGuide foreach (SongMetadata metadata in song.SongMetadata.HeadOrNone()) { - string thumbnail = Optional(metadata.Artwork).Flatten() - .Filter(a => a.ArtworkKind == ArtworkKind.Thumbnail) - .HeadOrNone() - .Match(a => GetArtworkUrl(a, ArtworkKind.Thumbnail), () => string.Empty); - - if (!string.IsNullOrWhiteSpace(thumbnail)) + string artworkPath = GetPrioritizedArtworkPath(metadata); + if (!string.IsNullOrWhiteSpace(artworkPath)) { xml.WriteStartElement("icon"); - xml.WriteAttributeString("src", thumbnail); + xml.WriteAttributeString("src", artworkPath); xml.WriteEndElement(); // icon } } @@ -313,24 +305,11 @@ public class ChannelGuide xml.WriteEndElement(); // category } - string artwork = Optional(metadata.Artwork).Flatten() - .Filter(a => a.ArtworkKind == ArtworkKind.Thumbnail) - .HeadOrNone() - .Match(a => GetArtworkUrl(a, ArtworkKind.Thumbnail), () => string.Empty); - - // fall back to poster - if (string.IsNullOrWhiteSpace(artwork)) - { - artwork = Optional(metadata.Artwork).Flatten() - .Filter(a => a.ArtworkKind == ArtworkKind.Poster) - .HeadOrNone() - .Match(a => GetArtworkUrl(a, ArtworkKind.Poster), () => string.Empty); - } - - if (!string.IsNullOrWhiteSpace(artwork)) + string artworkPath = GetPrioritizedArtworkPath(metadata); + if (!string.IsNullOrWhiteSpace(artworkPath)) { xml.WriteStartElement("icon"); - xml.WriteAttributeString("src", artwork); + xml.WriteAttributeString("src", artworkPath); xml.WriteEndElement(); // icon } } @@ -534,4 +513,22 @@ public class ChannelGuide .ToList(); private record ContentRating(Option System, string Value); + + private string GetPrioritizedArtworkPath(Domain.Metadata metadata) + { + Option maybeArtwork = Optional(metadata.Artwork).Flatten() + .Filter(a => a.ArtworkKind == ArtworkKind.Poster) + .HeadOrNone() + .Map(a => GetArtworkUrl(a, ArtworkKind.Poster)); + + if (maybeArtwork.IsNone) + { + maybeArtwork = Optional(metadata.Artwork).Flatten() + .Filter(a => a.ArtworkKind == ArtworkKind.Thumbnail) + .HeadOrNone() + .Map(a => GetArtworkUrl(a, ArtworkKind.Thumbnail)); + } + + return maybeArtwork.IfNone(string.Empty); + } }