aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-10-22 00:42:26 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-10-22 00:42:26 -0400
commit9f3891d418729b9cc1dbdf4e48013f5a0a57639a (patch)
tree265aeca4176a24e5ad58d9acf5ba3b0d5f4b5f54 /MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
parent1e7ac871db62d749725226fe05d61ab2629e79e9 (diff)
render movies as folders with dlna
Diffstat (limited to 'MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs')
-rw-r--r--MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs143
1 files changed, 110 insertions, 33 deletions
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
index 3f9ce66c5c..b92a4174ef 100644
--- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
+++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
@@ -1,7 +1,9 @@
-using MediaBrowser.Common.Extensions;
+using System.Linq;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Dlna.Didl;
@@ -85,7 +87,9 @@ namespace MediaBrowser.Dlna.ContentDirectory
{
var id = sparams["ObjectID"];
- var item = GetItemFromObjectId(id, user);
+ var serverItem = GetItemFromObjectId(id, user);
+
+ var item = serverItem.Item;
var newbookmark = int.Parse(sparams["PosSecond"], _usCulture);
@@ -173,49 +177,48 @@ namespace MediaBrowser.Dlna.ContentDirectory
//didl.SetAttribute("xmlns:sec", NS_SEC);
result.AppendChild(didl);
- var item = GetItemFromObjectId(id, user);
+ var serverItem = GetItemFromObjectId(id, user);
+ var item = serverItem.Item;
var totalCount = 0;
if (string.Equals(flag, "BrowseMetadata"))
{
- var folder = item as Folder;
-
- if (folder == null)
+ if (item.IsFolder || serverItem.StubType.HasValue)
{
- result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, null, deviceId, filter));
+ var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requested).ConfigureAwait(false));
+ totalCount = childrenResult.TotalRecordCount;
+
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, item, serverItem.StubType, null, totalCount, filter, id));
}
else
{
- var childrenResult = (await GetUserItems(folder, user, sortCriteria, start, requested).ConfigureAwait(false));
- totalCount = childrenResult.TotalRecordCount;
-
- result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, totalCount, filter, id));
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, item, null, null, deviceId, filter));
}
+
provided++;
}
else
{
- var folder = (Folder)item;
-
- var childrenResult = (await GetUserItems(folder, user, sortCriteria, start, requested).ConfigureAwait(false));
+ var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requested).ConfigureAwait(false));
totalCount = childrenResult.TotalRecordCount;
provided = childrenResult.Items.Length;
foreach (var i in childrenResult.Items)
{
- if (i.IsFolder)
+ var displayStubType = GetDisplayStubType(i, serverItem.Item);
+
+ if (i.IsFolder || displayStubType.HasValue)
{
- var f = (Folder)i;
- var childCount = (await GetUserItems(f, user, sortCriteria, null, 0).ConfigureAwait(false))
+ var childCount = (await GetUserItems(i, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false))
.TotalRecordCount;
- result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter));
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, i, displayStubType, item, childCount, filter));
}
else
{
- result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, folder, deviceId, filter));
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, item, serverItem.StubType, deviceId, filter));
}
}
}
@@ -231,6 +234,24 @@ 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", ""));
@@ -269,9 +290,11 @@ namespace MediaBrowser.Dlna.ContentDirectory
result.AppendChild(didl);
- var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user);
+ var serverItem = GetItemFromObjectId(sparams["ContainerID"], user);
+
+ var item = serverItem.Item;
- var childrenResult = (await GetChildrenSorted(folder, user, searchCriteria, sortCriteria, start, requested).ConfigureAwait(false));
+ var childrenResult = (await GetChildrenSorted(item, user, searchCriteria, sortCriteria, start, requested).ConfigureAwait(false));
var totalCount = childrenResult.TotalRecordCount;
@@ -281,15 +304,14 @@ namespace MediaBrowser.Dlna.ContentDirectory
{
if (i.IsFolder)
{
- var f = (Folder)i;
- var childCount = (await GetChildrenSorted(f, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false))
+ var childCount = (await GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false))
.TotalRecordCount;
- result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter));
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, i, null, item, childCount, filter));
}
else
{
- result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, folder, deviceId, filter));
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(result, i, item, serverItem.StubType, deviceId, filter));
}
}
@@ -304,8 +326,10 @@ namespace MediaBrowser.Dlna.ContentDirectory
};
}
- private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit)
+ private async Task<QueryResult<BaseItem>> GetChildrenSorted(BaseItem item, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit)
{
+ var folder = (Folder)item;
+
var sortOrders = new List<string>();
if (!folder.IsPreSorted)
{
@@ -340,7 +364,7 @@ namespace MediaBrowser.Dlna.ContentDirectory
//items = items.OfType<MusicAlbum>();
isFolder = true;
}
-
+
return await folder.GetItems(new InternalItemsQuery
{
Limit = limit,
@@ -356,8 +380,20 @@ namespace MediaBrowser.Dlna.ContentDirectory
}).ConfigureAwait(false);
}
- private async Task<QueryResult<BaseItem>> GetUserItems(Folder folder, User user, SortCriteria sort, int? startIndex, int? limit)
+ private async Task<QueryResult<BaseItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit)
{
+ if (stubType.HasValue)
+ {
+ var movie = item as Movie;
+
+ if (movie != null)
+ {
+ return await GetMovieItems(movie).ConfigureAwait(false);
+ }
+ }
+
+ var folder = (Folder)item;
+
var sortOrders = new List<string>();
if (!folder.IsPreSorted)
{
@@ -376,6 +412,23 @@ namespace MediaBrowser.Dlna.ContentDirectory
}).ConfigureAwait(false);
}
+ private Task<QueryResult<BaseItem>> GetMovieItems(Movie item)
+ {
+ var list = new List<BaseItem>();
+
+ list.Add(item);
+
+ 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>
+ {
+ Items = list.ToArray(),
+ TotalRecordCount = list.Count
+ });
+ }
+
private bool FilterUnsupportedContent(BaseItem i, User user)
{
// Unplayable
@@ -399,26 +452,50 @@ namespace MediaBrowser.Dlna.ContentDirectory
return true;
}
- private BaseItem GetItemFromObjectId(string id, User user)
+ private ServerItem GetItemFromObjectId(string id, User user)
{
return DidlBuilder.IsIdRoot(id)
- ? user.RootFolder
+ ? new ServerItem { Item = user.RootFolder }
: ParseItemId(id, user);
}
- private BaseItem ParseItemId(string id, User user)
+ private ServerItem ParseItemId(string id, User user)
{
Guid itemId;
+ StubType? stubType = null;
+
+ if (id.StartsWith("folder_", StringComparison.OrdinalIgnoreCase))
+ {
+ stubType = StubType.Folder;
+ id = id.Split(new[] { '_' }, 2)[1];
+ }
if (Guid.TryParse(id, out itemId))
{
- return _libraryManager.GetItemById(itemId);
+ var item = _libraryManager.GetItemById(itemId);
+
+ return new ServerItem
+ {
+ Item = item,
+ StubType = stubType
+ };
}
Logger.Error("Error parsing item Id: {0}. Returning user root folder.", id);
- return user.RootFolder;
+ return new ServerItem { Item = user.RootFolder };
}
}
+
+ internal class ServerItem
+ {
+ public BaseItem Item { get; set; }
+ public StubType? StubType { get; set; }
+ }
+
+ public enum StubType
+ {
+ Folder = 0
+ }
}