Ejemplo n.º 1
0
        public int?GetMetadataId(int sectionId, int tvdbId, string language, PlexServerSettings settings)
        {
            var guid     = $"com.plexapp.agents.thetvdb://{tvdbId}?lang={language}";
            var resource = $"library/sections/{sectionId}/all?guid={System.Web.HttpUtility.UrlEncode(guid)}";
            var request  = BuildRequest(resource, HttpMethod.GET, settings);
            var response = ProcessRequest(request);

            CheckForError(response);

            List <PlexSectionItem> items;

            if (response.Contains("_children"))
            {
                items = Json.Deserialize <PlexSectionResponseLegacy>(response)
                        .Items;
            }

            else
            {
                items = Json.Deserialize <PlexResponse <PlexSectionResponse> >(response)
                        .MediaContainer
                        .Items;
            }

            if (items == null || items.Empty())
            {
                return(null);
            }

            return(items.First().Id);
        }
Ejemplo n.º 2
0
        public List <PlexSection> GetTvSections(PlexServerSettings settings)
        {
            var request  = BuildRequest("library/sections", HttpMethod.GET, settings);
            var response = ProcessRequest(request);

            CheckForError(response);

            if (response.Contains("_children"))
            {
                return(Json.Deserialize <PlexMediaContainerLegacy>(response)
                       .Sections
                       .Where(d => d.Type == "show")
                       .Select(s => new PlexSection
                {
                    Id = s.Id,
                    Language = s.Language,
                    Locations = s.Locations,
                    Type = s.Type
                })
                       .ToList());
            }

            return(Json.Deserialize <PlexResponse <PlexSectionsContainer> >(response)
                   .MediaContainer
                   .Sections
                   .Where(d => d.Type == "show")
                   .ToList());
        }
Ejemplo n.º 3
0
        public void UpdateLibrary(Artist artist, PlexServerSettings settings)
        {
            try
            {
                _logger.Debug("Sending Update Request to Plex Server");

                var version = _versionCache.Get(settings.Host, () => GetVersion(settings), TimeSpan.FromHours(2));
                ValidateVersion(version);

                var sections       = GetSections(settings);
                var partialUpdates = _partialUpdateCache.Get(settings.Host, () => PartialUpdatesAllowed(settings, version), TimeSpan.FromHours(2));

                if (partialUpdates)
                {
                    UpdatePartialSection(artist, sections, settings);
                }

                else
                {
                    sections.ForEach(s => UpdateSection(s.Id, settings));
                }
            }

            catch (Exception ex)
            {
                _logger.Warn(ex, "Failed to Update Plex host: " + settings.Host);
                throw;
            }
        }
Ejemplo n.º 4
0
        public ValidationFailure Test(PlexServerSettings settings)
        {
            try
            {
                _versionCache.Remove(settings.Host);
                _partialUpdateCache.Remove(settings.Host);
                var sections = GetSections(settings);

                if (sections.Empty())
                {
                    return(new ValidationFailure("Host", "At least one TV library is required"));
                }
            }
            catch (PlexAuthenticationException ex)
            {
                _logger.Error(ex, "Unable to connect to Plex Server");
                return(new ValidationFailure("AuthToken", "Invalid authentication token"));
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Unable to connect to Plex Server");
                return(new ValidationFailure("Host", "Unable to connect to Plex Server"));
            }

            return(null);
        }
Ejemplo n.º 5
0
        public void Update(int sectionId, PlexServerSettings settings)
        {
            var resource = $"library/sections/{sectionId}/refresh";
            var request  = BuildRequest(resource, HttpMethod.GET, settings);
            var response = ProcessRequest(request);

            CheckForError(response);
        }
Ejemplo n.º 6
0
        public void UpdateSeries(int metadataId, PlexServerSettings settings)
        {
            var resource = $"library/metadata/{metadataId}/refresh";
            var request  = BuildRequest(resource, HttpMethod.PUT, settings);
            var response = ProcessRequest(request);

            CheckForError(response);
        }
Ejemplo n.º 7
0
        private Version GetVersion(PlexServerSettings settings)
        {
            _logger.Debug("Getting version from Plex host: {0}", settings.Host);

            var rawVersion = _plexServerProxy.Version(settings);
            var version    = new Version(Regex.Match(rawVersion, @"^(\d+[.-]){4}").Value.Trim('.', '-'));

            return(version);
        }
Ejemplo n.º 8
0
        public void UpdateLibrary(IEnumerable <Series> multipleSeries, PlexServerSettings settings)
        {
            try
            {
                _logger.Debug("Sending Update Request to Plex Server");
                var watch = Stopwatch.StartNew();

                var version = _versionCache.Get(settings.Host, () => GetVersion(settings), TimeSpan.FromHours(2));
                ValidateVersion(version);

                var sections       = GetSections(settings);
                var partialUpdates = _partialUpdateCache.Get(settings.Host, () => PartialUpdatesAllowed(settings, version), TimeSpan.FromHours(2));

                if (partialUpdates)
                {
                    var partiallyUpdated = true;

                    foreach (var series in multipleSeries)
                    {
                        partiallyUpdated &= UpdatePartialSection(series, sections, settings);

                        if (!partiallyUpdated)
                        {
                            break;
                        }
                    }

                    // Only update complete sections if all partial updates failed
                    if (!partiallyUpdated)
                    {
                        _logger.Debug("Unable to update partial section, updating all TV sections");
                        sections.ForEach(s => UpdateSection(s.Id, settings));
                    }
                }
                else
                {
                    sections.ForEach(s => UpdateSection(s.Id, settings));
                }

                _logger.Debug("Finished sending Update Request to Plex Server (took {0} ms)", watch.ElapsedMilliseconds);
            }

            catch (Exception ex)
            {
                _logger.Warn(ex, "Failed to Update Plex host: " + settings.Host);
                throw;
            }
        }
Ejemplo n.º 9
0
        public List <PlexPreference> Preferences(PlexServerSettings settings)
        {
            var request  = BuildRequest(":/prefs", HttpMethod.GET, settings);
            var response = ProcessRequest(request);

            CheckForError(response);

            if (response.Contains("_children"))
            {
                return(Json.Deserialize <PlexPreferencesLegacy>(response)
                       .Preferences);
            }

            return(Json.Deserialize <PlexResponse <PlexPreferences> >(response)
                   .MediaContainer
                   .Preferences);
        }
Ejemplo n.º 10
0
        public string Version(PlexServerSettings settings)
        {
            var request  = BuildRequest("identity", HttpMethod.GET, settings);
            var response = ProcessRequest(request);

            CheckForError(response);

            if (response.Contains("_children"))
            {
                return(Json.Deserialize <PlexIdentity>(response)
                       .Version);
            }

            return(Json.Deserialize <PlexResponse <PlexIdentity> >(response)
                   .MediaContainer
                   .Version);
        }
Ejemplo n.º 11
0
        private bool UpdatePartialSection(Movie movie, List <PlexSection> sections, PlexServerSettings settings)
        {
            var partiallyUpdated = false;

            foreach (var section in sections)
            {
                var metadataId = GetMetadataId(section.Id, movie, section.Language, settings);

                if (metadataId.HasValue)
                {
                    _logger.Debug("Updating Plex host: {0}, Section: {1}, Movie: {2}", settings.Host, section.Id, movie);
                    _plexServerProxy.UpdateMovie(metadataId.Value, settings);

                    partiallyUpdated = true;
                }
            }

            return(partiallyUpdated);
        }
Ejemplo n.º 12
0
        private HttpRequestBuilder BuildRequest(string resource, HttpMethod method, PlexServerSettings settings)
        {
            var scheme         = settings.UseSsl ? "https" : "http";
            var requestBuilder = new HttpRequestBuilder($"{scheme}://{settings.Host}:{settings.Port}")
                                 .Accept(HttpAccept.Json)
                                 .AddQueryParam("X-Plex-Client-Identifier", _configService.PlexClientIdentifier)
                                 .AddQueryParam("X-Plex-Product", BuildInfo.AppName)
                                 .AddQueryParam("X-Plex-Platform", "Windows")
                                 .AddQueryParam("X-Plex-Platform-Version", "7")
                                 .AddQueryParam("X-Plex-Device-Name", BuildInfo.AppName)
                                 .AddQueryParam("X-Plex-Version", BuildInfo.Version.ToString());

            if (settings.AuthToken.IsNotNullOrWhiteSpace())
            {
                requestBuilder.AddQueryParam("X-Plex-Token", settings.AuthToken);
            }

            requestBuilder.ResourceUrl = resource;
            requestBuilder.Method      = method;

            return(requestBuilder);
        }
Ejemplo n.º 13
0
        private bool PartialUpdatesAllowed(PlexServerSettings settings, Version version)
        {
            try
            {
                if (version >= new Version(0, 9, 12, 0))
                {
                    var preferences           = GetPreferences(settings);
                    var partialScanPreference = preferences.SingleOrDefault(p => p.Id.Equals("FSEventLibraryPartialScanEnabled"));

                    if (partialScanPreference == null)
                    {
                        return(false);
                    }

                    return(Convert.ToBoolean(partialScanPreference.Value));
                }
            }
            catch (Exception ex)
            {
                _logger.Warn(ex, "Unable to check if partial updates are allowed");
            }

            return(false);
        }
Ejemplo n.º 14
0
        private void UpdatePartialSection(Artist artist, List <PlexSection> sections, PlexServerSettings settings)
        {
            var partiallyUpdated = false;

            foreach (var section in sections)
            {
                var metadataId = GetMetadataId(section.Id, artist, section.Language, settings);

                if (metadataId.HasValue)
                {
                    _logger.Debug("Updating Plex host: {0}, Section: {1}, Artist: {2}", settings.Host, section.Id, artist);
                    _plexServerProxy.UpdateArtist(metadataId.Value, settings);

                    partiallyUpdated = true;
                }
            }

            // Only update complete sections if all partial updates failed
            if (!partiallyUpdated)
            {
                _logger.Debug("Unable to update partial section, updating all Music sections");
                sections.ForEach(s => UpdateSection(s.Id, settings));
            }
        }
Ejemplo n.º 15
0
        private List <PlexSection> GetSections(PlexServerSettings settings)
        {
            _logger.Debug("Getting sections from Plex host: {0}", settings.Host);

            return(_plexServerProxy.GetTvSections(settings).ToList());
        }
Ejemplo n.º 16
0
        private int?GetMetadataId(int sectionId, Artist artist, string language, PlexServerSettings settings)
        {
            _logger.Debug("Getting metadata from Plex host: {0} for artist: {1}", settings.Host, artist);

            return(_plexServerProxy.GetMetadataId(sectionId, artist.Metadata.Value.ForeignArtistId, language, settings));
        }
Ejemplo n.º 17
0
 public void UpdateLibrary(Series series, PlexServerSettings settings)
 {
     UpdateLibrary(new[] { series }, settings);
 }
Ejemplo n.º 18
0
        private bool UpdatePartialSection(Series series, List <PlexSection> sections, PlexServerSettings settings)
        {
            var partiallyUpdated = false;

            foreach (var section in sections)
            {
                var metadataId = GetMetadataId(section.Id, series, section.Language, settings);

                if (metadataId.IsNotNullOrWhiteSpace())
                {
                    _logger.Debug("Updating Plex host: {0}, Section: {1}, Series: {2}", settings.Host, section.Id, series);
                    _plexServerProxy.UpdateSeries(metadataId, settings);

                    partiallyUpdated = true;
                }
            }

            return(partiallyUpdated);
        }
Ejemplo n.º 19
0
        private string GetMetadataId(int sectionId, Series series, string language, PlexServerSettings settings)
        {
            _logger.Debug("Getting metadata from Plex host: {0} for series: {1}", settings.Host, series);

            return(_plexServerProxy.GetMetadataId(sectionId, series.TvdbId, language, settings));
        }
Ejemplo n.º 20
0
        private void UpdateSection(int sectionId, PlexServerSettings settings)
        {
            _logger.Debug("Updating Plex host: {0}, Section: {1}", settings.Host, sectionId);

            _plexServerProxy.Update(sectionId, settings);
        }
Ejemplo n.º 21
0
        private List <PlexPreference> GetPreferences(PlexServerSettings settings)
        {
            _logger.Debug("Getting preferences from Plex host: {0}", settings.Host);

            return(_plexServerProxy.Preferences(settings));
        }
Ejemplo n.º 22
0
        private int?GetMetadataId(int sectionId, Movie movie, string language, PlexServerSettings settings)
        {
            _logger.Debug("Getting metadata from Plex host: {0} for movie: {1}", settings.Host, movie);

            return(_plexServerProxy.GetMetadataId(sectionId, movie.ImdbId, language, settings));
        }
Ejemplo n.º 23
0
 public void UpdateLibrary(Movie movie, PlexServerSettings settings)
 {
     UpdateLibrary(new[] { movie }, settings);
 }
Ejemplo n.º 24
0
 public void UpdateLibrary(Artist artist, PlexServerSettings settings)
 {
     UpdateLibrary(new[] { artist }, settings);
 }