diff options
Diffstat (limited to 'MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs')
| -rw-r--r-- | MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs | 249 |
1 files changed, 59 insertions, 190 deletions
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index 3d08159d6..34acb4479 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -1,26 +1,18 @@ using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Playlists; using MediaBrowser.Dlna.Didl; using MediaBrowser.Dlna.Server; using MediaBrowser.Dlna.Service; -using MediaBrowser.Model.Channels; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Library; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using System; using System.Collections.Generic; using System.Globalization; -using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -45,21 +37,17 @@ namespace MediaBrowser.Dlna.ContentDirectory private readonly DidlBuilder _didlBuilder; private readonly DeviceProfile _profile; - private readonly IUserViewManager _userViewManager; - private readonly IChannelManager _channelManager; - public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, IUserViewManager userViewManager, IChannelManager channelManager) + public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config) : base(config, logger) { _libraryManager = libraryManager; _userDataManager = userDataManager; _user = user; _systemUpdateId = systemUpdateId; - _userViewManager = userViewManager; - _channelManager = channelManager; _profile = profile; - _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress); + _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, userDataManager); } protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams) @@ -202,7 +190,7 @@ namespace MediaBrowser.Dlna.ContentDirectory { - var childrenResult = (await GetChildrenSorted(folder, user, sortCriteria, start, requested).ConfigureAwait(false)); + var childrenResult = (await GetUserItems(folder, user, sortCriteria, start, requested).ConfigureAwait(false)); totalCount = childrenResult.TotalRecordCount; result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, totalCount, filter, id)); @@ -213,7 +201,7 @@ namespace MediaBrowser.Dlna.ContentDirectory { var folder = (Folder)item; - var childrenResult = (await GetChildrenSorted(folder, user, sortCriteria, start, requested).ConfigureAwait(false)); + var childrenResult = (await GetUserItems(folder, user, sortCriteria, start, requested).ConfigureAwait(false)); totalCount = childrenResult.TotalRecordCount; provided = childrenResult.Items.Length; @@ -223,7 +211,7 @@ namespace MediaBrowser.Dlna.ContentDirectory if (i.IsFolder) { var f = (Folder)i; - var childCount = (await GetChildrenSorted(f, user, sortCriteria, null, 0).ConfigureAwait(false)) + var childCount = (await GetUserItems(f, user, sortCriteria, null, 0).ConfigureAwait(false)) .TotalRecordCount; result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter)); @@ -321,216 +309,97 @@ namespace MediaBrowser.Dlna.ContentDirectory private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit) { - // TODO: Make a recursive version of GetChildrenSorted (although sorting isn't needed) - var result = folder.GetRecursiveChildren(user, true); + var sortOrders = new List<string>(); + if (!folder.IsPreSorted) + { + sortOrders.Add(ItemSortBy.SortName); + } - var items = FilterUnsupportedContent(result); + var mediaTypes = new List<string>(); + bool? isFolder = null; if (search.SearchType == SearchType.Audio) { - items = items.OfType<Audio>(); + mediaTypes.Add(MediaType.Audio); + isFolder = false; } else if (search.SearchType == SearchType.Video) { - items = items.OfType<Video>(); + mediaTypes.Add(MediaType.Video); + isFolder = false; } else if (search.SearchType == SearchType.Image) { - items = items.OfType<Photo>(); + mediaTypes.Add(MediaType.Photo); + isFolder = false; } else if (search.SearchType == SearchType.Playlist) { - items = items.OfType<Playlist>(); + //items = items.OfType<Playlist>(); + isFolder = true; } else if (search.SearchType == SearchType.MusicAlbum) { - items = items.OfType<MusicAlbum>(); + //items = items.OfType<MusicAlbum>(); + isFolder = true; } - - items = SortItems(items, user, sort); - - return ToResult(items, startIndex, limit); + + return await folder.GetUserItems(new UserItemsQuery + { + Limit = limit, + StartIndex = startIndex, + SortBy = sortOrders.ToArray(), + SortOrder = sort.SortOrder, + User = user, + Recursive = true, + Filter = FilterUnsupportedContent, + IsFolder = isFolder, + MediaTypes = mediaTypes.ToArray() + + }).ConfigureAwait(false); } - private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SortCriteria sort, int? startIndex, int? limit) + private async Task<QueryResult<BaseItem>> GetUserItems(Folder folder, User user, SortCriteria sort, int? startIndex, int? limit) { - if (folder is UserRootFolder) - { - var result = await _userViewManager.GetUserViews(new UserViewQuery - { - UserId = user.Id.ToString("N") - - }, CancellationToken.None).ConfigureAwait(false); - - return ToResult(result, startIndex, limit); - } - - var view = folder as UserView; - - if (view != null) + var sortOrders = new List<string>(); + if (!folder.IsPreSorted) { - var result = await GetUserViewChildren(view, user, sort).ConfigureAwait(false); - - return ToResult(result, startIndex, limit); + sortOrders.Add(ItemSortBy.SortName); } - var channel = folder as Channel; - - if (channel != null) + return await folder.GetUserItems(new UserItemsQuery { - try - { - // Don't blow up here because it could cause parent screens with other content to fail - return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery - { - ChannelId = channel.Id.ToString("N"), - Limit = limit, - StartIndex = startIndex, - UserId = user.Id.ToString("N") - - }, CancellationToken.None); - } - catch - { - // Already logged at lower levels - } - } + Limit = limit, + StartIndex = startIndex, + SortBy = sortOrders.ToArray(), + SortOrder = sort.SortOrder, + User = user, + Filter = FilterUnsupportedContent - var channelFolderItem = folder as ChannelFolderItem; - - if (channelFolderItem != null) - { - try - { - // Don't blow up here because it could cause parent screens with other content to fail - return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery - { - ChannelId = channelFolderItem.ChannelId, - FolderId = channelFolderItem.Id.ToString("N"), - Limit = limit, - StartIndex = startIndex, - UserId = user.Id.ToString("N") - - }, CancellationToken.None); - } - catch - { - // Already logged at lower levels - } - } - - return ToResult(GetPlainFolderChildrenSorted(folder, user, sort), startIndex, limit); + }).ConfigureAwait(false); } - private QueryResult<BaseItem> ToResult(IEnumerable<BaseItem> items, int? startIndex, int? limit) + private bool FilterUnsupportedContent(BaseItem i, User user) { - var list = items.ToArray(); - var totalCount = list.Length; - - if (startIndex.HasValue) + // Unplayable + if (i.LocationType == LocationType.Virtual && !i.IsFolder) { - list = list.Skip(startIndex.Value).ToArray(); + return false; } - if (limit.HasValue) + // Unplayable + var supportsPlaceHolder = i as ISupportsPlaceHolders; + if (supportsPlaceHolder != null && supportsPlaceHolder.IsPlaceHolder) { - list = list.Take(limit.Value).ToArray(); + return false; } - return new QueryResult<BaseItem> + if (i is Game || i is Book) { - Items = list, - TotalRecordCount = totalCount - }; - } - - private async Task<IEnumerable<BaseItem>> GetUserViewChildren(UserView folder, User user, SortCriteria sort) - { - if (string.Equals(folder.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) - { - var result = await _channelManager.GetChannelsInternal(new ChannelQuery() - { - UserId = user.Id.ToString("N") - - }, CancellationToken.None).ConfigureAwait(false); - - return result.Items; + //return false; } - if (string.Equals(folder.ViewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true).OfType<Series>(), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetRecursiveChildren(user, true).OfType<Movie>(), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true).OfType<MusicArtist>(), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.Folders, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.LiveTvRecordingGroups, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true), user, sort); - } - if (string.Equals(folder.ViewType, CollectionType.LiveTvChannels, StringComparison.OrdinalIgnoreCase)) - { - return SortItems(folder.GetChildren(user, true), user, sort); - } - - return GetPlainFolderChildrenSorted(folder, user, sort); - } - - private IEnumerable<BaseItem> GetPlainFolderChildrenSorted(Folder folder, User user, SortCriteria sort) - { - var items = folder.GetChildren(user, true); - - items = FilterUnsupportedContent(items); - - if (folder.IsPreSorted) - { - return items; - } - - return SortItems(items, user, sort); - } - - private IEnumerable<BaseItem> SortItems(IEnumerable<BaseItem> items, User user, SortCriteria sort) - { - return _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, sort.SortOrder); - } - - private IEnumerable<BaseItem> FilterUnsupportedContent(IEnumerable<BaseItem> items) - { - return items.Where(i => - { - // Unplayable - if (i.LocationType == LocationType.Virtual && !i.IsFolder) - { - return false; - } - - // Unplayable - var supportsPlaceHolder = i as ISupportsPlaceHolders; - if (supportsPlaceHolder != null && supportsPlaceHolder.IsPlaceHolder) - { - return false; - } - - if (i is Game || i is Book) - { - return false; - } - return true; - }); + return true; } private BaseItem GetItemFromObjectId(string id, User user) |
