aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/ItemLookupService.cs41
-rw-r--r--MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs25
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs20
-rw-r--r--MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs2
-rw-r--r--MediaBrowser.Providers/Movies/MovieDbProvider.cs51
-rw-r--r--MediaBrowser.Providers/Movies/MovieDbSearch.cs116
-rw-r--r--MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs4
-rw-r--r--MediaBrowser.Providers/TV/MissingEpisodeProvider.cs13
-rw-r--r--MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs116
-rw-r--r--MediaBrowser.Providers/TV/TvdbSeriesProvider.cs13
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs3
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj3
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
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>