/// <summary> /// Initializes a new instance of the <see cref="ServerConfiguration" /> class. /// </summary> public ServerConfiguration() { LocalNetworkAddresses = new string[] { }; Migrations = new string[] { }; SqliteCacheSize = 0; EnableLocalizedGuids = true; DisplaySpecialsWithinSeasons = true; ImageSavingConvention = ImageSavingConvention.Compatible; PublicPort = 8096; PublicHttpsPort = 8920; HttpServerPortNumber = 8096; HttpsPortNumber = 8920; EnableHttps = false; EnableDashboardResponseCaching = true; EnableDashboardResourceMinification = true; EnableAnonymousUsageReporting = true; EnableAutomaticRestart = true; EnableUPnP = true; SharingExpirationDays = 30; MinResumePct = 5; MaxResumePct = 90; // 5 minutes MinResumeDurationSeconds = 300; EnableLibraryMonitor = AutoOnOff.Auto; LibraryMonitorDelay = 60; EnableInternetProviders = true; FindInternetTrailers = true; PathSubstitutions = new PathSubstitution[] { }; ContentTypes = new NameValuePair[] { }; PreferredMetadataLanguage = "en"; MetadataCountryCode = "US"; SortReplaceCharacters = new[] { ".", "+", "%" }; SortRemoveCharacters = new[] { ",", "&", "-", "{", "}", "'" }; SortRemoveWords = new[] { "the", "a", "an" }; SeasonZeroDisplayName = "Specials"; UICulture = "en-us"; PeopleMetadataOptions = new PeopleMetadataOptions(); MetadataOptions = new[] { new MetadataOptions(1, 1280) {ItemType = "Book"}, new MetadataOptions(1, 1280) { ItemType = "Movie", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "MusicVideo", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "Series", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 1, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "MusicAlbum", ImageOptions = new [] { new ImageOption { Limit = 0, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc } } }, new MetadataOptions(1, 1280) { ItemType = "MusicArtist", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default // They do look great, but most artists won't have them, which means a banner view isn't really possible new ImageOption { Limit = 0, Type = ImageType.Banner }, // Don't download this by default // Generally not used new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default // Generally not used new ImageOption { Limit = 0, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "BoxSet", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Banner } } }, new MetadataOptions(0, 1280) { ItemType = "Season", ImageOptions = new [] { new ImageOption { Limit = 0, MinWidth = 1280, Type = ImageType.Backdrop }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 0, Type = ImageType.Thumb } }, DisabledMetadataFetchers = new []{ "The Open Movie Database", "TheMovieDb" } }, new MetadataOptions(0, 1280) { ItemType = "Episode", ImageOptions = new [] { new ImageOption { Limit = 0, MinWidth = 1280, Type = ImageType.Backdrop }, new ImageOption { Limit = 1, Type = ImageType.Primary } }, DisabledMetadataFetchers = new []{ "The Open Movie Database" }, DisabledImageFetchers = new []{ "TheMovieDb" } } }; }
private async Task<string> GetToken(ListingsProviderInfo info, CancellationToken cancellationToken) { var username = info.Username; // Reset the token if there's no username if (string.IsNullOrWhiteSpace(username)) { return null; } var password = info.Password; if (string.IsNullOrWhiteSpace(password)) { return null; } // Avoid hammering SD if ((DateTime.UtcNow - _lastErrorResponse).TotalMinutes < 1) { return null; } NameValuePair savedToken = null; if (!_tokens.TryGetValue(username, out savedToken)) { savedToken = new NameValuePair(); _tokens.TryAdd(username, savedToken); } if (!string.IsNullOrWhiteSpace(savedToken.Name) && !string.IsNullOrWhiteSpace(savedToken.Value)) { long ticks; if (long.TryParse(savedToken.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out ticks)) { // If it's under 24 hours old we can still use it if (DateTime.UtcNow.Ticks - ticks < TimeSpan.FromHours(20).Ticks) { return savedToken.Name; } } } await _tokenSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { var result = await GetTokenInternal(username, password, cancellationToken).ConfigureAwait(false); savedToken.Name = result; savedToken.Value = DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture); return result; } catch (HttpException ex) { if (ex.StatusCode.HasValue) { if ((int)ex.StatusCode.Value == 400) { _tokens.Clear(); _lastErrorResponse = DateTime.UtcNow; } } throw; } finally { _tokenSemaphore.Release(); } }
/// <summary> /// Initializes a new instance of the <see cref="ServerConfiguration" /> class. /// </summary> public ServerConfiguration() { ImageSavingConvention = ImageSavingConvention.Compatible; PublicPort = 8096; PublicHttpsPort = 8920; HttpServerPortNumber = 8096; HttpsPortNumber = 8920; EnableHttps = false; EnableDashboardResponseCaching = true; EnableDashboardResourceMinification = true; EnableAutomaticRestart = true; DenyIFrameEmbedding = true; EnableUPnP = true; SharingExpirationDays = 30; MinResumePct = 5; MaxResumePct = 90; // 5 minutes MinResumeDurationSeconds = 300; EnableLibraryMonitor = AutoOnOff.Auto; RealtimeLibraryMonitorDelay = 40; EnableInternetProviders = true; FindInternetTrailers = true; PathSubstitutions = new PathSubstitution[] { }; ContentTypes = new NameValuePair[] { }; PreferredMetadataLanguage = "en"; MetadataCountryCode = "US"; SortReplaceCharacters = new[] { ".", "+", "%" }; SortRemoveCharacters = new[] { ",", "&", "-", "{", "}", "'" }; SortRemoveWords = new[] { "the", "a", "an" }; SeasonZeroDisplayName = "Specials"; UICulture = "en-us"; PeopleMetadataOptions = new PeopleMetadataOptions(); EnableVideoFrameAnalysis = true; VideoFrameAnalysisLimitBytes = 600000000; InsecureApps9 = new[] { "Chromecast", "iOS", "Unknown app", "iPad", "iPhone", "Windows Phone" }; MetadataOptions = new[] { new MetadataOptions(1, 1280) {ItemType = "Book"}, new MetadataOptions(1, 1280) { ItemType = "Movie", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "MusicVideo", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "Series", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 1, Type = ImageType.Banner }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "MusicAlbum", ImageOptions = new [] { new ImageOption { Limit = 0, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc } } }, new MetadataOptions(1, 1280) { ItemType = "MusicArtist", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, // Don't download this by default // They do look great, but most artists won't have them, which means a banner view isn't really possible new ImageOption { Limit = 0, Type = ImageType.Banner }, // Don't download this by default // Generally not used new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default // Generally not used new ImageOption { Limit = 0, Type = ImageType.Logo } } }, new MetadataOptions(1, 1280) { ItemType = "BoxSet", ImageOptions = new [] { new ImageOption { Limit = 1, MinWidth = 1280, Type = ImageType.Backdrop }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 1, Type = ImageType.Thumb }, new ImageOption { Limit = 1, Type = ImageType.Logo }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Art }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Disc }, // Don't download this by default as it's rarely used. new ImageOption { Limit = 0, Type = ImageType.Banner } } }, new MetadataOptions(0, 1280) { ItemType = "Season", ImageOptions = new [] { new ImageOption { Limit = 0, MinWidth = 1280, Type = ImageType.Backdrop }, new ImageOption { Limit = 1, Type = ImageType.Primary }, new ImageOption { Limit = 0, Type = ImageType.Banner }, new ImageOption { Limit = 0, Type = ImageType.Thumb } } } }; }