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, 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(), ArtistIds = request.GetArtistIds(), GenreIds = request.GetGenreIds(), StudioIds = request.GetStudioIds(), Person = request.Person, PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), ImageTypes = request.GetImageTypes(), VideoTypes = request.GetVideoTypes(), 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, EnableTotalRecordCount = request.EnableTotalRecordCount, ExcludeItemIds = request.GetExcludeItemIds(), DtoOptions = dtoOptions }; 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.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.ToString("N")).ToArray(); } // ExcludeArtistIds if (!string.IsNullOrWhiteSpace(request.ExcludeArtistIds)) { query.ExcludeArtistIds = request.ExcludeArtistIds.Split('|'); } if (!string.IsNullOrWhiteSpace(request.AlbumIds)) { query.AlbumIds = request.AlbumIds.Split('|'); } // 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.ToString("N"))); }).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.ToString("N")).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 Tuple <string, SortOrder>[] { new Tuple <string, SortOrder>(ItemSortBy.ProductionYear, SortOrder.Descending), new Tuple <string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending) }; } } return(query); }
/// <summary> /// Applies the additional filters. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{BaseItem}.</returns> private IEnumerable <BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable <BaseItem> items, User user) { // Artists if (!string.IsNullOrEmpty(request.Artists)) { var artists = request.Artists.Split('|'); items = items.Where(i => { var audio = i as IHasArtist; return(audio != null && artists.Any(audio.HasArtist)); }); } // Albums if (!string.IsNullOrEmpty(request.Albums)) { var albums = request.Albums.Split('|'); items = items.Where(i => { var audio = i as Audio; if (audio != null) { return(albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase))); } var album = i as MusicAlbum; if (album != null) { return(albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase))); } var musicVideo = i as MusicVideo; if (musicVideo != null) { return(albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase))); } return(false); }); } if (!string.IsNullOrEmpty(request.AdjacentTo)) { var item = _dtoService.GetItemByDtoId(request.AdjacentTo); var allSiblings = item.Parent.GetChildren(user, true).OrderBy(i => i.SortName).ToList(); var index = allSiblings.IndexOf(item); var previousId = Guid.Empty; var nextId = Guid.Empty; if (index > 0) { previousId = allSiblings[index - 1].Id; } if (index < allSiblings.Count - 1) { nextId = allSiblings[index + 1].Id; } items = items.Where(i => i.Id == previousId || i.Id == nextId); } // Min index number if (request.MinIndexNumber.HasValue) { items = items.Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value); } // Min official rating if (!string.IsNullOrEmpty(request.MinOfficialRating)) { var level = _localization.GetRatingLevel(request.MinOfficialRating); if (level.HasValue) { items = items.Where(i => { var rating = i.CustomRating ?? i.OfficialRating; if (string.IsNullOrEmpty(rating)) { return(true); } var itemLevel = _localization.GetRatingLevel(rating); return(!itemLevel.HasValue || itemLevel.Value >= level.Value); }); } } // Max official rating if (!string.IsNullOrEmpty(request.MaxOfficialRating)) { var level = _localization.GetRatingLevel(request.MinOfficialRating); if (level.HasValue) { items = items.Where(i => { var rating = i.CustomRating ?? i.OfficialRating; if (string.IsNullOrEmpty(rating)) { return(true); } var itemLevel = _localization.GetRatingLevel(rating); return(!itemLevel.HasValue || itemLevel.Value <= level.Value); }); } } // Exclude item types if (!string.IsNullOrEmpty(request.ExcludeItemTypes)) { var vals = request.ExcludeItemTypes.Split(','); items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); } // Include item types if (!string.IsNullOrEmpty(request.IncludeItemTypes)) { var vals = request.IncludeItemTypes.Split(','); items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); } if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater)) { items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1); } if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater)) { items = items.OfType <IHasAlbumArtist>() .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtist, StringComparison.CurrentCultureIgnoreCase) < 1) .Cast <BaseItem>(); } // Filter by Series Status if (!string.IsNullOrEmpty(request.SeriesStatus)) { var vals = request.SeriesStatus.Split(','); items = items.OfType <Series>().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); } // Filter by Series AirDays if (!string.IsNullOrEmpty(request.AirDays)) { var days = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)); items = items.OfType <Series>().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d))); } // Filter by Video3DFormat if (request.Is3D.HasValue) { items = items.OfType <Video>().Where(i => request.Is3D.Value == i.Video3DFormat.HasValue); } // Filter by VideoType if (!string.IsNullOrEmpty(request.VideoTypes)) { var types = request.VideoTypes.Split(','); items = items.OfType <Video>().Where(i => types.Contains(i.VideoType.ToString(), StringComparer.OrdinalIgnoreCase)); } if (!string.IsNullOrEmpty(request.MediaTypes)) { var types = request.MediaTypes.Split(','); items = items.Where(i => !string.IsNullOrEmpty(i.MediaType) && types.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase)); } var imageTypes = request.GetImageTypes().ToArray(); if (imageTypes.Length > 0) { items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType))); } var genres = request.Genres; // Apply genre filter if (!string.IsNullOrEmpty(genres)) { var vals = genres.Split(','); items = items.Where(f => f.Genres != null && vals.Any(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))); } var studios = request.Studios; // Apply studio filter if (!string.IsNullOrEmpty(studios)) { var vals = studios.Split(','); items = items.Where(f => f.Studios != null && vals.Any(v => f.Studios.Contains(v, StringComparer.OrdinalIgnoreCase))); } var years = request.Years; // Apply year filter if (!string.IsNullOrEmpty(years)) { var vals = years.Split(',').Select(int.Parse); items = items.Where(f => f.ProductionYear.HasValue && vals.Contains(f.ProductionYear.Value)); } var personName = request.Person; // Apply person filter if (!string.IsNullOrEmpty(personName)) { var personTypes = request.PersonTypes; if (string.IsNullOrEmpty(personTypes)) { items = items.Where(item => item.People != null && item.People.Any(p => string.Equals(p.Name, personName, StringComparison.OrdinalIgnoreCase))); } else { var types = personTypes.Split(','); items = items.Where(item => item.People != null && item.People.Any(p => p.Name.Equals(personName, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase)))); } } if (request.HasTrailer.HasValue) { items = items.Where(i => request.HasTrailer.Value ? i.LocalTrailerIds.Count > 0 : i.LocalTrailerIds.Count == 0); } if (request.HasThemeSong.HasValue) { items = items.Where(i => request.HasThemeSong.Value ? i.ThemeSongIds.Count > 0 : i.ThemeSongIds.Count == 0); } if (request.HasThemeVideo.HasValue) { items = items.Where(i => request.HasThemeVideo.Value ? i.ThemeVideoIds.Count > 0 : i.ThemeVideoIds.Count == 0); } if (request.HasSpecialFeature.HasValue) { items = items.OfType <Movie>().Where(i => request.HasSpecialFeature.Value ? i.SpecialFeatureIds.Count > 0 : i.SpecialFeatureIds.Count == 0); } if (request.HasSubtitles.HasValue) { items = items.OfType <Video>().Where(i => { if (request.HasSubtitles.Value) { return(i.MediaStreams != null && i.MediaStreams.Any(m => m.Type == MediaStreamType.Subtitle)); } return(i.MediaStreams == null || i.MediaStreams.All(m => m.Type != MediaStreamType.Subtitle)); }); } return(items); }
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, EnableTotalRecordCount = request.EnableTotalRecordCount }; 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.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.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); }
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); }