aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs9
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs1
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs132
3 files changed, 112 insertions, 30 deletions
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index f480125e86..b05e371a68 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -138,6 +138,8 @@ namespace MediaBrowser.Api.Images
/// </summary>
[Route("/Users/{Id}/Images/{Type}", "GET")]
[Route("/Users/{Id}/Images/{Type}/{Index}", "GET")]
+ [Route("/Users/{Id}/Images/{Type}", "HEAD")]
+ [Route("/Users/{Id}/Images/{Type}/{Index}", "HEAD")]
[Api(Description = "Gets a user image")]
public class GetUserImage : ImageRequest
{
@@ -410,6 +412,13 @@ namespace MediaBrowser.Api.Images
return GetImage(request, item, false);
}
+ public object Head(GetUserImage request)
+ {
+ var item = _userManager.GetUserById(request.Id);
+
+ return GetImage(request, item, true);
+ }
+
public object Get(GetItemByNameImage request)
{
var pathInfo = PathInfo.Parse(Request.PathInfo);
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 34b930a6ae..acb3f7835e 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -421,7 +421,6 @@ namespace MediaBrowser.Api.Library
MovieCount = movies.Count,
SeriesCount = series.Count,
SongCount = songs.Count,
- TrailerCount = filteredItems.OfType<Trailer>().Count(),
MusicVideoCount = musicVideos.Count,
AdultVideoCount = adultVideos.Count,
BoxSetCount = boxsets.Count,
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index f0bf22c5e1..46b4c06722 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -1,17 +1,22 @@
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
+using MoreLinq;
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
namespace MediaBrowser.Api.Movies
{
@@ -21,13 +26,6 @@ namespace MediaBrowser.Api.Movies
[Route("/Movies/{Id}/Similar", "GET", Summary = "Finds movies and trailers similar to a given movie.")]
public class GetSimilarMovies : BaseGetSimilarItemsFromItem
{
- [ApiMember(Name = "IncludeTrailers", Description = "Whether or not to include trailers within the results. Defaults to true.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool IncludeTrailers { get; set; }
-
- public GetSimilarMovies()
- {
- IncludeTrailers = true;
- }
}
[Route("/Movies/Recommendations", "GET", Summary = "Gets movie recommendations")]
@@ -52,7 +50,7 @@ namespace MediaBrowser.Api.Movies
/// <value>The parent id.</value>
[ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string ParentId { get; set; }
-
+
public GetMovieRecommendations()
{
CategoryLimit = 5;
@@ -85,19 +83,22 @@ namespace MediaBrowser.Api.Movies
private readonly IItemRepository _itemRepo;
private readonly IDtoService _dtoService;
+ private readonly IChannelManager _channelManager;
+
/// <summary>
/// Initializes a new instance of the <see cref="MoviesService"/> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataRepository">The user data repository.</param>
/// <param name="libraryManager">The library manager.</param>
- public MoviesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService)
+ public MoviesService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, IChannelManager channelManager)
{
_userManager = userManager;
_userDataRepository = userDataRepository;
_libraryManager = libraryManager;
_itemRepo = itemRepo;
_dtoService = dtoService;
+ _channelManager = channelManager;
}
/// <summary>
@@ -105,38 +106,111 @@ namespace MediaBrowser.Api.Movies
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
- public object Get(GetSimilarMovies request)
+ public async Task<object> Get(GetSimilarMovies request)
{
- var result = SimilarItemsHelper.GetSimilarItemsResult(_userManager,
- _itemRepo,
- _libraryManager,
- _userDataRepository,
- _dtoService,
- Logger,
-
+ var result = await GetSimilarItemsResult(
// Strip out secondary versions
- request, item => (item is Movie || (item is Trailer && request.IncludeTrailers)) && !((Video)item).PrimaryVersionId.HasValue,
+ request, item => (item is Movie) && !((Video)item).PrimaryVersionId.HasValue,
- SimilarItemsHelper.GetSimiliarityScore);
+ SimilarItemsHelper.GetSimiliarityScore).ConfigureAwait(false);
return ToOptimizedSerializedResultUsingCache(result);
}
- public object Get(GetMovieRecommendations request)
+ public async Task<object> Get(GetMovieRecommendations request)
{
var user = _userManager.GetUserById(request.UserId.Value);
var movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId)
- .OfType<Movie>();
+ .Where(i => i is Movie);
+
+ movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies);
+
+ var list = movies.ToList();
+
+ if (user.Configuration.IncludeTrailersInSuggestions)
+ {
+ var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
+ {
+ ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
+ ExtraTypes = new[] { ExtraType.Trailer },
+ UserId = user.Id.ToString("N")
- movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies).Cast<Movie>();
+ }, CancellationToken.None).ConfigureAwait(false);
- var result = GetRecommendationCategories(user, movies.ToList(), request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
+ var newTrailers = trailerResult.Items;
+
+ list.AddRange(newTrailers);
+
+ list = list
+ .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
+ .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
+ .ToList();
+ }
+
+ var result = GetRecommendationCategories(user, list, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList());
return ToOptimizedResult(result);
}
- private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<Movie> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
+ private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore)
+ {
+ var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+
+ var item = string.IsNullOrEmpty(request.Id) ?
+ (request.UserId.HasValue ? user.RootFolder :
+ _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id);
+
+ var fields = request.GetItemFields().ToList();
+
+ var inputItems = user == null
+ ? _libraryManager.RootFolder.GetRecursiveChildren().Where(i => i.Id != item.Id)
+ : user.RootFolder.GetRecursiveChildren(user).Where(i => i.Id != item.Id);
+
+ inputItems = inputItems.Where(includeInSearch);
+
+ var list = inputItems.ToList();
+
+ if (item is Movie && user != null && user.Configuration.IncludeTrailersInSuggestions)
+ {
+ var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
+ {
+ ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
+ ExtraTypes = new[] { ExtraType.Trailer },
+ UserId = user.Id.ToString("N")
+
+ }, CancellationToken.None).ConfigureAwait(false);
+
+ var newTrailers = trailerResult.Items;
+
+ list.AddRange(newTrailers);
+
+ list = list
+ .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
+ .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase)
+ .ToList();
+ }
+
+ var items = SimilarItemsHelper.GetSimilaritems(item, list, getSimilarityScore).ToList();
+
+ IEnumerable<BaseItem> returnItems = items;
+
+ if (request.Limit.HasValue)
+ {
+ returnItems = returnItems.Take(request.Limit.Value);
+ }
+
+ var result = new ItemsResult
+ {
+ Items = returnItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray(),
+
+ TotalRecordCount = items.Count
+ };
+
+ return result;
+ }
+
+ private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields)
{
var categories = new List<RecommendationDto>();
@@ -144,7 +218,7 @@ namespace MediaBrowser.Api.Movies
.Select(i =>
{
var userdata = _userDataRepository.GetUserData(user.Id, i.GetUserDataKey());
- return new Tuple<Movie, bool, DateTime>(i, userdata.Played, userdata.LastPlayedDate ?? DateTime.MinValue);
+ return new Tuple<BaseItem, bool, DateTime>(i, userdata.Played, userdata.LastPlayedDate ?? DateTime.MinValue);
})
.Where(i => i.Item2)
.OrderByDescending(i => i.Item3)
@@ -167,7 +241,7 @@ namespace MediaBrowser.Api.Movies
score = userData.Likes.HasValue ? userData.Likes.Value ? 1 : -1 : 0;
}
- return new Tuple<Movie, int>(i, score);
+ return new Tuple<BaseItem, int>(i, score);
})
.OrderByDescending(i => i.Item2)
.ThenBy(i => Guid.NewGuid())
@@ -233,7 +307,7 @@ namespace MediaBrowser.Api.Movies
return categories.OrderBy(i => i.RecommendationType).ThenBy(i => Guid.NewGuid());
}
- private IEnumerable<RecommendationDto> GetWithDirector(User user, List<Movie> allMovies, IEnumerable<string> directors, int itemLimit, List<ItemFields> fields, RecommendationType type)
+ private IEnumerable<RecommendationDto> GetWithDirector(User user, List<BaseItem> allMovies, IEnumerable<string> directors, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;
@@ -257,7 +331,7 @@ namespace MediaBrowser.Api.Movies
}
}
- private IEnumerable<RecommendationDto> GetWithActor(User user, List<Movie> allMovies, IEnumerable<string> names, int itemLimit, List<ItemFields> fields, RecommendationType type)
+ private IEnumerable<RecommendationDto> GetWithActor(User user, List<BaseItem> allMovies, IEnumerable<string> names, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;
@@ -281,7 +355,7 @@ namespace MediaBrowser.Api.Movies
}
}
- private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<Movie> allMovies, IEnumerable<Movie> baselineItems, int itemLimit, List<ItemFields> fields, RecommendationType type)
+ private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<BaseItem> allMovies, IEnumerable<BaseItem> baselineItems, int itemLimit, List<ItemFields> fields, RecommendationType type)
{
var userId = user.Id;