public override IEnumerable <BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query) { return(GetPlayableItems(user, query)); }
protected override QueryResult <Tuple <BaseItem, ItemCounts> > GetItems(GetItemsByName request, InternalItemsQuery query) { return(LibraryManager.GetMusicGenres(query)); }
public override List <BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query) { return(GetEpisodes(user, new DtoOptions(true))); }
/// <summary> /// Gets the search hints. /// </summary> /// <param name="query">The query.</param> /// <param name="user">The user.</param> /// <returns>IEnumerable{SearchHintResult}.</returns> /// <exception cref="ArgumentNullException">searchTerm</exception> private List <SearchHintInfo> GetSearchHints(SearchQuery query, User user) { var searchTerm = query.SearchTerm; if (string.IsNullOrEmpty(searchTerm)) { throw new ArgumentNullException("SearchTerm can't be empty.", nameof(searchTerm)); } searchTerm = searchTerm.Trim().RemoveDiacritics(); var excludeItemTypes = query.ExcludeItemTypes.ToList(); var includeItemTypes = (query.IncludeItemTypes ?? Array.Empty <string>()).ToList(); excludeItemTypes.Add(typeof(Year).Name); excludeItemTypes.Add(typeof(Folder).Name); if (query.IncludeGenres && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Genre", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Genre).Name); AddIfMissing(includeItemTypes, typeof(MusicGenre).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Genre).Name); AddIfMissing(excludeItemTypes, typeof(MusicGenre).Name); } if (query.IncludePeople && (includeItemTypes.Count == 0 || includeItemTypes.Contains("People", StringComparer.OrdinalIgnoreCase) || includeItemTypes.Contains("Person", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Person).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Person).Name); } if (query.IncludeStudios && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Studio", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Studio).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Studio).Name); } if (query.IncludeArtists && (includeItemTypes.Count == 0 || includeItemTypes.Contains("MusicArtist", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(MusicArtist).Name); } } else { AddIfMissing(excludeItemTypes, typeof(MusicArtist).Name); } AddIfMissing(excludeItemTypes, typeof(CollectionFolder).Name); AddIfMissing(excludeItemTypes, typeof(Folder).Name); var mediaTypes = query.MediaTypes.ToList(); if (includeItemTypes.Count > 0) { excludeItemTypes.Clear(); mediaTypes.Clear(); } var searchQuery = new InternalItemsQuery(user) { SearchTerm = searchTerm, ExcludeItemTypes = excludeItemTypes.ToArray(), IncludeItemTypes = includeItemTypes.ToArray(), Limit = query.Limit, IncludeItemsByName = string.IsNullOrEmpty(query.ParentId), ParentId = string.IsNullOrEmpty(query.ParentId) ? Guid.Empty : new Guid(query.ParentId), OrderBy = new[] { new ValueTuple <string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending) }, Recursive = true, IsKids = query.IsKids, IsMovie = query.IsMovie, IsNews = query.IsNews, IsSeries = query.IsSeries, IsSports = query.IsSports, MediaTypes = mediaTypes.ToArray(), DtoOptions = new DtoOptions { Fields = new ItemFields[] { ItemFields.AirTime, ItemFields.DateCreated, ItemFields.ChannelInfo, ItemFields.ParentId } } }; List <BaseItem> mediaItems; if (searchQuery.IncludeItemTypes.Length == 1 && string.Equals(searchQuery.IncludeItemTypes[0], "MusicArtist", StringComparison.OrdinalIgnoreCase)) { if (!searchQuery.ParentId.Equals(Guid.Empty)) { searchQuery.AncestorIds = new[] { searchQuery.ParentId }; } searchQuery.ParentId = Guid.Empty; searchQuery.IncludeItemsByName = true; searchQuery.IncludeItemTypes = Array.Empty <string>(); mediaItems = _libraryManager.GetAllArtists(searchQuery).Items.Select(i => i.Item1).ToList(); } else { mediaItems = _libraryManager.GetItemList(searchQuery); } return(mediaItems.Select(i => new SearchHintInfo { Item = i }).ToList()); }
private InternalItemsQuery GetItemsQuery(GetItems request, User user) { var query = new InternalItemsQuery(user) { IsPlayed = request.IsPlayed, MediaTypes = request.GetMediaTypes(), IncludeItemTypes = request.GetIncludeItemTypes(), ExcludeItemTypes = request.GetExcludeItemTypes(), Recursive = request.Recursive, SortBy = request.GetOrderBy(), SortOrder = request.SortOrder ?? SortOrder.Ascending, IsFavorite = request.IsFavorite, Limit = request.Limit, StartIndex = request.StartIndex, IsMissing = request.IsMissing, IsVirtualUnaired = request.IsVirtualUnaired, IsUnaired = request.IsUnaired, CollapseBoxSetItems = request.CollapseBoxSetItems, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, HasImdbId = request.HasImdbId, IsYearMismatched = request.IsYearMismatched, IsPlaceHolder = request.IsPlaceHolder, IsLocked = request.IsLocked, IsInBoxSet = request.IsInBoxSet, IsHD = request.IsHD, Is3D = request.Is3D, HasTvdbId = request.HasTvdbId, HasTmdbId = request.HasTmdbId, HasOverview = request.HasOverview, HasOfficialRating = request.HasOfficialRating, HasParentalRating = request.HasParentalRating, HasSpecialFeature = request.HasSpecialFeature, HasSubtitles = request.HasSubtitles, HasThemeSong = request.HasThemeSong, HasThemeVideo = request.HasThemeVideo, HasTrailer = request.HasTrailer, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), GenreIds = request.GetGenreIds(), Studios = request.GetStudios(), StudioIds = request.GetStudioIds(), Person = request.Person, PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), ImageTypes = request.GetImageTypes().ToArray(), VideoTypes = request.GetVideoTypes().ToArray(), AdjacentTo = request.AdjacentTo, ItemIds = request.GetItemIds(), MinPlayers = request.MinPlayers, MaxPlayers = request.MaxPlayers, MinCommunityRating = request.MinCommunityRating, MinCriticRating = request.MinCriticRating, ParentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId), ParentIndexNumber = request.ParentIndexNumber, AiredDuringSeason = request.AiredDuringSeason, AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater }; if (!string.IsNullOrWhiteSpace(request.Ids)) { query.CollapseBoxSetItems = false; } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsRecentlyAdded: break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } if (!string.IsNullOrEmpty(request.MinPremiereDate)) { query.MinPremiereDate = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } if (!string.IsNullOrEmpty(request.MaxPremiereDate)) { query.MaxPremiereDate = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } // Filter by Series Status if (!string.IsNullOrEmpty(request.SeriesStatus)) { query.SeriesStatuses = request.SeriesStatus.Split(',').Select(d => (SeriesStatus)Enum.Parse(typeof(SeriesStatus), d, true)).ToArray(); } // Filter by Series AirDays if (!string.IsNullOrEmpty(request.AirDays)) { query.AirDays = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)).ToArray(); } // ExcludeLocationTypes if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) { query.ExcludeLocationTypes = request.ExcludeLocationTypes.Split(',').Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)).ToArray(); } if (!string.IsNullOrEmpty(request.LocationTypes)) { query.LocationTypes = request.LocationTypes.Split(',').Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)).ToArray(); } // Min official rating if (!string.IsNullOrEmpty(request.MinOfficialRating)) { query.MinParentalRating = _localization.GetRatingLevel(request.MinOfficialRating); } // Max official rating if (!string.IsNullOrEmpty(request.MaxOfficialRating)) { query.MaxParentalRating = _localization.GetRatingLevel(request.MinOfficialRating); } // Artists if (!string.IsNullOrEmpty(request.ArtistIds)) { var artistIds = request.ArtistIds.Split(new[] { '|', ',' }); var artistItems = artistIds.Select(_libraryManager.GetItemById).Where(i => i != null).ToList(); query.ArtistNames = artistItems.Select(i => i.Name).ToArray(); } // Artists if (!string.IsNullOrEmpty(request.Artists)) { query.ArtistNames = request.Artists.Split('|'); } // Albums if (!string.IsNullOrEmpty(request.Albums)) { query.AlbumNames = request.Albums.Split('|'); } return(query); }
public object Get(GetQueryFilters request) { var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null; if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase)) { parentItem = null; } var filters = new QueryFilters(); var genreQuery = new InternalItemsQuery(user) { IncludeItemTypes = request.GetIncludeItemTypes(), DtoOptions = new Controller.Dto.DtoOptions { Fields = Array.Empty <ItemFields>(), EnableImages = false, EnableUserData = false }, IsAiring = request.IsAiring, IsMovie = request.IsMovie, IsSports = request.IsSports, IsKids = request.IsKids, IsNews = request.IsNews, IsSeries = request.IsSeries }; // Non recursive not yet supported for library folders if ((request.Recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder) { genreQuery.AncestorIds = parentItem == null?Array.Empty <Guid>() : new[] { parentItem.Id }; } else { genreQuery.Parent = parentItem; } if (string.Equals(request.IncludeItemTypes, "MusicAlbum", StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, "MusicVideo", StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, "MusicArtist", StringComparison.OrdinalIgnoreCase) || string.Equals(request.IncludeItemTypes, "Audio", StringComparison.OrdinalIgnoreCase)) { filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair { Name = i.Item1.Name, Id = i.Item1.Id }).ToArray(); } else { filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair { Name = i.Item1.Name, Id = i.Item1.Id }).ToArray(); } return(ToOptimizedResult(filters)); }
private QueryResult <ServerItem> GetUserItems(BaseItem item, StubType?stubType, User user, SortCriteria sort, int?startIndex, int?limit) { if (item is MusicGenre) { return(GetMusicGenreItems(item, null, user, sort, startIndex, limit)); } if (item is MusicArtist) { return(GetMusicArtistItems(item, null, user, sort, startIndex, limit)); } var collectionFolder = item as ICollectionFolder; if (collectionFolder != null && string.Equals(CollectionType.Music, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetMusicFolders(item, user, stubType, sort, startIndex, limit)); } if (stubType.HasValue) { if (stubType.Value == StubType.People) { var items = _libraryManager.GetPeopleItems(new InternalPeopleQuery { ItemId = item.Id }).ToArray(); var result = new QueryResult <ServerItem> { Items = items.Select(i => new ServerItem(i)).ToArray(), TotalRecordCount = items.Length }; return(ApplyPaging(result, startIndex, limit)); } var person = item as Person; if (person != null) { return(GetItemsFromPerson(person, user, startIndex, limit)); } return(ApplyPaging(new QueryResult <ServerItem>(), startIndex, limit)); } var folder = (Folder)item; var query = new InternalItemsQuery { Limit = limit, StartIndex = startIndex, User = user, IsMissing = false, PresetViews = new[] { CollectionType.Movies, CollectionType.TvShows }, ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name }, IsPlaceHolder = false, DtoOptions = GetDtoOptions() }; SetSorting(query, sort, folder.IsPreSorted); var queryResult = folder.GetItems(query); return(ToResult(queryResult)); }
public ActionResult <QueryResult <BaseItemDto> > GetYears( [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] SortOrder[] sortOrder, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] sortBy, [FromQuery] bool?enableUserData, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] Guid?userId, [FromQuery] bool recursive = true, [FromQuery] bool?enableImages = true) { var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); User? user = null; BaseItem parentItem = _libraryManager.GetParentItem(parentId, userId); if (userId.HasValue && !userId.Equals(Guid.Empty)) { user = _userManager.GetUserById(userId.Value); } IList <BaseItem> items; var query = new InternalItemsQuery(user) { ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), MediaTypes = mediaTypes, DtoOptions = dtoOptions }; bool Filter(BaseItem i) => FilterItem(i, excludeItemTypes, includeItemTypes, mediaTypes); if (parentItem.IsFolder) { var folder = (Folder)parentItem; if (!userId.Equals(Guid.Empty)) { items = recursive ? folder.GetRecursiveChildren(user, query).ToList() : folder.GetChildren(user, true).Where(Filter).ToList(); } else { items = recursive ? folder.GetRecursiveChildren(Filter) : folder.Children.Where(Filter).ToList(); } } else { items = new[] { parentItem }.Where(Filter).ToList(); } var extractedItems = GetAllItems(items); var filteredItems = _libraryManager.Sort(extractedItems, user, RequestHelpers.GetOrderBy(sortBy, sortOrder)); var ibnItemsArray = filteredItems.ToList(); IEnumerable <BaseItem> ibnItems = ibnItemsArray; var result = new QueryResult <BaseItemDto> { TotalRecordCount = ibnItemsArray.Count }; if (startIndex.HasValue || limit.HasValue) { if (startIndex.HasValue) { ibnItems = ibnItems.Skip(startIndex.Value); } if (limit.HasValue) { ibnItems = ibnItems.Take(limit.Value); } } var tuples = ibnItems.Select(i => new Tuple <BaseItem, List <BaseItem> >(i, new List <BaseItem>())); var dtos = tuples.Select(i => _dtoService.GetItemByNameDto(i.Item1, dtoOptions, i.Item2, user)); result.Items = dtos.Where(i => i != null).ToArray(); return(result); }
public async Task Execute(CancellationToken cancellationToken, IProgress <double> progress) { var options = GetOptions(); var types = new[] { "Episode", "Movie" }; var dict = new Dictionary <Guid, BaseItem>(); foreach (var library in _libraryManager.RootFolder.Children.ToList()) { var libraryOptions = _libraryManager.GetLibraryOptions(library); string[] subtitleDownloadLanguages; bool SkipIfEmbeddedSubtitlesPresent; bool SkipIfAudioTrackMatches; bool RequirePerfectMatch; if (libraryOptions.SubtitleDownloadLanguages == null) { subtitleDownloadLanguages = options.DownloadLanguages; SkipIfEmbeddedSubtitlesPresent = options.SkipIfEmbeddedSubtitlesPresent; SkipIfAudioTrackMatches = options.SkipIfAudioTrackMatches; RequirePerfectMatch = options.RequirePerfectMatch; } else { subtitleDownloadLanguages = libraryOptions.SubtitleDownloadLanguages; SkipIfEmbeddedSubtitlesPresent = libraryOptions.SkipSubtitlesIfEmbeddedSubtitlesPresent; SkipIfAudioTrackMatches = libraryOptions.SkipSubtitlesIfAudioTrackMatches; RequirePerfectMatch = libraryOptions.RequirePerfectSubtitleMatch; } foreach (var lang in subtitleDownloadLanguages) { var query = new InternalItemsQuery { MediaTypes = new string[] { MediaType.Video }, IsVirtualItem = false, IncludeItemTypes = types, DtoOptions = new DtoOptions(true), SourceTypes = new[] { SourceType.Library }, Parent = library, Recursive = true }; if (SkipIfAudioTrackMatches) { query.HasNoAudioTrackWithLanguage = lang; } if (SkipIfEmbeddedSubtitlesPresent) { // Exclude if it already has any subtitles of the same language query.HasNoSubtitleTrackWithLanguage = lang; } else { // Exclude if it already has external subtitles of the same language query.HasNoExternalSubtitleTrackWithLanguage = lang; } var videosByLanguage = _libraryManager.GetItemList(query); foreach (var video in videosByLanguage) { dict[video.Id] = video; } } } var videos = dict.Values.ToList(); if (videos.Count == 0) { return; } var numComplete = 0; foreach (var video in videos) { cancellationToken.ThrowIfCancellationRequested(); try { await DownloadSubtitles(video as Video, options, cancellationToken).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "Error downloading subtitles for {Path}", video.Path); } // Update progress numComplete++; double percent = numComplete; percent /= videos.Count; progress.Report(100 * percent); } }
protected override QueryResult <Tuple <BaseItem, ItemCounts> > GetItems(GetItemsByName request, InternalItemsQuery query) { if (request is GetAlbumArtists) { return(LibraryManager.GetAlbumArtists(query)); } return(LibraryManager.GetArtists(query)); }
public async Task <QueryResult <BaseItem> > GetChannelItemsInternal(InternalItemsQuery query, IProgress <double> progress, CancellationToken cancellationToken) { // Get the internal channel entity var channel = GetChannel(query.ChannelIds[0]); // Find the corresponding channel provider plugin var channelProvider = GetChannelProvider(channel); var user = query.User; ChannelItemSortField?sortField = null; var sortDescending = false; var parentItem = !query.ParentId.Equals(Guid.Empty) ? _libraryManager.GetItemById(query.ParentId) : channel; var itemsResult = await GetChannelItems(channelProvider, user, parentItem is Channel?null : parentItem.ExternalId, sortField, sortDescending, cancellationToken) .ConfigureAwait(false); if (query.ParentId.Equals(Guid.Empty)) { query.Parent = channel; } query.ChannelIds = Array.Empty <Guid>(); // Not yet sure why this is causing a problem query.GroupByPresentationUniqueKey = false; //_logger.LogDebug("GetChannelItemsInternal"); // null if came from cache if (itemsResult != null) { var internalItems = itemsResult.Items .Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, parentItem, cancellationToken)) .ToArray(); var existingIds = _libraryManager.GetItemIds(query); var deadIds = existingIds.Except(internalItems.Select(i => i.Id)) .ToArray(); foreach (var deadId in deadIds) { var deadItem = _libraryManager.GetItemById(deadId); if (deadItem != null) { _libraryManager.DeleteItem(deadItem, new DeleteOptions { DeleteFileLocation = false, DeleteFromExternalProvider = false }, parentItem, false); } } } return(_libraryManager.GetItemsResult(query)); }
protected QueryResult <BaseItemDto> GetResultSlim(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); User user = null; BaseItem parentItem; if (!string.IsNullOrWhiteSpace(request.UserId)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes, StartIndex = request.StartIndex, Limit = request.Limit, IsFavorite = request.IsFavorite, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), GenreIds = request.GetGenreIds(), StudioIds = request.GetStudioIds(), Person = request.Person, PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), MinCommunityRating = request.MinCommunityRating, DtoOptions = dtoOptions }; if (!string.IsNullOrWhiteSpace(request.ParentId)) { if (parentItem is Folder) { query.AncestorIds = new[] { request.ParentId }; } else { query.ItemIds = new[] { request.ParentId }; } } // Studios if (!string.IsNullOrEmpty(request.Studios)) { query.StudioIds = request.Studios.Split('|').Select(i => { try { return(LibraryManager.GetStudio(i)); } catch { return(null); } }).Where(i => i != null).Select(i => i.Id.ToString("N")).ToArray(); } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } var result = GetItems(request, query); var syncProgess = DtoService.GetSyncedItemProgress(dtoOptions); var dtos = result.Items.Select(i => { var dto = DtoService.GetItemByNameDto(i.Item1, dtoOptions, null, syncProgess, user); if (!string.IsNullOrWhiteSpace(request.IncludeItemTypes)) { SetItemCounts(dto, i.Item2); } return(dto); }); return(new QueryResult <BaseItemDto> { Items = dtos.ToArray(result.Items.Length), TotalRecordCount = result.TotalRecordCount }); }
/// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> protected QueryResult <BaseItemDto> GetResult(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); User user = null; BaseItem parentItem; if (!string.IsNullOrWhiteSpace(request.UserId)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } IList <BaseItem> items; var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes, DtoOptions = dtoOptions }; Func <BaseItem, bool> filter = i => FilterItem(request, i, excludeItemTypes, includeItemTypes, mediaTypes); if (parentItem.IsFolder) { var folder = (Folder)parentItem; if (!string.IsNullOrWhiteSpace(request.UserId)) { items = request.Recursive ? folder.GetRecursiveChildren(user, query).ToList() : folder.GetChildren(user, true).Where(filter).ToList(); } else { items = request.Recursive ? folder.GetRecursiveChildren(filter) : folder.Children.Where(filter).ToList(); } } else { items = new[] { parentItem }.Where(filter).ToList(); } var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending); var ibnItemsArray = filteredItems.ToList(); IEnumerable <BaseItem> ibnItems = ibnItemsArray; var result = new QueryResult <BaseItemDto> { TotalRecordCount = ibnItemsArray.Count }; if (request.StartIndex.HasValue || request.Limit.HasValue) { if (request.StartIndex.HasValue) { ibnItems = ibnItems.Skip(request.StartIndex.Value); } if (request.Limit.HasValue) { ibnItems = ibnItems.Take(request.Limit.Value); } } var tuples = ibnItems.Select(i => new Tuple <BaseItem, List <BaseItem> >(i, new List <BaseItem>())); var syncProgess = DtoService.GetSyncedItemProgress(dtoOptions); var dtos = tuples.Select(i => DtoService.GetItemByNameDto(i.Item1, dtoOptions, i.Item2, syncProgess, user)); result.Items = dtos.Where(i => i != null).ToArray(); return(result); }
protected virtual QueryResult <Tuple <BaseItem, ItemCounts> > GetItems(GetItemsByName request, InternalItemsQuery query) { return(new QueryResult <Tuple <BaseItem, ItemCounts> >()); }
private QueryResult <ServerItem> GetFavoriteArtists(BaseItem parent, User user, InternalItemsQuery query) { var artists = _libraryManager.GetArtists(new InternalItemsQuery(user) { AncestorIds = new[] { parent.Id }, StartIndex = query.StartIndex, Limit = query.Limit, IsFavorite = true }); var result = new QueryResult <BaseItem> { TotalRecordCount = artists.TotalRecordCount, Items = artists.Items.Select(i => i.Item1).ToArray() }; return(ToResult(result)); }
protected override QueryResult <(BaseItem, ItemCounts)> GetItems(GetItemsByName request, InternalItemsQuery query) { return(LibraryManager.GetStudios(query)); }
private QueryResult <ServerItem> GetMusicPlaylists(BaseItem parent, User user, InternalItemsQuery query) { query.Parent = null; query.IncludeItemTypes = new[] { typeof(Playlist).Name }; query.SetUser(user); query.Recursive = true; var result = _libraryManager.GetItemsResult(query); return(ToResult(result)); }
/// <summary> /// Gets the search hints. /// </summary> /// <param name="query">The query.</param> /// <param name="user">The user.</param> /// <returns>IEnumerable{SearchHintResult}.</returns> /// <exception cref="System.ArgumentNullException">searchTerm</exception> private Task <IEnumerable <SearchHintInfo> > GetSearchHints(SearchQuery query, User user) { var searchTerm = query.SearchTerm; if (string.IsNullOrEmpty(searchTerm)) { throw new ArgumentNullException("searchTerm"); } searchTerm = searchTerm.Trim().RemoveDiacritics(); searchTerm = this.FixUnicodeChars(searchTerm); var terms = GetWords(searchTerm); var excludeItemTypes = query.ExcludeItemTypes.ToList(); var includeItemTypes = (query.IncludeItemTypes ?? Array.Empty <string>()).ToList(); excludeItemTypes.Add(typeof(Year).Name); excludeItemTypes.Add(typeof(Folder).Name); if (query.IncludeGenres && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Genre", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Genre).Name); AddIfMissing(includeItemTypes, typeof(GameGenre).Name); AddIfMissing(includeItemTypes, typeof(MusicGenre).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Genre).Name); AddIfMissing(excludeItemTypes, typeof(GameGenre).Name); AddIfMissing(excludeItemTypes, typeof(MusicGenre).Name); } if (query.IncludePeople && (includeItemTypes.Count == 0 || includeItemTypes.Contains("People", StringComparer.OrdinalIgnoreCase) || includeItemTypes.Contains("Person", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Person).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Person).Name); } if (query.IncludeStudios && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Studio", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(Studio).Name); } } else { AddIfMissing(excludeItemTypes, typeof(Studio).Name); } if (query.IncludeArtists && (includeItemTypes.Count == 0 || includeItemTypes.Contains("MusicArtist", StringComparer.OrdinalIgnoreCase))) { if (!query.IncludeMedia) { AddIfMissing(includeItemTypes, typeof(MusicArtist).Name); } } else { AddIfMissing(excludeItemTypes, typeof(MusicArtist).Name); } AddIfMissing(excludeItemTypes, typeof(CollectionFolder).Name); AddIfMissing(excludeItemTypes, typeof(Folder).Name); var mediaTypes = query.MediaTypes.ToList(); if (includeItemTypes.Count > 0) { excludeItemTypes.Clear(); mediaTypes.Clear(); } var searchQuery = new InternalItemsQuery(user) { NameContains = searchTerm, ExcludeItemTypes = excludeItemTypes.ToArray(excludeItemTypes.Count), IncludeItemTypes = includeItemTypes.ToArray(includeItemTypes.Count), Limit = query.Limit, IncludeItemsByName = string.IsNullOrEmpty(query.ParentId), ParentId = string.IsNullOrEmpty(query.ParentId) ? (Guid?)null : new Guid(query.ParentId), OrderBy = new[] { new Tuple <string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending) }, Recursive = true, IsKids = query.IsKids, IsMovie = query.IsMovie, IsNews = query.IsNews, IsSeries = query.IsSeries, IsSports = query.IsSports, MediaTypes = mediaTypes.ToArray(), DtoOptions = new DtoOptions { Fields = new ItemFields[] { ItemFields.AirTime, ItemFields.DateCreated, ItemFields.ChannelInfo, ItemFields.ParentId } } }; List <BaseItem> mediaItems; if (searchQuery.IncludeItemTypes.Length == 1 && string.Equals(searchQuery.IncludeItemTypes[0], "MusicArtist", StringComparison.OrdinalIgnoreCase)) { if (searchQuery.ParentId.HasValue) { searchQuery.AncestorIds = new Guid[] { searchQuery.ParentId.Value }; } searchQuery.ParentId = null; searchQuery.IncludeItemsByName = true; searchQuery.IncludeItemTypes = Array.Empty <string>(); mediaItems = _libraryManager.GetAllArtists(searchQuery).Items.Select(i => i.Item1).ToList(); } else { mediaItems = _libraryManager.GetItemList(searchQuery); } var returnValue = mediaItems.Select(item => { var index = GetIndex(item.Name, searchTerm, terms); return(new Tuple <BaseItem, string, int>(item, index.Item1, index.Item2)); }).OrderBy(i => i.Item3).ThenBy(i => i.Item1.SortName).Select(i => new SearchHintInfo { Item = i.Item1, MatchedTerm = i.Item2 }); return(Task.FromResult(returnValue)); }
private QueryResult <ServerItem> GetUserItems(BaseItem item, StubType?stubType, User user, SortCriteria sort, int?startIndex, int?limit) { if (item is MusicGenre) { return(GetMusicGenreItems(item, Guid.Empty, user, sort, startIndex, limit)); } if (item is MusicArtist) { return(GetMusicArtistItems(item, Guid.Empty, user, sort, startIndex, limit)); } if (item is Genre) { return(GetGenreItems(item, Guid.Empty, user, sort, startIndex, limit)); } if ((!stubType.HasValue || stubType.Value != StubType.Folder) && item is IHasCollectionType collectionFolder) { if (string.Equals(CollectionType.Music, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetMusicFolders(item, user, stubType, sort, startIndex, limit)); } else if (string.Equals(CollectionType.Movies, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetMovieFolders(item, user, stubType, sort, startIndex, limit)); } else if (string.Equals(CollectionType.TvShows, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetTvFolders(item, user, stubType, sort, startIndex, limit)); } else if (string.Equals(CollectionType.Folders, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetFolders(item, user, stubType, sort, startIndex, limit)); } else if (string.Equals(CollectionType.LiveTv, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase)) { return(GetLiveTvChannels(item, user, stubType, sort, startIndex, limit)); } } if (stubType.HasValue) { if (stubType.Value != StubType.Folder) { return(ApplyPaging(new QueryResult <ServerItem>(), startIndex, limit)); } } var folder = (Folder)item; var query = new InternalItemsQuery(user) { Limit = limit, StartIndex = startIndex, IsVirtualItem = false, ExcludeItemTypes = new[] { typeof(Book).Name }, IsPlaceHolder = false, DtoOptions = GetDtoOptions() }; SetSorting(query, sort, folder.IsPreSorted); var queryResult = folder.GetItems(query); return(ToResult(queryResult)); }
private InternalItemsQuery GetItemsQuery(GetItems request, DtoOptions dtoOptions, User user) { var query = new InternalItemsQuery(user) { IsPlayed = request.IsPlayed, MediaTypes = request.GetMediaTypes(), IncludeItemTypes = request.GetIncludeItemTypes(), ExcludeItemTypes = request.GetExcludeItemTypes(), Recursive = request.Recursive, OrderBy = request.GetOrderBy(), IsFavorite = request.IsFavorite, Limit = request.Limit, StartIndex = request.StartIndex, IsMissing = request.IsMissing, IsUnaired = request.IsUnaired, CollapseBoxSetItems = request.CollapseBoxSetItems, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, HasImdbId = request.HasImdbId, IsPlaceHolder = request.IsPlaceHolder, IsLocked = request.IsLocked, MinWidth = request.MinWidth, MinHeight = request.MinHeight, MaxWidth = request.MaxWidth, MaxHeight = request.MaxHeight, Is3D = request.Is3D, HasTvdbId = request.HasTvdbId, HasTmdbId = request.HasTmdbId, HasOverview = request.HasOverview, HasOfficialRating = request.HasOfficialRating, HasParentalRating = request.HasParentalRating, HasSpecialFeature = request.HasSpecialFeature, HasSubtitles = request.HasSubtitles, HasThemeSong = request.HasThemeSong, HasThemeVideo = request.HasThemeVideo, HasTrailer = request.HasTrailer, IsHD = request.IsHD, Is4K = request.Is4K, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), ArtistIds = GetGuids(request.ArtistIds), AlbumArtistIds = GetGuids(request.AlbumArtistIds), ContributingArtistIds = GetGuids(request.ContributingArtistIds), GenreIds = GetGuids(request.GenreIds), StudioIds = GetGuids(request.StudioIds), Person = request.Person, PersonIds = GetGuids(request.PersonIds), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), ImageTypes = request.GetImageTypes(), VideoTypes = request.GetVideoTypes(), AdjacentTo = request.AdjacentTo, ItemIds = GetGuids(request.Ids), MinPlayers = request.MinPlayers, MaxPlayers = request.MaxPlayers, MinCommunityRating = request.MinCommunityRating, MinCriticRating = request.MinCriticRating, ParentId = string.IsNullOrWhiteSpace(request.ParentId) ? Guid.Empty : new Guid(request.ParentId), ParentIndexNumber = request.ParentIndexNumber, EnableTotalRecordCount = request.EnableTotalRecordCount, ExcludeItemIds = GetGuids(request.ExcludeItemIds), DtoOptions = dtoOptions, SearchTerm = request.SearchTerm }; if (!string.IsNullOrWhiteSpace(request.Ids) || !string.IsNullOrWhiteSpace(request.SearchTerm)) { query.CollapseBoxSetItems = false; } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } if (!string.IsNullOrEmpty(request.MinDateLastSaved)) { query.MinDateLastSaved = DateTime.Parse(request.MinDateLastSaved, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } if (!string.IsNullOrEmpty(request.MinDateLastSavedForUser)) { query.MinDateLastSavedForUser = DateTime.Parse(request.MinDateLastSavedForUser, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } if (!string.IsNullOrEmpty(request.MinPremiereDate)) { query.MinPremiereDate = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } if (!string.IsNullOrEmpty(request.MaxPremiereDate)) { query.MaxPremiereDate = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); } // Filter by Series Status if (!string.IsNullOrEmpty(request.SeriesStatus)) { query.SeriesStatuses = request.SeriesStatus.Split(',').Select(d => (SeriesStatus)Enum.Parse(typeof(SeriesStatus), d, true)).ToArray(); } // ExcludeLocationTypes if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) { var excludeLocationTypes = request.ExcludeLocationTypes.Split(',').Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)).ToArray(); if (excludeLocationTypes.Contains(LocationType.Virtual)) { query.IsVirtualItem = false; } } if (!string.IsNullOrEmpty(request.LocationTypes)) { var requestedLocationTypes = request.LocationTypes.Split(','); if (requestedLocationTypes.Length > 0 && requestedLocationTypes.Length < 4) { query.IsVirtualItem = requestedLocationTypes.Contains(LocationType.Virtual.ToString()); } } // Min official rating if (!string.IsNullOrWhiteSpace(request.MinOfficialRating)) { query.MinParentalRating = _localization.GetRatingLevel(request.MinOfficialRating); } // Max official rating if (!string.IsNullOrWhiteSpace(request.MaxOfficialRating)) { query.MaxParentalRating = _localization.GetRatingLevel(request.MaxOfficialRating); } // Artists if (!string.IsNullOrEmpty(request.Artists)) { query.ArtistIds = request.Artists.Split('|').Select(i => { try { return(_libraryManager.GetArtist(i, new DtoOptions(false))); } catch { return(null); } }).Where(i => i != null).Select(i => i.Id).ToArray(); } // ExcludeArtistIds if (!string.IsNullOrWhiteSpace(request.ExcludeArtistIds)) { query.ExcludeArtistIds = GetGuids(request.ExcludeArtistIds); } if (!string.IsNullOrWhiteSpace(request.AlbumIds)) { query.AlbumIds = GetGuids(request.AlbumIds); } // Albums if (!string.IsNullOrEmpty(request.Albums)) { query.AlbumIds = request.Albums.Split('|').SelectMany(i => { return(_libraryManager.GetItemIds(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(MusicAlbum).Name }, Name = i, Limit = 1 }).Select(albumId => albumId)); }).ToArray(); } // Studios if (!string.IsNullOrEmpty(request.Studios)) { query.StudioIds = request.Studios.Split('|').Select(i => { try { return(_libraryManager.GetStudio(i)); } catch { return(null); } }).Where(i => i != null).Select(i => i.Id).ToArray(); } // Apply default sorting if none requested if (query.OrderBy.Length == 0) { // Albums by artist if (query.ArtistIds.Length > 0 && query.IncludeItemTypes.Length == 1 && string.Equals(query.IncludeItemTypes[0], "MusicAlbum", StringComparison.OrdinalIgnoreCase)) { query.OrderBy = new [] { new ValueTuple <string, SortOrder>(ItemSortBy.ProductionYear, SortOrder.Descending), new ValueTuple <string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending) }; } } return(query); }
private QueryResult <ServerItem> GetMusicFolders(BaseItem item, User user, StubType?stubType, SortCriteria sort, int?startIndex, int?limit) { var query = new InternalItemsQuery(user) { StartIndex = startIndex, Limit = limit }; SetSorting(query, sort, false); if (stubType.HasValue && stubType.Value == StubType.Latest) { return(GetMusicLatest(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Playlists) { return(GetMusicPlaylists(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Albums) { return(GetMusicAlbums(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Artists) { return(GetMusicArtists(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.AlbumArtists) { return(GetMusicAlbumArtists(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.FavoriteAlbums) { return(GetFavoriteAlbums(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.FavoriteArtists) { return(GetFavoriteArtists(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.FavoriteSongs) { return(GetFavoriteSongs(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Songs) { return(GetMusicSongs(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Genres) { return(GetMusicGenres(item, user, query)); } var list = new List <ServerItem>(); list.Add(new ServerItem(item) { StubType = StubType.Latest }); list.Add(new ServerItem(item) { StubType = StubType.Playlists }); list.Add(new ServerItem(item) { StubType = StubType.Albums }); list.Add(new ServerItem(item) { StubType = StubType.AlbumArtists }); list.Add(new ServerItem(item) { StubType = StubType.Artists }); list.Add(new ServerItem(item) { StubType = StubType.Songs }); list.Add(new ServerItem(item) { StubType = StubType.Genres }); list.Add(new ServerItem(item) { StubType = StubType.FavoriteArtists }); list.Add(new ServerItem(item) { StubType = StubType.FavoriteAlbums }); list.Add(new ServerItem(item) { StubType = StubType.FavoriteSongs }); return(new QueryResult <ServerItem> { Items = list.ToArray(), TotalRecordCount = list.Count }); }
private List <BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parents = new List <BaseItem>(); if (!parentId.Equals(Guid.Empty)) { var parentItem = _libraryManager.GetItemById(parentId); var parentItemChannel = parentItem as Channel; if (parentItemChannel != null) { return(_channelManager.GetLatestChannelItemsInternal(new InternalItemsQuery(user) { ChannelIds = new[] { parentId }, IsPlayed = request.IsPlayed, StartIndex = request.StartIndex, Limit = request.Limit, IncludeItemTypes = request.IncludeItemTypes, EnableTotalRecordCount = false }, CancellationToken.None).Result.Items.ToList()); } var parent = parentItem as Folder; if (parent != null) { parents.Add(parent); } } var isPlayed = request.IsPlayed; if (parents.OfType <ICollectionFolder>().Any(i => string.Equals(i.CollectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))) { isPlayed = null; } if (parents.Count == 0) { parents = _libraryManager.GetUserRootFolder().GetChildren(user, true) .Where(i => i is Folder) .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) .ToList(); } if (parents.Count == 0) { return(new List <BaseItem>()); } if (includeItemTypes.Length == 0) { // Handle situations with the grouping setting, e.g. movies showing up in tv, etc. // Thanks to mixed content libraries included in the UserView var hasCollectionType = parents.OfType <UserView>().ToArray(); if (hasCollectionType.Length > 0) { if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Movie" }; } else if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Episode" }; } } } var mediaTypes = new List <string>(); if (includeItemTypes.Length == 0) { foreach (var parent in parents.OfType <ICollectionFolder>()) { switch (parent.CollectionType) { case CollectionType.Books: mediaTypes.Add(MediaType.Book); mediaTypes.Add(MediaType.Audio); break; case CollectionType.Games: mediaTypes.Add(MediaType.Game); break; case CollectionType.Music: mediaTypes.Add(MediaType.Audio); break; case CollectionType.Photos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; case CollectionType.HomeVideos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; default: mediaTypes.Add(MediaType.Video); break; } } mediaTypes = mediaTypes.Distinct().ToList(); } var excludeItemTypes = includeItemTypes.Length == 0 && mediaTypes.Count == 0 ? new[] { typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : Array.Empty <string>(); var query = new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, OrderBy = new[] { new ValueTuple <string, SortOrder>(ItemSortBy.DateCreated, SortOrder.Descending) }, IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, ExcludeItemTypes = excludeItemTypes, IsVirtualItem = false, Limit = limit * 5, IsPlayed = isPlayed, DtoOptions = options, MediaTypes = mediaTypes.ToArray() }; if (parents.Count == 0) { return(_libraryManager.GetItemList(query, false)); } return(_libraryManager.GetItemList(query, parents)); }
private QueryResult <ServerItem> GetTvFolders(BaseItem item, User user, StubType?stubType, SortCriteria sort, int?startIndex, int?limit) { var query = new InternalItemsQuery(user) { StartIndex = startIndex, Limit = limit }; SetSorting(query, sort, false); if (stubType.HasValue && stubType.Value == StubType.ContinueWatching) { return(GetMovieContinueWatching(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.NextUp) { return(GetNextUp(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Latest) { return(GetTvLatest(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Series) { return(GetSeries(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.FavoriteSeries) { return(GetFavoriteSeries(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.FavoriteEpisodes) { return(GetFavoriteEpisodes(item, user, query)); } if (stubType.HasValue && stubType.Value == StubType.Genres) { return(GetGenres(item, user, query)); } var list = new List <ServerItem>(); list.Add(new ServerItem(item) { StubType = StubType.ContinueWatching }); list.Add(new ServerItem(item) { StubType = StubType.NextUp }); list.Add(new ServerItem(item) { StubType = StubType.Latest }); list.Add(new ServerItem(item) { StubType = StubType.Series }); list.Add(new ServerItem(item) { StubType = StubType.FavoriteSeries }); list.Add(new ServerItem(item) { StubType = StubType.FavoriteEpisodes }); list.Add(new ServerItem(item) { StubType = StubType.Genres }); return(new QueryResult <ServerItem> { Items = list.ToArray(), TotalRecordCount = list.Count }); }
private InternalItemsQuery GetItemsQuery(GetItems request, User user) { var query = new InternalItemsQuery { User = user, IsPlayed = request.IsPlayed, MediaTypes = request.GetMediaTypes(), IncludeItemTypes = request.GetIncludeItemTypes(), ExcludeItemTypes = request.GetExcludeItemTypes(), Recursive = request.Recursive, SortBy = request.GetOrderBy(), SortOrder = request.SortOrder ?? SortOrder.Ascending, Filter = i => ApplyAdditionalFilters(request, i, user, _libraryManager), Limit = request.Limit, StartIndex = request.StartIndex, IsMissing = request.IsMissing, IsVirtualUnaired = request.IsVirtualUnaired, IsUnaired = request.IsUnaired, CollapseBoxSetItems = request.CollapseBoxSetItems, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, HasImdbId = request.HasImdbId, IsYearMismatched = request.IsYearMismatched, IsUnidentified = request.IsUnidentified, IsPlaceHolder = request.IsPlaceHolder, IsLocked = request.IsLocked, IsInBoxSet = request.IsInBoxSet, IsHD = request.IsHD, Is3D = request.Is3D, HasTvdbId = request.HasTvdbId, HasTmdbId = request.HasTmdbId, HasOverview = request.HasOverview, HasOfficialRating = request.HasOfficialRating, HasParentalRating = request.HasParentalRating, HasSpecialFeature = request.HasSpecialFeature, HasSubtitles = request.HasSubtitles, HasThemeSong = request.HasThemeSong, HasThemeVideo = request.HasThemeVideo, HasTrailer = request.HasTrailer, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), Studios = request.GetStudios(), StudioIds = request.GetStudioIds(), Person = request.Person, PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), ImageTypes = request.GetImageTypes().ToArray(), VideoTypes = request.GetVideoTypes().ToArray(), AdjacentTo = request.AdjacentTo, ItemIds = request.GetItemIds(), MinPlayers = request.MinPlayers, MaxPlayers = request.MaxPlayers, MinCommunityRating = request.MinCommunityRating, MinCriticRating = request.MinCriticRating }; if (!string.IsNullOrWhiteSpace(request.Ids)) { query.CollapseBoxSetItems = false; } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsRecentlyAdded: break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } return(query); }
private QueryResult <ServerItem> GetMovieContinueWatching(BaseItem parent, User user, InternalItemsQuery query) { query.Recursive = true; query.Parent = parent; query.SetUser(user); query.OrderBy = new ValueTuple <string, SortOrder>[] { new ValueTuple <string, SortOrder> (ItemSortBy.DatePlayed, SortOrder.Descending), new ValueTuple <string, SortOrder> (ItemSortBy.SortName, SortOrder.Ascending) }; query.IsResumable = true; query.Limit = 10; var result = _libraryManager.GetItemsResult(query); return(ToResult(result)); }
public override List <BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query) { return(GetPlayableItems(user, query)); }
private QueryResult <ServerItem> GetMovieCollections(BaseItem parent, User user, InternalItemsQuery query) { query.Recursive = true; //query.Parent = parent; query.SetUser(user); query.IncludeItemTypes = new[] { typeof(BoxSet).Name }; var result = _libraryManager.GetItemsResult(query); return(ToResult(result)); }
public override List <BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query) { var children = base.GetChildren(user, includeLinkedChildren, query); if (string.Equals(DisplayOrder, ItemSortBy.SortName, StringComparison.OrdinalIgnoreCase)) { // Sort by name return(LibraryManager.Sort(children, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending).ToList()); } if (string.Equals(DisplayOrder, ItemSortBy.PremiereDate, StringComparison.OrdinalIgnoreCase)) { // Sort by release date return(LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending).ToList()); } // Default sorting return(LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending).ToList()); }
private QueryResult <ServerItem> GetFavoriteEpisodes(BaseItem parent, User user, InternalItemsQuery query) { query.Recursive = true; query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(Episode).Name }; var result = _libraryManager.GetItemsResult(query); return(ToResult(result)); }
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.Genres = new[] { Name }; query.IncludeItemTypes = new[] { typeof(MusicVideo).Name, typeof(Audio).Name, typeof(MusicAlbum).Name, typeof(MusicArtist).Name }; return LibraryManager.GetItemList(query); }
public async Task <object> Get(GetLatestChannelItems request) { var user = request.UserId.Equals(Guid.Empty) ? null : _userManager.GetUserById(request.UserId); var query = new InternalItemsQuery(user) { Limit = request.Limit, StartIndex = request.StartIndex, ChannelIds = (request.ChannelIds ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToArray(), DtoOptions = new Controller.Dto.DtoOptions { Fields = request.GetItemFields() } }; foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } var result = await _channelManager.GetLatestChannelItems(query, CancellationToken.None).ConfigureAwait(false); return(ToOptimizedResult(result)); }