From 9acfd2cd061544fc39212d1bc7939ded6513a078 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Fri, 3 Jun 2022 05:53:41 -0500 Subject: [PATCH] fix plex server identification (#833) --- CHANGELOG.md | 1 + .../Plex/IPlexServerApi.cs | 4 ++-- .../Plex/Models/PlexMediaContainerResponse.cs | 7 ++++++ .../Plex/PlexServerApiClient.cs | 22 +++++++++---------- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e3b62900..607469d52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Fixed - Fix Jellyfin show library paging +- Properly locate and identify multiple Plex servers ### Added - Add basic music video credits subtitle generation diff --git a/ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs b/ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs index 491e25cb0..17fb9d27a 100644 --- a/ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs +++ b/ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs @@ -6,8 +6,8 @@ namespace ErsatzTV.Infrastructure.Plex; public interface IPlexServerApi { [Get("/")] - [Headers("Accept: application/json")] - public Task Ping( + [Headers("Accept: text/xml")] + public Task Ping( [Query] [AliasAs("X-Plex-Token")] string token); diff --git a/ErsatzTV.Infrastructure/Plex/Models/PlexMediaContainerResponse.cs b/ErsatzTV.Infrastructure/Plex/Models/PlexMediaContainerResponse.cs index f3c662ddf..421080376 100644 --- a/ErsatzTV.Infrastructure/Plex/Models/PlexMediaContainerResponse.cs +++ b/ErsatzTV.Infrastructure/Plex/Models/PlexMediaContainerResponse.cs @@ -24,6 +24,13 @@ public class PlexXmlMediaContainerStatsResponse public int TotalSize { get; set; } } +[XmlRoot("MediaContainer", Namespace = null)] +public class PlexXmlMediaContainerPingResponse +{ + [XmlAttribute("machineIdentifier")] + public string MachineIdentifier { get; set; } +} + [XmlRoot("MediaContainer", Namespace = null)] public class PlexXmlVideoMetadataResponseContainer { diff --git a/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs b/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs index 43aae1ad3..272d21ed4 100644 --- a/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs +++ b/ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs @@ -30,15 +30,9 @@ public class PlexServerApiClient : IPlexServerApiClient { try { - IPlexServerApi service = RestService.For( - new HttpClient - { - BaseAddress = new Uri(connection.Uri), - Timeout = TimeSpan.FromSeconds(5) - }); - - await service.Ping(token.AuthToken); - return true; + IPlexServerApi service = XmlServiceFor(connection.Uri, TimeSpan.FromSeconds(5)); + PlexXmlMediaContainerPingResponse pingResult = await service.Ping(token.AuthToken); + return token.ClientIdentifier == pingResult.MachineIdentifier; } catch (Exception) { @@ -362,14 +356,20 @@ public class PlexServerApiClient : IPlexServerApiClient return result.Values.ToList(); } - private static IPlexServerApi XmlServiceFor(string uri) + private static IPlexServerApi XmlServiceFor(string uri, TimeSpan? timeout = null) { var overrides = new XmlAttributeOverrides(); var attrs = new XmlAttributes { XmlIgnore = true }; overrides.Add(typeof(PlexMetadataResponse), "Media", attrs); + TimeSpan httpClientTimeout = timeout ?? TimeSpan.FromSeconds(30); + return RestService.For( - uri, + new HttpClient + { + BaseAddress = new Uri(uri), + Timeout = httpClientTimeout + }, new RefitSettings { ContentSerializer = new XmlContentSerializer(