diff --git a/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs b/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs index 89d6f3a31..9a014aebd 100644 --- a/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs +++ b/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs @@ -117,6 +117,21 @@ namespace ErsatzTV.Infrastructure.Plex metadata.Artwork.Add(artwork); } + if (!string.IsNullOrWhiteSpace(response.Art)) + { + var path = $"plex/{mediaSourceId}{response.Art}"; + var artwork = new Artwork + { + ArtworkKind = ArtworkKind.FanArt, + Path = path, + DateAdded = dateAdded, + DateUpdated = lastWriteTime + }; + + metadata.Artwork ??= new List(); + metadata.Artwork.Add(artwork); + } + var version = new MediaVersion { Name = "Main", diff --git a/ErsatzTV/Controllers/ArtworkController.cs b/ErsatzTV/Controllers/ArtworkController.cs index e26ef4c51..cc000735d 100644 --- a/ErsatzTV/Controllers/ArtworkController.cs +++ b/ErsatzTV/Controllers/ArtworkController.cs @@ -73,6 +73,32 @@ namespace ErsatzTV.Controllers response.Content.Headers.ContentType?.MediaType ?? "image/jpeg"); }); } + + [HttpGet("/artwork/fanart/plex/{plexMediaSourceId}/{*path}")] + public async Task GetPlexFanArt(int plexMediaSourceId, string path) + { + Either connectionParameters = + await _mediator.Send(new GetPlexConnectionParameters(plexMediaSourceId)); + + return await connectionParameters.Match>( + Left: _ => new NotFoundResult().AsTask(), + Right: async r => + { + HttpClient client = _httpClientFactory.CreateClient(); + client.DefaultRequestHeaders.Add("X-Plex-Token", r.AuthToken); + + var transcodePath = $"/{path}"; + var fullPath = new Uri(r.Uri, transcodePath); + HttpResponseMessage response = await client.GetAsync( + fullPath, + HttpCompletionOption.ResponseHeadersRead); + Stream stream = await response.Content.ReadAsStreamAsync(); + + return new FileStreamResult( + stream, + response.Content.Headers.ContentType?.MediaType ?? "image/jpeg"); + }); + } [HttpGet("/artwork/thumbnails/{fileName}")] public async Task GetThumbnail(string fileName)