From 7a099f92ba05d321d9e3171cefbea8be25022c63 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 8 Jul 2014 22:53:04 -0400 Subject: [PATCH] redirect to item page when only one new item --- .../Playback/Hls/DynamicHlsService.cs | 4 +- .../BaseProgressiveStreamingService.cs | 12 +-- MediaBrowser.Dlna/PlayTo/PlayToController.cs | 4 +- .../Manager/MetadataService.cs | 55 ++++++++++---- .../TV/MovieDbEpisodeImageProvider.cs | 2 +- .../TV/MovieDbSeasonProvider.cs | 73 ++++++++++++------- 6 files changed, 93 insertions(+), 57 deletions(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 07aaf5f86c..6657bf6de1 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -55,8 +55,6 @@ namespace MediaBrowser.Api.Playback.Hls public object Get(GetMasterHlsVideoStream request) { - var result = GetAsync(request).Result; - if (string.Equals(request.AudioCodec, "copy", StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException("Audio codec copy is not allowed here."); @@ -67,6 +65,8 @@ namespace MediaBrowser.Api.Playback.Hls throw new ArgumentException("Video codec copy is not allowed here."); } + var result = GetAsync(request).Result; + return result; } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 79cf4170b2..dd89606492 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -123,14 +123,10 @@ namespace MediaBrowser.Api.Playback.Progressive { AddDlnaHeaders(state, responseHeaders, true); - try + using (state) { return GetStaticRemoteStreamResult(state, responseHeaders, isHeadRequest).Result; } - finally - { - state.Dispose(); - } } if (request.Static && state.InputProtocol != MediaProtocol.File) @@ -151,14 +147,10 @@ namespace MediaBrowser.Api.Playback.Progressive { var contentType = state.GetMimeType(state.MediaPath); - try + using (state) { return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, FileShare.Read, responseHeaders, isHeadRequest); } - finally - { - state.Dispose(); - } } // Not static but transcode cache file exists diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index 0bc9215081..34f657217c 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -734,7 +734,7 @@ namespace MediaBrowser.Dlna.PlayTo var info = StreamParams.ParseFromUrl(media.Url, _libraryManager); var progress = GetProgressInfo(media, info); - if (info.Item != null && !info.IsDirectStream) + if (info.Item != null) { var newPosition = progress.PositionTicks ?? 0; @@ -760,7 +760,7 @@ namespace MediaBrowser.Dlna.PlayTo var info = StreamParams.ParseFromUrl(media.Url, _libraryManager); var progress = GetProgressInfo(media, info); - if (info.Item != null && !info.IsDirectStream) + if (info.Item != null) { var newPosition = progress.PositionTicks ?? 0; diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 7feca2d349..91466c655e 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -295,11 +295,19 @@ namespace MediaBrowser.Providers.Manager var temp = CreateNew(); temp.Path = item.Path; + var successfulProviderCount = 0; + var failedProviderCount = 0; // If replacing all metadata, run internet providers first if (options.ReplaceAllMetadata) { - await ExecuteRemoteProviders(item, temp, id, providers.OfType>(), refreshResult, cancellationToken).ConfigureAwait(false); + var remoteResult = await ExecuteRemoteProviders(item, temp, id, providers.OfType>(), cancellationToken) + .ConfigureAwait(false); + refreshResult.UpdateType = refreshResult.UpdateType | remoteResult.UpdateType; + refreshResult.Status = remoteResult.Status; + refreshResult.ErrorMessage = remoteResult.ErrorMessage; + successfulProviderCount += remoteResult.Successes; + failedProviderCount += remoteResult.Failures; } var hasLocalMetadata = false; @@ -327,10 +335,11 @@ namespace MediaBrowser.Providers.Manager // Only one local provider allowed per item hasLocalMetadata = true; - item.IsUnidentified = false; + successfulProviderCount++; break; } + failedProviderCount++; Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name); } catch (OperationCanceledException) @@ -339,6 +348,8 @@ namespace MediaBrowser.Providers.Manager } catch (Exception ex) { + failedProviderCount++; + Logger.ErrorException("Error in {0}", ex, provider.Name); // If a local provider fails, consider that a failure @@ -356,7 +367,16 @@ namespace MediaBrowser.Providers.Manager // Local metadata is king - if any is found don't run remote providers if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh)) { - await ExecuteRemoteProviders(item, temp, id, providers.OfType>(), refreshResult, cancellationToken).ConfigureAwait(false); + var remoteResult = await ExecuteRemoteProviders(item, temp, id, providers.OfType>(), cancellationToken) + .ConfigureAwait(false); + + refreshResult.UpdateType = refreshResult.UpdateType | remoteResult.UpdateType; + if (remoteResult.Status != ProviderRefreshStatus.Success) + { + refreshResult.Status = remoteResult.Status; + refreshResult.ErrorMessage = remoteResult.ErrorMessage; + } + successfulProviderCount += remoteResult.Successes; } if (refreshResult.UpdateType > ItemUpdateType.None) @@ -364,6 +384,14 @@ namespace MediaBrowser.Providers.Manager MergeData(temp, item, item.LockedFields, true, true); } + var isUnidentified = failedProviderCount > 0 && successfulProviderCount == 0; + + if (item.IsUnidentified != isUnidentified) + { + item.IsUnidentified = isUnidentified; + refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport; + } + foreach (var provider in customProviders.Where(i => !(i is IPreRefreshProvider))) { await RunCustomProvider(provider, item, options, refreshResult, cancellationToken).ConfigureAwait(false); @@ -397,10 +425,9 @@ namespace MediaBrowser.Providers.Manager return new TItemType(); } - private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, TIdType id, IEnumerable> providers, RefreshResult refreshResult, CancellationToken cancellationToken) + private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, TIdType id, IEnumerable> providers, CancellationToken cancellationToken) { - var unidentifiedCount = 0; - var identifiedCount = 0; + var refreshResult = new RefreshResult(); foreach (var provider in providers) { @@ -422,11 +449,11 @@ namespace MediaBrowser.Providers.Manager refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; - identifiedCount++; + refreshResult.Successes++; } else { - unidentifiedCount++; + refreshResult.Failures++; Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name); } } @@ -436,20 +463,14 @@ namespace MediaBrowser.Providers.Manager } catch (Exception ex) { - unidentifiedCount++; + refreshResult.Failures++; refreshResult.Status = ProviderRefreshStatus.CompletedWithErrors; refreshResult.ErrorMessage = ex.Message; Logger.ErrorException("Error in {0}", ex, provider.Name); } } - var isUnidentified = unidentifiedCount > 0 && identifiedCount == 0; - - if (item.IsUnidentified != isUnidentified) - { - item.IsUnidentified = isUnidentified; - refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport; - } + return refreshResult; } private async Task CreateInitialLookupInfo(TItemType item, CancellationToken cancellationToken) @@ -510,5 +531,7 @@ namespace MediaBrowser.Providers.Manager public ProviderRefreshStatus Status { get; set; } public string ErrorMessage { get; set; } public List Providers { get; set; } + public int Successes { get; set; } + public int Failures { get; set; } } } diff --git a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs index b3f62005b0..7979711ec0 100644 --- a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs @@ -19,7 +19,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.TV { - public class MovieDbEpisodeImageProvider/* : IRemoteImageProvider, IHasOrder*/ + public class MovieDbEpisodeImageProvider : IRemoteImageProvider, IHasOrder { private const string GetTvInfo3 = @"http://api.themoviedb.org/3/tv/{0}/season/{1}/episode/{2}?api_key={3}&append_to_response=images,external_ids,credits,videos"; private readonly IHttpClient _httpClient; diff --git a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs index 7748615a73..6b2c067329 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs @@ -5,6 +5,8 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Net; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using MediaBrowser.Providers.Movies; @@ -13,6 +15,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; @@ -26,14 +29,16 @@ namespace MediaBrowser.Providers.TV private readonly IJsonSerializer _jsonSerializer; private readonly IFileSystem _fileSystem; private readonly ILocalizationManager _localization; + private readonly ILogger _logger; - public MovieDbSeasonProvider(IHttpClient httpClient, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILocalizationManager localization, IJsonSerializer jsonSerializer) + public MovieDbSeasonProvider(IHttpClient httpClient, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILocalizationManager localization, IJsonSerializer jsonSerializer, ILogManager logManager) { _httpClient = httpClient; _configurationManager = configurationManager; _fileSystem = fileSystem; _localization = localization; _jsonSerializer = jsonSerializer; + _logger = logManager.GetLogger(GetType().Name); } public async Task> GetMetadata(SeasonInfo info, CancellationToken cancellationToken) @@ -43,42 +48,58 @@ namespace MediaBrowser.Providers.TV string seriesTmdbId; info.SeriesProviderIds.TryGetValue(MetadataProviders.Tmdb.ToString(), out seriesTmdbId); - if (!string.IsNullOrWhiteSpace(seriesTmdbId) && info.IndexNumber.HasValue) + var seasonNumber = info.IndexNumber; + + if (!string.IsNullOrWhiteSpace(seriesTmdbId) && seasonNumber.HasValue) { result.HasMetadata = true; result.Item = new Season(); - var seasonInfo = await GetSeasonInfo(seriesTmdbId, info.IndexNumber.Value, info.MetadataLanguage, cancellationToken) - .ConfigureAwait(false); - - result.Item.Name = seasonInfo.name; - result.Item.Overview = seasonInfo.overview; - result.Item.IndexNumber = info.IndexNumber; - - if (seasonInfo.external_ids.tvdb_id > 0) + try { - result.Item.SetProviderId(MetadataProviders.Tvdb, seasonInfo.external_ids.tvdb_id.ToString(CultureInfo.InvariantCulture)); - } + var seasonInfo = await GetSeasonInfo(seriesTmdbId, seasonNumber.Value, info.MetadataLanguage, cancellationToken) + .ConfigureAwait(false); - var credits = seasonInfo.credits; - if (credits != null) - { - //Actors, Directors, Writers - all in People - //actors come from cast - if (credits.cast != null) + result.Item.Name = seasonInfo.name; + result.Item.Overview = seasonInfo.overview; + result.Item.IndexNumber = seasonNumber; + + if (seasonInfo.external_ids.tvdb_id > 0) { - //foreach (var actor in credits.cast.OrderBy(a => a.order)) result.Item.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + result.Item.SetProviderId(MetadataProviders.Tvdb, seasonInfo.external_ids.tvdb_id.ToString(CultureInfo.InvariantCulture)); } - //and the rest from crew - if (credits.crew != null) + var credits = seasonInfo.credits; + if (credits != null) { - //foreach (var person in credits.crew) result.Item.AddPerson(new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); - } - } + //Actors, Directors, Writers - all in People + //actors come from cast + if (credits.cast != null) + { + //foreach (var actor in credits.cast.OrderBy(a => a.order)) result.Item.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order }); + } - result.Item.PremiereDate = seasonInfo.air_date; - result.Item.ProductionYear = result.Item.PremiereDate.Value.Year; + //and the rest from crew + if (credits.crew != null) + { + //foreach (var person in credits.crew) result.Item.AddPerson(new PersonInfo { Name = person.name.Trim(), Role = person.job, Type = person.department }); + } + } + + result.Item.PremiereDate = seasonInfo.air_date; + result.Item.ProductionYear = result.Item.PremiereDate.Value.Year; + } + catch (HttpException ex) + { + _logger.Error("No metadata found for {0}", seasonNumber.Value); + + if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound) + { + return result; + } + + throw; + } } return result;