From 976523afa92420de1b690e3a7e35e003e1899ff9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Oct 2013 18:01:21 -0400 Subject: added new params for missing/unaired --- .../Configuration/UserConfiguration.cs | 6 +++--- MediaBrowser.Model/Entities/MetadataProviders.cs | 4 +++- MediaBrowser.Model/Querying/ItemQuery.cs | 19 +++++++++++----- MediaBrowser.Model/Querying/NextUpQuery.cs | 25 ++++++---------------- 4 files changed, 27 insertions(+), 27 deletions(-) (limited to 'MediaBrowser.Model') diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs index d88474d61d..43561cd749 100644 --- a/MediaBrowser.Model/Configuration/UserConfiguration.cs +++ b/MediaBrowser.Model/Configuration/UserConfiguration.cs @@ -56,8 +56,9 @@ namespace MediaBrowser.Model.Configuration public bool IsDisabled { get; set; } - public bool DisplayVirtualEpisodes { get; set; } - + public bool DisplayMissingEpisodes { get; set; } + public bool DisplayUnairedEpisodes { get; set; } + /// /// Initializes a new instance of the class. /// @@ -65,7 +66,6 @@ namespace MediaBrowser.Model.Configuration { IsAdministrator = true; BlockNotRated = false; - DisplayVirtualEpisodes = true; } } } diff --git a/MediaBrowser.Model/Entities/MetadataProviders.cs b/MediaBrowser.Model/Entities/MetadataProviders.cs index b508be13b2..5ef449317f 100644 --- a/MediaBrowser.Model/Entities/MetadataProviders.cs +++ b/MediaBrowser.Model/Entities/MetadataProviders.cs @@ -36,6 +36,8 @@ namespace MediaBrowser.Model.Entities /// TmdbCollection, MusicBrainzReleaseGroup, - Zap2It + Zap2It, + NesBox, + NesBoxRom } } diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs index d351474eb7..ba51bc46dd 100644 --- a/MediaBrowser.Model/Querying/ItemQuery.cs +++ b/MediaBrowser.Model/Querying/ItemQuery.cs @@ -241,16 +241,25 @@ namespace MediaBrowser.Model.Querying /// /// The location types. public LocationType[] LocationTypes { get; set; } + + /// + /// Gets or sets a value indicating whether this instance is missing episode. + /// + /// null if [is missing episode] contains no value, true if [is missing episode]; otherwise, false. + public bool? IsMissing { get; set; } + + /// + /// Gets or sets a value indicating whether this instance is unaired episode. + /// + /// null if [is unaired episode] contains no value, true if [is unaired episode]; otherwise, false. + public bool? IsUnaired { get; set; } + /// /// Gets or sets the exclude location types. /// /// The exclude location types. public LocationType[] ExcludeLocationTypes { get; set; } - - public bool? HasPremiereDate { get; set; } - public DateTime? MinPremiereDate { get; set; } - public DateTime? MaxPremiereDate { get; set; } - + /// /// Initializes a new instance of the class. /// diff --git a/MediaBrowser.Model/Querying/NextUpQuery.cs b/MediaBrowser.Model/Querying/NextUpQuery.cs index 1b7b45ca30..4f5d47a04e 100644 --- a/MediaBrowser.Model/Querying/NextUpQuery.cs +++ b/MediaBrowser.Model/Querying/NextUpQuery.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Model.Entities; -using System; - + namespace MediaBrowser.Model.Querying { public class NextUpQuery @@ -11,6 +9,12 @@ namespace MediaBrowser.Model.Querying /// The user id. public string UserId { get; set; } + /// + /// Gets or sets the series id. + /// + /// The series id. + public string SeriesId { get; set; } + /// /// Skips over a given number of items within the results. Use for paging. /// @@ -28,20 +32,5 @@ namespace MediaBrowser.Model.Querying /// /// The fields. public ItemFields[] Fields { get; set; } - - /// - /// Gets or sets the exclude location types. - /// - /// The exclude location types. - public LocationType[] ExcludeLocationTypes { get; set; } - - public bool? HasPremiereDate { get; set; } - public DateTime? MinPremiereDate { get; set; } - public DateTime? MaxPremiereDate { get; set; } - - public NextUpQuery() - { - ExcludeLocationTypes = new LocationType[] { }; - } } } -- cgit v1.2.3 From e7a1f523734d1fc6e7808c2f703dbe543410ffe1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 26 Oct 2013 18:40:53 -0400 Subject: account for unaired physical episodes --- MediaBrowser.Api/UserLibrary/ItemsService.cs | 33 +++++++++++++++++++++++++- MediaBrowser.Controller/Entities/TV/Episode.cs | 7 +++++- MediaBrowser.Controller/Entities/TV/Season.cs | 11 ++++++--- MediaBrowser.Model/Querying/ItemQuery.cs | 2 ++ Nuget/MediaBrowser.Common.Internal.nuspec | 4 ++-- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 ++-- 7 files changed, 53 insertions(+), 10 deletions(-) (limited to 'MediaBrowser.Model') diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 4db7cf9707..9c3ea7bf04 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -193,6 +193,9 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "IsUnaired", Description = "Optional filter by items that are unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsUnaired { get; set; } + + [ApiMember(Name = "IsVirtualUnaired", Description = "Optional filter by items that are virtual unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool? IsVirtualUnaired { get; set; } } /// @@ -470,6 +473,20 @@ namespace MediaBrowser.Api.UserLibrary }); } + if (request.IsVirtualUnaired.HasValue) + { + var val = request.IsVirtualUnaired.Value; + items = items.Where(i => + { + var e = i as Episode; + if (e != null) + { + return e.IsVirtualUnaired == val; + } + return true; + }); + } + return items; } @@ -487,7 +504,7 @@ namespace MediaBrowser.Api.UserLibrary var e = i as Season; if (e != null) { - return !e.IsMissingOrUnaired; + return !e.IsMissingOrVirtualUnaired; } return true; }); @@ -522,6 +539,20 @@ namespace MediaBrowser.Api.UserLibrary }); } + if (request.IsVirtualUnaired.HasValue) + { + var val = request.IsVirtualUnaired.Value; + items = items.Where(i => + { + var e = i as Season; + if (e != null) + { + return e.IsVirtualUnaired == val; + } + return true; + }); + } + return items; } diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index e15a7d4d02..1176fca52b 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -203,7 +203,12 @@ namespace MediaBrowser.Controller.Entities.TV public bool IsUnaired { - get { return LocationType == Model.Entities.LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value >= DateTime.UtcNow; } + get { return PremiereDate.HasValue && PremiereDate.Value >= DateTime.UtcNow; } + } + + public bool IsVirtualUnaired + { + get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; } } } } diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index 9a0959cad6..5a53e8c0fe 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -156,12 +156,17 @@ namespace MediaBrowser.Controller.Entities.TV public bool IsUnaired { - get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType().All(i => i.IsUnaired); } + get { return Children.OfType().All(i => i.IsUnaired); } } - public bool IsMissingOrUnaired + public bool IsVirtualUnaired { - get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType().All(i => i.IsUnaired || i.IsMissingEpisode); } + get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; } + } + + public bool IsMissingOrVirtualUnaired + { + get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType().All(i => i.IsVirtualUnaired || i.IsMissingEpisode); } } } } diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs index ba51bc46dd..f4a1d20d2d 100644 --- a/MediaBrowser.Model/Querying/ItemQuery.cs +++ b/MediaBrowser.Model/Querying/ItemQuery.cs @@ -254,6 +254,8 @@ namespace MediaBrowser.Model.Querying /// null if [is unaired episode] contains no value, true if [is unaired episode]; otherwise, false. public bool? IsUnaired { get; set; } + public bool? IsVirtualUnaired { get; set; } + /// /// Gets or sets the exclude location types. /// diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 1446dbec26..b93286b127 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.233 + 3.0.234 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 6da43af68b..6712fad0c3 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.233 + 3.0.234 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index fab5c80931..c4704f9b33 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.233 + 3.0.234 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - + -- cgit v1.2.3 From 2f99b2e1e60f7a36c7f9c420c07fb608bb231fbf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 30 Oct 2013 11:55:55 -0400 Subject: fixes #566 - Add permission configuration for remote control --- MediaBrowser.Api/SessionsService.cs | 15 ++++++++++++++- MediaBrowser.Model/Configuration/UserConfiguration.cs | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'MediaBrowser.Model') diff --git a/MediaBrowser.Api/SessionsService.cs b/MediaBrowser.Api/SessionsService.cs index 5888d9fba3..a3f7e3037c 100644 --- a/MediaBrowser.Api/SessionsService.cs +++ b/MediaBrowser.Api/SessionsService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Session; using ServiceStack.ServiceHost; @@ -182,16 +183,18 @@ namespace MediaBrowser.Api private readonly ISessionManager _sessionManager; private readonly IDtoService _dtoService; + private readonly IUserManager _userManager; /// /// Initializes a new instance of the class. /// /// The session manager. /// The dto service. - public SessionsService(ISessionManager sessionManager, IDtoService dtoService) + public SessionsService(ISessionManager sessionManager, IDtoService dtoService, IUserManager userManager) { _sessionManager = sessionManager; _dtoService = dtoService; + _userManager = userManager; } /// @@ -208,6 +211,16 @@ namespace MediaBrowser.Api result = result.Where(i => i.SupportsRemoteControl == request.SupportsRemoteControl.Value); } + if (request.ControllableByUserId.HasValue) + { + var user = _userManager.GetUserById(request.ControllableByUserId.Value); + + if (!user.Configuration.EnableRemoteControlOfOtherUsers) + { + result = result.Where(i => i.User == null || i.User.Id == request.ControllableByUserId.Value); + } + } + return ToOptimizedResult(result.Select(_dtoService.GetSessionInfoDto).ToList()); } diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs index 43561cd749..b736474e0d 100644 --- a/MediaBrowser.Model/Configuration/UserConfiguration.cs +++ b/MediaBrowser.Model/Configuration/UserConfiguration.cs @@ -58,6 +58,7 @@ namespace MediaBrowser.Model.Configuration public bool DisplayMissingEpisodes { get; set; } public bool DisplayUnairedEpisodes { get; set; } + public bool EnableRemoteControlOfOtherUsers { get; set; } /// /// Initializes a new instance of the class. @@ -65,6 +66,7 @@ namespace MediaBrowser.Model.Configuration public UserConfiguration() { IsAdministrator = true; + EnableRemoteControlOfOtherUsers = true; BlockNotRated = false; } } -- cgit v1.2.3 From 524150331c1811e8ced5ff8444e0d0197bc6419a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 30 Oct 2013 17:33:27 -0400 Subject: beginning manual image providers --- MediaBrowser.Api/LibraryService.cs | 30 ++++- .../MediaBrowser.Controller.csproj | 1 + .../Providers/IImageProvider.cs | 38 ++++++ .../Providers/IProviderManager.cs | 13 +- .../MediaBrowser.Model.Portable.csproj | 3 + .../MediaBrowser.Model.net35.csproj | 3 + MediaBrowser.Model/MediaBrowser.Model.csproj | 1 + MediaBrowser.Model/Providers/RemoteImageInfo.cs | 51 ++++++++ .../MediaBrowser.Providers.csproj | 1 + .../Movies/ManualMovieDbImageProvider.cs | 133 +++++++++++++++++++++ .../Movies/MovieDbImagesProvider.cs | 60 +++------- .../Providers/ProviderManager.cs | 64 +++++++++- MediaBrowser.ServerApplication/ApplicationHost.cs | 4 +- 13 files changed, 354 insertions(+), 48 deletions(-) create mode 100644 MediaBrowser.Controller/Providers/IImageProvider.cs create mode 100644 MediaBrowser.Model/Providers/RemoteImageInfo.cs create mode 100644 MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs (limited to 'MediaBrowser.Model') diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs index 202d372e83..5b133fbd3e 100644 --- a/MediaBrowser.Api/LibraryService.cs +++ b/MediaBrowser.Api/LibraryService.cs @@ -5,8 +5,10 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; @@ -32,6 +34,21 @@ namespace MediaBrowser.Api public string Id { get; set; } } + [Route("/Items/{Id}/RemoteImages/{Type}", "GET")] + [Api(Description = "Gets available remote images for an item")] + public class GetRemoteImages : IReturn> + { + /// + /// Gets or sets the id. + /// + /// The id. + [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Id { get; set; } + + [ApiMember(Name = "Type", Description = "The image type", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public ImageType Type { get; set; } + } + /// /// Class GetCriticReviews /// @@ -208,6 +225,7 @@ namespace MediaBrowser.Api private readonly ILibraryManager _libraryManager; private readonly IUserManager _userManager; private readonly IUserDataManager _userDataManager; + private readonly IProviderManager _providerManager; private readonly IDtoService _dtoService; @@ -215,13 +233,14 @@ namespace MediaBrowser.Api /// Initializes a new instance of the class. /// public LibraryService(IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager, - IDtoService dtoService, IUserDataManager userDataManager) + IDtoService dtoService, IUserDataManager userDataManager, IProviderManager providerManager) { _itemRepo = itemRepo; _libraryManager = libraryManager; _userManager = userManager; _dtoService = dtoService; _userDataManager = userDataManager; + _providerManager = providerManager; } public object Get(GetFile request) @@ -240,6 +259,15 @@ namespace MediaBrowser.Api return ToStaticFileResult(item.Path); } + public object Get(GetRemoteImages request) + { + var item = _dtoService.GetItemByDtoId(request.Id); + + var result = _providerManager.GetAvailableRemoteImages(item, request.Type, CancellationToken.None).Result; + + return ToOptimizedResult(result); + } + /// /// Gets the specified request. /// diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 77db7d2c24..c379714aa3 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -109,6 +109,7 @@ + diff --git a/MediaBrowser.Controller/Providers/IImageProvider.cs b/MediaBrowser.Controller/Providers/IImageProvider.cs new file mode 100644 index 0000000000..0764794388 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IImageProvider.cs @@ -0,0 +1,38 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + /// + /// Interface IImageProvider + /// + public interface IImageProvider + { + /// + /// Gets the name. + /// + /// The name. + string Name { get; } + + /// + /// Supportses the specified item. + /// + /// The item. + /// Type of the image. + /// true if XXXX, false otherwise + bool Supports(BaseItem item, ImageType imageType); + + /// + /// Gets the available images. + /// + /// The item. + /// Type of the image. + /// The cancellation token. + /// Task{IEnumerable{RemoteImageInfo}}. + Task> GetAvailableImages(BaseItem item, ImageType imageType, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 6a4d132b76..2eb2be6db1 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; using System.Collections.Generic; using System.IO; using System.Threading; @@ -52,6 +53,16 @@ namespace MediaBrowser.Controller.Providers /// Adds the metadata providers. /// /// The providers. - void AddParts(IEnumerable providers); + /// The image providers. + void AddParts(IEnumerable providers, IEnumerable imageProviders); + + /// + /// Gets the available remote images. + /// + /// The item. + /// The type. + /// The cancellation token. + /// Task{IEnumerable{RemoteImageInfo}}. + Task> GetAvailableRemoteImages(BaseItem item, ImageType type, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index e88953b9c1..0f54073ef5 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -287,6 +287,9 @@ Plugins\PluginInfo.cs + + Providers\RemoteImageInfo.cs + Querying\ArtistsQuery.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 6a14817a60..3d4b8d2c7d 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -274,6 +274,9 @@ Plugins\PluginInfo.cs + + Providers\RemoteImageInfo.cs + Querying\ArtistsQuery.cs diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index caf89346cd..b048dc1c3e 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -59,6 +59,7 @@ + diff --git a/MediaBrowser.Model/Providers/RemoteImageInfo.cs b/MediaBrowser.Model/Providers/RemoteImageInfo.cs new file mode 100644 index 0000000000..bb2a3cb69c --- /dev/null +++ b/MediaBrowser.Model/Providers/RemoteImageInfo.cs @@ -0,0 +1,51 @@ + +namespace MediaBrowser.Model.Providers +{ + /// + /// Class RemoteImageInfo + /// + public class RemoteImageInfo + { + /// + /// Gets or sets the name of the provider. + /// + /// The name of the provider. + public string ProviderName { get; set; } + + /// + /// Gets or sets the URL. + /// + /// The URL. + public string Url { get; set; } + + /// + /// Gets or sets the height. + /// + /// The height. + public int? Height { get; set; } + + /// + /// Gets or sets the width. + /// + /// The width. + public int? Width { get; set; } + + /// + /// Gets or sets the community rating. + /// + /// The community rating. + public double? CommunityRating { get; set; } + + /// + /// Gets or sets the vote count. + /// + /// The vote count. + public int? VoteCount { get; set; } + + /// + /// Gets or sets the language. + /// + /// The language. + public string Language { get; set; } + } +} diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 63bd8c9534..7a8975937d 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -60,6 +60,7 @@ + diff --git a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs new file mode 100644 index 0000000000..39b7fa6c67 --- /dev/null +++ b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs @@ -0,0 +1,133 @@ +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.Movies +{ + class ManualMovieDbImageProvider : IImageProvider + { + private readonly IJsonSerializer _jsonSerializer; + private readonly IServerConfigurationManager _config; + + public ManualMovieDbImageProvider(IJsonSerializer jsonSerializer, IServerConfigurationManager config) + { + _jsonSerializer = jsonSerializer; + _config = config; + } + + public string Name + { + get { return "TheMovieDB"; } + } + + public bool Supports(BaseItem item, ImageType imageType) + { + if (MovieDbImagesProvider.SupportsItem(item)) + { + return imageType == ImageType.Primary || imageType == ImageType.Backdrop; + } + + return false; + } + + public async Task> GetAvailableImages(BaseItem item, ImageType imageType, CancellationToken cancellationToken) + { + var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + + var results = MovieDbImagesProvider.FetchImages(item, _jsonSerializer); + + var tmdbImageUrl = tmdbSettings.images.base_url + "original"; + + if (imageType == ImageType.Primary) + { + var sources = GetPosters(results, item); + + return sources.Select(i => new RemoteImageInfo + { + Url = tmdbImageUrl + i.file_path, + CommunityRating = i.vote_average, + VoteCount = i.vote_count, + Width = i.width, + Height = i.height, + Language = i.iso_639_1, + ProviderName = Name + }); + } + + if (imageType == ImageType.Backdrop) + { + var sources = GetBackdrops(results, item); + + return sources.Select(i => new RemoteImageInfo + { + Url = tmdbImageUrl + i.file_path, + CommunityRating = i.vote_average, + VoteCount = i.vote_count, + Width = i.width, + Height = i.height, + ProviderName = Name + }); + } + + throw new ArgumentException("Unrecognized ImageType: " + imageType); + } + + /// + /// Gets the posters. + /// + /// The images. + /// The item. + /// IEnumerable{MovieDbProvider.Poster}. + public IEnumerable GetPosters(MovieDbProvider.Images images, BaseItem item) + { + var language = _config.Configuration.PreferredMetadataLanguage; + + var eligiblePosters = images.posters == null ? + new List() : + images.posters.Where(i => i.width >= _config.Configuration.MinMoviePosterWidth) + .ToList(); + + return eligiblePosters.OrderByDescending(i => i.vote_average) + .ThenByDescending(i => + { + if (string.Equals(language, i.iso_639_1, StringComparison.OrdinalIgnoreCase)) + { + return 3; + } + if (string.Equals("en", i.iso_639_1, StringComparison.OrdinalIgnoreCase)) + { + return 2; + } + if (string.IsNullOrEmpty(i.iso_639_1)) + { + return 1; + } + return 0; + }) + .ToList(); + } + + /// + /// Gets the backdrops. + /// + /// The images. + /// The item. + /// IEnumerable{MovieDbProvider.Backdrop}. + public IEnumerable GetBackdrops(MovieDbProvider.Images images, BaseItem item) + { + var eligibleBackdrops = images.backdrops == null ? new List() : + images.backdrops.Where(i => i.width >= _config.Configuration.MinMovieBackdropWidth) + .ToList(); + + return eligibleBackdrops.OrderByDescending(i => i.vote_average); + } + } +} diff --git a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs index 52e6c214f9..0fd61a96be 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs @@ -65,6 +65,11 @@ namespace MediaBrowser.Providers.Movies /// The item. /// true if XXXX, false otherwise public override bool Supports(BaseItem item) + { + return SupportsItem(item); + } + + public static bool SupportsItem(BaseItem item) { var trailer = item as Trailer; @@ -180,7 +185,7 @@ namespace MediaBrowser.Providers.Movies if (!string.IsNullOrEmpty(id)) { - var images = FetchImages(item); + var images = FetchImages(item, _jsonSerializer); if (images != null) { @@ -196,8 +201,9 @@ namespace MediaBrowser.Providers.Movies /// Fetches the images. /// /// The item. + /// The json serializer. /// Task{MovieImages}. - private MovieDbProvider.Images FetchImages(BaseItem item) + internal static MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer) { var path = MovieDbProvider.Current.GetDataFilePath(item, "default"); @@ -207,7 +213,7 @@ namespace MediaBrowser.Providers.Movies if (fileInfo.Exists) { - return _jsonSerializer.DeserializeFromFile(path).images; + return jsonSerializer.DeserializeFromFile(path).images; } } @@ -227,13 +233,9 @@ namespace MediaBrowser.Providers.Movies var status = ProviderRefreshStatus.Success; - var eligiblePosters = images.posters == null ? - new List() : - images.posters.Where(i => i.width >= ConfigurationManager.Configuration.MinMoviePosterWidth) + var eligiblePosters = new ManualMovieDbImageProvider(_jsonSerializer, ConfigurationManager).GetPosters(images, item) .ToList(); - eligiblePosters = eligiblePosters.OrderByDescending(i => i.vote_average).ToList(); - // poster if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary)) { @@ -242,48 +244,24 @@ namespace MediaBrowser.Providers.Movies var tmdbImageUrl = tmdbSettings.images.base_url + "original"; // get highest rated poster for our language - var poster = eligiblePosters.FirstOrDefault(p => string.Equals(p.iso_639_1, ConfigurationManager.Configuration.PreferredMetadataLanguage, StringComparison.OrdinalIgnoreCase)); - - if (poster == null) - { - // couldn't find our specific language, find english - poster = eligiblePosters.FirstOrDefault(p => string.Equals(p.iso_639_1, "en", StringComparison.OrdinalIgnoreCase)); - } - - if (poster == null) - { - //still couldn't find it - try highest rated null one - poster = eligiblePosters.FirstOrDefault(p => p.iso_639_1 == null); - } + var poster = eligiblePosters[0]; - if (poster == null) - { - //finally - just get the highest rated one - poster = eligiblePosters.FirstOrDefault(); - } + var url = tmdbImageUrl + poster.file_path; - if (poster != null) + var img = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { - var url = tmdbImageUrl + poster.file_path; + Url = url, + CancellationToken = cancellationToken - var img = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions - { - Url = url, - CancellationToken = cancellationToken + }).ConfigureAwait(false); - }).ConfigureAwait(false); - - await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(poster.file_path), ImageType.Primary, null, url, cancellationToken) - .ConfigureAwait(false); - - } + await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(poster.file_path), ImageType.Primary, null, url, cancellationToken) + .ConfigureAwait(false); } cancellationToken.ThrowIfCancellationRequested(); - var eligibleBackdrops = images.backdrops == null ? new List() : - images.backdrops.Where(i => i.width >= ConfigurationManager.Configuration.MinMovieBackdropWidth) - .ToList(); + var eligibleBackdrops = new ManualMovieDbImageProvider(_jsonSerializer, ConfigurationManager).GetBackdrops(images, item).ToList(); var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops; diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs index 19230cecdb..1b086a0f91 100644 --- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs +++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs @@ -13,6 +13,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Providers; namespace MediaBrowser.Server.Implementations.Providers { @@ -48,6 +49,8 @@ namespace MediaBrowser.Server.Implementations.Providers /// The metadata providers enumerable. private BaseMetadataProvider[] MetadataProviders { get; set; } + private IImageProvider[] ImageProviders { get; set; } + /// /// Initializes a new instance of the class. /// @@ -55,8 +58,7 @@ namespace MediaBrowser.Server.Implementations.Providers /// The configuration manager. /// The directory watchers. /// The log manager. - /// The library manager. - public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager, ILibraryManager libraryManager) + public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager) { _logger = logManager.GetLogger("ProviderManager"); _httpClient = httpClient; @@ -68,9 +70,12 @@ namespace MediaBrowser.Server.Implementations.Providers /// Adds the metadata providers. /// /// The providers. - public void AddParts(IEnumerable providers) + /// The image providers. + public void AddParts(IEnumerable providers, IEnumerable imageProviders) { MetadataProviders = providers.OrderBy(e => e.Priority).ToArray(); + + ImageProviders = imageProviders.ToArray(); } /// @@ -344,5 +349,58 @@ namespace MediaBrowser.Server.Implementations.Providers { return new ImageSaver(ConfigurationManager, _directoryWatchers).SaveImage(item, source, mimeType, type, imageIndex, sourceUrl, cancellationToken); } + + /// + /// Gets the available remote images. + /// + /// The item. + /// The type. + /// The cancellation token. + /// Task{IEnumerable{RemoteImageInfo}}. + public async Task> GetAvailableRemoteImages(BaseItem item, ImageType type, CancellationToken cancellationToken) + { + var providers = GetSupportedImageProviders(item, type); + + var tasks = providers.Select(i => Task.Run(async () => + { + try + { + var result = await i.GetAvailableImages(item, type, cancellationToken).ConfigureAwait(false); + return result.ToList(); + } + catch (Exception ex) + { + _logger.ErrorException("{0} failed in GetAvailableImages for type {1}", ex, i.GetType().Name, item.GetType().Name); + return new List(); + } + })); + + var results = await Task.WhenAll(tasks).ConfigureAwait(false); + + return results.SelectMany(i => i); + } + + /// + /// Gets the supported image providers. + /// + /// The item. + /// The type. + /// IEnumerable{IImageProvider}. + private IEnumerable GetSupportedImageProviders(BaseItem item, ImageType type) + { + return ImageProviders.Where(i => + { + try + { + return i.Supports(item, type); + } + catch (Exception ex) + { + _logger.ErrorException("{0} failed in Supports for type {1}", ex, i.GetType().Name, item.GetType().Name); + return false; + } + + }); + } } } diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index c277ee5098..4aac1bb919 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -275,7 +275,7 @@ namespace MediaBrowser.ServerApplication DirectoryWatchers = new DirectoryWatchers(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager); RegisterSingleInstance(DirectoryWatchers); - ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, DirectoryWatchers, LogManager, LibraryManager); + ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, DirectoryWatchers, LogManager); RegisterSingleInstance(ProviderManager); RegisterSingleInstance(() => new LuceneSearchEngine(ApplicationPaths, LogManager, LibraryManager)); @@ -449,7 +449,7 @@ namespace MediaBrowser.ServerApplication GetExports(), GetExports()); - ProviderManager.AddParts(GetExports()); + ProviderManager.AddParts(GetExports(), GetExports()); ImageProcessor.AddParts(GetExports()); -- cgit v1.2.3 From 882d0681e68c5e0ae663cca75752e4df765c8dd5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 31 Oct 2013 11:39:09 -0400 Subject: #551 - Add manual image selection for movies --- MediaBrowser.Model/Providers/RemoteImageInfo.cs | 8 ++ .../Movies/ManualMovieDbImageProvider.cs | 94 ++++++++++++++-------- .../Movies/MovieDbImagesProvider.cs | 68 ++++------------ .../Movies/TmdbPersonProvider.cs | 1 - MediaBrowser.Providers/TV/SeriesPostScanTask.cs | 23 ++++-- MediaBrowser.Providers/TV/TvdbPrescanTask.cs | 8 +- MediaBrowser.WebDashboard/ApiClient.js | 18 +++++ MediaBrowser.WebDashboard/packages.config | 2 +- 8 files changed, 128 insertions(+), 94 deletions(-) (limited to 'MediaBrowser.Model') diff --git a/MediaBrowser.Model/Providers/RemoteImageInfo.cs b/MediaBrowser.Model/Providers/RemoteImageInfo.cs index bb2a3cb69c..1a281f07d2 100644 --- a/MediaBrowser.Model/Providers/RemoteImageInfo.cs +++ b/MediaBrowser.Model/Providers/RemoteImageInfo.cs @@ -1,4 +1,6 @@  +using MediaBrowser.Model.Entities; + namespace MediaBrowser.Model.Providers { /// @@ -47,5 +49,11 @@ namespace MediaBrowser.Model.Providers /// /// The language. public string Language { get; set; } + + /// + /// Gets or sets the type. + /// + /// The type. + public ImageType Type { get; set; } } } diff --git a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs index a8f847b79f..f84845af7d 100644 --- a/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/ManualMovieDbImageProvider.cs @@ -6,6 +6,7 @@ using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -40,44 +41,50 @@ namespace MediaBrowser.Providers.Movies public async Task> GetAvailableImages(BaseItem item, ImageType imageType, CancellationToken cancellationToken) { - var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); + var images = await GetAllImages(item, cancellationToken).ConfigureAwait(false); - var results = MovieDbImagesProvider.FetchImages(item, _jsonSerializer); + return images.Where(i => i.Type == imageType); + } - var tmdbImageUrl = tmdbSettings.images.base_url + "original"; + public async Task> GetAllImages(BaseItem item, CancellationToken cancellationToken) + { + var list = new List(); - if (imageType == ImageType.Primary) - { - var sources = GetPosters(results, item); + var results = FetchImages(item, _jsonSerializer); - return sources.Select(i => new RemoteImageInfo - { - Url = tmdbImageUrl + i.file_path, - CommunityRating = i.vote_average, - VoteCount = i.vote_count, - Width = i.width, - Height = i.height, - Language = i.iso_639_1, - ProviderName = Name - }); + if (results == null) + { + return list; } - if (imageType == ImageType.Backdrop) - { - var sources = GetBackdrops(results, item); + var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); - return sources.Select(i => new RemoteImageInfo - { - Url = tmdbImageUrl + i.file_path, - CommunityRating = i.vote_average, - VoteCount = i.vote_count, - Width = i.width, - Height = i.height, - ProviderName = Name - }); - } + var tmdbImageUrl = tmdbSettings.images.base_url + "original"; - throw new ArgumentException("Unrecognized ImageType: " + imageType); + list.AddRange(GetPosters(results, item).Select(i => new RemoteImageInfo + { + Url = tmdbImageUrl + i.file_path, + CommunityRating = i.vote_average, + VoteCount = i.vote_count, + Width = i.width, + Height = i.height, + Language = i.iso_639_1, + ProviderName = Name, + Type = ImageType.Primary + })); + + list.AddRange(GetBackdrops(results, item).Select(i => new RemoteImageInfo + { + Url = tmdbImageUrl + i.file_path, + CommunityRating = i.vote_average, + VoteCount = i.vote_count, + Width = i.width, + Height = i.height, + ProviderName = Name, + Type = ImageType.Backdrop + })); + + return list; } /// @@ -86,7 +93,7 @@ namespace MediaBrowser.Providers.Movies /// The images. /// The item. /// IEnumerable{MovieDbProvider.Poster}. - public IEnumerable GetPosters(MovieDbProvider.Images images, BaseItem item) + private IEnumerable GetPosters(MovieDbProvider.Images images, BaseItem item) { var language = _config.Configuration.PreferredMetadataLanguage; @@ -126,7 +133,7 @@ namespace MediaBrowser.Providers.Movies /// The images. /// The item. /// IEnumerable{MovieDbProvider.Backdrop}. - public IEnumerable GetBackdrops(MovieDbProvider.Images images, BaseItem item) + private IEnumerable GetBackdrops(MovieDbProvider.Images images, BaseItem item) { var eligibleBackdrops = images.backdrops == null ? new List() : images.backdrops.Where(i => i.width >= _config.Configuration.MinMovieBackdropWidth) @@ -134,5 +141,28 @@ namespace MediaBrowser.Providers.Movies return eligibleBackdrops.OrderByDescending(i => i.vote_average); } + + /// + /// Fetches the images. + /// + /// The item. + /// The json serializer. + /// Task{MovieImages}. + private MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer) + { + var path = MovieDbProvider.Current.GetDataFilePath(item, "default"); + + if (!string.IsNullOrEmpty(path)) + { + var fileInfo = new FileInfo(path); + + if (fileInfo.Exists) + { + return jsonSerializer.DeserializeFromFile(path).images; + } + } + + return null; + } } } diff --git a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs index f2504da9ab..e34cbc54f0 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImagesProvider.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Library; 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; @@ -152,7 +153,7 @@ namespace MediaBrowser.Providers.Movies { return false; } - + var path = MovieDbProvider.Current.GetDataFilePath(item, "default"); if (!string.IsNullOrEmpty(path)) @@ -179,45 +180,18 @@ namespace MediaBrowser.Providers.Movies { var id = item.GetProviderId(MetadataProviders.Tmdb); - var status = ProviderRefreshStatus.Success; - if (!string.IsNullOrEmpty(id)) { - var images = FetchImages(item, _jsonSerializer); + var images = await new ManualMovieDbImageProvider(_jsonSerializer, ConfigurationManager).GetAllImages(item, + cancellationToken).ConfigureAwait(false); - if (images != null) - { - status = await ProcessImages(item, images, cancellationToken).ConfigureAwait(false); - } + await ProcessImages(item, images.ToList(), cancellationToken).ConfigureAwait(false); } - SetLastRefreshed(item, DateTime.UtcNow, status); + SetLastRefreshed(item, DateTime.UtcNow); return true; } - /// - /// Fetches the images. - /// - /// The item. - /// The json serializer. - /// Task{MovieImages}. - internal static MovieDbProvider.Images FetchImages(BaseItem item, IJsonSerializer jsonSerializer) - { - var path = MovieDbProvider.Current.GetDataFilePath(item, "default"); - - if (!string.IsNullOrEmpty(path)) - { - var fileInfo = new FileInfo(path); - - if (fileInfo.Exists) - { - return jsonSerializer.DeserializeFromFile(path).images; - } - } - - return null; - } - /// /// Processes the images. /// @@ -225,26 +199,20 @@ namespace MediaBrowser.Providers.Movies /// The images. /// The cancellation token /// Task. - private async Task ProcessImages(BaseItem item, MovieDbProvider.Images images, CancellationToken cancellationToken) + private async Task ProcessImages(BaseItem item, List images, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - var status = ProviderRefreshStatus.Success; - - var eligiblePosters = new ManualMovieDbImageProvider(_jsonSerializer, ConfigurationManager).GetPosters(images, item) + var eligiblePosters = images + .Where(i => i.Type == ImageType.Primary) .ToList(); // poster if (eligiblePosters.Count > 0 && !item.HasImage(ImageType.Primary)) { - var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); - - var tmdbImageUrl = tmdbSettings.images.base_url + "original"; - // get highest rated poster for our language - var poster = eligiblePosters[0]; - var url = tmdbImageUrl + poster.file_path; + var url = poster.Url; var img = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { @@ -253,26 +221,24 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false); - await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(poster.file_path), ImageType.Primary, null, url, cancellationToken) + await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(url), ImageType.Primary, null, url, cancellationToken) .ConfigureAwait(false); } cancellationToken.ThrowIfCancellationRequested(); - var eligibleBackdrops = new ManualMovieDbImageProvider(_jsonSerializer, ConfigurationManager).GetBackdrops(images, item).ToList(); + var eligibleBackdrops = images + .Where(i => i.Type == ImageType.Backdrop) + .ToList(); var backdropLimit = ConfigurationManager.Configuration.MaxBackdrops; // backdrops - only download if earlier providers didn't find any (fanart) if (eligibleBackdrops.Count > 0 && ConfigurationManager.Configuration.DownloadMovieImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit) { - var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); - - var tmdbImageUrl = tmdbSettings.images.base_url + "original"; - for (var i = 0; i < eligibleBackdrops.Count; i++) { - var url = tmdbImageUrl + eligibleBackdrops[i].file_path; + var url = eligibleBackdrops[i].Url; if (!item.ContainsImageWithSourceUrl(url)) { @@ -283,7 +249,7 @@ namespace MediaBrowser.Providers.Movies }).ConfigureAwait(false); - await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(eligibleBackdrops[i].file_path), ImageType.Backdrop, item.BackdropImagePaths.Count, url, cancellationToken) + await _providerManager.SaveImage(item, img, MimeTypes.GetMimeType(url), ImageType.Backdrop, item.BackdropImagePaths.Count, url, cancellationToken) .ConfigureAwait(false); } @@ -293,8 +259,6 @@ namespace MediaBrowser.Providers.Movies } } } - - return status; } } } diff --git a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs index 52f5ddab5c..7c38eb97b8 100644 --- a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs @@ -4,7 +4,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; diff --git a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs index 6e99edb126..22ff917618 100644 --- a/MediaBrowser.Providers/TV/SeriesPostScanTask.cs +++ b/MediaBrowser.Providers/TV/SeriesPostScanTask.cs @@ -39,6 +39,13 @@ namespace MediaBrowser.Providers.TV private async Task RunInternal(IProgress progress, CancellationToken cancellationToken) { + if (!_config.Configuration.EnableInternetProviders || + _config.Configuration.InternetProviderExcludeTypes.Contains(typeof(Series).Name, StringComparer.OrdinalIgnoreCase)) + { + progress.Report(100); + return; + } + var seriesList = _libraryManager.RootFolder .RecursiveChildren .OfType() @@ -136,21 +143,27 @@ namespace MediaBrowser.Providers.TV .Where(i => i.Item1 != -1 && i.Item2 != -1) .ToList(); - var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(series, episodeLookup, cancellationToken).ConfigureAwait(false); + var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(series, episodeLookup, cancellationToken) + .ConfigureAwait(false); - var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(series, episodeLookup, cancellationToken).ConfigureAwait(false); + var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(series, episodeLookup, cancellationToken) + .ConfigureAwait(false); var hasNewEpisodes = false; if (_config.Configuration.EnableInternetProviders) { - hasNewEpisodes = await AddMissingEpisodes(series, seriesDataPath, episodeLookup, cancellationToken).ConfigureAwait(false); + hasNewEpisodes = await AddMissingEpisodes(series, seriesDataPath, episodeLookup, cancellationToken) + .ConfigureAwait(false); } if (hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved) { - await series.RefreshMetadata(cancellationToken, true).ConfigureAwait(false); - await series.ValidateChildren(new Progress(), cancellationToken, true).ConfigureAwait(false); + await series.RefreshMetadata(cancellationToken, true) + .ConfigureAwait(false); + + await series.ValidateChildren(new Progress(), cancellationToken, true) + .ConfigureAwait(false); } } diff --git a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs index 4926b92f73..d77698725a 100644 --- a/MediaBrowser.Providers/TV/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TvdbPrescanTask.cs @@ -1,12 +1,13 @@ -using System.Globalization; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -69,7 +70,8 @@ namespace MediaBrowser.Providers.TV /// Task. public async Task Run(IProgress progress, CancellationToken cancellationToken) { - if (!_config.Configuration.EnableInternetProviders) + if (!_config.Configuration.EnableInternetProviders || + _config.Configuration.InternetProviderExcludeTypes.Contains(typeof(Series).Name, StringComparer.OrdinalIgnoreCase)) { progress.Report(100); return; diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js index 8e64e4300d..3606396652 100644 --- a/MediaBrowser.WebDashboard/ApiClient.js +++ b/MediaBrowser.WebDashboard/ApiClient.js @@ -306,6 +306,24 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi }); }; + self.getAvailableRemoteImages = function (itemId, imageType) { + + if (!itemId) { + throw new Error("null itemId"); + } + if (!imageType) { + throw new Error("null imageType"); + } + + var url = self.getUrl("Items/" + itemId + "/RemoteImages/" + imageType); + + return self.ajax({ + type: "GET", + url: url, + dataType: "json" + }); + }; + /** * Gets the current server status */ diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config index 02daa2cae4..22560b1331 100644 --- a/MediaBrowser.WebDashboard/packages.config +++ b/MediaBrowser.WebDashboard/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file -- cgit v1.2.3