Browse Source

update data queries

Luke Pulverenti 8 năm trước cách đây
mục cha
commit
da77b05817
62 tập tin đã thay đổi với 620 bổ sung446 xóa
  1. 16 6
      Emby.Dlna/ContentDirectory/ControlHandler.cs
  2. 18 3
      Emby.Drawing/ImageProcessor.cs
  3. 2 2
      Emby.Server.Implementations/Channels/ChannelManager.cs
  4. 42 31
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  5. 19 9
      Emby.Server.Implementations/Dto/DtoService.cs
  6. 5 2
      Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
  7. 8 4
      Emby.Server.Implementations/Library/LibraryManager.cs
  8. 5 2
      Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs
  9. 26 22
      Emby.Server.Implementations/Library/MusicManager.cs
  10. 12 1
      Emby.Server.Implementations/Library/SearchEngine.cs
  11. 6 4
      Emby.Server.Implementations/Library/UserViewManager.cs
  12. 12 6
      Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
  13. 11 6
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  14. 25 5
      Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
  15. 25 36
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  16. 5 2
      Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs
  17. 13 6
      Emby.Server.Implementations/Playlists/PlaylistManager.cs
  18. 4 1
      Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
  19. 15 4
      Emby.Server.Implementations/Session/SessionManager.cs
  20. 5 2
      Emby.Server.Implementations/TV/SeriesPostScanTask.cs
  21. 10 8
      Emby.Server.Implementations/TV/TVSeriesManager.cs
  22. 5 2
      Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
  23. 7 2
      Emby.Server.Implementations/UserViews/DynamicImageProvider.cs
  24. 0 10
      MediaBrowser.Api/BaseApiService.cs
  25. 15 3
      MediaBrowser.Api/GamesService.cs
  26. 2 0
      MediaBrowser.Api/Images/ImageService.cs
  27. 20 4
      MediaBrowser.Api/Library/LibraryService.cs
  28. 3 2
      MediaBrowser.Api/LiveTv/LiveTvService.cs
  29. 14 4
      MediaBrowser.Api/Movies/MoviesService.cs
  30. 33 19
      MediaBrowser.Api/Music/InstantMixService.cs
  31. 9 9
      MediaBrowser.Api/TvShowsService.cs
  32. 2 1
      MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
  33. 4 4
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  34. 5 5
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  35. 2 0
      MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
  36. 16 5
      MediaBrowser.Controller/Dto/DtoOptions.cs
  37. 0 14
      MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
  38. 0 10
      MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
  39. 61 18
      MediaBrowser.Controller/Entities/BaseItem.cs
  40. 20 6
      MediaBrowser.Controller/Entities/Folder.cs
  41. 0 10
      MediaBrowser.Controller/Entities/GameGenre.cs
  42. 0 10
      MediaBrowser.Controller/Entities/Genre.cs
  43. 0 7
      MediaBrowser.Controller/Entities/IItemByName.cs
  44. 19 14
      MediaBrowser.Controller/Entities/InternalItemsQuery.cs
  45. 0 16
      MediaBrowser.Controller/Entities/Person.cs
  46. 0 10
      MediaBrowser.Controller/Entities/Studio.cs
  47. 9 10
      MediaBrowser.Controller/Entities/TV/Season.cs
  48. 17 11
      MediaBrowser.Controller/Entities/TV/Series.cs
  49. 6 2
      MediaBrowser.Controller/Entities/UserView.cs
  50. 6 5
      MediaBrowser.Controller/Entities/UserViewBuilder.cs
  51. 0 20
      MediaBrowser.Controller/Entities/Year.cs
  52. 6 12
      MediaBrowser.Controller/Library/IMusicManager.cs
  53. 2 1
      MediaBrowser.Controller/Library/IUserViewManager.cs
  54. 2 9
      MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
  55. 14 10
      MediaBrowser.Controller/Playlists/Playlist.cs
  56. 3 7
      MediaBrowser.Controller/TV/ITVSeriesManager.cs
  57. 5 6
      MediaBrowser.Model/Querying/ItemFields.cs
  58. 6 1
      MediaBrowser.Providers/Manager/ProviderManager.cs
  59. 3 1
      MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
  60. 6 1
      MediaBrowser.Providers/People/TvdbPersonImageProvider.cs
  61. 11 2
      MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs
  62. 3 1
      MediaBrowser.XbmcMetadata/EntryPoint.cs

+ 16 - 6
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))

+ 18 - 3
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))
                     {

+ 2 - 2
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)

+ 42 - 31
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;

+ 19 - 9
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");
                 }
             }
 

+ 5 - 2
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();
                 }

+ 8 - 4
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)

+ 5 - 2
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();
 

+ 26 - 22
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[] { };

+ 12 - 1
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

+ 6 - 4
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);
         }

+ 12 - 6
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;
                     }

+ 11 - 6
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)

+ 25 - 5
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();
 

+ 25 - 36
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();
 

+ 5 - 2
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();
 

+ 13 - 6
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();
 

+ 4 - 1
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();

+ 15 - 4
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)

+ 5 - 2
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();
 

+ 10 - 8
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();
             };

+ 5 - 2
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);

+ 7 - 2
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);
 

+ 0 - 10
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)
             {

+ 15 - 3
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();

+ 2 - 0
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,

+ 20 - 4
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);

+ 3 - 2
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;

+ 14 - 4
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);

+ 33 - 19
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);

+ 9 - 9
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();
 

+ 2 - 1
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))

+ 4 - 4
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();
             }

+ 5 - 5
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 =>
                     {

+ 2 - 0
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; }

+ 16 - 5
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))

+ 0 - 14
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
         {

+ 0 - 10
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
         {

+ 61 - 18
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)
             {

+ 20 - 6
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);
 

+ 0 - 10
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") };

+ 0 - 10
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") };

+ 0 - 7
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);
     }
 

+ 19 - 14
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;
             }

+ 0 - 16
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
         {

+ 0 - 10
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") };

+ 9 - 10
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)

+ 17 - 11
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);

+ 6 - 2
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;
 

+ 6 - 5
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>();

+ 0 - 20
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
         {

+ 6 - 12
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);
     }
 }

+ 2 - 1
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);
     }
 }

+ 2 - 9
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&lt;QueryResult&lt;LiveTvChannel&gt;&gt;.</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&lt;QueryResult&lt;BaseItem&gt;&gt;.</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.

+ 14 - 10
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);

+ 3 - 7
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&lt;BaseItem&gt;.</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&lt;BaseItem&gt;.</returns>
-        QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders);
+        QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions options);
     }
 }

+ 5 - 6
MediaBrowser.Model/Querying/ItemFields.cs

@@ -153,11 +153,6 @@
 
         RecursiveItemCount,
 
-        /// <summary>
-        /// The season name
-        /// </summary>
-        SeasonName,
-
         /// <summary>
         /// The settings
         /// </summary>
@@ -236,6 +231,10 @@
         /// </summary>
         ServiceName,
         ThemeSongIds,
-        ThemeVideoIds
+        ThemeVideoIds,
+        ExternalEtag,
+        PresentationUniqueKey,
+        InheritedParentalRatingValue,
+        ExternalSeriesId
     }
 }

+ 6 - 1
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();

+ 3 - 1
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)

+ 6 - 1
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))

+ 11 - 2
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>();
 

+ 3 - 1
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();