diff options
Diffstat (limited to 'MediaBrowser.Controller')
56 files changed, 436 insertions, 470 deletions
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs index a2590dec7..35c2ea1aa 100644 --- a/MediaBrowser.Controller/Channels/Channel.cs +++ b/MediaBrowser.Controller/Channels/Channel.cs @@ -38,12 +38,12 @@ namespace MediaBrowser.Controller.Channels set { } } - protected override async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { try { // Don't blow up here because it could cause parent screens with other content to fail - return await ChannelManager.GetChannelItemsInternal(new ChannelItemQuery + return ChannelManager.GetChannelItemsInternal(new ChannelItemQuery { ChannelId = Id.ToString("N"), Limit = query.Limit, @@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.Channels SortBy = query.SortBy, SortOrder = query.SortOrder - }, new Progress<double>(), CancellationToken.None); + }, new Progress<double>(), CancellationToken.None).Result; } catch { diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 792744628..824bdf8ff 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -110,7 +110,7 @@ namespace MediaBrowser.Controller.Channels /// <param name="item">The item.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{IEnumerable{MediaSourceInfo}}.</returns> - Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken); + IEnumerable<MediaSourceInfo> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken); /// <summary> /// Gets the channel folder. diff --git a/MediaBrowser.Controller/Drawing/IImageEncoder.cs b/MediaBrowser.Controller/Drawing/IImageEncoder.cs index 64d997dba..9b895587f 100644 --- a/MediaBrowser.Controller/Drawing/IImageEncoder.cs +++ b/MediaBrowser.Controller/Drawing/IImageEncoder.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Controller.Drawing /// <summary> /// Encodes the image. /// </summary> - void EncodeImage(string inputPath, ImageSize? originalImageSize, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat); + string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat); /// <summary> /// Creates the image collage. diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index a107c1232..d98638d55 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -105,7 +105,7 @@ namespace MediaBrowser.Controller.Drawing /// Creates the image collage. /// </summary> /// <param name="options">The options.</param> - Task CreateImageCollage(ImageCollageOptions options); + void CreateImageCollage(ImageCollageOptions options); /// <summary> /// Gets a value indicating whether [supports image collage creation]. @@ -114,5 +114,7 @@ namespace MediaBrowser.Controller.Drawing bool SupportsImageCollageCreation { get; } IImageEncoder ImageEncoder { get; set; } + + void SaveImageSize(string path, DateTime imageDateModified, ImageSize size); } } diff --git a/MediaBrowser.Controller/Drawing/ImageHelper.cs b/MediaBrowser.Controller/Drawing/ImageHelper.cs index 30c4e90fb..54f2ff987 100644 --- a/MediaBrowser.Controller/Drawing/ImageHelper.cs +++ b/MediaBrowser.Controller/Drawing/ImageHelper.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using System; +using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; @@ -18,6 +19,13 @@ namespace MediaBrowser.Controller.Drawing return GetSizeEstimate(options); } + public static IImageProcessor ImageProcessor { get; set; } + + public static void SaveImageSize(string path, DateTime dateModified, ImageSize size) + { + ImageProcessor.SaveImageSize(path, dateModified, size); + } + private static ImageSize GetSizeEstimate(ImageProcessingOptions options) { if (options.Width.HasValue && options.Height.HasValue) diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs index 70ac08343..cfb3a97ee 100644 --- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs +++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs @@ -10,6 +10,8 @@ namespace MediaBrowser.Controller.Drawing { public class ImageProcessingOptions { + public string ItemId { get; set; } + public string ItemType { get; set; } public IHasImages Item { get; set; } public ItemImageInfo Image { get; set; } diff --git a/MediaBrowser.Controller/Dto/DtoOptions.cs b/MediaBrowser.Controller/Dto/DtoOptions.cs index e69b64948..b9d9d7dda 100644 --- a/MediaBrowser.Controller/Dto/DtoOptions.cs +++ b/MediaBrowser.Controller/Dto/DtoOptions.cs @@ -23,17 +23,28 @@ namespace MediaBrowser.Controller.Dto public bool AddCurrentProgram { get; set; } public DtoOptions() + : this(true) + { + } + + public DtoOptions(bool allFields) { - Fields = new List<ItemFields>(); ImageTypeLimit = int.MaxValue; EnableImages = true; EnableUserData = true; AddCurrentProgram = true; - Fields = Enum.GetNames(typeof (ItemFields)) - .Select(i => (ItemFields) Enum.Parse(typeof (ItemFields), i, true)) - .Except(DefaultExcludedFields) - .ToList(); + if (allFields) + { + Fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .Except(DefaultExcludedFields) + .ToList(); + } + else + { + Fields = new List<ItemFields>(); + } ImageTypes = Enum.GetNames(typeof(ImageType)) .Select(i => (ImageType)Enum.Parse(typeof(ImageType), i, true)) diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs index a1de23c93..fe8ac0919 100644 --- a/MediaBrowser.Controller/Entities/AggregateFolder.cs +++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 92d8d95bc..4d35531cb 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -131,7 +131,7 @@ namespace MediaBrowser.Controller.Entities.Audio /// Creates the name of the sort. /// </summary> /// <returns>System.String.</returns> - protected override string CreateSortName() + protected override string CreateSortNameInternal() { return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("0000 - ") : "") + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name; @@ -209,7 +209,7 @@ namespace MediaBrowser.Controller.Entities.Audio if (SourceType == SourceType.Channel) { var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None) - .Result.ToList(); + .ToList(); if (sources.Count > 0) { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index f40ab3cde..e9eca19cf 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -8,6 +8,7 @@ using System.Linq; using MediaBrowser.Model.Serialization; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Dto; @@ -42,20 +43,22 @@ namespace MediaBrowser.Controller.Entities.Audio [IgnoreDataMember] public MusicArtist MusicArtist { - get - { - var artist = GetParents().OfType<MusicArtist>().FirstOrDefault(); + get { return GetMusicArtist(new DtoOptions(true)); } + } - if (artist == null) + public MusicArtist GetMusicArtist(DtoOptions options) + { + var artist = GetParents().OfType<MusicArtist>().FirstOrDefault(); + + if (artist == null) + { + var name = AlbumArtist; + if (!string.IsNullOrWhiteSpace(name)) { - var name = AlbumArtist; - if (!string.IsNullOrWhiteSpace(name)) - { - artist = LibraryManager.GetArtist(name); - } + artist = LibraryManager.GetArtist(name, options); } - return artist; } + return artist; } [IgnoreDataMember] @@ -171,7 +174,7 @@ namespace MediaBrowser.Controller.Entities.Audio id.AlbumArtists = AlbumArtists; - var artist = MusicArtist; + var artist = GetMusicArtist(new DtoOptions(false)); if (artist != null) { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 8d83f8a35..b0b9493a5 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -266,20 +266,6 @@ namespace MediaBrowser.Controller.Entities.Audio return info; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => - { - var hasArtist = i as IHasArtist; - return hasArtist != null && hasArtist.HasAnyArtist(Name); - }; - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index 2f99e530e..d4a85b4d0 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -91,16 +91,6 @@ namespace MediaBrowser.Controller.Entities.Audio } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i is IHasMusicGenres && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 999f6db3f..346442f59 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -21,7 +21,8 @@ using System.Linq; 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,31 @@ namespace MediaBrowser.Controller.Entities } } + private string CreateSortNameFromCustomValue(string value) + { + return string.IsNullOrWhiteSpace(value) ? null : NormalizeCustomSortName(value); + } + + protected virtual string NormalizeCustomSortName(string value) + { + if (ConfigurationManager.Configuration.EnableSimpleSortNameHandling) + { + return value.RemoveDiacritics().ToLower(); + } + + return 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; @@ -643,14 +699,22 @@ namespace MediaBrowser.Controller.Entities return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString); } + protected string CreateSortName() + { + if (string.IsNullOrWhiteSpace(Name)) + { + return null; + } + + return CreateSortNameInternal(); + } + /// <summary> /// Creates the name of the sort. /// </summary> /// <returns>System.String.</returns> - protected virtual string CreateSortName() + protected virtual string CreateSortNameInternal() { - if (Name == null) return null; //some items may not have name filled in properly - if (!EnableAlphaNumericSorting) { return Name.TrimStart(); @@ -1303,7 +1367,6 @@ namespace MediaBrowser.Controller.Entities public void AfterMetadataRefresh() { - _sortName = null; } /// <summary> @@ -1680,7 +1743,7 @@ namespace MediaBrowser.Controller.Entities private BaseItem FindLinkedChild(LinkedChild info) { - if (!string.IsNullOrEmpty(info.Path)) + if (!string.IsNullOrWhiteSpace(info.Path)) { var itemByPath = LibraryManager.FindByPath(info.Path, null); @@ -1809,10 +1872,13 @@ namespace MediaBrowser.Controller.Entities /// Do whatever refreshing is necessary when the filesystem pertaining to this item has changed. /// </summary> /// <returns>Task.</returns> - public virtual Task ChangedExternally() + public virtual void ChangedExternally() { - ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(FileSystem), RefreshPriority.High); - return Task.FromResult(true); + ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(FileSystem) + { + ValidateChildren = true, + + }, RefreshPriority.High); } /// <summary> @@ -2187,8 +2253,6 @@ namespace MediaBrowser.Controller.Entities /// </summary> public virtual bool BeforeMetadataRefresh() { - _sortName = null; - var hasChanges = false; if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path)) @@ -2210,7 +2274,7 @@ namespace MediaBrowser.Controller.Entities return path; } - public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) + public virtual void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields) { if (RunTimeTicks.HasValue) { @@ -2226,8 +2290,6 @@ namespace MediaBrowser.Controller.Entities } } } - - return Task.FromResult(true); } protected Task RefreshMetadataForOwnedItem(BaseItem ownedItem, bool copyTitleMetadata, MetadataRefreshOptions options, CancellationToken cancellationToken) diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs index 24474ba55..0a5faa727 100644 --- a/MediaBrowser.Controller/Entities/CollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Extensions; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index edac27f99..7566911a1 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -10,8 +10,9 @@ using System.IO; using System.Linq; 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; @@ -671,8 +672,9 @@ namespace MediaBrowser.Controller.Entities { return ItemRepository.GetItemList(new InternalItemsQuery { - ParentId = Id, - GroupByPresentationUniqueKey = false + Parent = this, + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true) }); } @@ -690,9 +692,13 @@ namespace MediaBrowser.Controller.Entities { Recursive = false, Limit = 0, - ParentId = Id + Parent = this, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } - }).Result; + }); return result.TotalRecordCount; } @@ -705,9 +711,13 @@ namespace MediaBrowser.Controller.Entities IsFolder = false, IsVirtualItem = false, EnableTotalRecordCount = true, - Limit = 0 + Limit = 0, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } - }).Result.TotalRecordCount; + }).TotalRecordCount; } public QueryResult<BaseItem> QueryRecursive(InternalItemsQuery query) @@ -733,7 +743,10 @@ namespace MediaBrowser.Controller.Entities if (!(this is UserRootFolder) && !(this is AggregateFolder)) { - query.ParentId = query.ParentId ?? Id; + if (!query.ParentId.HasValue) + { + query.Parent = this; + } } if (RequiresPostFiltering2(query)) @@ -813,30 +826,6 @@ namespace MediaBrowser.Controller.Entities } } - if (query.SortBy != null && query.SortBy.Length > 0) - { - if (query.SortBy.Contains(ItemSortBy.AiredEpisodeOrder, StringComparer.OrdinalIgnoreCase)) - { - Logger.Debug("Query requires post-filtering due to ItemSortBy.AiredEpisodeOrder"); - return true; - } - if (query.SortBy.Contains(ItemSortBy.GameSystem, StringComparer.OrdinalIgnoreCase)) - { - Logger.Debug("Query requires post-filtering due to ItemSortBy.GameSystem"); - return true; - } - if (query.SortBy.Contains(ItemSortBy.Players, StringComparer.OrdinalIgnoreCase)) - { - Logger.Debug("Query requires post-filtering due to ItemSortBy.Players"); - return true; - } - if (query.SortBy.Contains(ItemSortBy.VideoBitRate, StringComparer.OrdinalIgnoreCase)) - { - Logger.Debug("Query requires post-filtering due to ItemSortBy.VideoBitRate"); - return true; - } - } - if (query.IsInBoxSet.HasValue) { Logger.Debug("Query requires post-filtering due to IsInBoxSet"); @@ -894,18 +883,6 @@ namespace MediaBrowser.Controller.Entities return true; } - if (query.MinPlayers.HasValue) - { - Logger.Debug("Query requires post-filtering due to MinPlayers"); - return true; - } - - if (query.MaxPlayers.HasValue) - { - Logger.Debug("Query requires post-filtering due to MaxPlayers"); - return true; - } - if (UserViewBuilder.CollapseBoxSetItems(query, this, query.User, ConfigurationManager)) { Logger.Debug("Query requires post-filtering due to CollapseBoxSetItems"); @@ -936,12 +913,6 @@ namespace MediaBrowser.Controller.Entities return true; } - if (!string.IsNullOrWhiteSpace(query.AlbumArtistStartsWithOrGreater)) - { - Logger.Debug("Query requires post-filtering due to AlbumArtistStartsWithOrGreater"); - return true; - } - if (query.IsPlayed.HasValue) { if (query.IncludeItemTypes.Length == 1 && query.IncludeItemTypes.Contains(typeof(Series).Name)) @@ -954,7 +925,7 @@ namespace MediaBrowser.Controller.Entities return false; } - public Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query) + public QueryResult<BaseItem> GetItems(InternalItemsQuery query) { if (query.ItemIds.Length > 0) { @@ -967,20 +938,20 @@ namespace MediaBrowser.Controller.Entities // Try to preserve order result.Items = result.Items.OrderBy(i => ids.IndexOf(i.Id.ToString("N"))).ToArray(); } - return Task.FromResult(result); + return result; } return GetItemsInternal(query); } - protected virtual async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected virtual QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { if (SourceType == SourceType.Channel) { try { // Don't blow up here because it could cause parent screens with other content to fail - return await ChannelManager.GetChannelItemsInternal(new ChannelItemQuery + return ChannelManager.GetChannelItemsInternal(new ChannelItemQuery { ChannelId = ChannelId, FolderId = Id.ToString("N"), @@ -990,7 +961,7 @@ namespace MediaBrowser.Controller.Entities SortBy = query.SortBy, SortOrder = query.SortOrder - }, new Progress<double>(), CancellationToken.None); + }, new Progress<double>(), CancellationToken.None).Result; } catch { @@ -1355,19 +1326,6 @@ namespace MediaBrowser.Controller.Entities } /// <summary> - /// Folders need to validate and refresh - /// </summary> - /// <returns>Task.</returns> - public override async Task ChangedExternally() - { - var progress = new Progress<double>(); - - await ValidateChildren(progress, CancellationToken.None).ConfigureAwait(false); - - await base.ChangedExternally().ConfigureAwait(false); - } - - /// <summary> /// Marks the played. /// </summary> /// <param name="user">The user.</param> @@ -1391,7 +1349,7 @@ namespace MediaBrowser.Controller.Entities query.IsVirtualItem = false; } - var itemsResult = await GetItems(query).ConfigureAwait(false); + var itemsResult = GetItems(query); // Sweep through recursively and update status var tasks = itemsResult.Items.Select(c => c.MarkPlayed(user, datePlayed, resetPosition)); @@ -1406,14 +1364,14 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task.</returns> public override async Task MarkUnplayed(User user) { - var itemsResult = await GetItems(new InternalItemsQuery + var itemsResult = GetItems(new InternalItemsQuery { User = user, Recursive = true, IsFolder = false, EnableTotalRecordCount = false - }).ConfigureAwait(false); + }); // Sweep through recursively and update status var tasks = itemsResult.Items.Select(c => c.MarkUnplayed(user)); @@ -1430,7 +1388,7 @@ namespace MediaBrowser.Controller.Entities IsVirtualItem = false, EnableTotalRecordCount = false - }).Result; + }); return itemsResult.Items .All(i => i.IsPlayed(user)); @@ -1481,7 +1439,7 @@ namespace MediaBrowser.Controller.Entities } } - public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields) + public override void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields) { if (!SupportsUserDataFromChildren) { @@ -1490,7 +1448,7 @@ namespace MediaBrowser.Controller.Entities if (itemDto != null) { - if (itemFields.Contains(ItemFields.RecursiveItemCount)) + if (fields.Contains(ItemFields.RecursiveItemCount)) { itemDto.RecursiveItemCount = GetRecursiveChildCount(user); } @@ -1498,16 +1456,20 @@ namespace MediaBrowser.Controller.Entities if (SupportsPlayedStatus) { - var unplayedQueryResult = await GetItems(new InternalItemsQuery(user) + var unplayedQueryResult = GetItems(new InternalItemsQuery(user) { Recursive = true, IsFolder = false, IsVirtualItem = false, EnableTotalRecordCount = true, Limit = 0, - IsPlayed = false + IsPlayed = false, + DtoOptions = new DtoOptions(false) + { + EnableImages = false + } - }).ConfigureAwait(false); + }); double unplayedCount = unplayedQueryResult.TotalRecordCount; diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index 093b191b6..836020d88 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -69,16 +69,6 @@ namespace MediaBrowser.Controller.Entities return false; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i is Game && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.GenreIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index 6569a1e6c..4b70eae58 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -81,16 +81,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.GenreIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 2104bee09..e2b3c0777 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -3,7 +3,7 @@ using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/Entities/IHasUserData.cs b/MediaBrowser.Controller/Entities/IHasUserData.cs index 0b3b7dc8d..0029947ee 100644 --- a/MediaBrowser.Controller/Entities/IHasUserData.cs +++ b/MediaBrowser.Controller/Entities/IHasUserData.cs @@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Fills the user data dto values. /// </summary> - Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields); + void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields); bool EnableRememberingTrackSelections { get; } diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs index b69c8bdfc..a02ca1c0c 100644 --- a/MediaBrowser.Controller/Entities/IItemByName.cs +++ b/MediaBrowser.Controller/Entities/IItemByName.cs @@ -7,13 +7,6 @@ namespace MediaBrowser.Controller.Entities /// </summary> public interface IItemByName : IHasMetadata { - /// <summary> - /// Gets the tagged items. - /// </summary> - /// <param name="inputItems">The input items.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems); - IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query); } diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 3c948487d..743e7642e 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -126,9 +126,27 @@ namespace MediaBrowser.Controller.Entities public bool? IsVirtualItem { get; set; } public Guid? ParentId { get; set; } + public string ParentType { get; set; } public string[] AncestorIds { get; set; } public string[] TopParentIds { get; set; } + public BaseItem Parent + { + set + { + if (value == null) + { + ParentId = null; + ParentType = null; + } + else + { + ParentId = value.Id; + ParentType = value.GetType().Name; + } + } + } + public string[] PresetViews { get; set; } public SourceType[] SourceTypes { get; set; } public SourceType[] ExcludeSourceTypes { get; set; } @@ -136,7 +154,6 @@ namespace MediaBrowser.Controller.Entities public DayOfWeek[] AirDays { get; set; } public SeriesStatus[] SeriesStatuses { get; set; } - public string AlbumArtistStartsWithOrGreater { get; set; } public string ExternalSeriesId { get; set; } public string ExternalId { get; set; } @@ -156,41 +173,11 @@ namespace MediaBrowser.Controller.Entities public DateTime? MinDateCreated { get; set; } public DateTime? MinDateLastSaved { get; set; } + public DateTime? MinDateLastSavedForUser { get; set; } public DtoOptions DtoOptions { get; set; } public int MinSimilarityScore { get; set; } - public bool HasField(ItemFields name) - { - var fields = DtoOptions.Fields; - - 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.DisplayMediaType: - //case ItemFields.ServiceName: - case ItemFields.Genres: - case ItemFields.Studios: - case ItemFields.Settings: - case ItemFields.OriginalTitle: - case ItemFields.Tags: - case ItemFields.DateLastMediaAdded: - return fields.Count == 0 || fields.Contains(name); - default: - return true; - } - } - public InternalItemsQuery() { MinSimilarityScore = 20; diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index 3f733ce03..efa85f3ae 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -152,7 +152,7 @@ namespace MediaBrowser.Controller.Entities.Movies var currentOfficialRating = OfficialRating; // Gather all possible ratings - var ratings = GetRecursiveChildren(i => i is Movie || i is Series || i is MusicAlbum || i is Game) + var ratings = GetLinkedChildren() .Select(i => i.OfficialRating) .Where(i => !string.IsNullOrEmpty(i)) .Distinct(StringComparer.OrdinalIgnoreCase) diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index c2a01f4ff..8a5b726e2 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Providers; diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index 005fb2014..20d9c7999 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -93,22 +93,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - var itemsWithPerson = LibraryManager.GetItemIds(new InternalItemsQuery - { - PersonIds = new[] { Id.ToString("N") } - }); - - return inputItems.Where(i => itemsWithPerson.Contains(i.Id)); - } - - - public Func<BaseItem, bool> GetItemFilter() - { - return i => LibraryManager.GetPeople(i).Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase)); - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 2e5e6ce43..8cb65c60a 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -88,16 +88,6 @@ namespace MediaBrowser.Controller.Entities } } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - return inputItems.Where(GetItemFilter()); - } - - public Func<BaseItem, bool> GetItemFilter() - { - return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { query.StudioIds = new[] { Id.ToString("N") }; diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index c2f7a6168..e963ab184 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -237,7 +237,7 @@ namespace MediaBrowser.Controller.Entities.TV /// Creates the name of the sort. /// </summary> /// <returns>System.String.</returns> - protected override string CreateSortName() + protected override string CreateSortNameInternal() { return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000 - ") : "") + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name; diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index ed04b5ddc..4ccf6d623 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -5,6 +5,7 @@ using MediaBrowser.Model.Users; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; @@ -144,12 +145,12 @@ namespace MediaBrowser.Controller.Entities.TV /// Creates the name of the sort. /// </summary> /// <returns>System.String.</returns> - protected override string CreateSortName() + protected override string CreateSortNameInternal() { return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name; } - protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { if (query.User == null) { @@ -160,41 +161,39 @@ 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); - return Task.FromResult(result); + return result; } /// <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() { - return Series.GetSeasonEpisodes(this, null, null); + return Series.GetSeasonEpisodes(this, null, null, new DtoOptions(true)); } public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) { - return GetEpisodes(user); + return GetEpisodes(user, new DtoOptions(true)); } protected override bool GetBlockUnratedValue(UserPolicy config) diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 7641c9523..c54f93f11 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; @@ -141,13 +142,12 @@ namespace MediaBrowser.Controller.Entities.TV public override int GetChildCount(User user) { - var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); var result = LibraryManager.GetCount(new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, - SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + AncestorWithPresentationUniqueKey = null, + SeriesPresentationUniqueKey = seriesKey, IncludeItemTypes = new[] { typeof(Season).Name }, IsVirtualItem = false, Limit = 0, @@ -166,13 +166,12 @@ namespace MediaBrowser.Controller.Entities.TV 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, + AncestorWithPresentationUniqueKey = null, + SeriesPresentationUniqueKey = seriesKey, DtoOptions = new Dto.DtoOptions { Fields = new List<ItemFields> @@ -250,12 +249,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); @@ -266,11 +268,10 @@ namespace MediaBrowser.Controller.Entities.TV { var config = user.Configuration; - var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); - query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey; - query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null; + query.AncestorWithPresentationUniqueKey = null; + query.SeriesPresentationUniqueKey = seriesKey; query.IncludeItemTypes = new[] { typeof(Season).Name }; query.SortBy = new[] {ItemSortBy.SortName}; @@ -288,7 +289,7 @@ namespace MediaBrowser.Controller.Entities.TV } } - protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { if (query.User == null) { @@ -299,11 +300,10 @@ namespace MediaBrowser.Controller.Entities.TV if (query.Recursive) { - var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey; var seriesKey = GetUniqueSeriesKey(this); - query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey; - query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null; + query.AncestorWithPresentationUniqueKey = null; + query.SeriesPresentationUniqueKey = seriesKey; if (query.SortBy.Length == 0) { query.SortBy = new[] { ItemSortBy.SortName }; @@ -313,25 +313,25 @@ namespace MediaBrowser.Controller.Entities.TV query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }; } query.IsVirtualItem = false; - return Task.FromResult(LibraryManager.GetItemsResult(query)); + return LibraryManager.GetItemsResult(query); } SetSeasonQueryOptions(query, user); - return Task.FromResult(LibraryManager.GetItemsResult(query)); + return 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); var query = new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey, - SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null, + AncestorWithPresentationUniqueKey = null, + SeriesPresentationUniqueKey = seriesKey, 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 +352,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,10 +429,8 @@ 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; - var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons; // add optimization when this setting is not enabled @@ -442,10 +440,11 @@ namespace MediaBrowser.Controller.Entities.TV var query = new InternalItemsQuery(user) { - AncestorWithPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? null : seriesKey, - SeriesPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? seriesKey : null, + AncestorWithPresentationUniqueKey = queryFromSeries ? null : seriesKey, + SeriesPresentationUniqueKey = queryFromSeries ? seriesKey : null, IncludeItemTypes = new[] { typeof(Episode).Name }, - SortBy = new[] { ItemSortBy.SortName } + SortBy = new[] { ItemSortBy.SortName }, + DtoOptions = options }; if (user != null) { @@ -466,14 +465,14 @@ namespace MediaBrowser.Controller.Entities.TV var allItems = LibraryManager.GetItemList(query).OfType<Episode>(); - return GetSeasonEpisodes(parentSeason, user, allItems); + return GetSeasonEpisodes(parentSeason, user, allItems, options); } - public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes) + public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options) { if (allSeriesEpisodes == null) { - return GetSeasonEpisodes(parentSeason, user); + return GetSeasonEpisodes(parentSeason, user, options); } var episodes = FilterEpisodesBySeason(allSeriesEpisodes, parentSeason, ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons); diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index b602990ac..c93c81401 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -50,23 +50,23 @@ namespace MediaBrowser.Controller.Entities } } - protected override async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { if (query.Recursive) { return QueryRecursive(query); } - var result = await UserViewManager.GetUserViews(new UserViewQuery + var result = UserViewManager.GetUserViews(new UserViewQuery { UserId = query.User.Id.ToString("N"), PresetViews = query.PresetViews - }, CancellationToken.None).ConfigureAwait(false); + }, CancellationToken.None).Result; var user = query.User; Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); - + return PostFilterAndSort(result.Where(filter), query, true, true); } diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 99601b290..27be696eb 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using MediaBrowser.Model.Serialization; using System.Threading.Tasks; using System.Linq; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Entities { @@ -53,7 +54,7 @@ namespace MediaBrowser.Controller.Entities return GetChildren(user, true).Count(); } - protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query) + protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query) { var parent = this as Folder; @@ -67,7 +68,7 @@ namespace MediaBrowser.Controller.Entities } return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, ConfigurationManager, PlaylistManager) - .GetUserItems(parent, this, ViewType, query); + .GetUserItems(parent, this, ViewType, query).Result; } public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) @@ -75,9 +76,10 @@ namespace MediaBrowser.Controller.Entities var result = GetItems(new InternalItemsQuery { User = user, - EnableTotalRecordCount = false + EnableTotalRecordCount = false, + DtoOptions = new DtoOptions(true) - }).Result; + }); return result.Items; } @@ -100,9 +102,11 @@ namespace MediaBrowser.Controller.Entities Recursive = true, EnableTotalRecordCount = false, - ForceDirect = true + ForceDirect = true, + + DtoOptions = query.DtoOptions - }).Result; + }); return result.Items.Where(i => UserViewBuilder.FilterItem(i, query)); } diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 8da069f62..91e24caeb 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -17,6 +17,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Extensions; namespace MediaBrowser.Controller.Entities @@ -83,7 +84,7 @@ namespace MediaBrowser.Controller.Entities Limit = query.Limit, StartIndex = query.StartIndex - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); return GetResult(result); } @@ -110,7 +111,7 @@ namespace MediaBrowser.Controller.Entities Limit = query.Limit, StartIndex = query.StartIndex - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); return GetResult(result); } @@ -129,7 +130,7 @@ namespace MediaBrowser.Controller.Entities if (query.Recursive) { query.Recursive = true; - query.ParentId = queryParent.Id; + query.Parent = queryParent; query.SetUser(user); return _libraryManager.GetItemsResult(query); @@ -141,7 +142,7 @@ namespace MediaBrowser.Controller.Entities return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Playlists: - return await GetPlaylistsView(queryParent, user, query).ConfigureAwait(false); + return GetPlaylistsView(queryParent, user, query); case CollectionType.BoxSets: return GetBoxsetView(queryParent, user, query); @@ -180,7 +181,7 @@ namespace MediaBrowser.Controller.Entities return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false); case SpecialFolder.MovieGenre: - return await GetMovieGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false); + return GetMovieGenreItems(queryParent, displayParent, user, query); case SpecialFolder.MovieResume: return GetMovieResume(queryParent, user, query); @@ -354,7 +355,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetMusicPlaylists(Folder parent, User user, InternalItemsQuery query) { - query.ParentId = null; + query.Parent = null; query.IncludeItemTypes = new[] { typeof(Playlist).Name }; query.SetUser(user); query.Recursive = true; @@ -365,7 +366,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IncludeItemTypes = new[] { typeof(MusicAlbum).Name }; @@ -376,7 +377,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetMusicSongs(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IncludeItemTypes = new[] { typeof(Audio.Audio).Name }; @@ -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[] { }; @@ -404,7 +405,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetFavoriteSongs(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(Audio.Audio).Name }; @@ -415,7 +416,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetFavoriteAlbums(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(MusicAlbum).Name }; @@ -423,13 +424,6 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task<QueryResult<BaseItem>> FindPlaylists(Folder parent, User user, InternalItemsQuery query) - { - var list = _playlistManager.GetPlaylists(user.Id.ToString("N")); - - return GetResult(list, parent, query); - } - private int GetSpecialItemsLimit() { return 50; @@ -465,7 +459,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetFavoriteMovies(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(Movie).Name }; @@ -476,7 +470,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetFavoriteSeries(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(Series).Name }; @@ -487,7 +481,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetFavoriteEpisodes(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IsFavorite = true; query.IncludeItemTypes = new[] { typeof(Episode).Name }; @@ -498,7 +492,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IncludeItemTypes = new[] { typeof(Movie).Name }; @@ -517,7 +511,7 @@ namespace MediaBrowser.Controller.Entities query.SortOrder = SortOrder.Descending; query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.Limit = GetSpecialItemsLimit(); query.IncludeItemTypes = new[] { typeof(Movie).Name }; @@ -531,7 +525,7 @@ namespace MediaBrowser.Controller.Entities query.SortOrder = SortOrder.Descending; query.IsResumable = true; query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.Limit = GetSpecialItemsLimit(); query.IncludeItemTypes = new[] { typeof(Movie).Name }; @@ -582,10 +576,10 @@ namespace MediaBrowser.Controller.Entities return GetResult(genres, parent, query); } - private async Task<QueryResult<BaseItem>> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = queryParent.Id; + query.Parent = queryParent; query.GenreIds = new[] { displayParent.Id.ToString("N") }; query.SetUser(user); @@ -594,14 +588,14 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task<QueryResult<BaseItem>> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query) + private QueryResult<BaseItem> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query) { return GetResult(_playlistManager.GetPlaylists(user.Id.ToString("N")), parent, query); } private QueryResult<BaseItem> GetBoxsetView(Folder parent, User user, InternalItemsQuery query) { - query.ParentId = null; + query.Parent = null; query.IncludeItemTypes = new[] { typeof(BoxSet).Name }; query.SetUser(user); query.Recursive = true; @@ -643,7 +637,7 @@ namespace MediaBrowser.Controller.Entities query.SortOrder = SortOrder.Descending; query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.Limit = GetSpecialItemsLimit(); query.IncludeItemTypes = new[] { typeof(Episode).Name }; @@ -662,7 +656,7 @@ namespace MediaBrowser.Controller.Entities StartIndex = query.StartIndex, UserId = query.User.Id.ToString("N") - }, parentFolders); + }, parentFolders, query.DtoOptions); return result; } @@ -673,7 +667,7 @@ namespace MediaBrowser.Controller.Entities query.SortOrder = SortOrder.Descending; query.IsResumable = true; query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.Limit = GetSpecialItemsLimit(); query.IncludeItemTypes = new[] { typeof(Episode).Name }; @@ -684,7 +678,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetTvSeries(Folder parent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = parent.Id; + query.Parent = parent; query.SetUser(user); query.IncludeItemTypes = new[] { typeof(Series).Name }; @@ -728,7 +722,7 @@ namespace MediaBrowser.Controller.Entities private QueryResult<BaseItem> GetTvGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) { query.Recursive = true; - query.ParentId = queryParent.Id; + query.Parent = queryParent; query.GenreIds = new[] { displayParent.Id.ToString("N") }; query.SetUser(user); @@ -1713,17 +1707,6 @@ namespace MediaBrowser.Controller.Entities } } - if (!string.IsNullOrEmpty(query.AlbumArtistStartsWithOrGreater)) - { - var ok = new[] { item }.OfType<IHasAlbumArtist>() - .Any(p => string.Compare(query.AlbumArtistStartsWithOrGreater, p.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1); - - if (!ok) - { - return false; - } - } - return true; } @@ -1783,7 +1766,7 @@ namespace MediaBrowser.Controller.Entities Status = RecordingStatus.Completed, UserId = user.Id.ToString("N") - }, CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); } var list = new List<BaseItem>(); diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 90aa3690a..fb31d9a47 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -11,7 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; @@ -282,12 +282,10 @@ namespace MediaBrowser.Controller.Entities public IEnumerable<Video> GetLinkedAlternateVersions() { - var linkedVersions = LinkedAlternateVersions + return LinkedAlternateVersions .Select(GetLinkedChild) .Where(i => i != null) - .OfType<Video>(); - - return linkedVersions + .OfType<Video>() .OrderBy(i => i.SortName); } @@ -554,7 +552,7 @@ namespace MediaBrowser.Controller.Entities if (SourceType == SourceType.Channel) { var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None) - .Result.ToList(); + .ToList(); if (sources.Count > 0) { @@ -630,21 +628,24 @@ namespace MediaBrowser.Controller.Entities { info.Path = media.ShortcutPath; - if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase)) - { - info.Protocol = MediaProtocol.Http; - } - else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase)) - { - info.Protocol = MediaProtocol.Rtmp; - } - else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase)) - { - info.Protocol = MediaProtocol.Rtsp; - } - else + if (!string.IsNullOrWhiteSpace(info.Path)) { - info.Protocol = MediaProtocol.File; + if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase)) + { + info.Protocol = MediaProtocol.Http; + } + else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase)) + { + info.Protocol = MediaProtocol.Rtmp; + } + else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase)) + { + info.Protocol = MediaProtocol.Rtsp; + } + else + { + info.Protocol = MediaProtocol.File; + } } } diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index b352950a0..61b1a3b1a 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -65,20 +65,6 @@ namespace MediaBrowser.Controller.Entities return true; } - public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems) - { - int year; - - var usCulture = new CultureInfo("en-US"); - - if (!int.TryParse(Name, NumberStyles.Integer, usCulture, out year)) - { - return inputItems; - } - - return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year); - } - public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query) { int year; @@ -107,12 +93,6 @@ namespace MediaBrowser.Controller.Entities return null; } - public Func<BaseItem, bool> GetItemFilter() - { - var val = GetYearValue(); - return i => i.ProductionYear.HasValue && val.HasValue && i.ProductionYear.Value == val.Value; - } - [IgnoreDataMember] public override bool SupportsPeople { diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs index d40829d44..97b778d0c 100644 --- a/MediaBrowser.Controller/IO/FileData.cs +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -3,7 +3,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; -using MediaBrowser.Common.IO; + using MediaBrowser.Model.IO; namespace MediaBrowser.Controller.IO diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index dd2379940..3f6b5a806 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -10,8 +10,9 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dto; @@ -68,18 +69,7 @@ namespace MediaBrowser.Controller.Library /// <param name="name">The name.</param> /// <returns>Task{Artist}.</returns> MusicArtist GetArtist(string name); - /// <summary> - /// Gets the album artists. - /// </summary> - /// <param name="items">The items.</param> - /// <returns>IEnumerable<MusicArtist>.</returns> - IEnumerable<MusicArtist> GetAlbumArtists(IEnumerable<IHasAlbumArtist> items); - /// <summary> - /// Gets the artists. - /// </summary> - /// <param name="items">The items.</param> - /// <returns>IEnumerable<MusicArtist>.</returns> - IEnumerable<MusicArtist> GetArtists(IEnumerable<IHasArtist> items); + MusicArtist GetArtist(string name, DtoOptions options); /// <summary> /// Gets a Studio /// </summary> @@ -557,6 +547,14 @@ namespace MediaBrowser.Controller.Library /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> bool IgnoreFile(FileSystemMetadata file, BaseItem parent); + Guid GetStudioId(string name); + + Guid GetGenreId(string name); + + Guid GetMusicGenreId(string name); + + Guid GetGameGenreId(string name); + void AddVirtualFolder(string name, string collectionType, LibraryOptions options, bool refreshLibrary); void RemoveVirtualFolder(string name, bool refreshLibrary); void AddMediaPath(string virtualFolderName, MediaPathInfo path); diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs index 9baf8b6f1..95ba671b4 100644 --- a/MediaBrowser.Controller/Library/IMusicManager.cs +++ b/MediaBrowser.Controller/Library/IMusicManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using System.Collections.Generic; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Library { @@ -9,23 +10,16 @@ namespace MediaBrowser.Controller.Library /// <summary> /// Gets the instant mix from song. /// </summary> - /// <param name="item">The item.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user); + IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions); + /// <summary> /// Gets the instant mix from artist. /// </summary> - /// <param name="artist">The artist.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user); + IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user, DtoOptions dtoOptions); + /// <summary> /// Gets the instant mix from genre. /// </summary> - /// <param name="genres">The genres.</param> - /// <param name="user">The user.</param> - /// <returns>IEnumerable{Audio}.</returns> - IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user); + IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions); } } diff --git a/MediaBrowser.Controller/Library/IUserDataManager.cs b/MediaBrowser.Controller/Library/IUserDataManager.cs index 5940c7e29..e9954545e 100644 --- a/MediaBrowser.Controller/Library/IUserDataManager.cs +++ b/MediaBrowser.Controller/Library/IUserDataManager.cs @@ -38,9 +38,9 @@ namespace MediaBrowser.Controller.Library /// <summary> /// Gets the user data dto. /// </summary> - Task<UserItemDataDto> GetUserDataDto(IHasUserData item, User user); + UserItemDataDto GetUserDataDto(IHasUserData item, User user); - Task<UserItemDataDto> GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields); + UserItemDataDto GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields); /// <summary> /// Get all user data for the given user diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index 5391d113e..b46ece49d 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.Library { @@ -16,6 +17,6 @@ namespace MediaBrowser.Controller.Library Task<UserView> GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); - List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request); + List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options); } } diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs index 3aa4d4ee2..3ddda81cd 100644 --- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs +++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.IO; using MediaBrowser.Model.Configuration; diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index 7e1dab462..288b30278 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -284,19 +284,12 @@ namespace MediaBrowser.Controller.LiveTv /// <summary> /// Gets the internal channels. /// </summary> - /// <param name="query">The query.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<QueryResult<LiveTvChannel>>.</returns> - Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, - CancellationToken cancellationToken); + Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); /// <summary> /// Gets the internal recordings. /// </summary> - /// <param name="query">The query.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<QueryResult<BaseItem>>.</returns> - Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken); + Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken); /// <summary> /// Gets the recording media sources. diff --git a/MediaBrowser.Controller/LiveTv/LiveStream.cs b/MediaBrowser.Controller/LiveTv/LiveStream.cs index 0908c3ecc..912fed23c 100644 --- a/MediaBrowser.Controller/LiveTv/LiveStream.cs +++ b/MediaBrowser.Controller/LiveTv/LiveStream.cs @@ -1,8 +1,11 @@ using System; using System.Collections.Generic; +using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.System; namespace MediaBrowser.Controller.LiveTv { @@ -10,7 +13,8 @@ namespace MediaBrowser.Controller.LiveTv { public MediaSourceInfo OriginalMediaSource { get; set; } public MediaSourceInfo OpenedMediaSource { get; set; } - public int ConsumerCount { + public int ConsumerCount + { get { return SharedStreamIds.Count; } } public ITunerHost TunerHost { get; set; } @@ -18,11 +22,16 @@ namespace MediaBrowser.Controller.LiveTv public bool EnableStreamSharing { get; set; } public string UniqueId = Guid.NewGuid().ToString("N"); - public List<string> SharedStreamIds = new List<string>(); + public List<string> SharedStreamIds = new List<string>(); + protected readonly IEnvironmentInfo Environment; + protected readonly IFileSystem FileSystem; + const int StreamCopyToBufferSize = 81920; - public LiveStream(MediaSourceInfo mediaSource) + public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem) { OriginalMediaSource = mediaSource; + Environment = environment; + FileSystem = fileSystem; OpenedMediaSource = mediaSource; EnableStreamSharing = true; } @@ -41,5 +50,40 @@ namespace MediaBrowser.Controller.LiveTv { return Task.FromResult(true); } + + protected Stream GetInputStream(string path, long startPosition, bool allowAsyncFileRead) + { + var fileOpenOptions = startPosition > 0 + ? FileOpenOptions.RandomAccess + : FileOpenOptions.SequentialScan; + + if (allowAsyncFileRead) + { + fileOpenOptions |= FileOpenOptions.Asynchronous; + } + + return FileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, fileOpenOptions); + } + + protected async Task DeleteTempFile(string path, int retryCount = 0) + { + try + { + FileSystem.DeleteFile(path); + return; + } + catch + { + + } + + if (retryCount > 20) + { + return; + } + + await Task.Delay(500).ConfigureAwait(false); + await DeleteTempFile(path, retryCount + 1).ConfigureAwait(false); + } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index 6e2fe2495..34a9103f8 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -89,7 +89,7 @@ namespace MediaBrowser.Controller.LiveTv } } - protected override string CreateSortName() + protected override string CreateSortNameInternal() { if (!string.IsNullOrEmpty(Number)) { @@ -101,7 +101,7 @@ namespace MediaBrowser.Controller.LiveTv } } - return Number + "-" + (Name ?? string.Empty); + return (Number ?? string.Empty) + "-" + (Name ?? string.Empty); } [IgnoreDataMember] diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b3a29bafa..d8b81027c 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -36,14 +36,6 @@ <PropertyGroup> <RunPostBuildEvent>Always</RunPostBuildEvent> </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' "> - <DebugType>none</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release Mono\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> <ItemGroup> <None Include="project.json" /> <!-- A reference to the entire .NET Framework is automatically included --> diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 29d37f99b..54a361ff7 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -968,7 +968,7 @@ namespace MediaBrowser.Controller.MediaEncoding { if (bitrate.HasValue && videoStream.BitRate.HasValue) { - bitrate = Math.Min(bitrate.Value, videoStream.BitRate.Value); + bitrate = GetMinBitrate(bitrate.Value, videoStream.BitRate.Value); } } } @@ -981,13 +981,29 @@ namespace MediaBrowser.Controller.MediaEncoding // If a max bitrate was requested, don't let the scaled bitrate exceed it if (request.VideoBitRate.HasValue) { - bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value); + bitrate = GetMinBitrate(bitrate.Value, request.VideoBitRate.Value); } } return bitrate; } + private int GetMinBitrate(int sourceBitrate, int requestedBitrate) + { + if (sourceBitrate <= 2000000) + { + sourceBitrate *= 2; + } + else if (sourceBitrate <= 3000000) + { + sourceBitrate = Convert.ToInt32(sourceBitrate * 1.5); + } + + var bitrate = Math.Min(sourceBitrate, requestedBitrate); + + return bitrate; + } + public int? GetAudioBitrateParam(BaseEncodingJobOptions request, MediaStream audioStream) { if (request.AudioBitRate.HasValue) diff --git a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs index bac9807a9..10d7b9a7e 100644 --- a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs +++ b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs @@ -124,7 +124,7 @@ namespace MediaBrowser.Controller.MediaEncoding Task Init(); - Task UpdateEncoderPath(string path, string pathType); + void UpdateEncoderPath(string path, string pathType); bool SupportsEncoder(string encoder); void SetLogFilename(string name); diff --git a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs index 0b1ca08e5..d5c85197f 100644 --- a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs +++ b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; namespace MediaBrowser.Controller.MediaEncoding diff --git a/MediaBrowser.Controller/Net/IHttpResultFactory.cs b/MediaBrowser.Controller/Net/IHttpResultFactory.cs index 9f295c71d..b88524691 100644 --- a/MediaBrowser.Controller/Net/IHttpResultFactory.cs +++ b/MediaBrowser.Controller/Net/IHttpResultFactory.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Model.IO; using MediaBrowser.Model.Services; @@ -22,6 +22,8 @@ namespace MediaBrowser.Controller.Net /// <returns>System.Object.</returns> object GetResult(object content, string contentType, IDictionary<string,string> responseHeaders = null); + object GetRedirectResult(string url); + /// <summary> /// Gets the optimized result. /// </summary> diff --git a/MediaBrowser.Controller/Net/StaticResultOptions.cs b/MediaBrowser.Controller/Net/StaticResultOptions.cs index 62c13fbb5..3064cbf10 100644 --- a/MediaBrowser.Controller/Net/StaticResultOptions.cs +++ b/MediaBrowser.Controller/Net/StaticResultOptions.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using MediaBrowser.Common.IO; + using MediaBrowser.Model.IO; namespace MediaBrowser.Controller.Net diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs index fb1410f4a..790e8e824 100644 --- a/MediaBrowser.Controller/Playlists/Playlist.cs +++ b/MediaBrowser.Controller/Playlists/Playlist.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using MediaBrowser.Model.Serialization; using System.Threading.Tasks; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Playlists @@ -81,7 +82,7 @@ namespace MediaBrowser.Controller.Playlists public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren) { - return GetPlayableItems(user).Result; + return GetPlayableItems(user, new DtoOptions(true)); } 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); if (query != null) { @@ -106,12 +107,12 @@ namespace MediaBrowser.Controller.Playlists return GetLinkedChildrenInfos(); } - private Task<IEnumerable<BaseItem>> GetPlayableItems(User user) + private 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 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 = GetPlaylistItems(item, user, playlistMediaType, options); list.AddRange(playlistItems); } return list; } - private static async Task<IEnumerable<BaseItem>> GetPlaylistItems(BaseItem item, User user, string mediaType) + private static 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,10 +169,11 @@ 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); + var itemsResult = folder.GetItems(query); var items = itemsResult.Items; return items; diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs index 62db007b9..3d1af2afa 100644 --- a/MediaBrowser.Controller/Providers/DirectoryService.cs +++ b/MediaBrowser.Controller/Providers/DirectoryService.cs @@ -4,7 +4,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/Providers/IDirectoryService.cs b/MediaBrowser.Controller/Providers/IDirectoryService.cs index f78d9cd6a..1b203f32c 100644 --- a/MediaBrowser.Controller/Providers/IDirectoryService.cs +++ b/MediaBrowser.Controller/Providers/IDirectoryService.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/Providers/LocalImageInfo.cs b/MediaBrowser.Controller/Providers/LocalImageInfo.cs index 63651fce8..5e6efe9f6 100644 --- a/MediaBrowser.Controller/Providers/LocalImageInfo.cs +++ b/MediaBrowser.Controller/Providers/LocalImageInfo.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index 7d9dab92b..86cef628e 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -1,5 +1,5 @@ using System.Linq; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -15,6 +15,7 @@ namespace MediaBrowser.Controller.Providers public bool ReplaceAllMetadata { get; set; } public bool IsPostRecursiveRefresh { get; set; } + public bool ValidateChildren { get; set; } public MetadataRefreshMode MetadataRefreshMode { get; set; } public RemoteSearchResult SearchResult { get; set; } diff --git a/MediaBrowser.Controller/Resolvers/IItemResolver.cs b/MediaBrowser.Controller/Resolvers/IItemResolver.cs index fcb162b9e..3af5d5f7f 100644 --- a/MediaBrowser.Controller/Resolvers/IItemResolver.cs +++ b/MediaBrowser.Controller/Resolvers/IItemResolver.cs @@ -2,7 +2,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using System.Collections.Generic; -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs index 06372395e..25537193a 100644 --- a/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs +++ b/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Common.IO; + using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; diff --git a/MediaBrowser.Controller/TV/ITVSeriesManager.cs b/MediaBrowser.Controller/TV/ITVSeriesManager.cs index 771fa602a..0bcb9ae5b 100644 --- a/MediaBrowser.Controller/TV/ITVSeriesManager.cs +++ b/MediaBrowser.Controller/TV/ITVSeriesManager.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Querying; using System.Collections.Generic; +using MediaBrowser.Controller.Dto; namespace MediaBrowser.Controller.TV { @@ -9,16 +10,11 @@ namespace MediaBrowser.Controller.TV /// <summary> /// Gets the next up. /// </summary> - /// <param name="query">The query.</param> - /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetNextUp(NextUpQuery query); + QueryResult<BaseItem> GetNextUp(NextUpQuery query, DtoOptions options); /// <summary> /// Gets the next up. /// </summary> - /// <param name="request">The request.</param> - /// <param name="parentsFolders">The parents folders.</param> - /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders); + QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions options); } } |
