From 5765b516807a43c68f438b5f2112f0351e2ef4a2 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 26 Dec 2016 12:37:49 -0500 Subject: [PATCH] support samsung dlna bookmarks --- Emby.Dlna/ContentDirectory/ControlHandler.cs | 6 +- Emby.Dlna/Didl/DidlBuilder.cs | 58 +++++++++++++++----- Emby.Dlna/PlayTo/PlayToController.cs | 2 +- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs index 4329911289..5718cbd09f 100644 --- a/Emby.Dlna/ContentDirectory/ControlHandler.cs +++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs @@ -268,7 +268,7 @@ namespace Emby.Dlna.ContentDirectory } else { - _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, item, null, null, deviceId, filter); + _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, item, user, null, null, deviceId, filter); } provided++; @@ -294,7 +294,7 @@ namespace Emby.Dlna.ContentDirectory } else { - _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, childItem, item, serverItem.StubType, deviceId, filter); + _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, childItem, user, item, serverItem.StubType, deviceId, filter); } } } @@ -390,7 +390,7 @@ namespace Emby.Dlna.ContentDirectory } else { - _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, i, item, serverItem.StubType, deviceId, filter); + _didlBuilder.WriteItemElement(_config.GetDlnaConfiguration(), writer, i, user, item, serverItem.StubType, deviceId, filter); } } diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 3dcdaf2efc..3e47362f65 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -61,7 +61,7 @@ namespace Emby.Dlna.Didl _user = user; } - public string GetItemDidl(DlnaOptions options, BaseItem item, BaseItem context, string deviceId, Filter filter, StreamInfo streamInfo) + public string GetItemDidl(DlnaOptions options, BaseItem item, User user, BaseItem context, string deviceId, Filter filter, StreamInfo streamInfo) { var settings = new XmlWriterSettings { @@ -86,7 +86,7 @@ namespace Emby.Dlna.Didl WriteXmlRootAttributes(_profile, writer); - WriteItemElement(options, writer, item, context, null, deviceId, filter, streamInfo); + WriteItemElement(options, writer, item, user, context, null, deviceId, filter, streamInfo); writer.WriteFullEndElement(); //writer.WriteEndDocument(); @@ -111,7 +111,15 @@ namespace Emby.Dlna.Didl } } - public void WriteItemElement(DlnaOptions options, XmlWriter writer, BaseItem item, BaseItem context, StubType? contextStubType, string deviceId, Filter filter, StreamInfo streamInfo = null) + public void WriteItemElement(DlnaOptions options, + XmlWriter writer, + BaseItem item, + User user, + BaseItem context, + StubType? contextStubType, + string deviceId, + Filter filter, + StreamInfo streamInfo = null) { var clientId = GetClientId(item, null); @@ -135,7 +143,7 @@ namespace Emby.Dlna.Didl AddGeneralProperties(item, null, context, writer, filter); - //AddBookmarkInfo(item, user, element); + AddSamsungBookmarkInfo(item, user, writer); // refID? // storeAttribute(itemNode, object, ClassProperties.REF_ID, false); @@ -555,17 +563,37 @@ namespace Emby.Dlna.Didl writer.WriteFullEndElement(); } - //private void AddBookmarkInfo(BaseItem item, User user, XmlElement element) - //{ - // var userdata = _userDataManager.GetUserData(user.Id, item.GetUserDataKey()); - - // if (userdata.PlaybackPositionTicks > 0) - // { - // var dcmInfo = element.OwnerDocument.CreateElement("sec", "dcmInfo", NS_SEC); - // dcmInfo.InnerText = string.Format("BM={0}", Convert.ToInt32(TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds).ToString(_usCulture)); - // element.AppendChild(dcmInfo); - // } - //} + private void AddSamsungBookmarkInfo(BaseItem item, User user, XmlWriter writer) + { + if (!item.SupportsPositionTicksResume || item is Folder) + { + return; + } + + XmlAttribute secAttribute = null; + foreach (var attribute in _profile.XmlRootAttributes) + { + if (string.Equals(attribute.Name, "xmlns:sec", StringComparison.OrdinalIgnoreCase)) + { + secAttribute = attribute; + break; + } + } + + // Not a samsung device + if (secAttribute == null) + { + return; + } + + var userdata = _userDataManager.GetUserData(user.Id, item); + + if (userdata.PlaybackPositionTicks > 0) + { + var elementValue = string.Format("BM={0}", Convert.ToInt32(TimeSpan.FromTicks(userdata.PlaybackPositionTicks).TotalSeconds).ToString(_usCulture)); + AddValue(writer, "sec", "dcmInfo", elementValue, secAttribute.Value); + } + } /// /// Adds fields used by both items and folders diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs index 7dff8bda13..4ad62216e4 100644 --- a/Emby.Dlna/PlayTo/PlayToController.cs +++ b/Emby.Dlna/PlayTo/PlayToController.cs @@ -493,7 +493,7 @@ namespace Emby.Dlna.PlayTo playlistItem.StreamUrl = playlistItem.StreamInfo.ToDlnaUrl(_serverAddress, _accessToken); var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _libraryManager, _mediaEncoder) - .GetItemDidl(_config.GetDlnaConfiguration(), item, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo); + .GetItemDidl(_config.GetDlnaConfiguration(), item, user, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo); playlistItem.Didl = itemXml;