diff options
Diffstat (limited to 'MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs')
| -rw-r--r-- | MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs | 71 |
1 files changed, 65 insertions, 6 deletions
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index d979e3d89..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); @@ -412,7 +417,7 @@ namespace MediaBrowser.Dlna.ContentDirectory var result = new QueryResult<ServerItem> { - Items = items.Select(i => new ServerItem { Item = i }).ToArray(), + Items = items.Select(i => new ServerItem { Item = i, StubType = StubType.Folder }).ToArray(), TotalRecordCount = items.Length }; @@ -426,6 +431,14 @@ namespace MediaBrowser.Dlna.ContentDirectory 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; @@ -463,6 +476,42 @@ namespace MediaBrowser.Dlna.ContentDirectory }; } + 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(); @@ -482,17 +531,27 @@ namespace MediaBrowser.Dlna.ContentDirectory { return StubType.Folder; } + } - if (movie.People.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>(); |
