diff options
Diffstat (limited to 'MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs')
| -rw-r--r-- | MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs | 196 |
1 files changed, 161 insertions, 35 deletions
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index ba98400ea..85be84016 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -1,13 +1,16 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; 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.Logging; @@ -26,6 +29,7 @@ namespace MediaBrowser.Dlna.ContentDirectory public class ControlHandler : BaseControlHandler { private readonly ILibraryManager _libraryManager; + private readonly IChannelManager _channelManager; private readonly IUserDataManager _userDataManager; private readonly User _user; @@ -41,13 +45,14 @@ namespace MediaBrowser.Dlna.ContentDirectory private readonly DeviceProfile _profile; - public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization) + public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager) : base(config, logger) { _libraryManager = libraryManager; _userDataManager = userDataManager; _user = user; _systemUpdateId = systemUpdateId; + _channelManager = channelManager; _profile = profile; _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, userDataManager, localization); @@ -235,18 +240,19 @@ namespace MediaBrowser.Dlna.ContentDirectory foreach (var i in childrenResult.Items) { - var displayStubType = GetDisplayStubType(i, serverItem.Item); + var childItem = i.Item; + var displayStubType = i.StubType; - if (i.IsFolder || displayStubType.HasValue) + if (childItem.IsFolder || displayStubType.HasValue) { - var childCount = (await GetUserItems(i, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false)) + var childCount = (await GetUserItems(childItem, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false)) .TotalRecordCount; - result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, i, displayStubType, item, childCount, filter)); + result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, childItem, displayStubType, item, childCount, filter)); } else { - result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, item, serverItem.StubType, deviceId, filter)); + result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, childItem, item, serverItem.StubType, deviceId, filter)); } } } @@ -262,24 +268,6 @@ namespace MediaBrowser.Dlna.ContentDirectory }; } - private StubType? GetDisplayStubType(BaseItem item, BaseItem context) - { - if (context == null || context.IsFolder) - { - var movie = item as Movie; - if (movie != null) - { - if (movie.LocalTrailerIds.Count > 0 || - movie.SpecialFeatureIds.Count > 0) - { - return StubType.Folder; - } - } - } - - return null; - } - private async Task<IEnumerable<KeyValuePair<string, string>>> HandleSearch(Headers sparams, User user, string deviceId) { var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", "")); @@ -408,16 +396,49 @@ namespace MediaBrowser.Dlna.ContentDirectory }).ConfigureAwait(false); } - private async Task<QueryResult<BaseItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit) + private async Task<QueryResult<ServerItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit) { if (stubType.HasValue) { - var movie = item as Movie; + if (stubType.Value == StubType.People) + { + var items = item.People.Select(i => + { + try + { + return _libraryManager.GetPerson(i.Name); + } + catch + { + return null; + } + + }).Where(i => i != null).ToArray(); + + var result = new QueryResult<ServerItem> + { + Items = items.Select(i => new ServerItem { Item = i, StubType = StubType.Folder }).ToArray(), + TotalRecordCount = items.Length + }; - if (movie != null) + return ApplyPaging(result, startIndex, limit); + } + if (stubType.Value == StubType.Folder) { - return await GetMovieItems(movie).ConfigureAwait(false); + var movie = item as Movie; + if (movie != null) + { + return ApplyPaging(await GetMovieItems(movie).ConfigureAwait(false), startIndex, limit); + } } + + var person = item as Person; + if (person != null) + { + return await GetItemsFromPerson(person, user, startIndex, limit).ConfigureAwait(false); + } + + return ApplyPaging(new QueryResult<ServerItem>(), startIndex, limit); } var folder = (Folder)item; @@ -428,7 +449,7 @@ namespace MediaBrowser.Dlna.ContentDirectory sortOrders.Add(ItemSortBy.SortName); } - return await folder.GetItems(new InternalItemsQuery + var queryResult = await folder.GetItems(new InternalItemsQuery { Limit = limit, StartIndex = startIndex, @@ -438,9 +459,100 @@ namespace MediaBrowser.Dlna.ContentDirectory Filter = FilterUnsupportedContent }).ConfigureAwait(false); + + var serverItems = queryResult + .Items + .Select(i => new ServerItem + { + Item = i, + StubType = GetDisplayStubType(i, item) + }) + .ToArray(); + + return new QueryResult<ServerItem> + { + TotalRecordCount = queryResult.TotalRecordCount, + Items = serverItems + }; } - private Task<QueryResult<BaseItem>> GetMovieItems(Movie item) + private async Task<QueryResult<ServerItem>> GetItemsFromPerson(Person person, User user, int? startIndex, int? limit) + { + var items = user.RootFolder.GetRecursiveChildren(user) + .Where(i => i is Movie || i is Series) + .Where(i => i.ContainsPerson(person.Name)) + .ToList(); + + var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery + { + ContentTypes = new[] { ChannelMediaContentType.MovieExtra }, + ExtraTypes = new[] { ExtraType.Trailer }, + UserId = user.Id.ToString("N") + + }, CancellationToken.None).ConfigureAwait(false); + + items.AddRange(trailerResult.Items.Where(i => i.ContainsPerson(person.Name))); + + items = _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending) + .Skip(startIndex ?? 0) + .Take(limit ?? int.MaxValue) + .ToList(); + + var serverItems = items.Select(i => new ServerItem + { + Item = i, + StubType = null + }) + .ToArray(); + + return new QueryResult<ServerItem> + { + TotalRecordCount = serverItems.Length, + Items = serverItems + }; + } + + private QueryResult<ServerItem> ApplyPaging(QueryResult<ServerItem> result, int? startIndex, int? limit) + { + result.Items = result.Items.Skip(startIndex ?? 0).Take(limit ?? int.MaxValue).ToArray(); + + return result; + } + + private StubType? GetDisplayStubType(BaseItem item, BaseItem context) + { + if (context == null || context.IsFolder) + { + var movie = item as Movie; + if (movie != null) + { + if (movie.LocalTrailerIds.Count > 0 || + movie.SpecialFeatureIds.Count > 0) + { + return StubType.Folder; + } + } + + if (EnablePeopleDisplay(item)) + { + return StubType.Folder; + } + } + + return null; + } + + private bool EnablePeopleDisplay(BaseItem item) + { + if (item.People.Count > 0) + { + return item is Movie; + } + + return false; + } + + private Task<QueryResult<ServerItem>> GetMovieItems(Movie item) { var list = new List<BaseItem>(); @@ -448,12 +560,20 @@ namespace MediaBrowser.Dlna.ContentDirectory list.AddRange(item.LocalTrailerIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); list.AddRange(item.SpecialFeatureIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); - list.AddRange(item.ThemeVideoIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null)); - return Task.FromResult(new QueryResult<BaseItem> + var serverItems = list.Select(i => new ServerItem { Item = i, StubType = null }) + .ToList(); + + serverItems.Add(new ServerItem + { + Item = item, + StubType = StubType.People + }); + + return Task.FromResult(new QueryResult<ServerItem> { - Items = list.ToArray(), - TotalRecordCount = list.Count + Items = serverItems.ToArray(), + TotalRecordCount = serverItems.Count }); } @@ -498,6 +618,11 @@ namespace MediaBrowser.Dlna.ContentDirectory stubType = StubType.Folder; id = id.Split(new[] { '_' }, 2)[1]; } + else if (id.StartsWith("people_", StringComparison.OrdinalIgnoreCase)) + { + stubType = StubType.People; + id = id.Split(new[] { '_' }, 2)[1]; + } if (Guid.TryParse(id, out itemId)) { @@ -524,6 +649,7 @@ namespace MediaBrowser.Dlna.ContentDirectory public enum StubType { - Folder = 0 + Folder = 0, + People = 1 } } |
