diff options
| -rw-r--r-- | MediaBrowser.Api/ItemLookupService.cs | 41 | ||||
| -rw-r--r-- | MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs | 25 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderManager.cs | 20 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbProvider.cs | 51 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbSearch.cs | 116 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Providers/TV/MissingEpisodeProvider.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs | 116 | ||||
| -rw-r--r-- | MediaBrowser.Providers/TV/TvdbSeriesProvider.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs | 3 | ||||
| -rw-r--r-- | MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Common.Internal.nuspec | 4 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Common.nuspec | 2 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Server.Core.nuspec | 4 |
15 files changed, 289 insertions, 128 deletions
diff --git a/MediaBrowser.Api/ItemLookupService.cs b/MediaBrowser.Api/ItemLookupService.cs index 25782f8c1..a32a1ad03 100644 --- a/MediaBrowser.Api/ItemLookupService.cs +++ b/MediaBrowser.Api/ItemLookupService.cs @@ -5,7 +5,9 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; using ServiceStack; using System; @@ -81,20 +83,30 @@ namespace MediaBrowser.Api [ApiMember(Name = "ProviderName", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] public string ProviderName { get; set; } } - + + [Route("/Items/RemoteSearch/Apply/{Id}", "POST")] + [Api(Description = "Applies search criteria to an item and refreshes metadata")] + public class ApplySearchCriteria : RemoteSearchResult, IReturnVoid + { + [ApiMember(Name = "Id", Description = "The item id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public string Id { get; set; } + } + public class ItemLookupService : BaseApiService { private readonly IDtoService _dtoService; private readonly IProviderManager _providerManager; private readonly IServerApplicationPaths _appPaths; private readonly IFileSystem _fileSystem; + private readonly ILibraryManager _libraryManager; - public ItemLookupService(IDtoService dtoService, IProviderManager providerManager, IServerApplicationPaths appPaths, IFileSystem fileSystem) + public ItemLookupService(IDtoService dtoService, IProviderManager providerManager, IServerApplicationPaths appPaths, IFileSystem fileSystem, ILibraryManager libraryManager) { _dtoService = dtoService; _providerManager = providerManager; _appPaths = appPaths; _fileSystem = fileSystem; + _libraryManager = libraryManager; } public object Get(GetExternalIdInfos request) @@ -162,6 +174,31 @@ namespace MediaBrowser.Api return result; } + public void Post(ApplySearchCriteria request) + { + var item = _libraryManager.GetItemById(new Guid(request.Id)); + + foreach (var key in request.ProviderIds) + { + var value = key.Value; + + if (!string.IsNullOrWhiteSpace(value)) + { + item.SetProviderId(key.Key, value); + } + } + + var task = item.RefreshMetadata(new MetadataRefreshOptions + { + MetadataRefreshMode = MetadataRefreshMode.FullRefresh, + ImageRefreshMode = ImageRefreshMode.FullRefresh, + ReplaceAllMetadata = true + + }, CancellationToken.None); + + Task.WaitAll(task); + } + /// <summary> /// Gets the remote image. /// </summary> diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index d698b4ce0..29032ca29 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -22,7 +22,6 @@ namespace MediaBrowser.Providers.BoxSets { public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo> { - private readonly CultureInfo _enUs = new CultureInfo("en-US"); private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images"; internal static MovieDbBoxSetProvider Current; @@ -78,25 +77,7 @@ namespace MediaBrowser.Providers.BoxSets return new[] { result }; } - var results = await new MovieDbSearch(_logger, _json).GetSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); - - return results.Select(i => GetRemoteSearchResult(i, tmdbImageUrl)); - } - - private RemoteSearchResult GetRemoteSearchResult(MovieDbSearch.TmdbMovieSearchResult tmdbResult, string baseImageUrl) - { - var result = new RemoteSearchResult - { - Name = tmdbResult.name, - - SearchProviderName = Name, - - ImageUrl = string.IsNullOrEmpty(tmdbResult.poster_path) ? null : (baseImageUrl + tmdbResult.poster_path) - }; - - result.SetProviderId(MetadataProviders.Tmdb, tmdbResult.id.ToString(_usCulture)); - - return result; + return await new MovieDbSearch(_logger, _json).GetSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); } public async Task<MetadataResult<BoxSet>> GetMetadata(BoxSetInfo id, CancellationToken cancellationToken) @@ -112,7 +93,7 @@ namespace MediaBrowser.Providers.BoxSets if (searchResult != null) { - tmdbId = searchResult.id.ToString(_enUs); + tmdbId = searchResult.GetProviderId(MetadataProviders.Tmdb); } } @@ -159,7 +140,7 @@ namespace MediaBrowser.Providers.BoxSets Overview = obj.overview }; - item.SetProviderId(MetadataProviders.Tmdb, obj.id.ToString(_enUs)); + item.SetProviderId(MetadataProviders.Tmdb, obj.id.ToString(_usCulture)); return item; } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index b35c4887c..5f6702e74 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -492,7 +492,7 @@ namespace MediaBrowser.Providers.Manager Type = MetadataPluginType.MetadataFetcher })); } - + if (item.IsSaveLocalMetadataEnabled()) { // Savers @@ -668,7 +668,7 @@ namespace MediaBrowser.Providers.Manager foreach (var provider in providers) { - var results = await provider.GetSearchResults(searchInfo.SearchInfo, cancellationToken).ConfigureAwait(false); + var results = await GetSearchResults(provider, searchInfo.SearchInfo, cancellationToken).ConfigureAwait(false); var list = results.ToList(); @@ -682,6 +682,22 @@ namespace MediaBrowser.Providers.Manager return new List<RemoteSearchResult>(); } + private async Task<IEnumerable<RemoteSearchResult>> GetSearchResults<TLookupType>(IRemoteSearchProvider<TLookupType> provider, TLookupType searchInfo, + CancellationToken cancellationToken) + where TLookupType : ItemLookupInfo + { + var results = await provider.GetSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); + + var list = results.ToList(); + + foreach (var item in list) + { + item.SearchProviderName = provider.Name; + } + + return list; + } + public Task<HttpResponseInfo> GetSearchImage(string providerName, string url, CancellationToken cancellationToken) { var provider = _metadataProviders.OfType<IRemoteSearchProvider>().FirstOrDefault(i => string.Equals(i.Name, providerName, StringComparison.OrdinalIgnoreCase)); diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs index b6dca5b7d..c6d5d1502 100644 --- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs +++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.Providers.Movies if (searchResult != null) { - tmdbId = searchResult.id.ToString(_usCulture); + tmdbId = searchResult.GetProviderId(MetadataProviders.Tmdb); } } diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 2c47dbc2f..b40158dd7 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -12,6 +12,7 @@ using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Threading; @@ -35,6 +36,8 @@ namespace MediaBrowser.Providers.Movies private readonly ILogger _logger; private readonly ILocalizationManager _localization; + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + public MovieDbProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILogger logger, ILocalizationManager localization) { _jsonSerializer = jsonSerializer; @@ -46,9 +49,47 @@ namespace MediaBrowser.Providers.Movies Current = this; } - public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken) + public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken) { - return new List<RemoteSearchResult>(); + return GetMovieSearchResults(searchInfo, cancellationToken); + } + + public async Task<IEnumerable<RemoteSearchResult>> GetMovieSearchResults(ItemLookupInfo searchInfo, CancellationToken cancellationToken) + { + var tmdbSettings = await GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var tmdbImageUrl = tmdbSettings.images.base_url + "original"; + + var tmdbId = searchInfo.GetProviderId(MetadataProviders.Tmdb); + + if (!string.IsNullOrEmpty(tmdbId)) + { + cancellationToken.ThrowIfCancellationRequested(); + + await EnsureMovieInfo(tmdbId, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false); + + var dataFilePath = GetDataFilePath(tmdbId, searchInfo.MetadataLanguage); + + var obj = _jsonSerializer.DeserializeFromFile<CompleteMovieData>(dataFilePath); + + var remoteResult = new RemoteSearchResult + { + Name = obj.title ?? obj.original_title ?? obj.name, + SearchProviderName = Name, + ImageUrl = string.IsNullOrWhiteSpace(obj.poster_path) ? null : tmdbImageUrl + obj.poster_path + }; + + remoteResult.SetProviderId(MetadataProviders.Tmdb, obj.id.ToString(_usCulture)); + + if (!string.IsNullOrWhiteSpace(obj.imdb_id)) + { + remoteResult.SetProviderId(MetadataProviders.Imdb, obj.imdb_id); + } + + return new[] { remoteResult }; + } + + return await new MovieDbSearch(_logger, _jsonSerializer).GetMovieSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); } public Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken) @@ -57,7 +98,7 @@ namespace MediaBrowser.Providers.Movies } public Task<MetadataResult<T>> GetItemMetadata<T>(ItemLookupInfo id, CancellationToken cancellationToken) - where T : Video, new () + where T : Video, new() { var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer); @@ -347,10 +388,10 @@ namespace MediaBrowser.Providers.Movies var dataFilePath = GetDataFilePath(tmdbId, item.GetPreferredMetadataLanguage()); var fileInfo = new FileInfo(dataFilePath); - + return !fileInfo.Exists || _fileSystem.GetLastWriteTimeUtc(fileInfo) > date; } - + return false; } diff --git a/MediaBrowser.Providers/Movies/MovieDbSearch.cs b/MediaBrowser.Providers/Movies/MovieDbSearch.cs index ad7335009..500b71a79 100644 --- a/MediaBrowser.Providers/Movies/MovieDbSearch.cs +++ b/MediaBrowser.Providers/Movies/MovieDbSearch.cs @@ -1,6 +1,8 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; @@ -29,27 +31,31 @@ namespace MediaBrowser.Providers.Movies _json = json; } - public Task<IEnumerable<TmdbMovieSearchResult>> GetSearchResults(SeriesInfo idInfo, CancellationToken cancellationToken) + public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo idInfo, CancellationToken cancellationToken) { return GetSearchResults(idInfo, "tv", cancellationToken); } - public Task<IEnumerable<TmdbMovieSearchResult>> GetMovieSearchResults(ItemLookupInfo idInfo, CancellationToken cancellationToken) + public Task<IEnumerable<RemoteSearchResult>> GetMovieSearchResults(ItemLookupInfo idInfo, CancellationToken cancellationToken) { return GetSearchResults(idInfo, "movie", cancellationToken); } - public Task<IEnumerable<TmdbMovieSearchResult>> GetSearchResults(BoxSetInfo idInfo, CancellationToken cancellationToken) + public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(BoxSetInfo idInfo, CancellationToken cancellationToken) { return GetSearchResults(idInfo, "collection", cancellationToken); } - private async Task<IEnumerable<TmdbMovieSearchResult>> GetSearchResults(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken) + private async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken) { var name = idInfo.Name; var year = idInfo.Year; int? yearInName = null; + var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var tmdbImageUrl = tmdbSettings.images.base_url + "original"; + NameParser.ParseName(name, out name, out yearInName); year = year ?? yearInName; @@ -60,14 +66,14 @@ namespace MediaBrowser.Providers.Movies //nope - search for it //var searchType = item is BoxSet ? "collection" : "movie"; - var results = await GetSearchResults(name, searchType, year, language, cancellationToken).ConfigureAwait(false); + var results = await GetSearchResults(name, searchType, year, language, tmdbImageUrl, cancellationToken).ConfigureAwait(false); if (results.Count == 0) { //try in english if wasn't before if (!string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) { - results = await GetSearchResults(name, searchType, year, "en", cancellationToken).ConfigureAwait(false); + results = await GetSearchResults(name, searchType, year, "en", tmdbImageUrl, cancellationToken).ConfigureAwait(false); } } @@ -88,21 +94,29 @@ namespace MediaBrowser.Providers.Movies // Search again if the new name is different if (!string.Equals(name, originalName)) { - results = await GetSearchResults(name, searchType, year, language, cancellationToken).ConfigureAwait(false); + results = await GetSearchResults(name, searchType, year, language, tmdbImageUrl, cancellationToken).ConfigureAwait(false); if (results.Count == 0 && !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) { //one more time, in english - results = await GetSearchResults(name, searchType, year, "en", cancellationToken).ConfigureAwait(false); + results = await GetSearchResults(name, searchType, year, "en", tmdbImageUrl, cancellationToken).ConfigureAwait(false); } } } - return results; + return results.Where(i => + { + if (year.HasValue && i.ProductionYear.HasValue) + { + return year.Value == i.ProductionYear.Value; + } + + return true; + }); } - private async Task<List<TmdbMovieSearchResult>> GetSearchResults(string name, string type, int? year, string language, CancellationToken cancellationToken) + private async Task<List<RemoteSearchResult>> GetSearchResults(string name, string type, int? year, string language, string baseImageUrl, CancellationToken cancellationToken) { var url3 = string.Format(Search3, WebUtility.UrlEncode(name), ApiKey, language, type); @@ -124,6 +138,32 @@ namespace MediaBrowser.Providers.Movies return resultTuples.OrderBy(i => GetSearchResultOrder(i.Item1, year)) .ThenBy(i => i.Item2) .Select(i => i.Item1) + .Select(i => + { + var remoteResult = new RemoteSearchResult + { + SearchProviderName = MovieDbProvider.Current.Name, + Name = i.title ?? i.original_title ?? i.name, + ImageUrl = string.IsNullOrWhiteSpace(i.poster_path) ? null : baseImageUrl + i.poster_path + }; + + if (!string.IsNullOrWhiteSpace(i.release_date)) + { + DateTime r; + + // These dates are always in this exact format + if (DateTime.TryParseExact(i.release_date, "yyyy-MM-dd", EnUs, DateTimeStyles.None, out r)) + { + remoteResult.PremiereDate = r.ToUniversalTime(); + remoteResult.ProductionYear = remoteResult.PremiereDate.Value.Year; + } + } + + remoteResult.SetProviderId(MetadataProviders.Tmdb, i.id.ToString(EnUs)); + + return remoteResult; + + }) .ToList(); } } @@ -144,62 +184,6 @@ namespace MediaBrowser.Providers.Movies return 0; } - private TmdbMovieSearchResult FindBestResult(List<TmdbMovieSearchResult> results, string name, int? year) - { - if (year.HasValue) - { - // Take the first result from the same year - var result = results.FirstOrDefault(i => - { - // Make sure it has a name - if (!string.IsNullOrEmpty(i.title ?? i.name)) - { - DateTime r; - - // These dates are always in this exact format - if (DateTime.TryParseExact(i.release_date, "yyyy-MM-dd", EnUs, DateTimeStyles.None, out r)) - { - return r.Year == year.Value; - } - } - - return false; - }); - - if (result != null) - { - return result; - } - - // Take the first result within one year - result = results.FirstOrDefault(i => - { - // Make sure it has a name - if (!string.IsNullOrEmpty(i.title ?? i.name)) - { - DateTime r; - - // These dates are always in this exact format - if (DateTime.TryParseExact(i.release_date, "yyyy-MM-dd", EnUs, DateTimeStyles.None, out r)) - { - return Math.Abs(r.Year - year.Value) <= 1; - } - } - - return false; - }); - - if (result != null) - { - return result; - } - } - - // Just take the first one - return results.FirstOrDefault(i => !string.IsNullOrEmpty(i.title ?? i.name)); - } - - /// <summary> /// Class TmdbMovieSearchResult /// </summary> diff --git a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs index 512fee8f8..78ea3e99c 100644 --- a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs @@ -23,9 +23,9 @@ namespace MediaBrowser.Providers.Movies return MovieDbProvider.Current.GetItemMetadata<Trailer>(info, cancellationToken); } - public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TrailerInfo searchInfo, CancellationToken cancellationToken) + public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TrailerInfo searchInfo, CancellationToken cancellationToken) { - return new List<RemoteSearchResult>(); + return MovieDbProvider.Current.GetMovieSearchResults(searchInfo, cancellationToken); } public string Name diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index c620a6c33..ff8f6a2e6 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -105,12 +105,15 @@ namespace MediaBrowser.Providers.TV hasNewSeasons = await AddDummySeasonFolders(series, cancellationToken).ConfigureAwait(false); } - var seriesConfig = _config.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, typeof(Series).Name, StringComparison.OrdinalIgnoreCase)); - - if (seriesConfig == null || !seriesConfig.DisabledMetadataFetchers.Contains(TvdbSeriesProvider.Current.Name, StringComparer.OrdinalIgnoreCase)) + if (_config.Configuration.EnableInternetProviders) { - hasNewEpisodes = await AddMissingEpisodes(group.ToList(), seriesDataPath, episodeLookup, cancellationToken) - .ConfigureAwait(false); + var seriesConfig = _config.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, typeof(Series).Name, StringComparison.OrdinalIgnoreCase)); + + if (seriesConfig == null || !seriesConfig.DisabledMetadataFetchers.Contains(TvdbSeriesProvider.Current.Name, StringComparer.OrdinalIgnoreCase)) + { + hasNewEpisodes = await AddMissingEpisodes(group.ToList(), seriesDataPath, episodeLookup, cancellationToken) + .ConfigureAwait(false); + } } if (hasNewSeasons || hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved) diff --git a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs index 9f1d5f021..b149f709a 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs @@ -21,7 +21,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.TV { - public class MovieDbSeriesProvider : IRemoteMetadataProvider<Series,SeriesInfo>, IHasOrder + public class MovieDbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder { private const string GetTvInfo3 = @"http://api.themoviedb.org/3/tv/{0}?api_key={1}&append_to_response=casts,images,keywords,external_ids"; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); @@ -53,7 +53,83 @@ namespace MediaBrowser.Providers.TV public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken) { - return new List<RemoteSearchResult>(); + var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var tmdbImageUrl = tmdbSettings.images.base_url + "original"; + + var tmdbId = searchInfo.GetProviderId(MetadataProviders.Tmdb); + + if (!string.IsNullOrEmpty(tmdbId)) + { + cancellationToken.ThrowIfCancellationRequested(); + + await EnsureSeriesInfo(tmdbId, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false); + + var dataFilePath = GetDataFilePath(tmdbId, searchInfo.MetadataLanguage); + + var obj = _jsonSerializer.DeserializeFromFile<RootObject>(dataFilePath); + + var remoteResult = new RemoteSearchResult + { + Name = obj.name, + SearchProviderName = Name, + ImageUrl = string.IsNullOrWhiteSpace(obj.poster_path) ? null : tmdbImageUrl + obj.poster_path + }; + + remoteResult.SetProviderId(MetadataProviders.Tmdb, obj.id.ToString(_usCulture)); + remoteResult.SetProviderId(MetadataProviders.Imdb, obj.external_ids.imdb_id); + + if (obj.external_ids.tvdb_id > 0) + { + remoteResult.SetProviderId(MetadataProviders.Tvdb, obj.external_ids.tvdb_id.ToString(_usCulture)); + } + + return new[] { remoteResult }; + } + + var imdbId = searchInfo.GetProviderId(MetadataProviders.Imdb); + + if (!string.IsNullOrEmpty(imdbId)) + { + var searchResult = await FindByExternalId(imdbId, "imdb_id", cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + var remoteResult = new RemoteSearchResult + { + Name = searchResult.name, + SearchProviderName = Name, + ImageUrl = string.IsNullOrWhiteSpace(searchResult.poster_path) ? null : tmdbImageUrl + searchResult.poster_path + }; + + remoteResult.SetProviderId(MetadataProviders.Tmdb, searchResult.id.ToString(_usCulture)); + + return new[] { remoteResult }; + } + } + + var tvdbId = searchInfo.GetProviderId(MetadataProviders.Tvdb); + + if (!string.IsNullOrEmpty(tvdbId)) + { + var searchResult = await FindByExternalId(tvdbId, "tvdb_id", cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + var remoteResult = new RemoteSearchResult + { + Name = searchResult.name, + SearchProviderName = Name, + ImageUrl = string.IsNullOrWhiteSpace(searchResult.poster_path) ? null : tmdbImageUrl + searchResult.poster_path + }; + + remoteResult.SetProviderId(MetadataProviders.Tmdb, searchResult.id.ToString(_usCulture)); + + return new[] { remoteResult }; + } + } + + return await new MovieDbSearch(_logger, _jsonSerializer).GetSearchResults(searchInfo, cancellationToken).ConfigureAwait(false); } public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken cancellationToken) @@ -68,7 +144,12 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrEmpty(imdbId)) { - tmdbId = await FindIdByExternalId(imdbId, "imdb_id", cancellationToken).ConfigureAwait(false); + var searchResult = await FindByExternalId(imdbId, "imdb_id", cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + tmdbId = searchResult.id.ToString(_usCulture); + } } } @@ -78,7 +159,12 @@ namespace MediaBrowser.Providers.TV if (!string.IsNullOrEmpty(tvdbId)) { - tmdbId = await FindIdByExternalId(tvdbId, "tvdb_id", cancellationToken).ConfigureAwait(false); + var searchResult = await FindByExternalId(tvdbId, "tvdb_id", cancellationToken).ConfigureAwait(false); + + if (searchResult != null) + { + tmdbId = searchResult.id.ToString(_usCulture); + } } } @@ -90,7 +176,7 @@ namespace MediaBrowser.Providers.TV if (searchResult != null) { - tmdbId = searchResult.id.ToString(_usCulture); + tmdbId = searchResult.GetProviderId(MetadataProviders.Tmdb); } } @@ -102,7 +188,7 @@ namespace MediaBrowser.Providers.TV result.HasMetadata = result.Item != null; } - + return result; } @@ -123,7 +209,7 @@ namespace MediaBrowser.Providers.TV tmdbId = seriesInfo.id.ToString(_usCulture); - dataFilePath = MovieDbProvider.Current.GetDataFilePath(tmdbId, language); + dataFilePath = GetDataFilePath(tmdbId, language); Directory.CreateDirectory(Path.GetDirectoryName(dataFilePath)); _jsonSerializer.SerializeToFile(seriesInfo, dataFilePath); @@ -151,7 +237,7 @@ namespace MediaBrowser.Providers.TV series.CommunityRating = rating; } - series.Overview = seriesInfo.overview; + series.Overview = seriesInfo.overview; if (seriesInfo.networks != null) { @@ -210,7 +296,7 @@ namespace MediaBrowser.Providers.TV return dataPath; } - + internal async Task DownloadSeriesInfo(string id, string preferredMetadataLanguage, CancellationToken cancellationToken) { var mainResult = await FetchMainResult(id, preferredMetadataLanguage, cancellationToken).ConfigureAwait(false); @@ -245,7 +331,7 @@ namespace MediaBrowser.Providers.TV url += string.Format("&language={0}", language); } - + // Get images in english and with no language url += "&include_image_language=" + string.Join(",", imageLanguages.ToArray()); @@ -262,7 +348,7 @@ namespace MediaBrowser.Providers.TV return _jsonSerializer.DeserializeFromStream<RootObject>(json); } } - + private readonly Task _cachedTask = Task.FromResult(true); internal Task EnsureSeriesInfo(string tmdbId, string language, CancellationToken cancellationToken) { @@ -332,10 +418,10 @@ namespace MediaBrowser.Providers.TV return false; } - private async Task<string> FindIdByExternalId(string id, string externalSource, CancellationToken cancellationToken) + private async Task<MovieDbSearch.TvResult> FindByExternalId(string id, string externalSource, CancellationToken cancellationToken) { - var url = string.Format("http://api.themoviedb.org/3/tv/find/{0}?api_key={1}&external_source={2}", - id, + var url = string.Format("http://api.themoviedb.org/3/tv/find/{0}?api_key={1}&external_source={2}", + id, MovieDbProvider.ApiKey, externalSource); @@ -355,7 +441,7 @@ namespace MediaBrowser.Providers.TV if (tv != null) { - return tv.id.ToString(_usCulture); + return tv; } } } diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index 51eec8668..4bd22107c 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -50,6 +50,12 @@ namespace MediaBrowser.Providers.TV public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken) { + var seriesId = searchInfo.GetProviderId(MetadataProviders.Tvdb); + + if (!string.IsNullOrEmpty(seriesId)) + { + } + return new List<RemoteSearchResult>(); } @@ -1092,7 +1098,12 @@ namespace MediaBrowser.Providers.TV public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) { - throw new NotImplementedException(); + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url, + ResourcePool = TvDbResourcePool + }); } } } diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index 192f84a6f..bd315530e 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -7,7 +7,6 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; -using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Sorting; @@ -49,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv private List<Guid> _channelIdList = new List<Guid>(); private Dictionary<Guid, LiveTvProgram> _programs = new Dictionary<Guid, LiveTvProgram>(); - private SemaphoreSlim _refreshSemaphore = new SemaphoreSlim(1, 1); + private readonly SemaphoreSlim _refreshSemaphore = new SemaphoreSlim(1, 1); public LiveTvManager(IServerConfigurationManager config, IFileSystem fileSystem, ILogger logger, IItemRepository itemRepo, IImageProcessor imageProcessor, IUserDataManager userDataManager, IDtoService dtoService, IUserManager userManager, ILibraryManager libraryManager, ITaskManager taskManager) { diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 84f94b98e..c8e630e9d 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -196,6 +196,9 @@ <Content Include="dashboard-ui\css\images\items\detail\tv.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\css\images\items\list\remotesearch.png">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\css\images\media\tvflyout.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index db84d93e6..b9e4fc39c 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common.Internal</id> - <version>3.0.333</version> + <version>3.0.334</version> <title>MediaBrowser.Common.Internal</title> <authors>Luke</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.333" /> + <dependency id="MediaBrowser.Common" version="3.0.334" /> <dependency id="NLog" version="2.1.0" /> <dependency id="SimpleInjector" version="2.4.1" /> <dependency id="sharpcompress" version="0.10.2" /> diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index c87a9c304..0db7f2139 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <metadata> <id>MediaBrowser.Common</id> - <version>3.0.333</version> + <version>3.0.334</version> <title>MediaBrowser.Common</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 573356d22..7bcee1e78 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <metadata> <id>MediaBrowser.Server.Core</id> - <version>3.0.333</version> + <version>3.0.334</version> <title>Media Browser.Server.Core</title> <authors>Media Browser Team</authors> <owners>ebr,Luke,scottisafool</owners> @@ -12,7 +12,7 @@ <description>Contains core components required to build plugins for Media Browser Server.</description> <copyright>Copyright © Media Browser 2013</copyright> <dependencies> - <dependency id="MediaBrowser.Common" version="3.0.333" /> + <dependency id="MediaBrowser.Common" version="3.0.334" /> </dependencies> </metadata> <files> |
