From 87598ca6d064aa7d3f20ef7ee564aab31f2cb53e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 4 May 2013 00:07:27 -0400 Subject: [PATCH 1/3] add customizable accept header to http client interface --- .../HttpClientManager/HttpClientManager.cs | 106 ++++++++++++------ MediaBrowser.Common/Net/HttpRequestOptions.cs | 6 + MediaBrowser.Common/Net/IHttpClient.cs | 9 +- 3 files changed, 83 insertions(+), 38 deletions(-) diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index dd02bdc092..87922f60a3 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -107,14 +107,13 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager /// /// Performs a GET request and returns the resulting stream /// - /// The URL. - /// The resource pool. - /// The cancellation token. + /// The options. /// Task{Stream}. + /// /// - public async Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + public async Task Get(HttpRequestOptions options) { - ValidateParams(url, cancellationToken); + ValidateParams(options.Url, options.CancellationToken); //var urlHash = url.GetMD5().ToString(); //var infoPath = _cacheRepository.GetResourcePath(urlHash + ".js"); @@ -136,9 +135,9 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager // return GetCachedResponse(responsePath); //} - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); - var message = new HttpRequestMessage(HttpMethod.Get, url); + var message = GetHttpRequestMessage(options); //if (cachedInfo != null) //{ @@ -152,22 +151,22 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager // } //} - if (resourcePool != null) + if (options.ResourcePool != null) { - await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false); } - _logger.Info("HttpClientManager.Get url: {0}", url); + _logger.Info("HttpClientManager.Get url: {0}", options.Url); try { - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); - var response = await GetHttpClient(GetHostFromUrl(url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false); EnsureSuccessStatusCode(response); - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); //cachedInfo = UpdateInfoCache(cachedInfo, url, infoPath, response); @@ -187,29 +186,58 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager } catch (OperationCanceledException ex) { - throw GetCancellationException(url, cancellationToken, ex); + throw GetCancellationException(options.Url, options.CancellationToken, ex); } catch (HttpRequestException ex) { - _logger.ErrorException("Error getting response from " + url, ex); + _logger.ErrorException("Error getting response from " + options.Url, ex); throw new HttpException(ex.Message, ex); } catch (Exception ex) { - _logger.ErrorException("Error getting response from " + url, ex); + _logger.ErrorException("Error getting response from " + options.Url, ex); throw; } finally { - if (resourcePool != null) + if (options.ResourcePool != null) { - resourcePool.Release(); + options.ResourcePool.Release(); } } } + /// + /// Performs a GET request and returns the resulting stream + /// + /// The URL. + /// The resource pool. + /// The cancellation token. + /// Task{Stream}. + public Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + { + return Get(new HttpRequestOptions + { + Url = url, + ResourcePool = resourcePool, + CancellationToken = cancellationToken, + }); + } + + /// + /// Gets the specified URL. + /// + /// The URL. + /// The cancellation token. + /// Task{Stream}. + public Task Get(string url, CancellationToken cancellationToken) + { + return Get(url, null, cancellationToken); + } + + /// /// Gets the cached response. /// @@ -393,13 +421,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager options.CancellationToken.ThrowIfCancellationRequested(); - var message = new HttpRequestMessage(HttpMethod.Get, options.Url); - - if (!string.IsNullOrEmpty(options.UserAgent)) - { - message.Headers.Add("User-Agent", options.UserAgent); - } - if (options.ResourcePool != null) { await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false); @@ -413,7 +434,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager { options.CancellationToken.ThrowIfCancellationRequested(); - using (var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false)) + using (var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(GetHttpRequestMessage(options), HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false)) { EnsureSuccessStatusCode(response); @@ -463,6 +484,28 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager return tempFile; } + /// + /// Gets the message. + /// + /// The options. + /// HttpResponseMessage. + private HttpRequestMessage GetHttpRequestMessage(HttpRequestOptions options) + { + var message = new HttpRequestMessage(HttpMethod.Get, options.Url); + + if (!string.IsNullOrEmpty(options.UserAgent)) + { + message.Headers.Add("User-Agent", options.UserAgent); + } + + if (!string.IsNullOrEmpty(options.AcceptHeader)) + { + message.Headers.Add("Accept", options.AcceptHeader); + } + + return message; + } + /// /// Gets the length of the content. /// @@ -616,17 +659,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager } } - /// - /// Gets the specified URL. - /// - /// The URL. - /// The cancellation token. - /// Task{Stream}. - public Task Get(string url, CancellationToken cancellationToken) - { - return Get(url, null, cancellationToken); - } - /// /// Posts the specified URL. /// diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index 98d02a9f99..77cb8b3df1 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -14,6 +14,12 @@ namespace MediaBrowser.Common.Net /// The URL. public string Url { get; set; } + /// + /// Gets or sets the accept header. + /// + /// The accept header. + public string AcceptHeader { get; set; } + /// /// Gets or sets the cancellation token. /// diff --git a/MediaBrowser.Common/Net/IHttpClient.cs b/MediaBrowser.Common/Net/IHttpClient.cs index 87f9b5d712..2998d1af9b 100644 --- a/MediaBrowser.Common/Net/IHttpClient.cs +++ b/MediaBrowser.Common/Net/IHttpClient.cs @@ -28,7 +28,14 @@ namespace MediaBrowser.Common.Net /// The cancellation token. /// Task{Stream}. Task Get(string url, CancellationToken cancellationToken); - + + /// + /// Gets the specified options. + /// + /// The options. + /// Task{Stream}. + Task Get(HttpRequestOptions options); + /// /// Performs a POST request /// From f80c827d7592d0ec69e08d995371c51f9f3c331a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 4 May 2013 00:15:39 -0400 Subject: [PATCH 2/3] set accept header for tmdb requests --- .../Providers/Movies/MovieDbProvider.cs | 93 ++++++++++++++++--- .../Providers/Movies/TmdbPersonProvider.cs | 27 +++++- 2 files changed, 106 insertions(+), 14 deletions(-) diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs index 6f096c668e..835b365414 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs @@ -161,7 +161,14 @@ namespace MediaBrowser.Controller.Providers.Movies { try { - using (var json = await httpClient.Get(String.Format(TmdbConfigUrl, ApiKey), Current.MovieDbResourcePool, CancellationToken.None).ConfigureAwait(false)) + using (var json = await httpClient.Get(new HttpRequestOptions + { + Url = string.Format(TmdbConfigUrl, ApiKey), + CancellationToken = CancellationToken.None, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { return jsonSerializer.DeserializeFromStream(json); } @@ -246,7 +253,8 @@ namespace MediaBrowser.Controller.Providers.Movies private const string CastInfo = @"http://api.themoviedb.org/3/movie/{0}/casts?api_key={1}"; private const string ReleaseInfo = @"http://api.themoviedb.org/3/movie/{0}/releases?api_key={1}"; private const string GetImages = @"http://api.themoviedb.org/3/{2}/{0}/images?api_key={1}"; - public static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669"; + internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669"; + internal static string AcceptHeader = "application/json,image/*"; static readonly Regex[] NameMatches = new[] { new Regex(@"(?.*)\((?\d{4})\)"), // matches "My Movie (2001)" and gives us the name and the year @@ -504,7 +512,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url3, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { searchResult = JsonSerializer.DeserializeFromStream(json); } @@ -536,7 +551,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (var json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (var json = await HttpClient.Get(new HttpRequestOptions + { + Url = url3, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { searchResult = JsonSerializer.DeserializeFromStream(json); } @@ -575,7 +597,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (var json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (var json = await HttpClient.Get(new HttpRequestOptions + { + Url = url3, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { var response = JsonSerializer.DeserializeFromStream(json); @@ -657,7 +686,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { var movieResult = JsonSerializer.DeserializeFromStream(json); @@ -758,7 +794,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (var json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (var json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { mainResult = JsonSerializer.DeserializeFromStream(json); } @@ -790,7 +833,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { mainResult = JsonSerializer.DeserializeFromStream(json); } @@ -826,7 +876,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { cast = JsonSerializer.DeserializeFromStream(json); } @@ -853,7 +910,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { releases = JsonSerializer.DeserializeFromStream(json); } @@ -882,7 +946,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = Current.MovieDbResourcePool, + AcceptHeader = AcceptHeader + + }).ConfigureAwait(false)) { images = JsonSerializer.DeserializeFromStream(json); } diff --git a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs index ac0bf99113..7aae0c0b95 100644 --- a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs @@ -163,7 +163,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = MovieDbProvider.Current.MovieDbResourcePool, + AcceptHeader = MovieDbProvider.AcceptHeader + + }).ConfigureAwait(false)) { searchResult = JsonSerializer.DeserializeFromStream(json); } @@ -189,7 +196,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = MovieDbProvider.Current.MovieDbResourcePool, + AcceptHeader = MovieDbProvider.AcceptHeader + + }).ConfigureAwait(false)) { if (json != null) { @@ -267,7 +281,14 @@ namespace MediaBrowser.Controller.Providers.Movies try { - using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false)) + using (Stream json = await HttpClient.Get(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + ResourcePool = MovieDbProvider.Current.MovieDbResourcePool, + AcceptHeader = MovieDbProvider.AcceptHeader + + }).ConfigureAwait(false)) { if (json != null) { From 4279ed529d625b0d5265a90932fbdc10fce42830 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 4 May 2013 00:38:38 -0400 Subject: [PATCH 3/3] improved item by name displays --- MediaBrowser.Api/UserLibrary/PersonsService.cs | 2 +- MediaBrowser.Model/Dto/ItemByNameCounts.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index ee16a986e2..837e56384d 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -163,7 +163,7 @@ namespace MediaBrowser.Api.UserLibrary AlbumCount = items.OfType().Count(), - EpisodeGuestStarCount = items.OfType().Count(i => i.People.Any(p => string.Equals(p.Name, request.Name, StringComparison.OrdinalIgnoreCase) && string.Equals(p.Type, PersonType.GuestStar))) + EpisodeCount = items.OfType().Count() }; return ToOptimizedResult(counts); diff --git a/MediaBrowser.Model/Dto/ItemByNameCounts.cs b/MediaBrowser.Model/Dto/ItemByNameCounts.cs index b650eb5661..ec8e0e95f9 100644 --- a/MediaBrowser.Model/Dto/ItemByNameCounts.cs +++ b/MediaBrowser.Model/Dto/ItemByNameCounts.cs @@ -22,10 +22,10 @@ namespace MediaBrowser.Model.Dto /// The series count. public int SeriesCount { get; set; } /// - /// Gets or sets the episode guest star count. + /// Gets or sets the episode count. /// - /// The episode guest star count. - public int EpisodeGuestStarCount { get; set; } + /// The episode count. + public int EpisodeCount { get; set; } /// /// Gets or sets the game count. ///