aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs')
-rw-r--r--MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs196
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
}
}