private ItemsResult GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func <BaseItem, List <PersonInfo>, List <PersonInfo>, BaseItem, int> getSimilarityScore) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); var inputItems = _libraryManager.GetArtists(user.RootFolder.GetRecursiveChildren(user, i => i is IHasArtist).OfType <IHasArtist>()); var list = inputItems.ToList(); var items = SimilarItemsHelper.GetSimilaritems(item, _libraryManager, list, getSimilarityScore).ToList(); IEnumerable <BaseItem> returnItems = items; if (request.Limit.HasValue) { returnItems = returnItems.Take(request.Limit.Value); } var dtoOptions = GetDtoOptions(request); var result = new ItemsResult { Items = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user).ToArray(), TotalRecordCount = items.Count }; return(result); }
private async Task <ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func <BaseItem, List <PersonInfo>, List <PersonInfo>, BaseItem, int> getSimilarityScore) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); var query = new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Movie).Name } }; if (user == null || user.Configuration.IncludeTrailersInSuggestions) { var includeList = query.IncludeItemTypes.ToList(); includeList.Add(typeof(Trailer).Name); query.IncludeItemTypes = includeList.ToArray(); } var parentIds = new string[] { }; var list = _libraryManager.GetItemList(query, parentIds) .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString("N")) .ToList(); if (item is Video) { var imdbId = item.GetProviderId(MetadataProviders.Imdb); // Use imdb id to try to filter duplicates of the same item if (!string.IsNullOrWhiteSpace(imdbId)) { list = list .Where(i => !string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase)) .ToList(); } } var items = SimilarItemsHelper.GetSimilaritems(item, _libraryManager, list, getSimilarityScore).ToList(); IEnumerable <BaseItem> returnItems = items; if (request.Limit.HasValue) { returnItems = returnItems.Take(request.Limit.Value); } var dtoOptions = GetDtoOptions(request); var result = new ItemsResult { Items = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user).ToArray(), TotalRecordCount = items.Count }; return(result); }
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> GetSimilarTo(User user, List <BaseItem> allMovies, IEnumerable <BaseItem> baselineItems, int itemLimit, DtoOptions dtoOptions, RecommendationType type) { foreach (var item in baselineItems) { var similar = SimilarItemsHelper .GetSimilaritems(item, _libraryManager, allMovies, SimilarItemsHelper.GetSimiliarityScore) .Take(itemLimit) .ToList(); if (similar.Count > 0) { yield return(new RecommendationDto { BaselineItemName = item.Name, CategoryId = item.Id.ToString("N"), RecommendationType = type, Items = _dtoService.GetBaseItemDtos(similar, dtoOptions, user).ToArray() }); } } }
private IEnumerable<RecommendationDto> GetSimilarTo(User user, List<Movie> allMovies, IEnumerable<Movie> baselineItems, int itemLimit, List<ItemFields> fields, RecommendationType type) { var userId = user.Id; foreach (var item in baselineItems) { var similar = SimilarItemsHelper .GetSimilaritems(item, allMovies, SimilarItemsHelper.GetSimiliarityScore) .Take(itemLimit) .ToList(); if (similar.Count > 0) { yield return new RecommendationDto { BaselineItemName = item.Name, CategoryId = item.Id.ToString("N"), RecommendationType = type, Items = similar.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray() }; } } }
private async Task <ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func <BaseItem, bool> includeInSearch, Func <BaseItem, BaseItem, int> getSimilarityScore) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; var item = string.IsNullOrEmpty(request.Id) ? (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); Func <BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i); var inputItems = user == null ? _libraryManager.RootFolder.GetRecursiveChildren(filter) : user.RootFolder.GetRecursiveChildren(user, filter); 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(); } if (item is Video) { var imdbId = item.GetProviderId(MetadataProviders.Imdb); // Use imdb id to try to filter duplicates of the same item if (!string.IsNullOrWhiteSpace(imdbId)) { list = list .Where(i => !string.Equals(imdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.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 dtoOptions = GetDtoOptions(request); var result = new ItemsResult { Items = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user).ToArray(), TotalRecordCount = items.Count }; return(result); }