redirect to item page when only one new item

This commit is contained in:
Luke Pulverenti 2014-07-08 22:53:04 -04:00
parent 651d483dec
commit 7a099f92ba
6 changed files with 93 additions and 57 deletions

View file

@ -55,8 +55,6 @@ namespace MediaBrowser.Api.Playback.Hls
public object Get(GetMasterHlsVideoStream request) public object Get(GetMasterHlsVideoStream request)
{ {
var result = GetAsync(request).Result;
if (string.Equals(request.AudioCodec, "copy", StringComparison.OrdinalIgnoreCase)) if (string.Equals(request.AudioCodec, "copy", StringComparison.OrdinalIgnoreCase))
{ {
throw new ArgumentException("Audio codec copy is not allowed here."); 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."); throw new ArgumentException("Video codec copy is not allowed here.");
} }
var result = GetAsync(request).Result;
return result; return result;
} }

View file

@ -123,14 +123,10 @@ namespace MediaBrowser.Api.Playback.Progressive
{ {
AddDlnaHeaders(state, responseHeaders, true); AddDlnaHeaders(state, responseHeaders, true);
try using (state)
{ {
return GetStaticRemoteStreamResult(state, responseHeaders, isHeadRequest).Result; return GetStaticRemoteStreamResult(state, responseHeaders, isHeadRequest).Result;
} }
finally
{
state.Dispose();
}
} }
if (request.Static && state.InputProtocol != MediaProtocol.File) if (request.Static && state.InputProtocol != MediaProtocol.File)
@ -151,14 +147,10 @@ namespace MediaBrowser.Api.Playback.Progressive
{ {
var contentType = state.GetMimeType(state.MediaPath); var contentType = state.GetMimeType(state.MediaPath);
try using (state)
{ {
return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, FileShare.Read, responseHeaders, isHeadRequest); return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, FileShare.Read, responseHeaders, isHeadRequest);
} }
finally
{
state.Dispose();
}
} }
// Not static but transcode cache file exists // Not static but transcode cache file exists

View file

@ -734,7 +734,7 @@ namespace MediaBrowser.Dlna.PlayTo
var info = StreamParams.ParseFromUrl(media.Url, _libraryManager); var info = StreamParams.ParseFromUrl(media.Url, _libraryManager);
var progress = GetProgressInfo(media, info); var progress = GetProgressInfo(media, info);
if (info.Item != null && !info.IsDirectStream) if (info.Item != null)
{ {
var newPosition = progress.PositionTicks ?? 0; var newPosition = progress.PositionTicks ?? 0;
@ -760,7 +760,7 @@ namespace MediaBrowser.Dlna.PlayTo
var info = StreamParams.ParseFromUrl(media.Url, _libraryManager); var info = StreamParams.ParseFromUrl(media.Url, _libraryManager);
var progress = GetProgressInfo(media, info); var progress = GetProgressInfo(media, info);
if (info.Item != null && !info.IsDirectStream) if (info.Item != null)
{ {
var newPosition = progress.PositionTicks ?? 0; var newPosition = progress.PositionTicks ?? 0;

View file

@ -295,11 +295,19 @@ namespace MediaBrowser.Providers.Manager
var temp = CreateNew(); var temp = CreateNew();
temp.Path = item.Path; temp.Path = item.Path;
var successfulProviderCount = 0;
var failedProviderCount = 0;
// If replacing all metadata, run internet providers first // If replacing all metadata, run internet providers first
if (options.ReplaceAllMetadata) if (options.ReplaceAllMetadata)
{ {
await ExecuteRemoteProviders(item, temp, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false); var remoteResult = await ExecuteRemoteProviders(item, temp, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), 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; var hasLocalMetadata = false;
@ -327,10 +335,11 @@ namespace MediaBrowser.Providers.Manager
// Only one local provider allowed per item // Only one local provider allowed per item
hasLocalMetadata = true; hasLocalMetadata = true;
item.IsUnidentified = false; successfulProviderCount++;
break; break;
} }
failedProviderCount++;
Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name); Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
@ -339,6 +348,8 @@ namespace MediaBrowser.Providers.Manager
} }
catch (Exception ex) catch (Exception ex)
{ {
failedProviderCount++;
Logger.ErrorException("Error in {0}", ex, provider.Name); Logger.ErrorException("Error in {0}", ex, provider.Name);
// If a local provider fails, consider that a failure // 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 // Local metadata is king - if any is found don't run remote providers
if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh)) if (!options.ReplaceAllMetadata && (!hasLocalMetadata || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh))
{ {
await ExecuteRemoteProviders(item, temp, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false); var remoteResult = await ExecuteRemoteProviders(item, temp, id, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), 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) if (refreshResult.UpdateType > ItemUpdateType.None)
@ -364,6 +384,14 @@ namespace MediaBrowser.Providers.Manager
MergeData(temp, item, item.LockedFields, true, true); 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))) foreach (var provider in customProviders.Where(i => !(i is IPreRefreshProvider)))
{ {
await RunCustomProvider(provider, item, options, refreshResult, cancellationToken).ConfigureAwait(false); await RunCustomProvider(provider, item, options, refreshResult, cancellationToken).ConfigureAwait(false);
@ -397,10 +425,9 @@ namespace MediaBrowser.Providers.Manager
return new TItemType(); return new TItemType();
} }
private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, RefreshResult refreshResult, CancellationToken cancellationToken) private async Task<RefreshResult> ExecuteRemoteProviders(TItemType item, TItemType temp, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken)
{ {
var unidentifiedCount = 0; var refreshResult = new RefreshResult();
var identifiedCount = 0;
foreach (var provider in providers) foreach (var provider in providers)
{ {
@ -422,11 +449,11 @@ namespace MediaBrowser.Providers.Manager
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload;
identifiedCount++; refreshResult.Successes++;
} }
else else
{ {
unidentifiedCount++; refreshResult.Failures++;
Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name); Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name);
} }
} }
@ -436,20 +463,14 @@ namespace MediaBrowser.Providers.Manager
} }
catch (Exception ex) catch (Exception ex)
{ {
unidentifiedCount++; refreshResult.Failures++;
refreshResult.Status = ProviderRefreshStatus.CompletedWithErrors; refreshResult.Status = ProviderRefreshStatus.CompletedWithErrors;
refreshResult.ErrorMessage = ex.Message; refreshResult.ErrorMessage = ex.Message;
Logger.ErrorException("Error in {0}", ex, provider.Name); Logger.ErrorException("Error in {0}", ex, provider.Name);
} }
} }
var isUnidentified = unidentifiedCount > 0 && identifiedCount == 0; return refreshResult;
if (item.IsUnidentified != isUnidentified)
{
item.IsUnidentified = isUnidentified;
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport;
}
} }
private async Task<TIdType> CreateInitialLookupInfo(TItemType item, CancellationToken cancellationToken) private async Task<TIdType> CreateInitialLookupInfo(TItemType item, CancellationToken cancellationToken)
@ -510,5 +531,7 @@ namespace MediaBrowser.Providers.Manager
public ProviderRefreshStatus Status { get; set; } public ProviderRefreshStatus Status { get; set; }
public string ErrorMessage { get; set; } public string ErrorMessage { get; set; }
public List<Guid> Providers { get; set; } public List<Guid> Providers { get; set; }
public int Successes { get; set; }
public int Failures { get; set; }
} }
} }

View file

@ -19,7 +19,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV 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 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; private readonly IHttpClient _httpClient;

View file

@ -5,6 +5,8 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Providers; using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
using MediaBrowser.Providers.Movies; using MediaBrowser.Providers.Movies;
@ -13,6 +15,7 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -26,14 +29,16 @@ namespace MediaBrowser.Providers.TV
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILocalizationManager _localization; 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; _httpClient = httpClient;
_configurationManager = configurationManager; _configurationManager = configurationManager;
_fileSystem = fileSystem; _fileSystem = fileSystem;
_localization = localization; _localization = localization;
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
_logger = logManager.GetLogger(GetType().Name);
} }
public async Task<MetadataResult<Season>> GetMetadata(SeasonInfo info, CancellationToken cancellationToken) public async Task<MetadataResult<Season>> GetMetadata(SeasonInfo info, CancellationToken cancellationToken)
@ -43,42 +48,58 @@ namespace MediaBrowser.Providers.TV
string seriesTmdbId; string seriesTmdbId;
info.SeriesProviderIds.TryGetValue(MetadataProviders.Tmdb.ToString(), out 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.HasMetadata = true;
result.Item = new Season(); result.Item = new Season();
var seasonInfo = await GetSeasonInfo(seriesTmdbId, info.IndexNumber.Value, info.MetadataLanguage, cancellationToken) try
.ConfigureAwait(false);
result.Item.Name = seasonInfo.name;
result.Item.Overview = seasonInfo.overview;
result.Item.IndexNumber = info.IndexNumber;
if (seasonInfo.external_ids.tvdb_id > 0)
{ {
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; result.Item.Name = seasonInfo.name;
if (credits != null) result.Item.Overview = seasonInfo.overview;
{ result.Item.IndexNumber = seasonNumber;
//Actors, Directors, Writers - all in People
//actors come from cast if (seasonInfo.external_ids.tvdb_id > 0)
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.SetProviderId(MetadataProviders.Tvdb, seasonInfo.external_ids.tvdb_id.ToString(CultureInfo.InvariantCulture));
} }
//and the rest from crew var credits = seasonInfo.credits;
if (credits.crew != null) 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; //and the rest from crew
result.Item.ProductionYear = result.Item.PremiereDate.Value.Year; 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; return result;