diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-05-21 03:25:49 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-05-21 03:25:49 -0400 |
| commit | da77b058172e1c7cdeb6dadd6106ea3fdd739544 (patch) | |
| tree | 570215d192714f18170558e6664bcab539a7b07c | |
| parent | ead88d3b65c8bd1023d6915af0aed1c703e21979 (diff) | |
update data queries
62 files changed, 620 insertions, 446 deletions
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs index 2251a8f58..a5229c4fa 100644 --- a/Emby.Dlna/ContentDirectory/ControlHandler.cs +++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs @@ -23,6 +23,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Model.Globalization; @@ -459,10 +460,16 @@ namespace Emby.Dlna.ContentDirectory IsMissing = false, ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name }, IsFolder = isFolder, - MediaTypes = mediaTypes.ToArray() + MediaTypes = mediaTypes.ToArray(), + DtoOptions = GetDtoOptions() }); } + private DtoOptions GetDtoOptions() + { + return new DtoOptions(true); + } + private async Task<QueryResult<ServerItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit) { if (item is MusicGenre) @@ -513,7 +520,8 @@ namespace Emby.Dlna.ContentDirectory IsMissing = false, PresetViews = new[] {CollectionType.Movies, CollectionType.TvShows, CollectionType.Music}, ExcludeItemTypes = new[] {typeof (Game).Name, typeof (Book).Name}, - IsPlaceHolder = false + IsPlaceHolder = false, + DtoOptions = GetDtoOptions() }; SetSorting(query, sort, folder.IsPreSorted); @@ -532,7 +540,8 @@ namespace Emby.Dlna.ContentDirectory ArtistIds = new[] { item.Id.ToString("N") }, IncludeItemTypes = new[] { typeof(MusicAlbum).Name }, Limit = limit, - StartIndex = startIndex + StartIndex = startIndex, + DtoOptions = GetDtoOptions() }; SetSorting(query, sort, false); @@ -551,7 +560,8 @@ namespace Emby.Dlna.ContentDirectory GenreIds = new[] {item.Id.ToString("N")}, IncludeItemTypes = new[] {typeof (MusicAlbum).Name}, Limit = limit, - StartIndex = startIndex + StartIndex = startIndex, + DtoOptions = GetDtoOptions() }; SetSorting(query, sort, false); @@ -595,8 +605,8 @@ namespace Emby.Dlna.ContentDirectory IncludeItemTypes = new[] { typeof(Movie).Name, typeof(Series).Name, typeof(Trailer).Name }, SortBy = new[] { ItemSortBy.SortName }, Limit = limit, - StartIndex = startIndex - + StartIndex = startIndex, + DtoOptions = GetDtoOptions() }); var serverItems = itemsResult.Items.Select(i => new ServerItem(i)) diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs index 92382aa47..d5a3b73c2 100644 --- a/Emby.Drawing/ImageProcessor.cs +++ b/Emby.Drawing/ImageProcessor.cs @@ -179,10 +179,15 @@ namespace Emby.Drawing } var originalImage = options.Image; + IHasImages item = options.Item; if (!originalImage.IsLocalFile) { - originalImage = await _libraryManager().ConvertImageToLocal(options.Item, originalImage, options.ImageIndex).ConfigureAwait(false); + if (item == null) + { + item = _libraryManager().GetItemById(options.ItemId); + } + originalImage = await _libraryManager().ConvertImageToLocal(item, originalImage, options.ImageIndex).ConfigureAwait(false); } var originalImagePath = originalImage.Path; @@ -195,13 +200,18 @@ namespace Emby.Drawing if (options.Enhancers.Count > 0) { + if (item == null) + { + item = _libraryManager().GetItemById(options.ItemId); + } + var tuple = await GetEnhancedImage(new ItemImageInfo { DateModified = dateModified, Type = originalImage.Type, Path = originalImagePath - }, options.Item, options.ImageIndex, options.Enhancers).ConfigureAwait(false); + }, item, options.ImageIndex, options.Enhancers).ConfigureAwait(false); originalImagePath = tuple.Item1; dateModified = tuple.Item2; @@ -237,7 +247,12 @@ namespace Emby.Drawing var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath)); _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath)); - var resultPath =_imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, AutoOrient(options.Item), quality, options, outputFormat); + if (item == null && string.Equals(options.ItemType, typeof(Photo).Name, StringComparison.OrdinalIgnoreCase)) + { + item = _libraryManager().GetItemById(options.ItemId); + } + + var resultPath =_imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, AutoOrient(item), quality, options, outputFormat); if (string.Equals(resultPath, originalImagePath, StringComparison.OrdinalIgnoreCase)) { diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index 0cdd934b7..067260dfd 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -460,12 +460,12 @@ namespace Emby.Server.Implementations.Channels public IEnumerable<ChannelFeatures> GetAllChannelFeatures() { - return _libraryManager.GetItemList(new InternalItemsQuery + return _libraryManager.GetItemIds(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(Channel).Name }, SortBy = new[] { ItemSortBy.SortName } - }).Select(i => GetChannelFeatures(i.Id.ToString("N"))); + }).Select(i => GetChannelFeatures(i.ToString("N"))); } public ChannelFeatures GetChannelFeatures(string id) diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 51aee444e..49bf9e39c 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -207,8 +207,6 @@ namespace Emby.Server.Implementations.Data AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames); AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames); - AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames); - AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames); AddColumn(db, "TypedBaseItems", "IsLive", "BIT", existingColumnNames); AddColumn(db, "TypedBaseItems", "IsNews", "BIT", existingColumnNames); @@ -426,7 +424,7 @@ namespace Emby.Server.Implementations.Data "OfficialRating", "HomePageUrl", "DisplayMediaType", - "ForcedSortName", + "SortName", "RunTimeTicks", "VoteCount", "DateCreated", @@ -549,7 +547,6 @@ namespace Emby.Server.Implementations.Data "DisplayMediaType", "DateCreated", "DateModified", - "ForcedSortName", "PreferredMetadataLanguage", "PreferredMetadataCountryCode", "IsHD", @@ -826,8 +823,6 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBind("@DateCreated", item.DateCreated); saveItemStatement.TryBind("@DateModified", item.DateModified); - saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName); - saveItemStatement.TryBind("@PreferredMetadataLanguage", item.PreferredMetadataLanguage); saveItemStatement.TryBind("@PreferredMetadataCountryCode", item.PreferredMetadataCountryCode); saveItemStatement.TryBind("@IsHD", item.IsHD); @@ -1237,7 +1232,7 @@ namespace Emby.Server.Implementations.Data foreach (var row in statement.ExecuteQuery()) { - return GetItem(row); + return GetItem(row, new InternalItemsQuery()); } } @@ -1246,11 +1241,6 @@ namespace Emby.Server.Implementations.Data } } - private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader) - { - return GetItem(reader, new InternalItemsQuery()); - } - private bool TypeRequiresDeserialization(Type type) { if (_config.Configuration.SkipDeserializationForBasicTypes) @@ -1535,11 +1525,14 @@ namespace Emby.Server.Implementations.Data } index++; - if (!reader.IsDBNull(index)) + if (query.HasField(ItemFields.ExternalEtag)) { - item.ExternalEtag = reader.GetString(index); + if (!reader.IsDBNull(index)) + { + item.ExternalEtag = reader.GetString(index); + } + index++; } - index++; if (!reader.IsDBNull(index)) { @@ -1614,7 +1607,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.ForcedSortName = reader.GetString(index); + item.SortName = reader.GetString(index); } index++; } @@ -1821,29 +1814,41 @@ namespace Emby.Server.Implementations.Data } index++; - if (!reader.IsDBNull(index)) + if (query.HasField(ItemFields.PresentationUniqueKey)) { - item.PresentationUniqueKey = reader.GetString(index); + if (!reader.IsDBNull(index)) + { + item.PresentationUniqueKey = reader.GetString(index); + } + index++; } - index++; - if (!reader.IsDBNull(index)) + if (query.HasField(ItemFields.InheritedParentalRatingValue)) { - item.InheritedParentalRatingValue = reader.GetInt32(index); + if (!reader.IsDBNull(index)) + { + item.InheritedParentalRatingValue = reader.GetInt32(index); + } + index++; } - index++; - if (!reader.IsDBNull(index)) + if (query.HasField(ItemFields.Tags)) { - item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + if (!reader.IsDBNull(index)) + { + item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + } + index++; } - index++; - if (!reader.IsDBNull(index)) + if (query.HasField(ItemFields.ExternalSeriesId)) { - item.ExternalSeriesId = reader.GetString(index); + if (!reader.IsDBNull(index)) + { + item.ExternalSeriesId = reader.GetString(index); + } + index++; } - index++; if (query.HasField(ItemFields.Taglines)) { @@ -2240,12 +2245,16 @@ namespace Emby.Server.Implementations.Data } if (field == ItemFields.SortName) { - return new[] { "ForcedSortName" }; + return new[] { "SortName" }; } if (field == ItemFields.Taglines) { return new[] { "Tagline" }; } + if (field == ItemFields.Tags) + { + return new[] { "Tags", "InheritedTags" }; + } return new[] { field.ToString() }; } @@ -4916,7 +4925,9 @@ namespace Emby.Server.Implementations.Data var columns = _retriveItemColumns.ToList(); columns.AddRange(itemCountColumns.Select(i => i.Item2).ToArray()); - var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, columns.ToArray())) + GetFromText(); + columns = GetFinalColumnsToSelect(query, columns.ToArray()).ToList(); + + var commandText = "select " + string.Join(",", columns.ToArray()) + GetFromText(); commandText += GetJoinUserDataText(query); var innerQuery = new InternalItemsQuery(query.User) @@ -5042,7 +5053,7 @@ namespace Emby.Server.Implementations.Data foreach (var row in statement.ExecuteQuery()) { - var item = GetItem(row); + var item = GetItem(row, query); if (item != null) { var countStartColumn = columns.Count - 1; diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index ec4f552a6..bb46e6006 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -127,7 +127,11 @@ namespace Emby.Server.Implementations.Dto { var libraryItems = byName.GetTaggedItems(new InternalItemsQuery(user) { - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }); SetItemByNameInfo(item, dto, libraryItems.ToList(), user); @@ -177,7 +181,11 @@ namespace Emby.Server.Implementations.Dto { if (options.Fields.Contains(ItemFields.ItemCounts)) { - SetItemByNameInfo(item, dto, GetTaggedItems(byName, user), user); + SetItemByNameInfo(item, dto, GetTaggedItems(byName, user, new DtoOptions(false) + { + EnableImages = false + + }), user); } FillSyncInfo(dto, item, options, user, syncDictionary); @@ -189,11 +197,12 @@ namespace Emby.Server.Implementations.Dto return dto; } - private List<BaseItem> GetTaggedItems(IItemByName byName, User user) + private List<BaseItem> GetTaggedItems(IItemByName byName, User user, DtoOptions options) { var items = byName.GetTaggedItems(new InternalItemsQuery(user) { - Recursive = true + Recursive = true, + DtoOptions = options }).ToList(); @@ -595,16 +604,17 @@ namespace Emby.Server.Implementations.Dto { if (!string.IsNullOrEmpty(item.Album)) { - var parentAlbum = _libraryManager.GetItemList(new InternalItemsQuery + var parentAlbumIds = _libraryManager.GetItemIds(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(MusicAlbum).Name }, - Name = item.Album + Name = item.Album, + Limit = 1 - }).FirstOrDefault(); + }); - if (parentAlbum != null) + if (parentAlbumIds.Count > 0) { - dto.AlbumId = GetDtoId(parentAlbum); + dto.AlbumId = parentAlbumIds[0].ToString("N"); } } diff --git a/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index 86c8c5f68..7371b4fdb 100644 --- a/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -16,6 +16,7 @@ using System.Threading; using System.Threading.Tasks; using Emby.Server.Implementations.Library; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; @@ -588,7 +589,8 @@ namespace Emby.Server.Implementations.FileOrganization var series = _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(Series).Name }, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(true) }) .Cast<Series>() .Select(i => NameUtils.GetMatchScore(nameWithoutYear, yearInName, i)) @@ -607,7 +609,8 @@ namespace Emby.Server.Implementations.FileOrganization { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, - Name = info.ItemName + Name = info.ItemName, + DtoOptions = new DtoOptions(true) }).Cast<Series>().FirstOrDefault(); } diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index c8151ec86..a423db9d6 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -41,6 +41,7 @@ using SortOrder = MediaBrowser.Model.Entities.SortOrder; using VideoResolver = MediaBrowser.Naming.Video.VideoResolver; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Tasks; @@ -313,7 +314,8 @@ namespace Emby.Server.Implementations.Library { IncludeItemTypes = new[] { typeof(Season).Name }, Recursive = true, - IndexNumber = 0 + IndexNumber = 0, + DtoOptions = new DtoOptions(true) }).Cast<Season>() .Where(i => !string.Equals(i.Name, newName, StringComparison.Ordinal)) @@ -342,7 +344,7 @@ namespace Emby.Server.Implementations.Library } if (item is IItemByName) { - if (!(item is MusicArtist) && !(item is Studio)) + if (!(item is MusicArtist)) { return; } @@ -868,7 +870,8 @@ namespace Emby.Server.Implementations.Library IsFolder = isFolder, SortBy = new[] { ItemSortBy.DateCreated }, SortOrder = SortOrder.Descending, - Limit = 1 + Limit = 1, + DtoOptions = new DtoOptions(true) }; return GetItemList(query) @@ -981,7 +984,8 @@ namespace Emby.Server.Implementations.Library var existing = GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(T).Name }, - Name = name + Name = name, + DtoOptions = new DtoOptions(true) }).Cast<MusicArtist>() .OrderBy(i => i.IsAccessedByName ? 1 : 0) diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs index 7424ed5e5..e64980dff 100644 --- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -6,6 +6,7 @@ using System; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -27,7 +28,8 @@ namespace Emby.Server.Implementations.Library var items = _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(BoxSet).Name, typeof(Game).Name, typeof(Movie).Name, typeof(Series).Name }, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(true) }).OfType<IHasTrailers>().ToList(); @@ -40,7 +42,8 @@ namespace Emby.Server.Implementations.Library { IncludeItemTypes = new[] { typeof(Trailer).Name }, TrailerTypes = trailerTypes, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(false) }).ToArray(); diff --git a/Emby.Server.Implementations/Library/MusicManager.cs b/Emby.Server.Implementations/Library/MusicManager.cs index b15c01125..f0d07cc3c 100644 --- a/Emby.Server.Implementations/Library/MusicManager.cs +++ b/Emby.Server.Implementations/Library/MusicManager.cs @@ -5,6 +5,7 @@ using MediaBrowser.Controller.Playlists; using System; using System.Collections.Generic; using System.Linq; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Querying; namespace Emby.Server.Implementations.Library @@ -18,47 +19,48 @@ namespace Emby.Server.Implementations.Library _libraryManager = libraryManager; } - public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user) + public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user, DtoOptions dtoOptions) { var list = new List<Audio> { item }; - return list.Concat(GetInstantMixFromGenres(item.Genres, user)); + return list.Concat(GetInstantMixFromGenres(item.Genres, user, dtoOptions)); } - public IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist item, User user) + public IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist item, User user, DtoOptions dtoOptions) { - return GetInstantMixFromGenres(item.Genres, user); + return GetInstantMixFromGenres(item.Genres, user, dtoOptions); } - public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user) + public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user, DtoOptions dtoOptions) { - return GetInstantMixFromGenres(item.Genres, user); + return GetInstantMixFromGenres(item.Genres, user, dtoOptions); } - public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user) + public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user, DtoOptions dtoOptions) { var genres = item .GetRecursiveChildren(user, new InternalItemsQuery(user) { - IncludeItemTypes = new[] { typeof(Audio).Name } + IncludeItemTypes = new[] { typeof(Audio).Name }, + DtoOptions = dtoOptions }) .Cast<Audio>() .SelectMany(i => i.Genres) .Concat(item.Genres) .DistinctNames(); - return GetInstantMixFromGenres(genres, user); + return GetInstantMixFromGenres(genres, user, dtoOptions); } - public IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user) + public IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user, DtoOptions dtoOptions) { - return GetInstantMixFromGenres(item.Genres, user); + return GetInstantMixFromGenres(item.Genres, user, dtoOptions); } - public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user) + public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions) { var genreIds = genres.DistinctNames().Select(i => { @@ -73,10 +75,10 @@ namespace Emby.Server.Implementations.Library }).Where(i => i != null); - return GetInstantMixFromGenreIds(genreIds, user); + return GetInstantMixFromGenreIds(genreIds, user, dtoOptions); } - public IEnumerable<Audio> GetInstantMixFromGenreIds(IEnumerable<string> genreIds, User user) + public IEnumerable<Audio> GetInstantMixFromGenreIds(IEnumerable<string> genreIds, User user, DtoOptions dtoOptions) { return _libraryManager.GetItemList(new InternalItemsQuery(user) { @@ -86,47 +88,49 @@ namespace Emby.Server.Implementations.Library Limit = 200, - SortBy = new[] { ItemSortBy.Random } + SortBy = new[] { ItemSortBy.Random }, + + DtoOptions = dtoOptions }).Cast<Audio>(); } - public IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user) + public IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions) { var genre = item as MusicGenre; if (genre != null) { - return GetInstantMixFromGenreIds(new[] { item.Id.ToString("N") }, user); + return GetInstantMixFromGenreIds(new[] { item.Id.ToString("N") }, user, dtoOptions); } var playlist = item as Playlist; if (playlist != null) { - return GetInstantMixFromPlaylist(playlist, user); + return GetInstantMixFromPlaylist(playlist, user, dtoOptions); } var album = item as MusicAlbum; if (album != null) { - return GetInstantMixFromAlbum(album, user); + return GetInstantMixFromAlbum(album, user, dtoOptions); } var artist = item as MusicArtist; if (artist != null) { - return GetInstantMixFromArtist(artist, user); + return GetInstantMixFromArtist(artist, user, dtoOptions); } var song = item as Audio; if (song != null) { - return GetInstantMixFromSong(song, user); + return GetInstantMixFromSong(song, user, dtoOptions); } var folder = item as Folder; if (folder != null) { - return GetInstantMixFromFolder(folder, user); + return GetInstantMixFromFolder(folder, user, dtoOptions); } return new Audio[] { }; diff --git a/Emby.Server.Implementations/Library/SearchEngine.cs b/Emby.Server.Implementations/Library/SearchEngine.cs index 5f88a6c66..6f63322c8 100644 --- a/Emby.Server.Implementations/Library/SearchEngine.cs +++ b/Emby.Server.Implementations/Library/SearchEngine.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Extensions; namespace Emby.Server.Implementations.Library @@ -175,7 +176,17 @@ namespace Emby.Server.Implementations.Library IsNews = query.IsNews, IsSeries = query.IsSeries, IsSports = query.IsSports, - MediaTypes = query.MediaTypes + MediaTypes = query.MediaTypes, + + DtoOptions = new DtoOptions + { + Fields = new List<ItemFields> + { + ItemFields.AirTime, + ItemFields.DateCreated, + ItemFields.ChannelInfo + } + } }); // Add search hints based on item name diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index 9e1291847..f403ca266 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Model.Globalization; @@ -190,11 +191,11 @@ namespace Emby.Server.Implementations.Library return _libraryManager.GetShadowView(parent, viewType, sortName, cancellationToken); } - public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request) + public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options) { var user = _userManager.GetUserById(request.UserId); - var libraryItems = GetItemsForLatestItems(user, request); + var libraryItems = GetItemsForLatestItems(user, request, options); var list = new List<Tuple<BaseItem, List<BaseItem>>>(); @@ -230,7 +231,7 @@ namespace Emby.Server.Implementations.Library return list; } - private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request) + private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options) { var parentId = request.ParentId; @@ -289,7 +290,8 @@ namespace Emby.Server.Implementations.Library IsVirtualItem = false, Limit = limit * 5, SourceTypes = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { }, - IsPlayed = isPlayed + IsPlayed = isPlayed, + DtoOptions = options }, parents); } diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 7f1a9ba6d..89b772731 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -30,6 +30,7 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Controller; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.IO; @@ -1232,7 +1233,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV RequiresClosing = false, Protocol = MediaBrowser.Model.MediaInfo.MediaProtocol.Http, BufferMs = 0, - IgnoreDts = true + IgnoreDts = true, + IgnoreIndex = true, + GenPtsInput = true }; var isAudio = false; @@ -1640,7 +1643,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV SortOrder = SortOrder.Descending, IsVirtualItem = false, IsFolder = false, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(true) }).ConfigureAwait(false)) .Items @@ -1977,7 +1981,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV { IncludeItemTypes = new[] { typeof(LiveTvProgram).Name }, Limit = 1, - ExternalId = timer.ProgramId + ExternalId = timer.ProgramId, + DtoOptions = new DtoOptions(true) }).FirstOrDefault() as LiveTvProgram; @@ -2511,16 +2516,17 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV if (program.EpisodeNumber.HasValue && program.SeasonNumber.HasValue) { - var result = _libraryManager.GetItemsResult(new InternalItemsQuery + var result = _libraryManager.GetItemIds(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(Episode).Name }, ParentIndexNumber = program.SeasonNumber.Value, IndexNumber = program.EpisodeNumber.Value, AncestorIds = seriesIds, - IsVirtualItem = false + IsVirtualItem = false, + Limit = 1 }); - if (result.TotalRecordCount > 0) + if (result.Count > 0) { return true; } diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs index 2f449bee2..cec158633 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs @@ -200,27 +200,32 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV flags.Add("+genpts"); } - var inputModifiers = "-async 1 -vsync -1"; + var inputModifier = "-async 1 -vsync -1"; if (flags.Count > 0) { - inputModifiers += " -fflags " + string.Join("", flags.ToArray()); + inputModifier += " -fflags " + string.Join("", flags.ToArray()); } if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType)) { - inputModifiers += " -hwaccel auto"; + inputModifier += " -hwaccel auto"; } if (mediaSource.ReadAtNativeFramerate) { - inputModifiers += " -re"; + inputModifier += " -re"; + } + + if (mediaSource.RequiresLooping) + { + inputModifier += " -stream_loop -1"; } var analyzeDurationSeconds = 5; var analyzeDuration = " -analyzeduration " + (analyzeDurationSeconds * 1000000).ToString(CultureInfo.InvariantCulture); - inputModifiers += analyzeDuration; + inputModifier += analyzeDuration; var subtitleArgs = CopySubtitles ? " -codec:s copy" : " -sn"; @@ -239,7 +244,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV durationParam, outputParam); - return inputModifiers + " " + commandLineArgs; + return inputModifier + " " + commandLineArgs; } private string GetAudioArgs(MediaSourceInfo mediaSource) diff --git a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs index 43b055098..5c5072192 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -149,7 +149,11 @@ namespace Emby.Server.Implementations.LiveTv IncludeItemTypes = new string[] { typeof(Series).Name }, Name = seriesName, Limit = 1, - ImageTypes = new ImageType[] { ImageType.Thumb } + ImageTypes = new ImageType[] { ImageType.Thumb }, + DtoOptions = new DtoOptions + { + Fields = new List<MediaBrowser.Model.Querying.ItemFields>() + } }).FirstOrDefault(); @@ -191,7 +195,11 @@ namespace Emby.Server.Implementations.LiveTv IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name }, ExternalSeriesId = programSeriesId, Limit = 1, - ImageTypes = new ImageType[] { ImageType.Primary } + ImageTypes = new ImageType[] { ImageType.Primary }, + DtoOptions = new DtoOptions + { + Fields = new List<MediaBrowser.Model.Querying.ItemFields>() + } }).FirstOrDefault(); @@ -239,7 +247,11 @@ namespace Emby.Server.Implementations.LiveTv IncludeItemTypes = new string[] { typeof(Series).Name }, Name = seriesName, Limit = 1, - ImageTypes = new ImageType[] { ImageType.Thumb } + ImageTypes = new ImageType[] { ImageType.Thumb }, + DtoOptions = new DtoOptions + { + Fields = new List<MediaBrowser.Model.Querying.ItemFields>() + } }).FirstOrDefault(); @@ -281,14 +293,22 @@ namespace Emby.Server.Implementations.LiveTv IncludeItemTypes = new string[] { typeof(Series).Name }, Name = seriesName, Limit = 1, - ImageTypes = new ImageType[] { ImageType.Primary } + ImageTypes = new ImageType[] { ImageType.Primary }, + DtoOptions = new DtoOptions + { + Fields = new List<MediaBrowser.Model.Querying.ItemFields>() + } }).FirstOrDefault() ?? _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name }, ExternalSeriesId = programSeriesId, Limit = 1, - ImageTypes = new ImageType[] { ImageType.Primary } + ImageTypes = new ImageType[] { ImageType.Primary }, + DtoOptions = new DtoOptions + { + Fields = new List<MediaBrowser.Model.Querying.ItemFields>() + } }).FirstOrDefault(); diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 5ba96283b..fa505d3fb 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -173,7 +173,7 @@ namespace Emby.Server.Implementations.LiveTv } } - public async Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, CancellationToken cancellationToken) + public async Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); @@ -192,7 +192,8 @@ namespace Emby.Server.Implementations.LiveTv IsFavorite = query.IsFavorite, IsLiked = query.IsLiked, StartIndex = query.StartIndex, - Limit = query.Limit + Limit = query.Limit, + DtoOptions = dtoOptions }; internalQuery.OrderBy.AddRange(query.SortBy.Select(i => new Tuple<string, SortOrder>(i, query.SortOrder ?? SortOrder.Ascending))); @@ -249,7 +250,7 @@ namespace Emby.Server.Implementations.LiveTv { Id = id - }, cancellationToken).ConfigureAwait(false); + }, new DtoOptions(), cancellationToken).ConfigureAwait(false); return result.Items.FirstOrDefault(); } @@ -865,13 +866,6 @@ namespace Emby.Server.Implementations.LiveTv return item.Id; } - - - private string GetExternalSeriesIdLegacy(BaseItem item) - { - return item.GetProviderId("ProviderExternalSeriesId"); - } - public async Task<BaseItemDto> GetProgram(string id, CancellationToken cancellationToken, User user = null) { var program = GetInternalProgram(id); @@ -882,11 +876,6 @@ namespace Emby.Server.Implementations.LiveTv var externalSeriesId = program.ExternalSeriesId; - if (string.IsNullOrWhiteSpace(externalSeriesId)) - { - externalSeriesId = GetExternalSeriesIdLegacy(program); - } - list.Add(new Tuple<BaseItemDto, string, string, string>(dto, program.ServiceName, GetItemExternalId(program), externalSeriesId)); await AddRecordingInfo(list, cancellationToken).ConfigureAwait(false); @@ -906,6 +895,8 @@ namespace Emby.Server.Implementations.LiveTv query.SortBy = new[] { ItemSortBy.StartDate }; } + RemoveFields(options); + var internalQuery = new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(LiveTvProgram).Name }, @@ -965,8 +956,6 @@ namespace Emby.Server.Implementations.LiveTv var queryResult = _libraryManager.QueryItems(internalQuery); - RemoveFields(options); - var returnArray = (await _dtoService.GetBaseItemDtos(queryResult.Items, options, user).ConfigureAwait(false)).ToArray(); var result = new QueryResult<BaseItemDto> @@ -1045,12 +1034,12 @@ namespace Emby.Server.Implementations.LiveTv public async Task<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { + RemoveFields(options); + var internalResult = await GetRecommendedProgramsInternal(query, options, cancellationToken).ConfigureAwait(false); var user = _userManager.GetUserById(query.UserId); - RemoveFields(options); - var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray(); var result = new QueryResult<BaseItemDto> @@ -1333,7 +1322,8 @@ namespace Emby.Server.Implementations.LiveTv { IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name }, - ChannelIds = new string[] { currentChannel.Id.ToString("N") } + ChannelIds = new string[] { currentChannel.Id.ToString("N") }, + DtoOptions = new DtoOptions(true) }).Cast<LiveTvProgram>().ToDictionary(i => i.Id); @@ -1436,7 +1426,8 @@ namespace Emby.Server.Implementations.LiveTv { var list = _itemRepo.GetItemIdsList(new InternalItemsQuery { - IncludeItemTypes = validTypes + IncludeItemTypes = validTypes, + DtoOptions = new DtoOptions(false) }).ToList(); @@ -1663,6 +1654,8 @@ namespace Emby.Server.Implementations.LiveTv includeItemTypes.Add(typeof(Series).Name); + RemoveFields(options); + var internalResult = _libraryManager.GetItemsResult(new InternalItemsQuery(user) { Recursive = true, @@ -1672,11 +1665,10 @@ namespace Emby.Server.Implementations.LiveTv SortOrder = SortOrder.Descending, EnableTotalRecordCount = query.EnableTotalRecordCount, IncludeItemTypes = includeItemTypes.ToArray(), - ExcludeItemTypes = excludeItemTypes.ToArray() + ExcludeItemTypes = excludeItemTypes.ToArray(), + DtoOptions = options }); - RemoveFields(options); - var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray(); return new QueryResult<BaseItemDto> @@ -1686,7 +1678,7 @@ namespace Emby.Server.Implementations.LiveTv }; } - public async Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken) + public async Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); if (user != null && !IsLiveTvEnabled(user)) @@ -1696,14 +1688,15 @@ namespace Emby.Server.Implementations.LiveTv if (_services.Count == 1 && !(query.IsInProgress ?? false) && (!query.IsLibraryItem.HasValue || query.IsLibraryItem.Value)) { - return GetEmbyRecordings(query, new DtoOptions(), user); + return GetEmbyRecordings(query, options, user); } await RefreshRecordings(cancellationToken).ConfigureAwait(false); var internalQuery = new InternalItemsQuery(user) { - IncludeItemTypes = new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name } + IncludeItemTypes = new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }, + DtoOptions = options }; if (!string.IsNullOrEmpty(query.ChannelId)) @@ -1872,11 +1865,6 @@ namespace Emby.Server.Implementations.LiveTv var externalSeriesId = program.ExternalSeriesId; - if (string.IsNullOrWhiteSpace(externalSeriesId)) - { - externalSeriesId = GetExternalSeriesIdLegacy(program); - } - programTuples.Add(new Tuple<BaseItemDto, string, string, string>(dto, serviceName, GetItemExternalId(program), externalSeriesId)); } @@ -1953,10 +1941,10 @@ namespace Emby.Server.Implementations.LiveTv { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var internalResult = await GetInternalRecordings(query, cancellationToken).ConfigureAwait(false); - RemoveFields(options); + var internalResult = await GetInternalRecordings(query, options, cancellationToken).ConfigureAwait(false); + var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray(); return new QueryResult<BaseItemDto> @@ -2299,7 +2287,8 @@ namespace Emby.Server.Implementations.LiveTv MinEndDate = now, Limit = channelIds.Length, SortBy = new[] { "StartDate" }, - TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") } + TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") }, + DtoOptions = options }).ToList() : new List<BaseItem>(); @@ -2601,7 +2590,7 @@ namespace Emby.Server.Implementations.LiveTv { UserId = query.UserId - }, cancellationToken).ConfigureAwait(false); + }, new DtoOptions(), cancellationToken).ConfigureAwait(false); var recordings = recordingResult.Items.OfType<ILiveTvRecording>().ToList(); diff --git a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs index 9514c12ca..75124cab8 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading.Tasks; using Emby.Server.Implementations.Images; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; @@ -89,7 +90,8 @@ namespace Emby.Server.Implementations.Playlists SortBy = new[] { ItemSortBy.Random }, Limit = 4, Recursive = true, - ImageTypes = new[] { ImageType.Primary } + ImageTypes = new[] { ImageType.Primary }, + DtoOptions = new DtoOptions(false) }).ToList(); @@ -120,7 +122,8 @@ namespace Emby.Server.Implementations.Playlists SortBy = new[] { ItemSortBy.Random }, Limit = 4, Recursive = true, - ImageTypes = new[] { ImageType.Primary } + ImageTypes = new[] { ImageType.Primary }, + DtoOptions = new DtoOptions(false) }).ToList(); diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs index 18042b587..6a290c664 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; @@ -135,7 +136,10 @@ namespace Emby.Server.Implementations.Playlists if (options.ItemIdList.Count > 0) { - await AddToPlaylistInternal(playlist.Id.ToString("N"), options.ItemIdList, user); + await AddToPlaylistInternal(playlist.Id.ToString("N"), options.ItemIdList, user, new DtoOptions(false) + { + EnableImages = true + }); } return new PlaylistCreationResult @@ -160,21 +164,24 @@ namespace Emby.Server.Implementations.Playlists return path; } - private Task<IEnumerable<BaseItem>> GetPlaylistItems(IEnumerable<string> itemIds, string playlistMediaType, User user) + private Task<IEnumerable<BaseItem>> GetPlaylistItems(IEnumerable<string> itemIds, string playlistMediaType, User user, DtoOptions options) { var items = itemIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null); - return Playlist.GetPlaylistItems(playlistMediaType, items, user); + return Playlist.GetPlaylistItems(playlistMediaType, items, user, options); } public Task AddToPlaylist(string playlistId, IEnumerable<string> itemIds, string userId) { var user = string.IsNullOrWhiteSpace(userId) ? null : _userManager.GetUserById(userId); - return AddToPlaylistInternal(playlistId, itemIds, user); + return AddToPlaylistInternal(playlistId, itemIds, user, new DtoOptions(false) + { + EnableImages = true + }); } - private async Task AddToPlaylistInternal(string playlistId, IEnumerable<string> itemIds, User user) + private async Task AddToPlaylistInternal(string playlistId, IEnumerable<string> itemIds, User user, DtoOptions options) { var playlist = _libraryManager.GetItemById(playlistId) as Playlist; @@ -185,7 +192,7 @@ namespace Emby.Server.Implementations.Playlists var list = new List<LinkedChild>(); - var items = (await GetPlaylistItems(itemIds, playlist.MediaType, user).ConfigureAwait(false)) + var items = (await GetPlaylistItems(itemIds, playlist.MediaType, user, options).ConfigureAwait(false)) .Where(i => i.SupportsAddingToPlaylist) .ToList(); diff --git a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index d1c70ba1d..22d54831e 100644 --- a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Entities; @@ -85,7 +86,9 @@ namespace Emby.Server.Implementations.ScheduledTasks { MediaTypes = new[] { MediaType.Video }, IsFolder = false, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(false) + }) .OfType<Video>() .ToList(); diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index de00cf239..7031ad770 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -1022,7 +1022,10 @@ namespace Emby.Server.Implementations.Session var series = episode.Series; if (series != null) { - var episodes = series.GetEpisodes(user) + var episodes = series.GetEpisodes(user, new DtoOptions(false) + { + EnableImages = false + }) .Where(i => !i.IsVirtualItem) .SkipWhile(i => i.Id != episode.Id) .ToList(); @@ -1065,7 +1068,11 @@ namespace Emby.Server.Implementations.Session var items = byName.GetTaggedItems(new InternalItemsQuery(user) { IsFolder = false, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }); return FilterToSingleMediaType(items) @@ -1080,7 +1087,11 @@ namespace Emby.Server.Implementations.Session var itemsResult = await folder.GetItems(new InternalItemsQuery(user) { Recursive = true, - IsFolder = false + IsFolder = false, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).ConfigureAwait(false); @@ -1111,7 +1122,7 @@ namespace Emby.Server.Implementations.Session return new List<BaseItem>(); } - return _musicManager.GetInstantMixFromItem(item, user); + return _musicManager.GetInstantMixFromItem(item, user, new DtoOptions(false) { EnableImages = false }); } public Task SendBrowseCommand(string controllingSessionId, string sessionId, BrowseRequest command, CancellationToken cancellationToken) diff --git a/Emby.Server.Implementations/TV/SeriesPostScanTask.cs b/Emby.Server.Implementations/TV/SeriesPostScanTask.cs index 3d93561f1..23b6a3cb5 100644 --- a/Emby.Server.Implementations/TV/SeriesPostScanTask.cs +++ b/Emby.Server.Implementations/TV/SeriesPostScanTask.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -58,7 +59,8 @@ namespace Emby.Server.Implementations.TV { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, - GroupByPresentationUniqueKey = false + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true) }).Cast<Series>().ToList(); @@ -188,7 +190,8 @@ namespace Emby.Server.Implementations.TV { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, - GroupByPresentationUniqueKey = false + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true) }).Cast<Series>().ToList(); diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs index b5e64bc23..255c93b5f 100644 --- a/Emby.Server.Implementations/TV/TVSeriesManager.cs +++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; namespace Emby.Server.Implementations.TV { @@ -26,7 +27,7 @@ namespace Emby.Server.Implementations.TV _config = config; } - public QueryResult<BaseItem> GetNextUp(NextUpQuery request) + public QueryResult<BaseItem> GetNextUp(NextUpQuery request, DtoOptions dtoOptions) { var user = _userManager.GetUserById(request.UserId); @@ -75,12 +76,12 @@ namespace Emby.Server.Implementations.TV }).Cast<Series>().Select(GetUniqueSeriesKey); // Avoid implicitly captured closure - var episodes = GetNextUpEpisodes(request, user, items); + var episodes = GetNextUpEpisodes(request, user, items, dtoOptions); return GetResult(episodes, request); } - public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders) + public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions dtoOptions) { var user = _userManager.GetUserById(request.UserId); @@ -126,18 +127,18 @@ namespace Emby.Server.Implementations.TV }, parentsFolders.Cast<BaseItem>().ToList()).Cast<Series>().Select(GetUniqueSeriesKey); // Avoid implicitly captured closure - var episodes = GetNextUpEpisodes(request, user, items); + var episodes = GetNextUpEpisodes(request, user, items, dtoOptions); return GetResult(episodes, request); } - public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IEnumerable<string> seriesKeys) + public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IEnumerable<string> seriesKeys, DtoOptions dtoOptions) { // Avoid implicitly captured closure var currentUser = user; var allNextUp = seriesKeys - .Select(i => GetNextUp(i, currentUser)); + .Select(i => GetNextUp(i, currentUser, dtoOptions)); //allNextUp = allNextUp.OrderByDescending(i => i.Item1); @@ -175,7 +176,7 @@ namespace Emby.Server.Implementations.TV /// Gets the next up. /// </summary> /// <returns>Task{Episode}.</returns> - private Tuple<DateTime, Func<Episode>> GetNextUp(string seriesKey, User user) + private Tuple<DateTime, Func<Episode>> GetNextUp(string seriesKey, User user, DtoOptions dtoOptions) { var enableSeriesPresentationKey = _config.Configuration.EnableSeriesPresentationUniqueKey; @@ -213,7 +214,8 @@ namespace Emby.Server.Implementations.TV IsPlayed = false, IsVirtualItem = false, ParentIndexNumberNotEquals = 0, - MinSortName = lastWatchedEpisode == null ? null : lastWatchedEpisode.SortName + MinSortName = lastWatchedEpisode == null ? null : lastWatchedEpisode.SortName, + DtoOptions = dtoOptions }).Cast<Episode>().FirstOrDefault(); }; diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index 7d3a118c0..376696536 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -14,6 +14,7 @@ using Emby.Server.Implementations.Images; using MediaBrowser.Common.IO; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Collections; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; @@ -46,7 +47,8 @@ namespace Emby.Server.Implementations.UserViews { CollapseBoxSetItems = false, Recursive = recursive, - ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Playlist" } + ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Playlist" }, + DtoOptions = new DtoOptions(false) }).ConfigureAwait(false); @@ -144,7 +146,8 @@ namespace Emby.Server.Implementations.UserViews Recursive = recursive, IncludeItemTypes = new[] { typeof(BoxSet).Name }, Limit = 20, - SortBy = new[] { ItemSortBy.Random } + SortBy = new[] { ItemSortBy.Random }, + DtoOptions = new DtoOptions(false) }); return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index b0fb954e2..06f7d73e5 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -12,6 +12,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; using Emby.Server.Implementations.Images; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.IO; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Extensions; @@ -58,7 +59,9 @@ namespace Emby.Server.Implementations.UserViews IncludeItemTypes = new[] { typeof(LiveTvProgram).Name }, ImageTypes = new[] { ImageType.Primary }, Limit = 30, - IsMovie = true + IsMovie = true, + DtoOptions = new DtoOptions(false) + }).ToList(); return GetFinalItems(programs).ToList(); @@ -69,7 +72,8 @@ namespace Emby.Server.Implementations.UserViews { var userItemsResult = await view.GetItems(new InternalItemsQuery { - CollapseBoxSetItems = false + CollapseBoxSetItems = false, + DtoOptions = new DtoOptions(false) }); return userItemsResult.Items.ToList(); @@ -84,6 +88,7 @@ namespace Emby.Server.Implementations.UserViews CollapseBoxSetItems = false, Recursive = recursive, ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Person" }, + DtoOptions = new DtoOptions(false) }).ConfigureAwait(false); diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index a802e56af..1a57ff62d 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -151,16 +151,6 @@ namespace MediaBrowser.Api options.Fields.Add(Model.Querying.ItemFields.ChildCount); } - if (client.IndexOf("web", StringComparison.OrdinalIgnoreCase) == -1 && - - // covers both emby mobile and emby for android mobile - client.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) == -1 && - client.IndexOf("ios", StringComparison.OrdinalIgnoreCase) == -1 && - client.IndexOf("theater", StringComparison.OrdinalIgnoreCase) == -1) - { - options.Fields.Add(Model.Querying.ItemFields.ChildCount); - } - var hasDtoOptions = request as IHasDtoOptions; if (hasDtoOptions != null) { diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs index a9394b52e..2d161ccfd 100644 --- a/MediaBrowser.Api/GamesService.cs +++ b/MediaBrowser.Api/GamesService.cs @@ -110,7 +110,11 @@ namespace MediaBrowser.Api var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId); var query = new InternalItemsQuery(user) { - IncludeItemTypes = new[] { typeof(GameSystem).Name } + IncludeItemTypes = new[] { typeof(GameSystem).Name }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }; var gameSystems = _libraryManager.GetItemList(query) .Cast<GameSystem>() @@ -130,7 +134,11 @@ namespace MediaBrowser.Api var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId); var query = new InternalItemsQuery(user) { - IncludeItemTypes = new[] { typeof(Game).Name } + IncludeItemTypes = new[] { typeof(Game).Name }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }; var games = _libraryManager.GetItemList(query) .Cast<Game>() @@ -167,7 +175,11 @@ namespace MediaBrowser.Api system.GetRecursiveChildren(i => i is Game) : system.GetRecursiveChildren(user, new InternalItemsQuery(user) { - IncludeItemTypes = new[] { typeof(Game).Name } + IncludeItemTypes = new[] { typeof(Game).Name }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }); var games = items.Cast<Game>().ToList(); diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 9f144c8e4..cbbaa82b8 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -617,6 +617,8 @@ namespace MediaBrowser.Api.Images ImageIndex = request.Index ?? 0, Image = image, Item = item, + ItemId = item.Id.ToString("N"), + ItemType = item.GetType().Name, MaxHeight = request.MaxHeight, MaxWidth = request.MaxWidth, Quality = request.Quality ?? 100, diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index e654cc8f6..31292618d 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -427,7 +427,11 @@ namespace MediaBrowser.Api.Library { var series = _libraryManager.GetItemList(new InternalItemsQuery { - IncludeItemTypes = new[] { typeof(Series).Name } + IncludeItemTypes = new[] { typeof(Series).Name }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Where(i => string.Equals(request.TvdbId, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase)).ToArray(); @@ -448,7 +452,11 @@ namespace MediaBrowser.Api.Library { var movies = _libraryManager.GetItemList(new InternalItemsQuery { - IncludeItemTypes = new[] { typeof(Movie).Name } + IncludeItemTypes = new[] { typeof(Movie).Name }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).ToArray(); @@ -668,7 +676,11 @@ namespace MediaBrowser.Api.Library Recursive = true, IsVirtualItem = false, SourceTypes = new[] { SourceType.Library }, - IsFavorite = request.IsFavorite + IsFavorite = request.IsFavorite, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }; return _libraryManager.GetItemsResult(query).TotalRecordCount; @@ -898,7 +910,11 @@ namespace MediaBrowser.Api.Library var query = new InternalItemsQuery(user) { IncludeItemTypes = includeTypes, - Recursive = true + Recursive = true, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }; var items = _libraryManager.GetItemList(query); diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 9fcdb4be5..3494754d0 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -889,6 +889,8 @@ namespace MediaBrowser.Api.LiveTv public async Task<object> Get(GetChannels request) { + var options = GetDtoOptions(_authContext, request); + var channelResult = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { ChannelType = request.Type, @@ -908,11 +910,10 @@ namespace MediaBrowser.Api.LiveTv SortOrder = request.SortOrder ?? SortOrder.Ascending, AddCurrentProgram = request.AddCurrentProgram - }, CancellationToken.None).ConfigureAwait(false); + }, options, CancellationToken.None).ConfigureAwait(false); var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId); - var options = GetDtoOptions(_authContext, request); RemoveFields(options); options.AddCurrentProgram = request.AddCurrentProgram; diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index b5c6f52fc..e20fa2cca 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.Api.Movies } [Route("/Movies/Recommendations", "GET", Summary = "Gets movie recommendations")] - public class GetMovieRecommendations : IReturn<RecommendationDto[]>, IHasItemFields + public class GetMovieRecommendations : IReturn<RecommendationDto[]>, IHasDtoOptions { [ApiMember(Name = "CategoryLimit", Description = "The max number of categories to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int CategoryLimit { get; set; } @@ -58,6 +58,18 @@ namespace MediaBrowser.Api.Movies [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; } + [ApiMember(Name = "EnableImages", Description = "Optional, include image information in output", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] + public bool? EnableImages { get; set; } + + [ApiMember(Name = "EnableUserData", Description = "Optional, include user data", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] + public bool? EnableUserData { get; set; } + + [ApiMember(Name = "ImageTypeLimit", Description = "Optional, the max number of images to return, per image type", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + public int? ImageTypeLimit { get; set; } + + [ApiMember(Name = "EnableImageTypes", Description = "Optional. The image types to include in the output.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string EnableImageTypes { get; set; } + public GetMovieRecommendations() { CategoryLimit = 5; @@ -115,14 +127,12 @@ namespace MediaBrowser.Api.Movies return ToOptimizedSerializedResultUsingCache(result); } - public async Task<object> Get(GetMovieRecommendations request) + public object Get(GetMovieRecommendations request) { var user = _userManager.GetUserById(request.UserId); var dtoOptions = GetDtoOptions(_authContext, request); - dtoOptions.Fields = request.GetItemFields().ToList(); - var result = GetRecommendationCategories(user, request.ParentId, request.CategoryLimit, request.ItemLimit, dtoOptions); return ToOptimizedResult(result); diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index d735dd7cd..797edd940 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -85,9 +85,11 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(item, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromArtistId request) @@ -96,9 +98,11 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(item, user); + var dtoOptions = GetDtoOptions(_authContext, request); - return GetResult(items, user, request); + var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions); + + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromMusicGenreId request) @@ -107,9 +111,11 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(item, user); + var dtoOptions = GetDtoOptions(_authContext, request); - return GetResult(items, user, request); + var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions); + + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromSong request) @@ -118,9 +124,11 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(item, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromAlbum request) @@ -129,9 +137,11 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(album, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromItem(album, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromPlaylist request) @@ -140,18 +150,22 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromItem(playlist, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromItem(playlist, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromMusicGenre request) { var user = _userManager.GetUserById(request.UserId); - var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } public Task<object> Get(GetInstantMixFromArtist request) @@ -159,12 +173,14 @@ namespace MediaBrowser.Api.Music var user = _userManager.GetUserById(request.UserId); var artist = _libraryManager.GetArtist(request.Name); - var items = _musicManager.GetInstantMixFromArtist(artist, user); + var dtoOptions = GetDtoOptions(_authContext, request); + + var items = _musicManager.GetInstantMixFromArtist(artist, user, dtoOptions); - return GetResult(items, user, request); + return GetResult(items, user, request, dtoOptions); } - private async Task<object> GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request) + private async Task<object> GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request, DtoOptions dtoOptions) { var list = items.ToList(); @@ -173,8 +189,6 @@ namespace MediaBrowser.Api.Music TotalRecordCount = list.Count }; - var dtoOptions = GetDtoOptions(_authContext, request); - result.Items = (await _dtoService.GetBaseItemDtos(list.Take(request.Limit ?? list.Count), dtoOptions, user).ConfigureAwait(false)).ToArray(); return ToOptimizedResult(result); diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 4b279031e..02114399a 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -374,6 +374,8 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public async Task<object> Get(GetNextUpEpisodes request) { + var options = GetDtoOptions(_authContext, request); + var result = _tvSeriesManager.GetNextUp(new NextUpQuery { Limit = request.Limit, @@ -382,12 +384,10 @@ namespace MediaBrowser.Api StartIndex = request.StartIndex, UserId = request.UserId, EnableTotalRecordCount = request.EnableTotalRecordCount - }); + }, options); var user = _userManager.GetUserById(request.UserId); - var options = GetDtoOptions(_authContext, request); - var returnItems = (await _dtoService.GetBaseItemDtos(result.Items, options, user).ConfigureAwait(false)).ToArray(); return ToOptimizedSerializedResultUsingCache(new ItemsResult @@ -469,6 +469,8 @@ namespace MediaBrowser.Api IEnumerable<Episode> episodes; + var dtoOptions = GetDtoOptions(_authContext, request); + if (!string.IsNullOrWhiteSpace(request.SeasonId)) { var season = _libraryManager.GetItemById(new Guid(request.SeasonId)) as Season; @@ -478,7 +480,7 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("No season exists with Id " + request.SeasonId); } - episodes = season.GetEpisodes(user); + episodes = season.GetEpisodes(user, dtoOptions); } else if (request.Season.HasValue) { @@ -489,7 +491,7 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("Series not found"); } - var season = series.GetSeasons(user).FirstOrDefault(i => i.IndexNumber == request.Season.Value); + var season = series.GetSeasons(user, dtoOptions).FirstOrDefault(i => i.IndexNumber == request.Season.Value); if (season == null) { @@ -497,7 +499,7 @@ namespace MediaBrowser.Api } else { - episodes = season.GetEpisodes(user); + episodes = season.GetEpisodes(user, dtoOptions); } } else @@ -509,7 +511,7 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException("Series not found"); } - episodes = series.GetEpisodes(user); + episodes = series.GetEpisodes(user, dtoOptions); } // Filter after the fact in case the ui doesn't want them @@ -543,8 +545,6 @@ namespace MediaBrowser.Api var pagedItems = ApplyPaging(returnList, request.StartIndex, request.Limit); - var dtoOptions = GetDtoOptions(_authContext, request); - var dtos = (await _dtoService.GetBaseItemDtos(pagedItems, dtoOptions, user).ConfigureAwait(false)) .ToArray(); diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index c1cc1555d..daef97915 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -129,7 +129,8 @@ namespace MediaBrowser.Api.UserLibrary PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), - MinCommunityRating = request.MinCommunityRating + MinCommunityRating = request.MinCommunityRating, + DtoOptions = dtoOptions }; if (!string.IsNullOrWhiteSpace(request.ParentId)) diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index f8580d328..da5c5c763 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -330,7 +330,7 @@ namespace MediaBrowser.Api.UserLibrary { var requestedLocationTypes = request.LocationTypes.Split(',') - .Select(d => (LocationType) Enum.Parse(typeof (LocationType), d, true)) + .Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)) .ToList(); if (requestedLocationTypes.Count > 0 && requestedLocationTypes.Count < 4) @@ -381,15 +381,15 @@ namespace MediaBrowser.Api.UserLibrary // Albums if (!string.IsNullOrEmpty(request.Albums)) { - query.AlbumIds = request.Albums.Split('|').Select(i => + query.AlbumIds = request.Albums.Split('|').SelectMany(i => { - return _libraryManager.GetItemList(new InternalItemsQuery + return _libraryManager.GetItemIds(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(MusicAlbum).Name }, Name = i, Limit = 1 - }).Select(album => album.Id.ToString("N")).FirstOrDefault(); + }).Select(albumId => albumId.ToString("N")); }).ToArray(); } diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index b1f196f15..a4e1ec330 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -308,6 +308,8 @@ namespace MediaBrowser.Api.UserLibrary } } + var dtoOptions = GetDtoOptions(_authContext, request); + var list = _userViewManager.GetLatestItems(new LatestItemsQuery { GroupItems = request.GroupItems, @@ -315,10 +317,8 @@ namespace MediaBrowser.Api.UserLibrary IsPlayed = request.IsPlayed, Limit = request.Limit, ParentId = request.ParentId, - UserId = request.UserId - }); - - var dtoOptions = GetDtoOptions(_authContext, request); + UserId = request.UserId, + }, dtoOptions); var dtos = list.Select(i => { @@ -360,7 +360,7 @@ namespace MediaBrowser.Api.UserLibrary var currentUser = user; var dtos = series - .GetEpisodes(user) + .GetEpisodes(user, dtoOptions) .Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0) .OrderBy(i => { diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs index 70ac08343..cfb3a97ee 100644 --- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs +++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs @@ -10,6 +10,8 @@ namespace MediaBrowser.Controller.Drawing { public class ImageProcessingOptions { + public string ItemId { get; set; } + public string ItemType { get; set; } public IHasImages Item { get; set; } public ItemImageInfo Image { get; set; } diff --git a/MediaBrowser.Controller/Dto/DtoOptions.cs b/MediaBrowser.Controller/Dto/DtoOptions.cs index e69b64948..b9d9d7dda 100644 --- a/MediaBrowser.Controller/Dto/DtoOptions.cs +++ b/MediaBrowser.Controller/Dto/DtoOptions.cs @@ -23,17 +23,28 @@ namespace MediaBrowser.Controller.Dto public bool AddCurrentProgram { get; set; } public DtoOptions() + : this(true) + { + } + + public DtoOptions(bool allFields) { - Fields = new List<ItemFields>(); ImageTypeLimit = int.MaxValue; EnableImages = true; EnableUserData = true; AddCurrentProgram = true; - Fields = Enum.GetNames(typeof (ItemFields)) - .Select(i => (ItemFields) Enum.Parse(typeof (ItemFields), i, true)) - .Except(DefaultExcludedFields) - .ToList(); + if (allFields) + { + Fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .Except(DefaultExcludedFields) + .ToList(); + } + else + { + Fields = new List<ItemFields>(); + } ImageTypes = Enum.GetNames(typeof(ImageType)) .Select(i => (ImageType)Enum.Parse(typeof(ImageType), i, true)) diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 8d83f8a35..b0b9493a5 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -266,20 +266,6 @@ namespace MediaBrowser.Controller.Entities.Audio return info; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => - { - var hasArtist = i as IHasArtist; - return hasArtist != null && hasArtist.HasAnyArtist(Name); - }; - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index 2f99e530e..d4a85b4d0 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -91,16 +91,6 @@ namespace MediaBrowser.Controller.Entities.Audio } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i is IHasMusicGenres && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 999f6db3f..1fe7dd3f6 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -22,6 +22,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Extensions; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Sorting; @@ -186,10 +187,15 @@ namespace MediaBrowser.Controller.Entities } set { + var isSortNameDefault = IsSortNameDefault(SortName); + _name = value; - // lazy load this again - _sortName = null; + if (isSortNameDefault) + { + // lazy load this again + SortName = null; + } } } @@ -580,7 +586,6 @@ namespace MediaBrowser.Controller.Entities } } - private string _forcedSortName; /// <summary> /// Gets or sets the name of the forced sort. /// </summary> @@ -588,8 +593,42 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public string ForcedSortName { - get { return _forcedSortName; } - set { _forcedSortName = value; _sortName = null; } + get + { + var sortName = SortName; + + if (string.IsNullOrWhiteSpace(sortName)) + { + return null; + } + + if (string.Equals(sortName, CreateSortName(), StringComparison.OrdinalIgnoreCase)) + { + return null; + } + + return sortName; + } + set + { + if (string.IsNullOrWhiteSpace(value)) + { + SortName = null; + } + else + { + var newValue = CreateSortNameFromCustomValue(value); + + if (string.Equals(newValue, CreateSortName(), StringComparison.OrdinalIgnoreCase)) + { + SortName = null; + } + else + { + SortName = newValue; + } + } + } } private string _sortName; @@ -604,15 +643,7 @@ namespace MediaBrowser.Controller.Entities { if (_sortName == null) { - if (!string.IsNullOrWhiteSpace(ForcedSortName)) - { - // Need the ToLower because that's what CreateSortName does - _sortName = ModifySortChunks(ForcedSortName).ToLower(); - } - else - { - _sortName = CreateSortName(); - } + _sortName = CreateSortName(); } return _sortName; } @@ -622,6 +653,21 @@ namespace MediaBrowser.Controller.Entities } } + private string CreateSortNameFromCustomValue(string value) + { + return string.IsNullOrWhiteSpace(value) ? null : ModifySortChunks(value).ToLower(); + } + + public bool IsSortNameDefault(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return true; + } + + return string.Equals(CreateSortNameFromCustomValue(value), CreateSortName(), StringComparison.OrdinalIgnoreCase); + } + public string GetInternalMetadataPath() { var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath; @@ -1303,7 +1349,6 @@ namespace MediaBrowser.Controller.Entities public void AfterMetadataRefresh() { - _sortName = null; } /// <summary> @@ -2187,8 +2232,6 @@ namespace MediaBrowser.Controller.Entities /// </summary> public virtual bool BeforeMetadataRefresh() { - _sortName = null; - var hasChanges = false; if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path)) @@ -2210,7 +2253,7 @@ namespace MediaBrowser.Controller.Entities return path; } - public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) + public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields) { if (RunTimeTicks.HasValue) { diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index edac27f99..b18d47a65 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -672,7 +673,8 @@ namespace MediaBrowser.Controller.Entities return ItemRepository.GetItemList(new InternalItemsQuery { ParentId = Id, - GroupByPresentationUniqueKey = false + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true) }); } @@ -690,7 +692,11 @@ namespace MediaBrowser.Controller.Entities { Recursive = false, Limit = 0, - ParentId = Id + ParentId = Id, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Result; @@ -705,7 +711,11 @@ namespace MediaBrowser.Controller.Entities IsFolder = false, IsVirtualItem = false, EnableTotalRecordCount = true, - Limit = 0 + Limit = 0, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Result.TotalRecordCount; } @@ -1481,7 +1491,7 @@ namespace MediaBrowser.Controller.Entities } } - public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) + public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields) { if (!SupportsUserDataFromChildren) { @@ -1490,7 +1500,7 @@ namespace MediaBrowser.Controller.Entities if (itemDto != null) { - if (itemFields.Contains(ItemFields.RecursiveItemCount)) + if (fields.Contains(ItemFields.RecursiveItemCount)) { itemDto.RecursiveItemCount = GetRecursiveChildCount(user); } @@ -1505,7 +1515,11 @@ namespace MediaBrowser.Controller.Entities IsVirtualItem = false, EnableTotalRecordCount = true, Limit = 0, - IsPlayed = false + IsPlayed = false, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index 093b191b6..836020d88 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -69,16 +69,6 @@ namespace MediaBrowser.Controller.Entities return false; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i is Game && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.GenreIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index 6569a1e6c..4b70eae58 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -81,16 +81,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.GenreIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs index b69c8bdfc..a02ca1c0c 100644 --- a/MediaBrowser.Controller/Entities/IItemByName.cs +++ b/MediaBrowser.Controller/Entities/IItemByName.cs @@ -7,13 +7,6 @@ namespace MediaBrowser.Controller.Entities /// </summary> public interface IItemByName : IHasMetadata { - /// <summary> - /// Gets the tagged items. - /// </summary> - /// <param name="inputItems">The input items.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems); - IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query); } diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 3c948487d..f029d36fd 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -166,26 +166,31 @@ namespace MediaBrowser.Controller.Entities switch (name) { - case ItemFields.ThemeSongIds: - case ItemFields.ThemeVideoIds: - case ItemFields.ProductionLocations: - case ItemFields.Keywords: - case ItemFields.Taglines: - case ItemFields.CustomRating: - case ItemFields.DateCreated: - case ItemFields.SortName: - case ItemFields.Overview: case ItemFields.HomePageUrl: - case ItemFields.VoteCount: + case ItemFields.Keywords: case ItemFields.DisplayMediaType: - //case ItemFields.ServiceName: - case ItemFields.Genres: - case ItemFields.Studios: + case ItemFields.VoteCount: + case ItemFields.CustomRating: + case ItemFields.ProductionLocations: case ItemFields.Settings: case ItemFields.OriginalTitle: + case ItemFields.Taglines: + case ItemFields.SortName: + case ItemFields.Studios: case ItemFields.Tags: + case ItemFields.ThemeSongIds: + case ItemFields.ThemeVideoIds: + case ItemFields.DateCreated: + case ItemFields.Overview: + case ItemFields.Genres: case ItemFields.DateLastMediaAdded: - return fields.Count == 0 || fields.Contains(name); + case ItemFields.ExternalEtag: + case ItemFields.PresentationUniqueKey: + case ItemFields.InheritedParentalRatingValue: + case ItemFields.ExternalSeriesId: + return fields.Contains(name); + case ItemFields.ServiceName: + return true; default: return true; } diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index 005fb2014..20d9c7999 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -93,22 +93,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - var itemsWithPerson = LibraryManager.GetItemIds(new InternalItemsQuery - { - PersonIds = new[] { Id.ToString("N") } - }); - - return inputItems.Where(i => itemsWithPerson.Contains(i.Id)); - } - - - public Func<BaseItem, bool> GetItemFilter() - { - return i => LibraryManager.GetPeople(i).Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase)); - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 2e5e6ce43..8cb65c60a 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -88,16 +88,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.StudioIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index ed04b5ddc..af1b6d53c 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -5,6 +5,7 @@ using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; @@ -160,7 +161,7 @@ namespace MediaBrowser.Controller.Entities.TV Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); - var items = GetEpisodes(user).Where(filter); + var items = GetEpisodes(user, query.DtoOptions).Where(filter); var result = PostFilterAndSort(items, query, false, false); @@ -170,21 +171,19 @@ namespace MediaBrowser.Controller.Entities.TV /// <summary> /// Gets the episodes. /// </summary> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Episode}.</returns> - public IEnumerable<Episode> GetEpisodes(User user) + public IEnumerable<Episode> GetEpisodes(User user, DtoOptions options) { - return GetEpisodes(Series, user); + return GetEpisodes(Series, user, options); } - public IEnumerable<Episode> GetEpisodes(Series series, User user) + public IEnumerable<Episode> GetEpisodes(Series series, User user, DtoOptions options) { - return GetEpisodes(series, user, null); + return GetEpisodes(series, user, null, options); } - public IEnumerable<Episode> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes) + public IEnumerable<Episode> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options) { - return series.GetSeasonEpisodes(this, user, allSeriesEpisodes); + return series.GetSeasonEpisodes(this, user, allSeriesEpisodes, options); } public IEnumerable<Episode> GetEpisodes() @@ -194,7 +193,7 @@ namespace MediaBrowser.Controller.Entities.TV public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) { - return GetEpisodes(user); + return GetEpisodes(user, new DtoOptions(true)); } protected override bool GetBlockUnratedValue(UserPolicy config) diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 7641c9523..f75a78c97 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; @@ -250,12 +251,15 @@ namespace MediaBrowser.Controller.Entities.TV public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) { - return GetSeasons(user); + return GetSeasons(user, new DtoOptions(true)); } - public IEnumerable<Season> GetSeasons(User user) + public IEnumerable<Season> GetSeasons(User user, DtoOptions options) { - var query = new InternalItemsQuery(user); + var query = new InternalItemsQuery(user) + { + DtoOptions = options + }; SetSeasonQueryOptions(query, user); @@ -321,7 +325,7 @@ namespace MediaBrowser.Controller.Entities.TV return Task.FromResult(LibraryManager.GetItemsResult(query)); } - public IEnumerable<Episode> GetEpisodes(User user) + public IEnumerable<Episode> GetEpisodes(User user, DtoOptions options) { var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); @@ -331,7 +335,8 @@ namespace MediaBrowser.Controller.Entities.TV AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }, - SortBy = new[] { ItemSortBy.SortName } + SortBy = new[] { ItemSortBy.SortName }, + DtoOptions = options }; var config = user.Configuration; if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes) @@ -352,7 +357,7 @@ namespace MediaBrowser.Controller.Entities.TV var allSeriesEpisodes = allItems.OfType<Episode>().ToList(); var allEpisodes = allItems.OfType<Season>() - .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes)) + .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes, options)) .Reverse() .ToList(); @@ -429,7 +434,7 @@ namespace MediaBrowser.Controller.Entities.TV progress.Report(100); } - public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user) + public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options) { var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; @@ -445,7 +450,8 @@ namespace MediaBrowser.Controller.Entities.TV AncestorWithPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? null : seriesKey, SeriesPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? seriesKey : null, IncludeItemTypes = new[] { typeof(Episode).Name }, - SortBy = new[] { ItemSortBy.SortName } + SortBy = new[] { ItemSortBy.SortName }, + DtoOptions = options }; if (user != null) { @@ -466,14 +472,14 @@ namespace MediaBrowser.Controller.Entities.TV var allItems = LibraryManager.GetItemList(query).OfType<Episode>(); - return GetSeasonEpisodes(parentSeason, user, allItems); + return GetSeasonEpisodes(parentSeason, user, allItems, options); } - public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes) + public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options) { if (allSeriesEpisodes == null) { - return GetSeasonEpisodes(parentSeason, user); + return GetSeasonEpisodes(parentSeason, user, options); } var episodes = FilterEpisodesBySeason(allSeriesEpisodes, parentSeason, ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons); diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 99601b290..ac843d5fb 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using MediaBrowser.Model.Serialization; using System.Threading.Tasks; using System.Linq; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Entities { @@ -75,7 +76,8 @@ namespace MediaBrowser.Controller.Entities var result = GetItems(new InternalItemsQuery { User = user, - EnableTotalRecordCount = false + EnableTotalRecordCount = false, + DtoOptions = new DtoOptions(true) }).Result; @@ -100,7 +102,9 @@ namespace MediaBrowser.Controller.Entities Recursive = true, EnableTotalRecordCount = false, - ForceDirect = true + ForceDirect = true, + + DtoOptions = query.DtoOptions }).Result; diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 8da069f62..801d1d783 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -17,6 +17,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities @@ -83,7 +84,7 @@ namespace MediaBrowser.Controller.Entities Limit = query.Limit, StartIndex = query.StartIndex - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); return GetResult(result); } @@ -110,7 +111,7 @@ namespace MediaBrowser.Controller.Entities Limit = query.Limit, StartIndex = query.StartIndex - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); return GetResult(result); } @@ -394,7 +395,7 @@ namespace MediaBrowser.Controller.Entities ParentId = parent == null ? null : parent.Id.ToString("N"), GroupItems = true - }).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null); + }, query.DtoOptions).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null); query.SortBy = new string[] { }; @@ -662,7 +663,7 @@ namespace MediaBrowser.Controller.Entities StartIndex = query.StartIndex, UserId = query.User.Id.ToString("N") - }, parentFolders); + }, parentFolders, query.DtoOptions); return result; } @@ -1783,7 +1784,7 @@ namespace MediaBrowser.Controller.Entities Status = RecordingStatus.Completed, UserId = user.Id.ToString("N") - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); } var list = new List<BaseItem>(); diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index b352950a0..61b1a3b1a 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -65,20 +65,6 @@ namespace MediaBrowser.Controller.Entities return true; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - int year; - - var usCulture = new CultureInfo("en-US"); - - if (!int.TryParse(Name, NumberStyles.Integer, usCulture, out year)) - { - return inputItems; - } - - return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { int year; @@ -107,12 +93,6 @@ namespace MediaBrowser.Controller.Entities return null; } - public Func<BaseItem, bool> GetItemFilter() - { - var val = GetYearValue(); - return i => i.ProductionYear.HasValue && val.HasValue && i.ProductionYear.Value == val.Value; - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs index 9baf8b6f1..95ba671b4 100644 --- a/MediaBrowser.Controller/Library/IMusicManager.cs +++ b/MediaBrowser.Controller/Library/IMusicManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using System.Collections.Generic; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Library { @@ -9,23 +10,16 @@ namespace MediaBrowser.Controller.Library /// <summary> /// Gets the instant mix from song. /// </summary> - /// <param name="item">The item.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user); + IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions); + /// <summary> /// Gets the instant mix from artist. /// </summary> - /// <param name="artist">The artist.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user); + IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user, DtoOptions dtoOptions); + /// <summary> /// Gets the instant mix from genre. /// </summary> - /// <param name="genres">The genres.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user); + IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions); } } diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index 5391d113e..b46ece49d 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Library { @@ -16,6 +17,6 @@ namespace MediaBrowser.Controller.Library Task<UserView> GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); - List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request); + List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options); } } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index 7e1dab462..288b30278 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -284,19 +284,12 @@ namespace MediaBrowser.Controller.LiveTv /// <summary> /// Gets the internal channels. /// </summary> - /// <param name="query">The query.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<QueryResult<LiveTvChannel>>.</returns> - Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, - CancellationToken cancellationToken); + Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); /// <summary> /// Gets the internal recordings. /// </summary> - /// <param name="query">The query.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<QueryResult<BaseItem>>.</returns> - Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken); + Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken); /// <summary> /// Gets the recording media sources. diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs index fb1410f4a..73c3b9a25 100644 --- a/MediaBrowser.Controller/Playlists/Playlist.cs +++ b/MediaBrowser.Controller/Playlists/Playlist.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using MediaBrowser.Model.Serialization; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Playlists @@ -81,7 +82,7 @@ namespace MediaBrowser.Controller.Playlists public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) { - return GetPlayableItems(user).Result; + return GetPlayableItems(user, new DtoOptions(true)).Result; } protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService) @@ -91,7 +92,7 @@ namespace MediaBrowser.Controller.Playlists public override IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query) { - var items = GetPlayableItems(user).Result; + var items = GetPlayableItems(user, query.DtoOptions).Result; if (query != null) { @@ -106,12 +107,12 @@ namespace MediaBrowser.Controller.Playlists return GetLinkedChildrenInfos(); } - private Task<IEnumerable<BaseItem>> GetPlayableItems(User user) + private Task<IEnumerable<BaseItem>> GetPlayableItems(User user, DtoOptions options) { - return GetPlaylistItems(MediaType, base.GetChildren(user, true), user); + return GetPlaylistItems(MediaType, base.GetChildren(user, true), user, options); } - public static async Task<IEnumerable<BaseItem>> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user) + public static async Task<IEnumerable<BaseItem>> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user, DtoOptions options) { if (user != null) { @@ -122,14 +123,14 @@ namespace MediaBrowser.Controller.Playlists foreach (var item in inputItems) { - var playlistItems = await GetPlaylistItems(item, user, playlistMediaType).ConfigureAwait(false); + var playlistItems = await GetPlaylistItems(item, user, playlistMediaType, options).ConfigureAwait(false); list.AddRange(playlistItems); } return list; } - private static async Task<IEnumerable<BaseItem>> GetPlaylistItems(BaseItem item, User user, string mediaType) + private static async Task<IEnumerable<BaseItem>> GetPlaylistItems(BaseItem item, User user, string mediaType, DtoOptions options) { var musicGenre = item as MusicGenre; if (musicGenre != null) @@ -140,7 +141,8 @@ namespace MediaBrowser.Controller.Playlists IncludeItemTypes = new[] { typeof(Audio).Name }, GenreIds = new[] { musicGenre.Id.ToString("N") }, SortBy = new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, - SortOrder = SortOrder.Ascending + SortOrder = SortOrder.Ascending, + DtoOptions = options }); } @@ -153,7 +155,8 @@ namespace MediaBrowser.Controller.Playlists IncludeItemTypes = new[] { typeof(Audio).Name }, ArtistIds = new[] { musicArtist.Id.ToString("N") }, SortBy = new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, - SortOrder = SortOrder.Ascending + SortOrder = SortOrder.Ascending, + DtoOptions = options }); } @@ -166,7 +169,8 @@ namespace MediaBrowser.Controller.Playlists IsFolder = false, SortBy = new[] { ItemSortBy.SortName }, MediaTypes = new[] { mediaType }, - EnableTotalRecordCount = false + EnableTotalRecordCount = false, + DtoOptions = options }; var itemsResult = await folder.GetItems(query).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/TV/ITVSeriesManager.cs b/MediaBrowser.Controller/TV/ITVSeriesManager.cs index 771fa602a..0bcb9ae5b 100644 --- a/MediaBrowser.Controller/TV/ITVSeriesManager.cs +++ b/MediaBrowser.Controller/TV/ITVSeriesManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Querying; using System.Collections.Generic; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.TV { @@ -9,16 +10,11 @@ namespace MediaBrowser.Controller.TV /// <summary> /// Gets the next up. /// </summary> - /// <param name="query">The query.</param> - /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetNextUp(NextUpQuery query); + QueryResult<BaseItem> GetNextUp(NextUpQuery query, DtoOptions options); /// <summary> /// Gets the next up. /// </summary> - /// <param name="request">The request.</param> - /// <param name="parentsFolders">The parents folders.</param> - /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders); + QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions options); } } diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index ab560875e..db35090b9 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -154,11 +154,6 @@ RecursiveItemCount, /// <summary> - /// The season name - /// </summary> - SeasonName, - - /// <summary> /// The settings /// </summary> Settings, @@ -236,6 +231,10 @@ /// </summary> ServiceName, ThemeSongIds, - ThemeVideoIds + ThemeVideoIds, + ExternalEtag, + PresentationUniqueKey, + InheritedParentalRatingValue, + ExternalSeriesId } } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 7ff018c7b..131bf50c3 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -21,6 +21,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; @@ -958,7 +959,11 @@ namespace MediaBrowser.Providers.Manager .GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(MusicAlbum).Name }, - ArtistIds = new[] { item.Id.ToString("N") } + ArtistIds = new[] { item.Id.ToString("N") }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }) .OfType<MusicAlbum>() .ToList(); diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs index 0e842cdb4..200615a5d 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs @@ -14,6 +14,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Tasks; @@ -82,7 +83,8 @@ namespace MediaBrowser.Providers.MediaInfo { MediaTypes = new string[] { MediaType.Video }, IsVirtualItem = false, - IncludeItemTypes = types.ToArray() + IncludeItemTypes = types.ToArray(), + DtoOptions = new DtoOptions(true) }).OfType<Video>() .Where(i => i.LocationType != LocationType.Remote) diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs index dd3bfb4f8..efbf46cd6 100644 --- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs @@ -15,6 +15,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.IO; using MediaBrowser.Model.Xml; @@ -65,7 +66,11 @@ namespace MediaBrowser.Providers.People var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery { IncludeItemTypes = new[] { typeof(Series).Name }, - PersonIds = new[] { item.Id.ToString("N") } + PersonIds = new[] { item.Id.ToString("N") }, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Cast<Series>() .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds)) diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs index e8ed05225..5fccb9e3c 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs @@ -15,6 +15,7 @@ using System.Threading; using System.Threading.Tasks; using System.Xml; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; @@ -114,7 +115,11 @@ namespace MediaBrowser.Providers.TV { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, - GroupByPresentationUniqueKey = false + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Cast<Series>() .ToList(); @@ -325,7 +330,11 @@ namespace MediaBrowser.Providers.TV { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, - GroupByPresentationUniqueKey = false + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } }).Cast<Series>(); diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs index cd18e5670..188fc8504 100644 --- a/MediaBrowser.XbmcMetadata/EntryPoint.cs +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -9,6 +9,7 @@ using MediaBrowser.XbmcMetadata.Configuration; using MediaBrowser.XbmcMetadata.Savers; using System; using System.Linq; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.XbmcMetadata { @@ -52,7 +53,8 @@ namespace MediaBrowser.XbmcMetadata var items = _libraryManager.GetItemList(new InternalItemsQuery { - PersonIds = new [] { person.Id.ToString("N") } + PersonIds = new [] { person.Id.ToString("N") }, + DtoOptions = new DtoOptions(true) }).ToList(); |
