diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities')
42 files changed, 547 insertions, 251 deletions
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs index 7b769deb3..a6b9d860a 100644 --- a/MediaBrowser.Controller/Entities/AggregateFolder.cs +++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs @@ -4,11 +4,12 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 56c3248f3..e4f638cb6 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -7,10 +7,10 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Channels; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.Audio { @@ -22,14 +22,10 @@ namespace MediaBrowser.Controller.Entities.Audio IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>, - IHasMediaSources, - IThemeMedia + IHasMediaSources { public List<ChannelMediaInfo> ChannelMediaSources { get; set; } - public int? TotalBitrate { get; set; } - public ExtraType? ExtraType { get; set; } - /// <summary> /// Gets or sets the artist. /// </summary> @@ -39,15 +35,6 @@ namespace MediaBrowser.Controller.Entities.Audio public List<string> AlbumArtists { get; set; } [IgnoreDataMember] - public bool IsThemeMedia - { - get - { - return ExtraType.HasValue && ExtraType.Value == Model.Entities.ExtraType.ThemeSong; - } - } - - [IgnoreDataMember] public override bool EnableRefreshOnDateModifiedChange { get { return true; } @@ -75,6 +62,12 @@ namespace MediaBrowser.Controller.Entities.Audio } [IgnoreDataMember] + public override bool SupportsInheritedParentImages + { + get { return true; } + } + + [IgnoreDataMember] protected override bool SupportsOwnedItems { get diff --git a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs index 9072e1094..8c820d367 100644 --- a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs +++ b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs @@ -1,6 +1,16 @@ -namespace MediaBrowser.Controller.Entities.Audio +using MediaBrowser.Model.Serialization; + +namespace MediaBrowser.Controller.Entities.Audio { public class AudioPodcast : Audio { + [IgnoreDataMember] + public override bool SupportsPositionTicksResume + { + get + { + return true; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index 3f457d89a..ffdbba6f2 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -5,7 +5,7 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Library; @@ -33,6 +33,12 @@ namespace MediaBrowser.Controller.Entities.Audio } [IgnoreDataMember] + public override bool SupportsInheritedParentImages + { + get { return true; } + } + + [IgnoreDataMember] public MusicArtist MusicArtist { get diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index a31f04fc4..fd20f2ab4 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -6,10 +6,12 @@ using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities.Audio { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index bd991d9f4..d75b31f6a 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities.Audio { @@ -29,6 +31,15 @@ namespace MediaBrowser.Controller.Entities.Audio get { return true; } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + /// <summary> /// Returns the folder containing the item. /// If the item is a folder, it returns the folder itself diff --git a/MediaBrowser.Controller/Entities/AudioBook.cs b/MediaBrowser.Controller/Entities/AudioBook.cs new file mode 100644 index 000000000..efeb9b497 --- /dev/null +++ b/MediaBrowser.Controller/Entities/AudioBook.cs @@ -0,0 +1,64 @@ +using System; +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Entities +{ + public class AudioBook : Audio.Audio, IHasSeries + { + [IgnoreDataMember] + public override bool SupportsPositionTicksResume + { + get + { + return true; + } + } + + [IgnoreDataMember] + public string SeriesPresentationUniqueKey { get; set; } + [IgnoreDataMember] + public string SeriesName { get; set; } + [IgnoreDataMember] + public Guid? SeriesId { get; set; } + [IgnoreDataMember] + public string SeriesSortName { get; set; } + + public string FindSeriesSortName() + { + return SeriesSortName; + } + public string FindSeriesName() + { + return SeriesName; + } + public string FindSeriesPresentationUniqueKey() + { + return SeriesPresentationUniqueKey; + } + + [IgnoreDataMember] + public override bool EnableRefreshOnDateModifiedChange + { + get { return true; } + } + + public Guid? FindSeriesId() + { + return SeriesId; + } + + public override bool CanDownload() + { + var locationType = LocationType; + return locationType != LocationType.Remote && + locationType != LocationType.Virtual; + } + + public override UnratedItem GetBlockUnratedType() + { + return UnratedItem.Book; + } + } +} diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index e1a7741c9..2aa53d651 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -5,7 +5,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; -using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; @@ -19,14 +18,20 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; -using System.Runtime.Serialization; using System.Text; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.IO; using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { @@ -138,6 +143,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public virtual bool SupportsPositionTicksResume + { + get + { + return false; + } + } + public bool DetectIsInMixedFolder() { if (SupportsIsInMixedFolderDetection) @@ -199,6 +213,19 @@ namespace MediaBrowser.Controller.Entities get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; } } + public int? TotalBitrate { get; set; } + public ExtraType? ExtraType { get; set; } + + [IgnoreDataMember] + public bool IsThemeMedia + { + get + { + return ExtraType.HasValue && (ExtraType.Value == Model.Entities.ExtraType.ThemeSong || ExtraType.Value == Model.Entities.ExtraType.ThemeVideo); + } + } + + [IgnoreDataMember] public string OriginalTitle { get; set; } /// <summary> @@ -279,28 +306,11 @@ namespace MediaBrowser.Controller.Entities /// If this content came from an external service, the id of the content on that service /// </summary> [IgnoreDataMember] - public string ExternalId - { - get { return this.GetProviderId("ProviderExternalId"); } - set - { - this.SetProviderId("ProviderExternalId", value); - } - } + public string ExternalId { get; set; } [IgnoreDataMember] public string ExternalSeriesId { get; set; } - [IgnoreDataMember] - public string ExternalSeriesIdLegacy - { - get { return this.GetProviderId("ProviderExternalSeriesId"); } - set - { - this.SetProviderId("ProviderExternalSeriesId", value); - } - } - /// <summary> /// Gets or sets the etag. /// </summary> @@ -1031,7 +1041,7 @@ namespace MediaBrowser.Controller.Entities audio = dbItem; } - audio.ExtraType = ExtraType.ThemeSong; + audio.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeSong; return audio; @@ -1061,7 +1071,7 @@ namespace MediaBrowser.Controller.Entities item = dbItem; } - item.ExtraType = ExtraType.ThemeVideo; + item.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeVideo; return item; @@ -1211,7 +1221,7 @@ namespace MediaBrowser.Controller.Entities if (!i.IsThemeMedia) { - i.ExtraType = ExtraType.ThemeVideo; + i.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeVideo; subOptions.ForceSave = true; } @@ -1241,7 +1251,7 @@ namespace MediaBrowser.Controller.Entities if (!i.IsThemeMedia) { - i.ExtraType = ExtraType.ThemeSong; + i.ExtraType = MediaBrowser.Model.Entities.ExtraType.ThemeSong; subOptions.ForceSave = true; } @@ -1569,6 +1579,12 @@ namespace MediaBrowser.Controller.Entities return IsVisibleStandaloneInternal(user, true); } + [IgnoreDataMember] + public virtual bool SupportsInheritedParentImages + { + get { return false; } + } + protected bool IsVisibleStandaloneInternal(User user, bool checkFolders) { if (!IsVisible(user)) @@ -1875,19 +1891,7 @@ namespace MediaBrowser.Controller.Entities if (info.IsLocalFile) { - // Delete the source file - var currentFile = new FileInfo(info.Path); - - // Deletion will fail if the file is hidden so remove the attribute first - if (currentFile.Exists) - { - if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) - { - currentFile.Attributes &= ~FileAttributes.Hidden; - } - - FileSystem.DeleteFile(currentFile.FullName); - } + FileSystem.DeleteFile(info.Path); } return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); @@ -2146,7 +2150,7 @@ namespace MediaBrowser.Controller.Entities { MetadataCountryCode = GetPreferredMetadataCountryCode(), MetadataLanguage = GetPreferredMetadataLanguage(), - Name = Name, + Name = GetNameForMetadataLookup(), ProviderIds = ProviderIds, IndexNumber = IndexNumber, ParentIndexNumber = ParentIndexNumber, @@ -2155,6 +2159,11 @@ namespace MediaBrowser.Controller.Entities }; } + protected virtual string GetNameForMetadataLookup() + { + return Name; + } + /// <summary> /// This is called before any metadata refresh and returns true or false indicating if changes were made /// </summary> @@ -2183,7 +2192,7 @@ namespace MediaBrowser.Controller.Entities return path; } - public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user) + public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) { if (RunTimeTicks.HasValue) { @@ -2336,17 +2345,25 @@ namespace MediaBrowser.Controller.Entities { get { - if (GetParent() is AggregateFolder || this is BasePluginFolder || this is Channel) + if (this is BasePluginFolder || this is Channel) { return true; } var view = this as UserView; - if (view != null && string.Equals(view.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) + if (view != null) { - return true; + if (string.Equals(view.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + if (string.Equals(view.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) + { + return true; + } } - if (view != null && string.Equals(view.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) + + if (GetParent() is AggregateFolder) { return true; } diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs index bd109af7a..7dbea317c 100644 --- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs +++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs @@ -1,5 +1,5 @@ -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index 56f9fa784..a6da389f0 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -2,7 +2,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities @@ -19,6 +19,8 @@ namespace MediaBrowser.Controller.Entities } [IgnoreDataMember] + public string SeriesPresentationUniqueKey { get; set; } + [IgnoreDataMember] public string SeriesName { get; set; } [IgnoreDataMember] public Guid? SeriesId { get; set; } @@ -33,6 +35,10 @@ namespace MediaBrowser.Controller.Entities { return SeriesName; } + public string FindSeriesPresentationUniqueKey() + { + return SeriesPresentationUniqueKey; + } [IgnoreDataMember] public override bool EnableRefreshOnDateModifiedChange diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 41e277b7c..681f16f07 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -5,14 +5,14 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; -using MoreLinq; namespace MediaBrowser.Controller.Entities { @@ -27,6 +27,7 @@ namespace MediaBrowser.Controller.Entities public CollectionFolder() { PhysicalLocationsList = new List<string>(); + PhysicalFolderIds = new List<Guid>(); } [IgnoreDataMember] @@ -77,7 +78,7 @@ namespace MediaBrowser.Controller.Entities { return new LibraryOptions(); } - catch (DirectoryNotFoundException) + catch (IOException) { return new LibraryOptions(); } @@ -153,6 +154,7 @@ namespace MediaBrowser.Controller.Entities } public List<string> PhysicalLocationsList { get; set; } + public List<Guid> PhysicalFolderIds { get; set; } protected override IEnumerable<FileSystemMetadata> GetFileSystemChildren(IDirectoryService directoryService) { @@ -176,6 +178,18 @@ namespace MediaBrowser.Controller.Entities } } + if (!changed) + { + var folderIds = PhysicalFolderIds.ToList(); + + var newFolderIds = GetPhysicalFolders(false).Select(i => i.Id).ToList(); + + if (!folderIds.SequenceEqual(newFolderIds)) + { + changed = true; + } + } + return changed; } @@ -186,6 +200,39 @@ namespace MediaBrowser.Controller.Entities return changed; } + protected override bool RefreshLinkedChildren(IEnumerable<FileSystemMetadata> fileSystemChildren) + { + return RefreshLinkedChildrenInternal(true); + } + + private bool RefreshLinkedChildrenInternal(bool setFolders) + { + var physicalFolders = GetPhysicalFolders(false) + .ToList(); + + var linkedChildren = physicalFolders + .SelectMany(c => c.LinkedChildren) + .ToList(); + + var changed = !linkedChildren.SequenceEqual(LinkedChildren, new LinkedChildComparer()); + + LinkedChildren = linkedChildren; + + var folderIds = PhysicalFolderIds.ToList(); + var newFolderIds = physicalFolders.Select(i => i.Id).ToList(); + + if (!folderIds.SequenceEqual(newFolderIds)) + { + changed = true; + if (setFolders) + { + PhysicalFolderIds = newFolderIds.ToList(); + } + } + + return changed; + } + internal override bool IsValidFromResolver(BaseItem newItem) { var newCollectionFolder = newItem as CollectionFolder; @@ -263,25 +310,6 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Our children are actually just references to the ones in the physical root... /// </summary> - /// <value>The linked children.</value> - public override List<LinkedChild> LinkedChildren - { - get { return GetLinkedChildrenInternal(); } - set - { - base.LinkedChildren = value; - } - } - private List<LinkedChild> GetLinkedChildrenInternal() - { - return GetPhysicalParents() - .SelectMany(c => c.LinkedChildren) - .ToList(); - } - - /// <summary> - /// Our children are actually just references to the ones in the physical root... - /// </summary> /// <value>The actual children.</value> [IgnoreDataMember] protected override IEnumerable<BaseItem> ActualChildren @@ -291,11 +319,16 @@ namespace MediaBrowser.Controller.Entities private IEnumerable<BaseItem> GetActualChildren() { - return GetPhysicalParents().SelectMany(c => c.Children); + return GetPhysicalFolders(true).SelectMany(c => c.Children); } - public IEnumerable<Folder> GetPhysicalParents() + private IEnumerable<Folder> GetPhysicalFolders(bool enableCache) { + if (enableCache) + { + return PhysicalFolderIds.Select(i => LibraryManager.GetItemById(i)).OfType<Folder>(); + } + var rootChildren = LibraryManager.RootFolder.Children .OfType<Folder>() .ToList(); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index cc71ab43e..943c9d882 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -8,14 +8,16 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.IO; using MediaBrowser.Model.Channels; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { @@ -101,6 +103,16 @@ namespace MediaBrowser.Controller.Entities } } + public override bool CanDelete() + { + if (IsRoot) + { + return false; + } + + return base.CanDelete(); + } + public override bool RequiresRefresh() { var baseResult = base.RequiresRefresh(); @@ -679,6 +691,19 @@ namespace MediaBrowser.Controller.Entities return result.TotalRecordCount; } + public virtual int GetRecursiveChildCount(User user) + { + return GetItems(new InternalItemsQuery(user) + { + Recursive = true, + IsFolder = false, + IsVirtualItem = false, + EnableTotalRecordCount = true, + Limit = 0 + + }).Result.TotalRecordCount; + } + public QueryResult<BaseItem> QueryRecursive(InternalItemsQuery query) { var user = query.User; @@ -1207,7 +1232,7 @@ namespace MediaBrowser.Controller.Entities /// Refreshes the linked children. /// </summary> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> - private bool RefreshLinkedChildren(IEnumerable<FileSystemMetadata> fileSystemChildren) + protected virtual bool RefreshLinkedChildren(IEnumerable<FileSystemMetadata> fileSystemChildren) { var currentManualLinks = LinkedChildren.Where(i => i.Type == LinkedChildType.Manual).ToList(); var currentShortcutLinks = LinkedChildren.Where(i => i.Type == LinkedChildType.Shortcut).ToList(); @@ -1217,7 +1242,7 @@ namespace MediaBrowser.Controller.Entities if (SupportsShortcutChildren) { newShortcutLinks = fileSystemChildren - .Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory && FileSystem.IsShortcut(i.FullName)) + .Where(i => !i.IsDirectory && FileSystem.IsShortcut(i.FullName)) .Select(i => { try @@ -1381,60 +1406,64 @@ namespace MediaBrowser.Controller.Entities { return false; } + var iItemByName = this as IItemByName; + if (iItemByName != null) + { + var hasDualAccess = this as IHasDualAccess; + if (hasDualAccess == null || hasDualAccess.IsAccessedByName) + { + return false; + } + } return true; } } - public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user) + public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) { if (!SupportsUserDataFromChildren) { return; } - var unplayedQueryResult = await GetItems(new InternalItemsQuery(user) + if (itemDto != null) { - Recursive = true, - IsFolder = false, - IsVirtualItem = false, - EnableTotalRecordCount = true, - Limit = 0, - IsPlayed = false - - }).ConfigureAwait(false); + if (itemFields.Contains(ItemFields.RecursiveItemCount)) + { + itemDto.RecursiveItemCount = GetRecursiveChildCount(user); + } + } - var allItemsQueryResult = await GetItems(new InternalItemsQuery(user) + if (SupportsPlayedStatus) { - Recursive = true, - IsFolder = false, - IsVirtualItem = false, - EnableTotalRecordCount = true, - Limit = 0 - - }).ConfigureAwait(false); + var unplayedQueryResult = await GetItems(new InternalItemsQuery(user) + { + Recursive = true, + IsFolder = false, + IsVirtualItem = false, + EnableTotalRecordCount = true, + Limit = 0, + IsPlayed = false - if (itemDto != null) - { - itemDto.RecursiveItemCount = allItemsQueryResult.TotalRecordCount; - } + }).ConfigureAwait(false); - var recursiveItemCount = allItemsQueryResult.TotalRecordCount; - double unplayedCount = unplayedQueryResult.TotalRecordCount; + double unplayedCount = unplayedQueryResult.TotalRecordCount; - if (recursiveItemCount > 0) - { - var unplayedPercentage = (unplayedCount / recursiveItemCount) * 100; - dto.PlayedPercentage = 100 - unplayedPercentage; - dto.Played = dto.PlayedPercentage.Value >= 100; dto.UnplayedItemCount = unplayedQueryResult.TotalRecordCount; - } - if (itemDto != null) - { - if (this is Season || this is MusicAlbum) + if (itemDto != null && itemDto.RecursiveItemCount.HasValue) + { + if (itemDto.RecursiveItemCount.Value > 0) + { + var unplayedPercentage = (unplayedCount/itemDto.RecursiveItemCount.Value)*100; + dto.PlayedPercentage = 100 - unplayedPercentage; + dto.Played = dto.PlayedPercentage.Value >= 100; + } + } + else { - itemDto.ChildCount = recursiveItemCount; + dto.Played = (dto.UnplayedItemCount ?? 0) == 0; } } } diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs index aa2ccf4bc..8bfb8be99 100644 --- a/MediaBrowser.Controller/Entities/Game.cs +++ b/MediaBrowser.Controller/Entities/Game.cs @@ -4,7 +4,7 @@ using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index 6448828fb..22a8675c5 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { @@ -35,6 +37,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + /// <summary> /// Gets a value indicating whether this instance is owned item. /// </summary> diff --git a/MediaBrowser.Controller/Entities/GameSystem.cs b/MediaBrowser.Controller/Entities/GameSystem.cs index 9e00ab260..d8879155a 100644 --- a/MediaBrowser.Controller/Entities/GameSystem.cs +++ b/MediaBrowser.Controller/Entities/GameSystem.cs @@ -1,4 +1,4 @@ -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using System; diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index 1736ba8c7..da4ee352f 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -1,9 +1,11 @@ -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Controller.Entities.Audio; using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { @@ -38,6 +40,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool IsSaveLocalMetadataEnabled() { return true; diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 1ab0566e0..888e2080d 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -3,8 +3,10 @@ using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Model.IO; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs b/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs deleted file mode 100644 index 6f5cb59bc..000000000 --- a/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs +++ /dev/null @@ -1,8 +0,0 @@ - -namespace MediaBrowser.Controller.Entities -{ - public interface IHasOriginalTitle - { - string OriginalTitle { get; set; } - } -} diff --git a/MediaBrowser.Controller/Entities/IHasSeries.cs b/MediaBrowser.Controller/Entities/IHasSeries.cs index 531f58788..203be93e8 100644 --- a/MediaBrowser.Controller/Entities/IHasSeries.cs +++ b/MediaBrowser.Controller/Entities/IHasSeries.cs @@ -15,5 +15,7 @@ namespace MediaBrowser.Controller.Entities string FindSeriesSortName(); Guid? SeriesId { get; set; } Guid? FindSeriesId(); + string SeriesPresentationUniqueKey { get; set; } + string FindSeriesPresentationUniqueKey(); } } diff --git a/MediaBrowser.Controller/Entities/IHasUserData.cs b/MediaBrowser.Controller/Entities/IHasUserData.cs index c21e170ae..0b3b7dc8d 100644 --- a/MediaBrowser.Controller/Entities/IHasUserData.cs +++ b/MediaBrowser.Controller/Entities/IHasUserData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Querying; namespace MediaBrowser.Controller.Entities { @@ -14,10 +15,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Fills the user data dto values. /// </summary> - /// <param name="dto">The dto.</param> - /// <param name="userData">The user data.</param> - /// <param name="user">The user.</param> - Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user); + Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields); bool EnableRememberingTrackSelections { get; } diff --git a/MediaBrowser.Controller/Entities/IThemeMedia.cs b/MediaBrowser.Controller/Entities/IThemeMedia.cs deleted file mode 100644 index b2eff230f..000000000 --- a/MediaBrowser.Controller/Entities/IThemeMedia.cs +++ /dev/null @@ -1,8 +0,0 @@ - -namespace MediaBrowser.Controller.Entities -{ - public interface IThemeMedia - { - bool IsThemeMedia { get; } - } -} diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 3fb118a9c..a2d278a71 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -123,9 +123,7 @@ namespace MediaBrowser.Controller.Entities public int? MinParentalRating { get; set; } public int? MaxParentalRating { get; set; } - public bool? IsCurrentSchema { get; set; } public bool? HasDeadParentId { get; set; } - public bool? IsOffline { get; set; } public bool? IsVirtualItem { get; set; } public Guid? ParentId { get; set; } @@ -143,11 +141,13 @@ namespace MediaBrowser.Controller.Entities public SeriesStatus[] SeriesStatuses { get; set; } public string AlbumArtistStartsWithOrGreater { get; set; } public string ExternalSeriesId { get; set; } + public string ExternalId { get; set; } public string[] AlbumNames { get; set; } public string[] ArtistNames { get; set; } public string[] ExcludeArtistIds { get; set; } public string AncestorWithPresentationUniqueKey { get; set; } + public string SeriesPresentationUniqueKey { get; set; } public bool GroupByPresentationUniqueKey { get; set; } public bool EnableTotalRecordCount { get; set; } diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index aa3917c15..672595db8 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -1,6 +1,6 @@ using MediaBrowser.Model.Entities; using System; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs index ac13657b9..4d3c13c6e 100644 --- a/MediaBrowser.Controller/Entities/LinkedChild.cs +++ b/MediaBrowser.Controller/Entities/LinkedChild.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index 6d5278f1f..3e6c88a85 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -7,7 +7,7 @@ using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Controller.Entities.Audio; namespace MediaBrowser.Controller.Entities.Movies @@ -202,5 +202,10 @@ namespace MediaBrowser.Controller.Entities.Movies return false; } + + public override bool IsVisibleStandalone(User user) + { + return IsVisible(user); + } } } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index f13adb21c..ec04879b5 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -4,18 +4,20 @@ using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.Movies { /// <summary> /// Class Movie /// </summary> - public class Movie : Video, IHasSpecialFeatures, IHasBudget, IHasTrailers, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle + public class Movie : Video, IHasSpecialFeatures, IHasBudget, IHasTrailers, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping { public List<Guid> SpecialFeatureIds { get; set; } @@ -123,7 +125,18 @@ namespace MediaBrowser.Controller.Entities.Movies if (!DetectIsInMixedFolder()) { - info.Name = System.IO.Path.GetFileName(ContainingFolderPath); + var name = System.IO.Path.GetFileName(ContainingFolderPath); + + if (VideoType == VideoType.VideoFile || VideoType == VideoType.Iso) + { + if (string.Equals(name, System.IO.Path.GetFileName(Path), StringComparison.OrdinalIgnoreCase)) + { + // if the folder has the file extension, strip it + name = System.IO.Path.GetFileNameWithoutExtension(name); + } + } + + info.Name = name; } return info; diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs index 6e632a26c..e3fc4259a 100644 --- a/MediaBrowser.Controller/Entities/MusicVideo.cs +++ b/MediaBrowser.Controller/Entities/MusicVideo.cs @@ -2,7 +2,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using System.Collections.Generic; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index f21bc0a71..0c36442af 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -2,9 +2,11 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { @@ -38,7 +40,7 @@ namespace MediaBrowser.Controller.Entities public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { - query.Person = Name; + query.PersonIds = new[] { Id.ToString("N") }; return LibraryManager.GetItemList(query); } @@ -93,7 +95,7 @@ namespace MediaBrowser.Controller.Entities { var itemsWithPerson = LibraryManager.GetItemIds(new InternalItemsQuery { - Person = Name + PersonIds = new[] { Id.ToString("N") } }); return inputItems.Where(i => itemsWithPerson.Contains(i.Id)); diff --git a/MediaBrowser.Controller/Entities/Photo.cs b/MediaBrowser.Controller/Entities/Photo.cs index a42fce8bb..e95ceee52 100644 --- a/MediaBrowser.Controller/Entities/Photo.cs +++ b/MediaBrowser.Controller/Entities/Photo.cs @@ -1,6 +1,6 @@ using MediaBrowser.Model.Drawing; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/PhotoAlbum.cs b/MediaBrowser.Controller/Entities/PhotoAlbum.cs index cb5c5c453..c902ac8cd 100644 --- a/MediaBrowser.Controller/Entities/PhotoAlbum.cs +++ b/MediaBrowser.Controller/Entities/PhotoAlbum.cs @@ -1,7 +1,7 @@ using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Users; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 04b09b744..ec623eeda 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Extensions; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { @@ -37,6 +39,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool CanDelete() { return false; diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 1a02043d6..e6ebcb7fd 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -3,8 +3,9 @@ using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.TV { @@ -71,6 +72,12 @@ namespace MediaBrowser.Controller.Entities.TV { return IsStacked || MediaSourceCount > 1; } + }
+
+ [IgnoreDataMember]
+ public override bool SupportsInheritedParentImages
+ {
+ get { return true; }
} [IgnoreDataMember] @@ -159,18 +166,37 @@ namespace MediaBrowser.Controller.Entities.TV { return FindParent<Season>() != null; } - } + }
+
+ [IgnoreDataMember]
+ public string SeriesPresentationUniqueKey { get; set; }
[IgnoreDataMember] public string SeriesName { get; set; }
[IgnoreDataMember]
- public string SeasonName { get; set; } + public string SeasonName { get; set; }
+
+ public string FindSeriesPresentationUniqueKey()
+ {
+ var series = Series;
+ return series == null ? null : series.PresentationUniqueKey;
+ } public string FindSeasonName() {
- var season = Season;
- return season == null ? SeasonName : season.Name;
+ var season = Season; + + if (season == null) + { + if (ParentIndexNumber.HasValue) + { + return "Season " + ParentIndexNumber.Value.ToString(CultureInfo.InvariantCulture); + }
+ return "Season Unknown";
+ }
+
+ return season.Name;
}
public string FindSeriesName()
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index ce13f5fc5..f2a6586e2 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -2,12 +2,11 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Users; -using MoreLinq; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using System.Threading.Tasks; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.TV { @@ -41,13 +40,15 @@ namespace MediaBrowser.Controller.Entities.TV } [IgnoreDataMember] + public override bool SupportsInheritedParentImages + { + get { return true; } + } + + [IgnoreDataMember] public override Guid? DisplayParentId { - get - { - var series = Series; - return series == null ? ParentId : series.Id; - } + get { return SeriesId; } } [IgnoreDataMember] @@ -203,11 +204,20 @@ namespace MediaBrowser.Controller.Entities.TV } [IgnoreDataMember] + public string SeriesPresentationUniqueKey { get; set; } + + [IgnoreDataMember] public string SeriesName { get; set; } [IgnoreDataMember] public Guid? SeriesId { get; set; } + public string FindSeriesPresentationUniqueKey() + { + var series = Series; + return series == null ? null : series.PresentationUniqueKey; + } + public string FindSeriesName() { var series = Series; diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 39703f67a..872011ce8 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -6,18 +6,18 @@ using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Providers; -using MoreLinq; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.TV { /// <summary> /// Class Series /// </summary> - public class Series : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IMetadataContainer, IHasOriginalTitle + public class Series : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IMetadataContainer { public int? AnimeSeriesIndex { get; set; } @@ -95,17 +95,27 @@ namespace MediaBrowser.Controller.Entities.TV public override string CreatePresentationUniqueKey() { - var userdatakeys = GetUserDataKeys(); - - if (userdatakeys.Count > 1) + if (LibraryManager.GetLibraryOptions(this).EnableAutomaticSeriesGrouping) { - return AddLibrariesToPresentationUniqueKey(userdatakeys[0]); + var userdatakeys = GetUserDataKeys(); + + if (userdatakeys.Count > 1) + { + return AddLibrariesToPresentationUniqueKey(userdatakeys[0]); + } } + return base.CreatePresentationUniqueKey(); } private string AddLibrariesToPresentationUniqueKey(string key) { + var lang = GetPreferredMetadataLanguage(); + if (!string.IsNullOrWhiteSpace(lang)) + { + key += "-" + lang; + } + var folders = LibraryManager.GetCollectionFolders(this) .Select(i => i.Id.ToString("N")) .ToArray(); @@ -120,25 +130,62 @@ namespace MediaBrowser.Controller.Entities.TV private static string GetUniqueSeriesKey(BaseItem series) { - if (ConfigurationManager.Configuration.SchemaVersion < 97) - { - return series.Id.ToString("N"); - } return series.GetPresentationUniqueKey(); } public override int GetChildCount(User user) { - var result = LibraryManager.GetItemsResult(new InternalItemsQuery(user) + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; + var seriesKey = GetUniqueSeriesKey(this); + + var result = LibraryManager.GetCount(new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this), + AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, + SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, IncludeItemTypes = new[] { typeof(Season).Name }, - SortBy = new[] { ItemSortBy.SortName }, IsVirtualItem = false, - Limit = 0 + Limit = 0, + DtoOptions = new Dto.DtoOptions + { + Fields = new List<ItemFields> + { + + }, + EnableImages = false + } }); - return result.TotalRecordCount; + return result; + } + + public override int GetRecursiveChildCount(User user) + { + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; + var seriesKey = GetUniqueSeriesKey(this); + + var query = new InternalItemsQuery(user) + { + AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, + SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + DtoOptions = new Dto.DtoOptions + { + Fields = new List<ItemFields> + { + + }, + EnableImages = false + } + }; + + if (query.IncludeItemTypes.Length == 0) + { + query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }; + } + query.IsVirtualItem = false; + query.Limit = 0; + var totalRecordCount = LibraryManager.GetCount(query); + + return totalRecordCount; } /// <summary> @@ -204,13 +251,15 @@ namespace MediaBrowser.Controller.Entities.TV { var config = user.Configuration; + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); var query = new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = seriesKey, - IncludeItemTypes = new[] {typeof (Season).Name}, - SortBy = new[] {ItemSortBy.SortName} + AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, + SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + IncludeItemTypes = new[] { typeof(Season).Name }, + SortBy = new[] { ItemSortBy.SortName } }; if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes) @@ -240,7 +289,11 @@ namespace MediaBrowser.Controller.Entities.TV if (query.Recursive) { - query.AncestorWithPresentationUniqueKey = GetUniqueSeriesKey(this); + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; + var seriesKey = GetUniqueSeriesKey(this); + + query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey; + query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null; if (query.SortBy.Length == 0) { query.SortBy = new[] { ItemSortBy.SortName }; @@ -262,13 +315,15 @@ namespace MediaBrowser.Controller.Entities.TV public IEnumerable<Episode> GetEpisodes(User user) { + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); var query = new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = seriesKey, - IncludeItemTypes = new[] {typeof (Episode).Name, typeof (Season).Name}, - SortBy = new[] {ItemSortBy.SortName} + AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, + SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }, + SortBy = new[] { ItemSortBy.SortName } }; var config = user.Configuration; if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes) @@ -368,11 +423,19 @@ namespace MediaBrowser.Controller.Entities.TV public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user) { - var seriesKey = GetUniqueSeriesKey(this); + var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; + + var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons; + + // add optimization when this setting is not enabled + var seriesKey = queryFromSeries ? + GetUniqueSeriesKey(this) : + GetUniqueSeriesKey(parentSeason); var query = new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = seriesKey, + AncestorWithPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? null : seriesKey, + SeriesPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? seriesKey : null, IncludeItemTypes = new[] { typeof(Episode).Name }, SortBy = new[] { ItemSortBy.SortName } }; diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index 0780cfec5..dd6d8a999 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -2,15 +2,15 @@ using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using System.Collections.Generic; -using System.Runtime.Serialization; using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { /// <summary> /// Class Trailer /// </summary> - public class Trailer : Video, IHasBudget, IHasMetascore, IHasOriginalTitle, IHasLookupInfo<TrailerInfo> + public class Trailer : Video, IHasLookupInfo<TrailerInfo> { public Trailer() { @@ -21,8 +21,6 @@ namespace MediaBrowser.Controller.Entities public List<TrailerType> TrailerTypes { get; set; } - public float? Metascore { get; set; } - public List<MediaUrl> RemoteTrailers { get; set; } [IgnoreDataMember] @@ -31,18 +29,6 @@ namespace MediaBrowser.Controller.Entities get { return TrailerTypes.Contains(TrailerType.LocalTrailer); } } - /// <summary> - /// Gets or sets the budget. - /// </summary> - /// <value>The budget.</value> - public double? Budget { get; set; } - - /// <summary> - /// Gets or sets the revenue. - /// </summary> - /// <value>The revenue.</value> - public double? Revenue { get; set; } - public override UnratedItem GetBlockUnratedType() { return UnratedItem.Trailer; diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 46da469fa..d5d229bb3 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -6,7 +6,6 @@ using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Users; using System; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; diff --git a/MediaBrowser.Controller/Entities/UserItemData.cs b/MediaBrowser.Controller/Entities/UserItemData.cs index f95fd7036..0e1326949 100644 --- a/MediaBrowser.Controller/Entities/UserItemData.cs +++ b/MediaBrowser.Controller/Entities/UserItemData.cs @@ -1,5 +1,5 @@ using System; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index b67817846..b602990ac 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -1,4 +1,4 @@ -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Library; using MediaBrowser.Model.Querying; diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index a689e0d09..5ac5843d7 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -4,7 +4,7 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using System; using System.Collections.Generic; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; using System.Threading.Tasks; using System.Linq; diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 390d1bf02..bc806e76e 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -17,7 +17,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Configuration; -using MoreLinq; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities { @@ -1778,7 +1778,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => user.IsFolderGrouped(i.Id) && UserView.IsEligibleForGrouping(i)); } - private IEnumerable<Folder> GetMediaFolders(User user, IEnumerable<string> viewTypes) + private List<Folder> GetMediaFolders(User user, IEnumerable<string> viewTypes) { if (user == null) { @@ -1788,7 +1788,7 @@ namespace MediaBrowser.Controller.Entities var folder = i as ICollectionFolder; return folder != null && viewTypes.Contains(folder.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase); - }); + }).ToList(); } return GetMediaFolders(user) .Where(i => @@ -1796,17 +1796,17 @@ namespace MediaBrowser.Controller.Entities var folder = i as ICollectionFolder; return folder != null && viewTypes.Contains(folder.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase); - }); + }).ToList(); } - private IEnumerable<Folder> GetMediaFolders(Folder parent, User user, IEnumerable<string> viewTypes) + private List<Folder> GetMediaFolders(Folder parent, User user, IEnumerable<string> viewTypes) { if (parent == null || parent is UserView) { return GetMediaFolders(user, viewTypes); } - return new[] { parent }; + return new List<Folder> { parent }; } private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes) diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 78d7a7fdd..7ba59df4f 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -8,12 +8,14 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using CommonIO; using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Channels; +using MediaBrowser.Controller.IO; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { @@ -23,8 +25,7 @@ namespace MediaBrowser.Controller.Entities public class Video : BaseItem, IHasAspectRatio, ISupportsPlaceHolders, - IHasMediaSources, - IThemeMedia + IHasMediaSources { [IgnoreDataMember] public string PrimaryVersionId { get; set; } @@ -35,16 +36,16 @@ namespace MediaBrowser.Controller.Entities public List<ChannelMediaInfo> ChannelMediaSources { get; set; } [IgnoreDataMember] - public bool IsThemeMedia + public override bool SupportsPlayedStatus { get { - return ExtraType.HasValue && ExtraType.Value == Model.Entities.ExtraType.ThemeVideo; + return true; } } [IgnoreDataMember] - public override bool SupportsPlayedStatus + public override bool SupportsPositionTicksResume { get { @@ -86,9 +87,6 @@ namespace MediaBrowser.Controller.Entities get { return true; } } - public int? TotalBitrate { get; set; } - public ExtraType? ExtraType { get; set; } - /// <summary> /// Gets or sets the timestamp. /// </summary> @@ -112,12 +110,6 @@ namespace MediaBrowser.Controller.Entities public string ShortcutPath { get; set; } /// <summary> - /// Gets or sets the video bit rate. - /// </summary> - /// <value>The video bit rate.</value> - public int? VideoBitRate { get; set; } - - /// <summary> /// Gets or sets the default index of the video stream. /// </summary> /// <value>The default index of the video stream.</value> diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index 4197ea93e..75fb69435 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Runtime.Serialization; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities { @@ -33,6 +33,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool CanDelete() { return false; |
