| 
					
				 | 
			
			
				@@ -40,7 +40,7 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// The movie db 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1,1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private readonly SemaphoreSlim _movieDbResourcePool = new SemaphoreSlim(1,1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         internal static MovieDbProvider Current { get; private set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -81,7 +81,7 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (dispose) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                MovieDbResourcePool.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _movieDbResourcePool.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -172,7 +172,7 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             get 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                LazyInitializer.EnsureInitialized(ref _tmdbSettingsTask, ref _tmdbSettingsTaskInitialized, ref _tmdbSettingsTaskSyncLock, () => GetTmdbSettings(JsonSerializer, HttpClient)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                LazyInitializer.EnsureInitialized(ref _tmdbSettingsTask, ref _tmdbSettingsTaskInitialized, ref _tmdbSettingsTaskSyncLock, () => GetTmdbSettings(JsonSerializer)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return _tmdbSettingsTask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -181,15 +181,14 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// Gets the TMDB settings. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <returns>Task{TmdbSettingsResult}.</returns> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private static async Task<TmdbSettingsResult> GetTmdbSettings(IJsonSerializer jsonSerializer, IHttpClient httpClient) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private async Task<TmdbSettingsResult> GetTmdbSettings(IJsonSerializer jsonSerializer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var json = await httpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                using (var json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     Url = string.Format(TmdbConfigUrl, ApiKey), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     CancellationToken = CancellationToken.None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -560,11 +559,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (Stream json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                using (Stream json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     Url = url3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -600,11 +598,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    using (var json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    using (var json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         Url = url3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -647,11 +644,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            using (var json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            using (var json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 Url = url3, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -737,11 +733,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    using (Stream json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    using (Stream json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         Url = url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -822,11 +817,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                using (var json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     Url = url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -863,11 +857,10 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        using (Stream json = await HttpClient.Get(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        using (Stream json = await GetMovieDbResponse(new HttpRequestOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             Url = url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             CancellationToken = cancellationToken, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            ResourcePool = Current.MovieDbResourcePool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             AcceptHeader = AcceptHeader, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             EnableResponseCache = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1022,6 +1015,38 @@ namespace MediaBrowser.Controller.Providers.Movies 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private DateTime _lastRequestDate = DateTime.MinValue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// Gets the movie db response. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        internal async Task<Stream> GetMovieDbResponse(HttpRequestOptions options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var cancellationToken = options.CancellationToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            await _movieDbResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Limit to three requests per second 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var diff = 330 - (DateTime.Now - _lastRequestDate).TotalMilliseconds; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (diff > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await Task.Delay(Convert.ToInt32(diff), cancellationToken).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _lastRequestDate = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return await HttpClient.Get(options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            finally 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _lastRequestDate = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                _movieDbResourcePool.Release(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// The remove 
			 |