public int? GetMetadataId(int sectionId, int tvdbId, string language, PlexServerSettings settings) { var guid = string.Format("com.plexapp.agents.thetvdb://{0}?lang={1}", tvdbId, language); var resource = string.Format("library/sections/{0}/all?guid={1}", sectionId, System.Web.HttpUtility.UrlEncode(guid)); var request = GetPlexServerRequest(resource, Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Sections response: {0}", response.Content); CheckForError(response, settings); List<PlexSectionItem> items; if (response.Content.Contains("_children")) { items = Json.Deserialize<PlexSectionResponseLegacy>(response.Content) .Items; } else { items = Json.Deserialize<PlexResponse<PlexSectionResponse>>(response.Content) .MediaContainer .Items; } if (items == null || items.Empty()) { return null; } return items.First().Id; }
public void UpdateLibrary(Series series, PlexServerSettings settings) { try { _logger.Debug("Sending Update Request to Plex Server"); var sections = GetSections(settings); var partialUpdates = _partialUpdateCache.Get(settings.Host, () => PartialUpdatesAllowed(settings), TimeSpan.FromHours(2)); if (partialUpdates) { UpdatePartialSection(series, sections, settings); } else { sections.ForEach(s => UpdateSection(s.Id, settings)); } } catch(Exception ex) { _logger.WarnException("Failed to Update Plex host: " + settings.Host, ex); throw; } }
private bool PartialUpdatesAllowed(PlexServerSettings settings) { try { var rawVersion = GetVersion(settings); var version = new Version(Regex.Match(rawVersion, @"^(\d+\.){4}").Value.Trim('.')); 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.WarnException("Unable to check if partial updates are allowed", ex); } return false; }
public void Update(int sectionId, PlexServerSettings settings) { var resource = String.Format("library/sections/{0}/refresh", sectionId); var request = GetPlexServerRequest(resource, Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); }
public void UpdateSeries(int metadataId, PlexServerSettings settings) { var resource = string.Format("library/metadata/{0}/refresh", metadataId); var request = GetPlexServerRequest(resource, Method.PUT, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Update Series response: {0}", response.Content); CheckForError(response, settings); }
public string Version(PlexServerSettings settings) { var request = GetPlexServerRequest("identity", Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Version response: {0}", response.Content); CheckForError(response, settings); return Json.Deserialize<PlexIdentity>(response.Content).Version; }
public void Update(int sectionId, PlexServerSettings settings) { var resource = String.Format("library/sections/{0}/refresh", sectionId); var request = GetPlexServerRequest(resource, Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); CheckForError(response.Content); _logger.Debug("Update response: {0}", response.Content); }
public List<PlexDirectory> GetTvSections(PlexServerSettings settings) { var request = GetPlexServerRequest("library/sections", Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); return Json.Deserialize<PlexMediaContainer>(response.Content) .Directories .Where(d => d.Type == "show") .ToList(); }
public int? GetMetadataId(int sectionId, int tvdbId, string language, PlexServerSettings settings) { var guid = String.Format("com.plexapp.agents.thetvdb://{0}?lang={1}", tvdbId, language); var resource = String.Format("library/sections/{0}/all?guid={1}", sectionId, System.Web.HttpUtility.UrlEncode(guid)); var request = GetPlexServerRequest(resource, Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Sections response: {0}", response.Content); CheckForError(response, settings); var item = Json.Deserialize<PlexSectionResponse>(response.Content) .Items .FirstOrDefault(); if (item == null) { return null; } return item.Id; }
public ValidationFailure Test(PlexServerSettings settings) { try { var sections = GetSections(settings); if (sections.Empty()) { return new ValidationFailure("Host", "At least one TV library is required"); } } catch(PlexAuthenticationException ex) { _logger.ErrorException("Unable to connect to Plex Server: " + ex.Message, ex); return new ValidationFailure("Username", "Incorrect username or password"); } catch (Exception ex) { _logger.ErrorException("Unable to connect to Plex Server: " + ex.Message, ex); return new ValidationFailure("Host", "Unable to connect to Plex Server"); } return null; }
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; }
public ValidationFailure Test(PlexServerSettings settings) { try { if (!GetSectionKeys(new PlexServerSettings { Host = settings.Host, Port = settings.Port, Username = settings.Username, Password = settings.Password }).Any()) { throw new Exception("Unable to connect to Plex Server"); } } catch (Exception ex) { _logger.ErrorException("Unable to connect to Plex Server: " + ex.Message, ex); return new ValidationFailure("Host", "Unable to connect to Plex Server"); } return null; }
public ValidationFailure Test(PlexServerSettings settings) { try { var sections = GetSectionKeys(new PlexServerSettings { Host = settings.Host, Port = settings.Port, Username = settings.Username, Password = settings.Password }); if (sections.Empty()) { return new ValidationFailure("Host", "At least one TV library is required"); } } catch (Exception ex) { _logger.ErrorException("Unable to connect to Plex Server: " + ex.Message, ex); return new ValidationFailure("Host", "Unable to connect to Plex Server"); } return null; }
private RestClient GetPlexServerClient(PlexServerSettings settings) { return RestClientFactory.BuildClient(String.Format("http://{0}:{1}", settings.Host, settings.Port)); }
private RestRequest GetPlexServerRequest(string resource, Method method, PlexServerSettings settings) { var request = new RestRequest(resource, method); request.AddHeader("Accept", "application/json"); if (settings.Username.IsNotNullOrWhiteSpace()) { request.AddParameter("X-Plex-Token", GetAuthenticationToken(settings), ParameterType.HttpHeader); } return request; }
private string GetAuthenticationToken(PlexServerSettings settings) { var token = _authCache.Get(settings.Username + settings.Password, () => Authenticate(settings)); if (token.IsNullOrWhiteSpace()) { throw new PlexAuthenticationException("Invalid Token - Update your username and password"); } return token; }
private string GetVersion(PlexServerSettings settings) { _logger.Debug("Getting version from Plex host: {0}", settings.Host); return _plexServerProxy.Version(settings); }
public List<PlexPreference> Preferences(PlexServerSettings settings) { var request = GetPlexServerRequest(":/prefs", Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Preferences response: {0}", response.Content); CheckForError(response, settings); if (response.Content.Contains("_children")) { return Json.Deserialize<PlexPreferencesLegacy>(response.Content) .Preferences; } return Json.Deserialize<PlexResponse<PlexPreferences>>(response.Content) .MediaContainer .Preferences; }
public List<PlexSection> GetTvSections(PlexServerSettings settings) { var request = GetPlexServerRequest("library/sections", Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Sections response: {0}", response.Content); CheckForError(response, settings); if (response.Content.Contains("_children")) { return Json.Deserialize<PlexMediaContainerLegacy>(response.Content) .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.Content) .MediaContainer .Sections .Where(d => d.Type == "show") .ToList(); }
private int? 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); }
private void 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.HasValue) { _logger.Debug("Updating Plex host: {0}, Section: {1}, Series: {2}", settings.Host, section.Id, series); _plexServerProxy.UpdateSeries(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 TV sections"); sections.ForEach(s => UpdateSection(s.Id, settings)); } }
private List<PlexPreference> GetPreferences(PlexServerSettings settings) { _logger.Debug("Getting preferences from Plex host: {0}", settings.Host); return _plexServerProxy.Preferences(settings); }
private void UpdateSeries(int sectionId, Series series, string language, PlexServerSettings settings) { _logger.Debug("Updating Plex host: {0}, Section: {1}, Series: {2}", settings.Host, sectionId, series); var metadataId = GetMetadataId(sectionId, series, language, settings); if (metadataId.HasValue) { _plexServerProxy.UpdateSeries(metadataId.Value, settings); } else { UpdateSection(sectionId, settings); } }
private string Authenticate(PlexServerSettings settings) { var request = GetPlexTvRequest("users/sign_in.json", Method.POST); var client = GetPlexTvClient(settings.Username, settings.Password); var response = client.Execute(request); _logger.Debug("Authentication Response: {0}", response.Content); CheckForError(response, settings); var user = Json.Deserialize<PlexUser>(JObject.Parse(response.Content).SelectToken("user").ToString()); return user.AuthenticationToken; }
private void CheckForError(IRestResponse response, PlexServerSettings settings) { _logger.Trace("Checking for error"); if (response.StatusCode == HttpStatusCode.Unauthorized) { if (settings.Username.IsNullOrWhiteSpace()) { throw new PlexAuthenticationException("Unauthorized - Username and password required"); } //Set the token to null in the cache so we don't keep trying with bad credentials _authCache.Set(settings.Username + settings.Password, null); throw new PlexAuthenticationException("Unauthorized - Username or password is incorrect"); } var error = Json.Deserialize<PlexError>(response.Content); if (error != null && !error.Error.IsNullOrWhiteSpace()) { throw new PlexException(error.Error); } _logger.Trace("No error detected"); }
public void UpdateLibrary(PlexServerSettings settings) { try { _logger.Debug("Sending Update Request to Plex Server"); var sections = GetSectionKeys(settings); sections.ForEach(s => UpdateSection(s, settings)); } catch(Exception ex) { _logger.WarnException("Failed to Update Plex host: " + settings.Host, ex); throw; } }
private RestClient GetPlexServerClient(PlexServerSettings settings) { var protocol = settings.UseSsl ? "https" : "http"; return RestClientFactory.BuildClient(string.Format("{0}://{1}:{2}", protocol, settings.Host, settings.Port)); }
private List<int> GetSectionKeys(PlexServerSettings settings) { _logger.Debug("Getting sections from Plex host: {0}", settings.Host); return _plexServerProxy.GetTvSections(settings).Select(s => s.Key).ToList(); }
public List<PlexPreference> Preferences(PlexServerSettings settings) { var request = GetPlexServerRequest(":/prefs", Method.GET, settings); var client = GetPlexServerClient(settings); var response = client.Execute(request); _logger.Trace("Preferences response: {0}", response.Content); CheckForError(response, settings); return Json.Deserialize<PlexPreferences>(response.Content).Preferences; }
private void UpdateSection(int key, PlexServerSettings settings) { _logger.Debug("Updating Plex host: {0}, Section: {1}", settings.Host, key); _plexServerProxy.Update(key, settings); }