aboutsummaryrefslogtreecommitdiff
path: root/Emby.Dlna
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-10-30 03:29:27 -0400
committerGitHub <noreply@github.com>2016-10-30 03:29:27 -0400
commitd31b0f7be4b14e4ada999c97e675b856ad68352b (patch)
treea4619513efbb3be62a6204c996526df606cb62c5 /Emby.Dlna
parentb19f75fcae017cb51f1e58eb2d54ca84620b6ee0 (diff)
parent3094cd7ff3e51578808ce1b6f56b141930c18004 (diff)
Merge pull request #2258 from MediaBrowser/dev
Dev
Diffstat (limited to 'Emby.Dlna')
-rw-r--r--Emby.Dlna/Common/Argument.cs12
-rw-r--r--Emby.Dlna/Common/DeviceIcon.cs21
-rw-r--r--Emby.Dlna/Common/DeviceService.cs21
-rw-r--r--Emby.Dlna/Common/ServiceAction.cs21
-rw-r--r--Emby.Dlna/Common/StateVariable.cs25
-rw-r--r--Emby.Dlna/ConfigurationExtension.cs29
-rw-r--r--Emby.Dlna/ConnectionManager/ConnectionManager.cs37
-rw-r--r--Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs106
-rw-r--r--Emby.Dlna/ConnectionManager/ControlHandler.cs41
-rw-r--r--Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs205
-rw-r--r--Emby.Dlna/ContentDirectory/ContentDirectory.cs133
-rw-r--r--Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs126
-rw-r--r--Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs147
-rw-r--r--Emby.Dlna/ContentDirectory/ControlHandler.cs588
-rw-r--r--Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs378
-rw-r--r--Emby.Dlna/Didl/DidlBuilder.cs1163
-rw-r--r--Emby.Dlna/Didl/Filter.cs35
-rw-r--r--Emby.Dlna/DlnaManager.cs648
-rw-r--r--Emby.Dlna/Emby.Dlna.xproj24
-rw-r--r--Emby.Dlna/Eventing/EventManager.cs170
-rw-r--r--Emby.Dlna/Eventing/EventSubscription.cs34
-rw-r--r--Emby.Dlna/Images/logo120.jpgbin0 -> 5054 bytes
-rw-r--r--Emby.Dlna/Images/logo120.pngbin0 -> 840 bytes
-rw-r--r--Emby.Dlna/Images/logo240.jpgbin0 -> 8197 bytes
-rw-r--r--Emby.Dlna/Images/logo240.pngbin0 -> 1681 bytes
-rw-r--r--Emby.Dlna/Images/logo48.jpgbin0 -> 2099 bytes
-rw-r--r--Emby.Dlna/Images/logo48.pngbin0 -> 699 bytes
-rw-r--r--Emby.Dlna/Images/people48.jpgbin0 -> 1101 bytes
-rw-r--r--Emby.Dlna/Images/people48.pngbin0 -> 688 bytes
-rw-r--r--Emby.Dlna/Images/people480.jpgbin0 -> 8691 bytes
-rw-r--r--Emby.Dlna/Images/people480.pngbin0 -> 6351 bytes
-rw-r--r--Emby.Dlna/Main/DlnaEntryPoint.cs393
-rw-r--r--Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs43
-rw-r--r--Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrar.cs39
-rw-r--r--Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs78
-rw-r--r--Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs154
-rw-r--r--Emby.Dlna/PlayTo/CurrentIdEventArgs.cs9
-rw-r--r--Emby.Dlna/PlayTo/Device.cs1092
-rw-r--r--Emby.Dlna/PlayTo/DeviceInfo.cs76
-rw-r--r--Emby.Dlna/PlayTo/PlayToController.cs941
-rw-r--r--Emby.Dlna/PlayTo/PlayToManager.cs205
-rw-r--r--Emby.Dlna/PlayTo/PlaybackProgressEventArgs.cs9
-rw-r--r--Emby.Dlna/PlayTo/PlaybackStartEventArgs.cs9
-rw-r--r--Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs15
-rw-r--r--Emby.Dlna/PlayTo/PlaylistItem.cs15
-rw-r--r--Emby.Dlna/PlayTo/PlaylistItemFactory.cs69
-rw-r--r--Emby.Dlna/PlayTo/SsdpHttpClient.cs139
-rw-r--r--Emby.Dlna/PlayTo/TRANSPORTSTATE.cs11
-rw-r--r--Emby.Dlna/PlayTo/TransportCommands.cs185
-rw-r--r--Emby.Dlna/PlayTo/TransportStateEventArgs.cs9
-rw-r--r--Emby.Dlna/PlayTo/UpnpContainer.cs26
-rw-r--r--Emby.Dlna/PlayTo/uBaseObject.cs58
-rw-r--r--Emby.Dlna/PlayTo/uParser.cs47
-rw-r--r--Emby.Dlna/PlayTo/uParserObject.cs9
-rw-r--r--Emby.Dlna/PlayTo/uPnpNamespaces.cs39
-rw-r--r--Emby.Dlna/ProfileSerialization/CodecProfile.cs68
-rw-r--r--Emby.Dlna/ProfileSerialization/ContainerProfile.cs31
-rw-r--r--Emby.Dlna/ProfileSerialization/DeviceProfile.cs351
-rw-r--r--Emby.Dlna/ProfileSerialization/DirectPlayProfile.cs51
-rw-r--r--Emby.Dlna/ProfileSerialization/HttpHeaderInfo.cs17
-rw-r--r--Emby.Dlna/ProfileSerialization/ProfileCondition.cs39
-rw-r--r--Emby.Dlna/ProfileSerialization/ResponseProfile.cs64
-rw-r--r--Emby.Dlna/ProfileSerialization/SubtitleProfile.cs48
-rw-r--r--Emby.Dlna/ProfileSerialization/TranscodingProfile.cs58
-rw-r--r--Emby.Dlna/ProfileSerialization/XmlAttribute.cs13
-rw-r--r--Emby.Dlna/Profiles/BubbleUpnpProfile.cs146
-rw-r--r--Emby.Dlna/Profiles/DefaultProfile.cs114
-rw-r--r--Emby.Dlna/Profiles/DenonAvrProfile.cs31
-rw-r--r--Emby.Dlna/Profiles/DirectTvProfile.cs119
-rw-r--r--Emby.Dlna/Profiles/DishHopperJoeyProfile.cs219
-rw-r--r--Emby.Dlna/Profiles/Foobar2000Profile.cs77
-rw-r--r--Emby.Dlna/Profiles/Json/BubbleUPnp.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Default.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Denon AVR.json1
-rw-r--r--Emby.Dlna/Profiles/Json/DirecTV HD-DVR.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Dish Hopper-Joey.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Kodi.json1
-rw-r--r--Emby.Dlna/Profiles/Json/LG Smart TV.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Linksys DMA2100.json1
-rw-r--r--Emby.Dlna/Profiles/Json/MediaMonkey.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Panasonic Viera.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Popcorn Hour.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Samsung Smart TV.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2013.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2014.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2015.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2016.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Blu-ray Player.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Bravia (2010).json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Bravia (2011).json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Bravia (2012).json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Bravia (2013).json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony Bravia (2014).json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony PlayStation 3.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Sony PlayStation 4.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Vlc.json1
-rw-r--r--Emby.Dlna/Profiles/Json/WDTV Live.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Xbox 360.json1
-rw-r--r--Emby.Dlna/Profiles/Json/Xbox One.json1
-rw-r--r--Emby.Dlna/Profiles/Json/foobar2000.json1
-rw-r--r--Emby.Dlna/Profiles/KodiProfile.cs151
-rw-r--r--Emby.Dlna/Profiles/LgTvProfile.cs210
-rw-r--r--Emby.Dlna/Profiles/LinksysDMA2100Profile.cs37
-rw-r--r--Emby.Dlna/Profiles/MediaMonkeyProfile.cs77
-rw-r--r--Emby.Dlna/Profiles/PanasonicVieraProfile.cs215
-rw-r--r--Emby.Dlna/Profiles/PopcornHourProfile.cs207
-rw-r--r--Emby.Dlna/Profiles/SamsungSmartTvProfile.cs357
-rw-r--r--Emby.Dlna/Profiles/SonyBlurayPlayer2013.cs228
-rw-r--r--Emby.Dlna/Profiles/SonyBlurayPlayer2014.cs228
-rw-r--r--Emby.Dlna/Profiles/SonyBlurayPlayer2015.cs216
-rw-r--r--Emby.Dlna/Profiles/SonyBlurayPlayer2016.cs216
-rw-r--r--Emby.Dlna/Profiles/SonyBlurayPlayerProfile.cs267
-rw-r--r--Emby.Dlna/Profiles/SonyBravia2010Profile.cs356
-rw-r--r--Emby.Dlna/Profiles/SonyBravia2011Profile.cs373
-rw-r--r--Emby.Dlna/Profiles/SonyBravia2012Profile.cs291
-rw-r--r--Emby.Dlna/Profiles/SonyBravia2013Profile.cs309
-rw-r--r--Emby.Dlna/Profiles/SonyBravia2014Profile.cs309
-rw-r--r--Emby.Dlna/Profiles/SonyPs3Profile.cs260
-rw-r--r--Emby.Dlna/Profiles/SonyPs4Profile.cs260
-rw-r--r--Emby.Dlna/Profiles/VlcProfile.cs149
-rw-r--r--Emby.Dlna/Profiles/WdtvLiveProfile.cs266
-rw-r--r--Emby.Dlna/Profiles/Xbox360Profile.cs317
-rw-r--r--Emby.Dlna/Profiles/XboxOneProfile.cs356
-rw-r--r--Emby.Dlna/Properties/AssemblyInfo.cs19
-rw-r--r--Emby.Dlna/Server/DescriptionXmlBuilder.cs390
-rw-r--r--Emby.Dlna/Server/Headers.cs176
-rw-r--r--Emby.Dlna/Server/UpnpDevice.cs37
-rw-r--r--Emby.Dlna/Service/BaseControlHandler.cs137
-rw-r--r--Emby.Dlna/Service/BaseService.cs37
-rw-r--r--Emby.Dlna/Service/ControlErrorHandler.cs41
-rw-r--r--Emby.Dlna/Service/ServiceXmlBuilder.cs91
-rw-r--r--Emby.Dlna/Ssdp/DeviceDiscovery.cs141
-rw-r--r--Emby.Dlna/Ssdp/Extensions.cs34
-rw-r--r--Emby.Dlna/project.fragment.lock.json56
-rw-r--r--Emby.Dlna/project.json57
-rw-r--r--Emby.Dlna/project.lock.json4355
136 files changed, 20335 insertions, 0 deletions
diff --git a/Emby.Dlna/Common/Argument.cs b/Emby.Dlna/Common/Argument.cs
new file mode 100644
index 0000000000..7e61c3d6d5
--- /dev/null
+++ b/Emby.Dlna/Common/Argument.cs
@@ -0,0 +1,12 @@
+
+namespace Emby.Dlna.Common
+{
+ public class Argument
+ {
+ public string Name { get; set; }
+
+ public string Direction { get; set; }
+
+ public string RelatedStateVariable { get; set; }
+ }
+}
diff --git a/Emby.Dlna/Common/DeviceIcon.cs b/Emby.Dlna/Common/DeviceIcon.cs
new file mode 100644
index 0000000000..27ae92d6f0
--- /dev/null
+++ b/Emby.Dlna/Common/DeviceIcon.cs
@@ -0,0 +1,21 @@
+
+namespace Emby.Dlna.Common
+{
+ public class DeviceIcon
+ {
+ public string Url { get; set; }
+
+ public string MimeType { get; set; }
+
+ public int Width { get; set; }
+
+ public int Height { get; set; }
+
+ public string Depth { get; set; }
+
+ public override string ToString()
+ {
+ return string.Format("{0}x{1}", Height, Width);
+ }
+ }
+}
diff --git a/Emby.Dlna/Common/DeviceService.cs b/Emby.Dlna/Common/DeviceService.cs
new file mode 100644
index 0000000000..0d91dbe76d
--- /dev/null
+++ b/Emby.Dlna/Common/DeviceService.cs
@@ -0,0 +1,21 @@
+
+namespace Emby.Dlna.Common
+{
+ public class DeviceService
+ {
+ public string ServiceType { get; set; }
+
+ public string ServiceId { get; set; }
+
+ public string ScpdUrl { get; set; }
+
+ public string ControlUrl { get; set; }
+
+ public string EventSubUrl { get; set; }
+
+ public override string ToString()
+ {
+ return string.Format("{0}", ServiceId);
+ }
+ }
+}
diff --git a/Emby.Dlna/Common/ServiceAction.cs b/Emby.Dlna/Common/ServiceAction.cs
new file mode 100644
index 0000000000..1bcc6a1d68
--- /dev/null
+++ b/Emby.Dlna/Common/ServiceAction.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+
+namespace Emby.Dlna.Common
+{
+ public class ServiceAction
+ {
+ public string Name { get; set; }
+
+ public List<Argument> ArgumentList { get; set; }
+
+ public override string ToString()
+ {
+ return Name;
+ }
+
+ public ServiceAction()
+ {
+ ArgumentList = new List<Argument>();
+ }
+ }
+}
diff --git a/Emby.Dlna/Common/StateVariable.cs b/Emby.Dlna/Common/StateVariable.cs
new file mode 100644
index 0000000000..7e0bc6ae8b
--- /dev/null
+++ b/Emby.Dlna/Common/StateVariable.cs
@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+
+namespace Emby.Dlna.Common
+{
+ public class StateVariable
+ {
+ public string Name { get; set; }
+
+ public string DataType { get; set; }
+
+ public bool SendsEvents { get; set; }
+
+ public List<string> AllowedValues { get; set; }
+
+ public override string ToString()
+ {
+ return Name;
+ }
+
+ public StateVariable()
+ {
+ AllowedValues = new List<string>();
+ }
+ }
+}
diff --git a/Emby.Dlna/ConfigurationExtension.cs b/Emby.Dlna/ConfigurationExtension.cs
new file mode 100644
index 0000000000..cec885e4a7
--- /dev/null
+++ b/Emby.Dlna/ConfigurationExtension.cs
@@ -0,0 +1,29 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Configuration;
+using System.Collections.Generic;
+
+namespace Emby.Dlna
+{
+ public static class ConfigurationExtension
+ {
+ public static DlnaOptions GetDlnaConfiguration(this IConfigurationManager manager)
+ {
+ return manager.GetConfiguration<DlnaOptions>("dlna");
+ }
+ }
+
+ public class DlnaConfigurationFactory : IConfigurationFactory
+ {
+ public IEnumerable<ConfigurationStore> GetConfigurations()
+ {
+ return new List<ConfigurationStore>
+ {
+ new ConfigurationStore
+ {
+ Key = "dlna",
+ ConfigurationType = typeof (DlnaOptions)
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/ConnectionManager/ConnectionManager.cs b/Emby.Dlna/ConnectionManager/ConnectionManager.cs
new file mode 100644
index 0000000000..53253543b5
--- /dev/null
+++ b/Emby.Dlna/ConnectionManager/ConnectionManager.cs
@@ -0,0 +1,37 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Logging;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ConnectionManager
+{
+ public class ConnectionManager : BaseService, IConnectionManager
+ {
+ private readonly IDlnaManager _dlna;
+ private readonly ILogger _logger;
+ private readonly IServerConfigurationManager _config;
+
+ public ConnectionManager(IDlnaManager dlna, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient)
+ : base(logger, httpClient)
+ {
+ _dlna = dlna;
+ _config = config;
+ _logger = logger;
+ }
+
+ public string GetServiceXml(IDictionary<string, string> headers)
+ {
+ return new ConnectionManagerXmlBuilder().GetXml();
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ var profile = _dlna.GetProfile(request.Headers) ??
+ _dlna.GetDefaultProfile();
+
+ return new ControlHandler(_logger, profile, _config).ProcessControlRequest(request);
+ }
+ }
+}
diff --git a/Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs b/Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs
new file mode 100644
index 0000000000..2a415c58e0
--- /dev/null
+++ b/Emby.Dlna/ConnectionManager/ConnectionManagerXmlBuilder.cs
@@ -0,0 +1,106 @@
+using Emby.Dlna.Common;
+using Emby.Dlna.Service;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ConnectionManager
+{
+ public class ConnectionManagerXmlBuilder
+ {
+ public string GetXml()
+ {
+ return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(), GetStateVariables());
+ }
+
+ private IEnumerable<StateVariable> GetStateVariables()
+ {
+ var list = new List<StateVariable>();
+
+ list.Add(new StateVariable
+ {
+ Name = "SourceProtocolInfo",
+ DataType = "string",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "SinkProtocolInfo",
+ DataType = "string",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "CurrentConnectionIDs",
+ DataType = "string",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_ConnectionStatus",
+ DataType = "string",
+ SendsEvents = false,
+
+ AllowedValues = new List<string>
+ {
+ "OK",
+ "ContentFormatMismatch",
+ "InsufficientBandwidth",
+ "UnreliableChannel",
+ "Unknown"
+ }
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_ConnectionManager",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Direction",
+ DataType = "string",
+ SendsEvents = false,
+
+ AllowedValues = new List<string>
+ {
+ "Output",
+ "Input"
+ }
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_ProtocolInfo",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_ConnectionID",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_AVTransportID",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_RcsID",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ConnectionManager/ControlHandler.cs b/Emby.Dlna/ConnectionManager/ControlHandler.cs
new file mode 100644
index 0000000000..e9af5cd1de
--- /dev/null
+++ b/Emby.Dlna/ConnectionManager/ControlHandler.cs
@@ -0,0 +1,41 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
+using Emby.Dlna.Server;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ConnectionManager
+{
+ public class ControlHandler : BaseControlHandler
+ {
+ private readonly DeviceProfile _profile;
+
+ public ControlHandler(ILogger logger, DeviceProfile profile, IServerConfigurationManager config)
+ : base(config, logger)
+ {
+ _profile = profile;
+ }
+
+ protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)
+ {
+ if (string.Equals(methodName, "GetProtocolInfo", StringComparison.OrdinalIgnoreCase))
+ {
+ return HandleGetProtocolInfo();
+ }
+
+ throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetProtocolInfo()
+ {
+ return new Headers(true)
+ {
+ { "Source", _profile.ProtocolInfo },
+ { "Sink", "" }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs b/Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs
new file mode 100644
index 0000000000..9b22b77734
--- /dev/null
+++ b/Emby.Dlna/ConnectionManager/ServiceActionListBuilder.cs
@@ -0,0 +1,205 @@
+using Emby.Dlna.Common;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ConnectionManager
+{
+ public class ServiceActionListBuilder
+ {
+ public IEnumerable<ServiceAction> GetActions()
+ {
+ var list = new List<ServiceAction>
+ {
+ GetCurrentConnectionInfo(),
+ GetProtocolInfo(),
+ GetCurrentConnectionIDs(),
+ ConnectionComplete(),
+ PrepareForConnection()
+ };
+
+ return list;
+ }
+
+ private ServiceAction PrepareForConnection()
+ {
+ var action = new ServiceAction
+ {
+ Name = "PrepareForConnection"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RemoteProtocolInfo",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ProtocolInfo"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "PeerConnectionManager",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionManager"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "PeerConnectionID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Direction",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Direction"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ConnectionID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "AVTransportID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_AVTransportID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RcsID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_RcsID"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetCurrentConnectionInfo()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetCurrentConnectionInfo"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ConnectionID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RcsID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_RcsID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "AVTransportID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_AVTransportID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ProtocolInfo",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_ProtocolInfo"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "PeerConnectionManager",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionManager"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "PeerConnectionID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Direction",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Direction"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Status",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionStatus"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetProtocolInfo()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetProtocolInfo"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Source",
+ Direction = "out",
+ RelatedStateVariable = "SourceProtocolInfo"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Sink",
+ Direction = "out",
+ RelatedStateVariable = "SinkProtocolInfo"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetCurrentConnectionIDs()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetCurrentConnectionIDs"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ConnectionIDs",
+ Direction = "out",
+ RelatedStateVariable = "CurrentConnectionIDs"
+ });
+
+ return action;
+ }
+
+ private ServiceAction ConnectionComplete()
+ {
+ var action = new ServiceAction
+ {
+ Name = "ConnectionComplete"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ConnectionID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ConnectionID"
+ });
+
+ return action;
+ }
+ }
+}
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectory.cs b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
new file mode 100644
index 0000000000..e4cbb59f00
--- /dev/null
+++ b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
@@ -0,0 +1,133 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Globalization;
+
+namespace Emby.Dlna.ContentDirectory
+{
+ public class ContentDirectory : BaseService, IContentDirectory, IDisposable
+ {
+ private readonly ILibraryManager _libraryManager;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly IUserDataManager _userDataManager;
+ private readonly IDlnaManager _dlna;
+ private readonly IServerConfigurationManager _config;
+ private readonly IUserManager _userManager;
+ private readonly ILocalizationManager _localization;
+ private readonly IChannelManager _channelManager;
+ private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IUserViewManager _userViewManager;
+ private readonly Func<IMediaEncoder> _mediaEncoder;
+
+ public ContentDirectory(IDlnaManager dlna,
+ IUserDataManager userDataManager,
+ IImageProcessor imageProcessor,
+ ILibraryManager libraryManager,
+ IServerConfigurationManager config,
+ IUserManager userManager,
+ ILogger logger,
+ IHttpClient httpClient, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, Func<IMediaEncoder> mediaEncoder)
+ : base(logger, httpClient)
+ {
+ _dlna = dlna;
+ _userDataManager = userDataManager;
+ _imageProcessor = imageProcessor;
+ _libraryManager = libraryManager;
+ _config = config;
+ _userManager = userManager;
+ _localization = localization;
+ _channelManager = channelManager;
+ _mediaSourceManager = mediaSourceManager;
+ _userViewManager = userViewManager;
+ _mediaEncoder = mediaEncoder;
+ }
+
+ private int SystemUpdateId
+ {
+ get
+ {
+ var now = DateTime.UtcNow;
+
+ return now.Year + now.DayOfYear + now.Hour;
+ }
+ }
+
+ public string GetServiceXml(IDictionary<string, string> headers)
+ {
+ return new ContentDirectoryXmlBuilder().GetXml();
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ var profile = _dlna.GetProfile(request.Headers) ??
+ _dlna.GetDefaultProfile();
+
+ var serverAddress = request.RequestedUrl.Substring(0, request.RequestedUrl.IndexOf("/dlna", StringComparison.OrdinalIgnoreCase));
+ string accessToken = null;
+
+ var user = GetUser(profile);
+
+ return new ControlHandler(
+ Logger,
+ _libraryManager,
+ profile,
+ serverAddress,
+ accessToken,
+ _imageProcessor,
+ _userDataManager,
+ user,
+ SystemUpdateId,
+ _config,
+ _localization,
+ _channelManager,
+ _mediaSourceManager,
+ _userViewManager,
+ _mediaEncoder())
+ .ProcessControlRequest(request);
+ }
+
+ private User GetUser(DeviceProfile profile)
+ {
+ if (!string.IsNullOrEmpty(profile.UserId))
+ {
+ var user = _userManager.GetUserById(profile.UserId);
+
+ if (user != null)
+ {
+ return user;
+ }
+ }
+
+ var userId = _config.GetDlnaConfiguration().DefaultUserId;
+
+ if (!string.IsNullOrEmpty(userId))
+ {
+ var user = _userManager.GetUserById(userId);
+
+ if (user != null)
+ {
+ return user;
+ }
+ }
+
+ // No configuration so it's going to be pretty arbitrary
+ return _userManager.Users.First();
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs
new file mode 100644
index 0000000000..2b421794ab
--- /dev/null
+++ b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs
@@ -0,0 +1,126 @@
+using System.Linq;
+using System.Xml.Linq;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Querying;
+using System.Globalization;
+using System.IO;
+using System.Security;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Emby.Dlna.Server;
+
+namespace Emby.Dlna.ContentDirectory
+{
+ public class ContentDirectoryBrowser
+ {
+ private readonly IHttpClient _httpClient;
+ private readonly ILogger _logger;
+
+ public ContentDirectoryBrowser(IHttpClient httpClient, ILogger logger)
+ {
+ _httpClient = httpClient;
+ _logger = logger;
+ }
+
+ private static XNamespace UNamespace = "u";
+
+ public async Task<QueryResult<ChannelItemInfo>> Browse(ContentDirectoryBrowseRequest request, CancellationToken cancellationToken)
+ {
+ var options = new HttpRequestOptions
+ {
+ CancellationToken = cancellationToken,
+ UserAgent = "Emby",
+ RequestContentType = "text/xml; charset=\"utf-8\"",
+ LogErrorResponseBody = true,
+ Url = request.ContentDirectoryUrl,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["SOAPACTION"] = "urn:schemas-upnp-org:service:ContentDirectory:1#Browse";
+
+ options.RequestContent = GetRequestBody(request);
+
+ var response = await _httpClient.SendAsync(options, "POST");
+
+ using (var reader = new StreamReader(response.Content))
+ {
+ var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace);
+
+ var queryResult = new QueryResult<ChannelItemInfo>();
+
+ if (doc.Document == null)
+ return queryResult;
+
+ var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList();
+
+ var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null);
+ var countValue = countElement == null ? null : countElement.Value;
+
+ int count;
+ if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count))
+ {
+ queryResult.TotalRecordCount = count;
+
+ var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null);
+ var resultString = (string)resultElement;
+
+ if (resultElement != null)
+ {
+ var xElement = XElement.Parse(resultString);
+ }
+ }
+
+ return queryResult;
+ }
+ }
+
+ private string GetRequestBody(ContentDirectoryBrowseRequest request)
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+
+ builder.Append("<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>");
+ builder.Append("<u:Browse xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:1\">");
+
+ if (string.IsNullOrWhiteSpace(request.ParentId))
+ {
+ request.ParentId = "1";
+ }
+
+ builder.AppendFormat("<ObjectID>{0}</ObjectID>", DescriptionXmlBuilder.Escape(request.ParentId));
+ builder.Append("<BrowseFlag>BrowseDirectChildren</BrowseFlag>");
+
+ //builder.Append("<BrowseFlag>BrowseMetadata</BrowseFlag>");
+
+ builder.Append("<Filter>*</Filter>");
+
+ request.StartIndex = request.StartIndex ?? 0;
+ builder.AppendFormat("<StartingIndex>{0}</StartingIndex>", DescriptionXmlBuilder.Escape(request.StartIndex.Value.ToString(CultureInfo.InvariantCulture)));
+
+ request.Limit = request.Limit ?? 20;
+ if (request.Limit.HasValue)
+ {
+ builder.AppendFormat("<RequestedCount>{0}</RequestedCount>", DescriptionXmlBuilder.Escape(request.Limit.Value.ToString(CultureInfo.InvariantCulture)));
+ }
+
+ builder.Append("<SortCriteria></SortCriteria>");
+
+ builder.Append("</u:Browse>");
+ builder.Append("</s:Body></s:Envelope>");
+
+ return builder.ToString();
+ }
+ }
+
+ public class ContentDirectoryBrowseRequest
+ {
+ public int? StartIndex { get; set; }
+ public int? Limit { get; set; }
+ public string ParentId { get; set; }
+ public string ContentDirectoryUrl { get; set; }
+ }
+}
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs b/Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs
new file mode 100644
index 0000000000..7a9bc18ad8
--- /dev/null
+++ b/Emby.Dlna/ContentDirectory/ContentDirectoryXmlBuilder.cs
@@ -0,0 +1,147 @@
+using Emby.Dlna.Common;
+using Emby.Dlna.Service;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ContentDirectory
+{
+ public class ContentDirectoryXmlBuilder
+ {
+ public string GetXml()
+ {
+ return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(),
+ GetStateVariables());
+ }
+
+ private IEnumerable<StateVariable> GetStateVariables()
+ {
+ var list = new List<StateVariable>();
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Filter",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_SortCriteria",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Index",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Count",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_UpdateID",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "SearchCapabilities",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "SortCapabilities",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "SystemUpdateID",
+ DataType = "ui4",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_SearchCriteria",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Result",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_ObjectID",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_BrowseFlag",
+ DataType = "string",
+ SendsEvents = false,
+
+ AllowedValues = new List<string>
+ {
+ "BrowseMetadata",
+ "BrowseDirectChildren"
+ }
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_BrowseLetter",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_CategoryType",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_RID",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_PosSec",
+ DataType = "ui4",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Featurelist",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
new file mode 100644
index 0000000000..89260facae
--- /dev/null
+++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs
@@ -0,0 +1,588 @@
+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 Emby.Dlna.Didl;
+using Emby.Dlna.Server;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Querying;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Globalization;
+
+namespace Emby.Dlna.ContentDirectory
+{
+ public class ControlHandler : BaseControlHandler
+ {
+ private readonly ILibraryManager _libraryManager;
+ private readonly IChannelManager _channelManager;
+ private readonly IUserDataManager _userDataManager;
+ private readonly IServerConfigurationManager _config;
+ private readonly User _user;
+ private readonly IUserViewManager _userViewManager;
+ private readonly IMediaEncoder _mediaEncoder;
+
+ private const string NS_DC = "http://purl.org/dc/elements/1.1/";
+ private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
+ private const string NS_DLNA = "urn:schemas-dlna-org:metadata-1-0/";
+ private const string NS_UPNP = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+
+ private readonly int _systemUpdateId;
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ private readonly DidlBuilder _didlBuilder;
+
+ private readonly DeviceProfile _profile;
+
+ public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, string accessToken, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, IMediaEncoder mediaEncoder)
+ : base(config, logger)
+ {
+ _libraryManager = libraryManager;
+ _userDataManager = userDataManager;
+ _user = user;
+ _systemUpdateId = systemUpdateId;
+ _channelManager = channelManager;
+ _userViewManager = userViewManager;
+ _mediaEncoder = mediaEncoder;
+ _profile = profile;
+ _config = config;
+
+ _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, Logger, libraryManager, _mediaEncoder);
+ }
+
+ protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)
+ {
+ var deviceId = "test";
+
+ var user = _user;
+
+ if (string.Equals(methodName, "GetSearchCapabilities", StringComparison.OrdinalIgnoreCase))
+ return HandleGetSearchCapabilities();
+
+ if (string.Equals(methodName, "GetSortCapabilities", StringComparison.OrdinalIgnoreCase))
+ return HandleGetSortCapabilities();
+
+ if (string.Equals(methodName, "GetSortExtensionCapabilities", StringComparison.OrdinalIgnoreCase))
+ return HandleGetSortExtensionCapabilities();
+
+ if (string.Equals(methodName, "GetSystemUpdateID", StringComparison.OrdinalIgnoreCase))
+ return HandleGetSystemUpdateID();
+
+ if (string.Equals(methodName, "Browse", StringComparison.OrdinalIgnoreCase))
+ return HandleBrowse(methodParams, user, deviceId).Result;
+
+ if (string.Equals(methodName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase))
+ return HandleXGetFeatureList();
+
+ if (string.Equals(methodName, "GetFeatureList", StringComparison.OrdinalIgnoreCase))
+ return HandleGetFeatureList();
+
+ if (string.Equals(methodName, "X_SetBookmark", StringComparison.OrdinalIgnoreCase))
+ return HandleXSetBookmark(methodParams, user);
+
+ if (string.Equals(methodName, "Search", StringComparison.OrdinalIgnoreCase))
+ return HandleSearch(methodParams, user, deviceId).Result;
+
+ throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleXSetBookmark(IDictionary<string, string> sparams, User user)
+ {
+ var id = sparams["ObjectID"];
+
+ var serverItem = GetItemFromObjectId(id, user);
+
+ var item = serverItem.Item;
+
+ var newbookmark = int.Parse(sparams["PosSecond"], _usCulture);
+
+ var userdata = _userDataManager.GetUserData(user, item);
+
+ userdata.PlaybackPositionTicks = TimeSpan.FromSeconds(newbookmark).Ticks;
+
+ _userDataManager.SaveUserData(user.Id, item, userdata, UserDataSaveReason.TogglePlayed,
+ CancellationToken.None);
+
+ return new Headers();
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetSearchCapabilities()
+ {
+ return new Headers(true) { { "SearchCaps", "res@resolution,res@size,res@duration,dc:title,dc:creator,upnp:actor,upnp:artist,upnp:genre,upnp:album,dc:date,upnp:class,@id,@refID,@protocolInfo,upnp:author,dc:description,pv:avKeywords" } };
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetSortCapabilities()
+ {
+ return new Headers(true)
+ {
+ { "SortCaps", "res@duration,res@size,res@bitrate,dc:date,dc:title,dc:size,upnp:album,upnp:artist,upnp:albumArtist,upnp:episodeNumber,upnp:genre,upnp:originalTrackNumber,upnp:rating" }
+ };
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetSortExtensionCapabilities()
+ {
+ return new Headers(true)
+ {
+ { "SortExtensionCaps", "res@duration,res@size,res@bitrate,dc:date,dc:title,dc:size,upnp:album,upnp:artist,upnp:albumArtist,upnp:episodeNumber,upnp:genre,upnp:originalTrackNumber,upnp:rating" }
+ };
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetSystemUpdateID()
+ {
+ var headers = new Headers(true);
+ headers.Add("Id", _systemUpdateId.ToString(_usCulture));
+ return headers;
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleGetFeatureList()
+ {
+ return new Headers(true)
+ {
+ { "FeatureList", GetFeatureListXml() }
+ };
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleXGetFeatureList()
+ {
+ return new Headers(true)
+ {
+ { "FeatureList", GetFeatureListXml() }
+ };
+ }
+
+ private string GetFeatureListXml()
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ builder.Append("<Features xmlns=\"urn:schemas-upnp-org:av:avs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:schemas-upnp-org:av:avs http://www.upnp.org/schemas/av/avs.xsd\">");
+
+ builder.Append("<Feature name=\"samsung.com_BASICVIEW\" version=\"1\">");
+ builder.Append("<container id=\"I\" type=\"object.item.imageItem\"/>");
+ builder.Append("<container id=\"A\" type=\"object.item.audioItem\"/>");
+ builder.Append("<container id=\"V\" type=\"object.item.videoItem\"/>");
+ builder.Append("</Feature>");
+
+ builder.Append("</Features>");
+
+ return builder.ToString();
+ }
+
+ private async Task<IEnumerable<KeyValuePair<string, string>>> HandleBrowse(Headers sparams, User user, string deviceId)
+ {
+ var id = sparams["ObjectID"];
+ var flag = sparams["BrowseFlag"];
+ var filter = new Filter(sparams.GetValueOrDefault("Filter", "*"));
+ var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", ""));
+
+ var provided = 0;
+
+ // Default to null instead of 0
+ // Upnp inspector sends 0 as requestedCount when it wants everything
+ int? requestedCount = null;
+ int? start = 0;
+
+ int requestedVal;
+ if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0)
+ {
+ requestedCount = requestedVal;
+ }
+
+ int startVal;
+ if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0)
+ {
+ start = startVal;
+ }
+
+ //var root = GetItem(id) as IMediaFolder;
+ var result = new XmlDocument();
+
+ var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
+ didl.SetAttribute("xmlns:dc", NS_DC);
+ didl.SetAttribute("xmlns:dlna", NS_DLNA);
+ didl.SetAttribute("xmlns:upnp", NS_UPNP);
+ //didl.SetAttribute("xmlns:sec", NS_SEC);
+ result.AppendChild(didl);
+
+ var serverItem = GetItemFromObjectId(id, user);
+ var item = serverItem.Item;
+
+ int totalCount;
+
+ if (string.Equals(flag, "BrowseMetadata"))
+ {
+ totalCount = 1;
+
+ if (item.IsFolder || serverItem.StubType.HasValue)
+ {
+ var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount).ConfigureAwait(false));
+
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, item, serverItem.StubType, null, childrenResult.TotalRecordCount, filter, id));
+ }
+ else
+ {
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(_config.GetDlnaConfiguration(), result, item, null, null, deviceId, filter));
+ }
+
+ provided++;
+ }
+ else
+ {
+ var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount).ConfigureAwait(false));
+ totalCount = childrenResult.TotalRecordCount;
+
+ provided = childrenResult.Items.Length;
+
+ foreach (var i in childrenResult.Items)
+ {
+ var childItem = i.Item;
+ var displayStubType = i.StubType;
+
+ if (childItem.IsFolder || displayStubType.HasValue)
+ {
+ var childCount = (await GetUserItems(childItem, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false))
+ .TotalRecordCount;
+
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, childItem, displayStubType, item, childCount, filter));
+ }
+ else
+ {
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(_config.GetDlnaConfiguration(), result, childItem, item, serverItem.StubType, deviceId, filter));
+ }
+ }
+ }
+
+ var resXML = result.OuterXml;
+
+ return new List<KeyValuePair<string, string>>
+ {
+ new KeyValuePair<string,string>("Result", resXML),
+ new KeyValuePair<string,string>("NumberReturned", provided.ToString(_usCulture)),
+ new KeyValuePair<string,string>("TotalMatches", totalCount.ToString(_usCulture)),
+ new KeyValuePair<string,string>("UpdateID", _systemUpdateId.ToString(_usCulture))
+ };
+ }
+
+ private async Task<IEnumerable<KeyValuePair<string, string>>> HandleSearch(Headers sparams, User user, string deviceId)
+ {
+ var searchCriteria = new SearchCriteria(sparams.GetValueOrDefault("SearchCriteria", ""));
+ var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", ""));
+ var filter = new Filter(sparams.GetValueOrDefault("Filter", "*"));
+
+ // sort example: dc:title, dc:date
+
+ // Default to null instead of 0
+ // Upnp inspector sends 0 as requestedCount when it wants everything
+ int? requestedCount = null;
+ int? start = 0;
+
+ int requestedVal;
+ if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0)
+ {
+ requestedCount = requestedVal;
+ }
+
+ int startVal;
+ if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0)
+ {
+ start = startVal;
+ }
+
+ //var root = GetItem(id) as IMediaFolder;
+ var result = new XmlDocument();
+
+ var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
+ didl.SetAttribute("xmlns:dc", NS_DC);
+ didl.SetAttribute("xmlns:dlna", NS_DLNA);
+ didl.SetAttribute("xmlns:upnp", NS_UPNP);
+
+ foreach (var att in _profile.XmlRootAttributes)
+ {
+ didl.SetAttribute(att.Name, att.Value);
+ }
+
+ result.AppendChild(didl);
+
+ var serverItem = GetItemFromObjectId(sparams["ContainerID"], user);
+
+ var item = serverItem.Item;
+
+ var childrenResult = (await GetChildrenSorted(item, user, searchCriteria, sortCriteria, start, requestedCount).ConfigureAwait(false));
+
+ var totalCount = childrenResult.TotalRecordCount;
+
+ var provided = childrenResult.Items.Length;
+
+ foreach (var i in childrenResult.Items)
+ {
+ if (i.IsFolder)
+ {
+ var childCount = (await GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false))
+ .TotalRecordCount;
+
+ result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, i, null, item, childCount, filter));
+ }
+ else
+ {
+ result.DocumentElement.AppendChild(_didlBuilder.GetItemElement(_config.GetDlnaConfiguration(), result, i, item, serverItem.StubType, deviceId, filter));
+ }
+ }
+
+ var resXML = result.OuterXml;
+
+ return new List<KeyValuePair<string, string>>
+ {
+ new KeyValuePair<string,string>("Result", resXML),
+ new KeyValuePair<string,string>("NumberReturned", provided.ToString(_usCulture)),
+ new KeyValuePair<string,string>("TotalMatches", totalCount.ToString(_usCulture)),
+ new KeyValuePair<string,string>("UpdateID", _systemUpdateId.ToString(_usCulture))
+ };
+ }
+
+ private 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)
+ {
+ sortOrders.Add(ItemSortBy.SortName);
+ }
+
+ var mediaTypes = new List<string>();
+ bool? isFolder = null;
+
+ if (search.SearchType == SearchType.Audio)
+ {
+ mediaTypes.Add(MediaType.Audio);
+ isFolder = false;
+ }
+ else if (search.SearchType == SearchType.Video)
+ {
+ mediaTypes.Add(MediaType.Video);
+ isFolder = false;
+ }
+ else if (search.SearchType == SearchType.Image)
+ {
+ mediaTypes.Add(MediaType.Photo);
+ isFolder = false;
+ }
+ else if (search.SearchType == SearchType.Playlist)
+ {
+ //items = items.OfType<Playlist>();
+ isFolder = true;
+ }
+ else if (search.SearchType == SearchType.MusicAlbum)
+ {
+ //items = items.OfType<MusicAlbum>();
+ isFolder = true;
+ }
+
+ return folder.GetItems(new InternalItemsQuery
+ {
+ Limit = limit,
+ StartIndex = startIndex,
+ SortBy = sortOrders.ToArray(),
+ SortOrder = sort.SortOrder,
+ User = user,
+ Recursive = true,
+ IsMissing = false,
+ ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
+ IsFolder = isFolder,
+ MediaTypes = mediaTypes.ToArray()
+ });
+ }
+
+ private async Task<QueryResult<ServerItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit)
+ {
+ if (stubType.HasValue)
+ {
+ if (stubType.Value == StubType.People)
+ {
+ var items = _libraryManager.GetPeopleItems(new InternalPeopleQuery
+ {
+ ItemId = item.Id
+
+ }).ToArray();
+
+ var result = new QueryResult<ServerItem>
+ {
+ Items = items.Select(i => new ServerItem { Item = i, StubType = StubType.Folder }).ToArray(),
+ TotalRecordCount = items.Length
+ };
+
+ return ApplyPaging(result, startIndex, limit);
+ }
+
+ var person = item as Person;
+ if (person != null)
+ {
+ return GetItemsFromPerson(person, user, startIndex, limit);
+ }
+
+ return ApplyPaging(new QueryResult<ServerItem>(), startIndex, limit);
+ }
+
+ var folder = (Folder)item;
+
+ var sortOrders = new List<string>();
+ if (!folder.IsPreSorted)
+ {
+ sortOrders.Add(ItemSortBy.SortName);
+ }
+
+ var queryResult = await folder.GetItems(new InternalItemsQuery
+ {
+ Limit = limit,
+ StartIndex = startIndex,
+ SortBy = sortOrders.ToArray(),
+ SortOrder = sort.SortOrder,
+ User = user,
+ IsMissing = false,
+ PresetViews = new[] { CollectionType.Movies, CollectionType.TvShows, CollectionType.Music },
+ ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
+ IsPlaceHolder = false
+
+ }).ConfigureAwait(false);
+
+ var serverItems = queryResult
+ .Items
+ .Select(i => new ServerItem
+ {
+ Item = i
+ })
+ .ToArray();
+
+ return new QueryResult<ServerItem>
+ {
+ TotalRecordCount = queryResult.TotalRecordCount,
+ Items = serverItems
+ };
+ }
+
+ private QueryResult<ServerItem> GetItemsFromPerson(Person person, User user, int? startIndex, int? limit)
+ {
+ var itemsResult = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
+ {
+ Person = person.Name,
+ IncludeItemTypes = new[] { typeof(Movie).Name, typeof(Series).Name, typeof(Trailer).Name },
+ SortBy = new[] { ItemSortBy.SortName },
+ Limit = limit,
+ StartIndex = startIndex
+
+ });
+
+ var serverItems = itemsResult.Items.Select(i => new ServerItem
+ {
+ Item = i,
+ StubType = null
+ })
+ .ToArray();
+
+ return new QueryResult<ServerItem>
+ {
+ TotalRecordCount = itemsResult.TotalRecordCount,
+ 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 bool EnablePeopleDisplay(BaseItem item)
+ {
+ if (_libraryManager.GetPeopleNames(new InternalPeopleQuery
+ {
+ ItemId = item.Id
+
+ }).Count > 0)
+ {
+ return item is Movie;
+ }
+
+ return false;
+ }
+
+ private ServerItem GetItemFromObjectId(string id, User user)
+ {
+ return DidlBuilder.IsIdRoot(id)
+
+ ? new ServerItem { Item = user.RootFolder }
+ : ParseItemId(id, user);
+ }
+
+ private ServerItem ParseItemId(string id, User user)
+ {
+ Guid itemId;
+ StubType? stubType = null;
+
+ // After using PlayTo, MediaMonkey sends a request to the server trying to get item info
+ const string paramsSrch = "Params=";
+ var paramsIndex = id.IndexOf(paramsSrch, StringComparison.OrdinalIgnoreCase);
+ if (paramsIndex != -1)
+ {
+ id = id.Substring(paramsIndex + paramsSrch.Length);
+
+ var parts = id.Split(';');
+ id = parts[23];
+ }
+
+ if (id.StartsWith("folder_", StringComparison.OrdinalIgnoreCase))
+ {
+ 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))
+ {
+ 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 new ServerItem { Item = user.RootFolder };
+ }
+ }
+
+ internal class ServerItem
+ {
+ public BaseItem Item { get; set; }
+ public StubType? StubType { get; set; }
+ }
+
+ public enum StubType
+ {
+ Folder = 0,
+ People = 1
+ }
+}
diff --git a/Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs b/Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs
new file mode 100644
index 0000000000..8e3821e7c8
--- /dev/null
+++ b/Emby.Dlna/ContentDirectory/ServiceActionListBuilder.cs
@@ -0,0 +1,378 @@
+using Emby.Dlna.Common;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.ContentDirectory
+{
+ public class ServiceActionListBuilder
+ {
+ public IEnumerable<ServiceAction> GetActions()
+ {
+ var list = new List<ServiceAction>
+ {
+ GetSearchCapabilitiesAction(),
+ GetSortCapabilitiesAction(),
+ GetGetSystemUpdateIDAction(),
+ GetBrowseAction(),
+ GetSearchAction(),
+ GetX_GetFeatureListAction(),
+ GetXSetBookmarkAction(),
+ GetBrowseByLetterAction()
+ };
+
+ return list;
+ }
+
+ private ServiceAction GetGetSystemUpdateIDAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetSystemUpdateID"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Id",
+ Direction = "out",
+ RelatedStateVariable = "SystemUpdateID"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetSearchCapabilitiesAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetSearchCapabilities"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SearchCaps",
+ Direction = "out",
+ RelatedStateVariable = "SearchCapabilities"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetSortCapabilitiesAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetSortCapabilities"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCaps",
+ Direction = "out",
+ RelatedStateVariable = "SortCapabilities"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetX_GetFeatureListAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "X_GetFeatureList"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "FeatureList",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Featurelist"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetSearchAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "Search"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ContainerID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SearchCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SearchCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Filter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Filter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingIndex",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Index"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RequestedCount",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Result"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "NumberReturned",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "TotalMatches",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "UpdateID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_UpdateID"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetBrowseAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "Browse"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ObjectID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "BrowseFlag",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_BrowseFlag"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Filter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Filter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingIndex",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Index"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RequestedCount",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Result"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "NumberReturned",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "TotalMatches",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "UpdateID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_UpdateID"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetBrowseByLetterAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "X_BrowseByLetter"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ObjectID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "BrowseFlag",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_BrowseFlag"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Filter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Filter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingLetter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_BrowseLetter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RequestedCount",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Result"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "NumberReturned",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "TotalMatches",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "UpdateID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_UpdateID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingIndex",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Index"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetXSetBookmarkAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "X_SetBookmark"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "CategoryType",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_CategoryType"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_RID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ObjectID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "PosSecond",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_PosSec"
+ });
+
+ return action;
+ }
+ }
+}
diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs
new file mode 100644
index 0000000000..dabd11510a
--- /dev/null
+++ b/Emby.Dlna/Didl/DidlBuilder.cs
@@ -0,0 +1,1163 @@
+using MediaBrowser.Model.Extensions;
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Playlists;
+using Emby.Dlna.ContentDirectory;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Drawing;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
+using System;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Globalization;
+
+namespace Emby.Dlna.Didl
+{
+ public class DidlBuilder
+ {
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
+ private const string NS_DC = "http://purl.org/dc/elements/1.1/";
+ private const string NS_UPNP = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+ private const string NS_DLNA = "urn:schemas-dlna-org:metadata-1-0/";
+
+ private readonly DeviceProfile _profile;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly string _serverAddress;
+ private readonly string _accessToken;
+ private readonly User _user;
+ private readonly IUserDataManager _userDataManager;
+ private readonly ILocalizationManager _localization;
+ private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly ILogger _logger;
+ private readonly ILibraryManager _libraryManager;
+ private readonly IMediaEncoder _mediaEncoder;
+
+ public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, ILogger logger, ILibraryManager libraryManager, IMediaEncoder mediaEncoder)
+ {
+ _profile = profile;
+ _imageProcessor = imageProcessor;
+ _serverAddress = serverAddress;
+ _userDataManager = userDataManager;
+ _localization = localization;
+ _mediaSourceManager = mediaSourceManager;
+ _logger = logger;
+ _libraryManager = libraryManager;
+ _mediaEncoder = mediaEncoder;
+ _accessToken = accessToken;
+ _user = user;
+ }
+
+ public string GetItemDidl(DlnaOptions options, BaseItem item, BaseItem context, string deviceId, Filter filter, StreamInfo streamInfo)
+ {
+ var result = new XmlDocument();
+
+ var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
+ didl.SetAttribute("xmlns:dc", NS_DC);
+ didl.SetAttribute("xmlns:dlna", NS_DLNA);
+ didl.SetAttribute("xmlns:upnp", NS_UPNP);
+ //didl.SetAttribute("xmlns:sec", NS_SEC);
+
+ foreach (var att in _profile.XmlRootAttributes)
+ {
+ didl.SetAttribute(att.Name, att.Value);
+ }
+
+ result.AppendChild(didl);
+
+ result.DocumentElement.AppendChild(GetItemElement(options, result, item, context, null, deviceId, filter, streamInfo));
+
+ return result.DocumentElement.OuterXml;
+ }
+
+ public XmlElement GetItemElement(DlnaOptions options, XmlDocument doc, BaseItem item, BaseItem context, StubType? contextStubType, string deviceId, Filter filter, StreamInfo streamInfo = null)
+ {
+ var clientId = GetClientId(item, null);
+
+ var element = doc.CreateElement(string.Empty, "item", NS_DIDL);
+ element.SetAttribute("restricted", "1");
+ element.SetAttribute("id", clientId);
+
+ if (context != null)
+ {
+ element.SetAttribute("parentID", GetClientId(context, contextStubType));
+ }
+ else
+ {
+ var parent = item.DisplayParentId;
+ if (parent.HasValue)
+ {
+ element.SetAttribute("parentID", GetClientId(parent.Value, null));
+ }
+ }
+
+ //AddBookmarkInfo(item, user, element);
+
+ AddGeneralProperties(item, null, context, element, filter);
+
+ // refID?
+ // storeAttribute(itemNode, object, ClassProperties.REF_ID, false);
+
+ var hasMediaSources = item as IHasMediaSources;
+
+ if (hasMediaSources != null)
+ {
+ if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
+ {
+ AddAudioResource(options, element, hasMediaSources, deviceId, filter, streamInfo);
+ }
+ else if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ {
+ AddVideoResource(options, element, hasMediaSources, deviceId, filter, streamInfo);
+ }
+ }
+
+ AddCover(item, context, null, element);
+
+ return element;
+ }
+
+ private ILogger GetStreamBuilderLogger(DlnaOptions options)
+ {
+ if (options.EnableDebugLog)
+ {
+ return _logger;
+ }
+
+ return new NullLogger();
+ }
+
+ private void AddVideoResource(DlnaOptions options, XmlElement container, IHasMediaSources video, string deviceId, Filter filter, StreamInfo streamInfo = null)
+ {
+ if (streamInfo == null)
+ {
+ var sources = _mediaSourceManager.GetStaticMediaSources(video, true, _user).ToList();
+
+ streamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger(options)).BuildVideoItem(new VideoOptions
+ {
+ ItemId = GetClientId(video),
+ MediaSources = sources,
+ Profile = _profile,
+ DeviceId = deviceId,
+ MaxBitrate = _profile.MaxStreamingBitrate
+ });
+ }
+
+ var targetWidth = streamInfo.TargetWidth;
+ var targetHeight = streamInfo.TargetHeight;
+
+ var contentFeatureList = new ContentFeatureBuilder(_profile).BuildVideoHeader(streamInfo.Container,
+ streamInfo.VideoCodec,
+ streamInfo.TargetAudioCodec,
+ targetWidth,
+ targetHeight,
+ streamInfo.TargetVideoBitDepth,
+ streamInfo.TargetVideoBitrate,
+ streamInfo.TargetTimestamp,
+ streamInfo.IsDirectStream,
+ streamInfo.RunTimeTicks,
+ streamInfo.TargetVideoProfile,
+ streamInfo.TargetVideoLevel,
+ streamInfo.TargetFramerate,
+ streamInfo.TargetPacketLength,
+ streamInfo.TranscodeSeekInfo,
+ streamInfo.IsTargetAnamorphic,
+ streamInfo.TargetRefFrames,
+ streamInfo.TargetVideoStreamCount,
+ streamInfo.TargetAudioStreamCount,
+ streamInfo.TargetVideoCodecTag,
+ streamInfo.IsTargetAVC);
+
+ foreach (var contentFeature in contentFeatureList)
+ {
+ AddVideoResource(container, video, deviceId, filter, contentFeature, streamInfo);
+ }
+
+ foreach (var subtitle in streamInfo.GetSubtitleProfiles(false, _serverAddress, _accessToken))
+ {
+ if (subtitle.DeliveryMethod == SubtitleDeliveryMethod.External)
+ {
+ var subtitleAdded = AddSubtitleElement(container, subtitle);
+
+ if (subtitleAdded && _profile.EnableSingleSubtitleLimit)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ private bool AddSubtitleElement(XmlElement container, SubtitleStreamInfo info)
+ {
+ var subtitleProfile = _profile.SubtitleProfiles
+ .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase) && i.Method == SubtitleDeliveryMethod.External);
+
+ if (subtitleProfile == null)
+ {
+ return false;
+ }
+
+ var subtitleMode = subtitleProfile.DidlMode;
+
+ if (string.Equals(subtitleMode, "CaptionInfoEx", StringComparison.OrdinalIgnoreCase))
+ {
+ // <sec:CaptionInfoEx sec:type="srt">http://192.168.1.3:9999/video.srt</sec:CaptionInfoEx>
+ // <sec:CaptionInfo sec:type="srt">http://192.168.1.3:9999/video.srt</sec:CaptionInfo>
+
+ var res = container.OwnerDocument.CreateElement("CaptionInfoEx", "sec");
+
+ res.InnerText = info.Url;
+
+ //// TODO: attribute needs SEC:
+ res.SetAttribute("type", "sec", info.Format.ToLower());
+ container.AppendChild(res);
+ }
+ else if (string.Equals(subtitleMode, "smi", StringComparison.OrdinalIgnoreCase))
+ {
+ var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
+
+ res.InnerText = info.Url;
+
+ res.SetAttribute("protocolInfo", "http-get:*:smi/caption:*");
+
+ container.AppendChild(res);
+ }
+ else
+ {
+ var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
+
+ res.InnerText = info.Url;
+
+ var protocolInfo = string.Format("http-get:*:text/{0}:*", info.Format.ToLower());
+ res.SetAttribute("protocolInfo", protocolInfo);
+
+ container.AppendChild(res);
+ }
+
+ return true;
+ }
+
+ private void AddVideoResource(XmlElement container, IHasMediaSources video, string deviceId, Filter filter, string contentFeatures, StreamInfo streamInfo)
+ {
+ var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
+
+ var url = streamInfo.ToDlnaUrl(_serverAddress, _accessToken);
+
+ res.InnerText = url;
+
+ var mediaSource = streamInfo.MediaSource;
+
+ if (mediaSource.RunTimeTicks.HasValue)
+ {
+ res.SetAttribute("duration", TimeSpan.FromTicks(mediaSource.RunTimeTicks.Value).ToString("c", _usCulture));
+ }
+
+ if (filter.Contains("res@size"))
+ {
+ if (streamInfo.IsDirectStream || streamInfo.EstimateContentLength)
+ {
+ var size = streamInfo.TargetSize;
+
+ if (size.HasValue)
+ {
+ res.SetAttribute("size", size.Value.ToString(_usCulture));
+ }
+ }
+ }
+
+ var totalBitrate = streamInfo.TargetTotalBitrate;
+ var targetSampleRate = streamInfo.TargetAudioSampleRate;
+ var targetChannels = streamInfo.TargetAudioChannels;
+
+ var targetWidth = streamInfo.TargetWidth;
+ var targetHeight = streamInfo.TargetHeight;
+
+ if (targetChannels.HasValue)
+ {
+ res.SetAttribute("nrAudioChannels", targetChannels.Value.ToString(_usCulture));
+ }
+
+ if (filter.Contains("res@resolution"))
+ {
+ if (targetWidth.HasValue && targetHeight.HasValue)
+ {
+ res.SetAttribute("resolution", string.Format("{0}x{1}", targetWidth.Value, targetHeight.Value));
+ }
+ }
+
+ if (targetSampleRate.HasValue)
+ {
+ res.SetAttribute("sampleFrequency", targetSampleRate.Value.ToString(_usCulture));
+ }
+
+ if (totalBitrate.HasValue)
+ {
+ res.SetAttribute("bitrate", totalBitrate.Value.ToString(_usCulture));
+ }
+
+ var mediaProfile = _profile.GetVideoMediaProfile(streamInfo.Container,
+ streamInfo.TargetAudioCodec,
+ streamInfo.VideoCodec,
+ streamInfo.TargetAudioBitrate,
+ targetWidth,
+ targetHeight,
+ streamInfo.TargetVideoBitDepth,
+ streamInfo.TargetVideoProfile,
+ streamInfo.TargetVideoLevel,
+ streamInfo.TargetFramerate,
+ streamInfo.TargetPacketLength,
+ streamInfo.TargetTimestamp,
+ streamInfo.IsTargetAnamorphic,
+ streamInfo.TargetRefFrames,
+ streamInfo.TargetVideoStreamCount,
+ streamInfo.TargetAudioStreamCount,
+ streamInfo.TargetVideoCodecTag,
+ streamInfo.IsTargetAVC);
+
+ var filename = url.Substring(0, url.IndexOf('?'));
+
+ var mimeType = mediaProfile == null || string.IsNullOrEmpty(mediaProfile.MimeType)
+ ? MimeTypes.GetMimeType(filename)
+ : mediaProfile.MimeType;
+
+ res.SetAttribute("protocolInfo", String.Format(
+ "http-get:*:{0}:{1}",
+ mimeType,
+ contentFeatures
+ ));
+
+ container.AppendChild(res);
+ }
+
+ private string GetDisplayName(BaseItem item, StubType? itemStubType, BaseItem context)
+ {
+ if (itemStubType.HasValue && itemStubType.Value == StubType.People)
+ {
+ if (item is Video)
+ {
+ return _localization.GetLocalizedString("HeaderCastCrew");
+ }
+ return _localization.GetLocalizedString("HeaderPeople");
+ }
+
+ var episode = item as Episode;
+ var season = context as Season;
+
+ if (episode != null && season != null)
+ {
+ // This is a special embedded within a season
+ if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0)
+ {
+ if (season.IndexNumber.HasValue && season.IndexNumber.Value != 0)
+ {
+ return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name);
+ }
+ }
+
+ if (item.IndexNumber.HasValue)
+ {
+ var number = item.IndexNumber.Value.ToString("00", CultureInfo.InvariantCulture);
+
+ if (episode.IndexNumberEnd.HasValue)
+ {
+ number += "-" + episode.IndexNumberEnd.Value.ToString("00", CultureInfo.InvariantCulture);
+ }
+
+ return number + " - " + item.Name;
+ }
+ }
+
+ return item.Name;
+ }
+
+ private void AddAudioResource(DlnaOptions options, XmlElement container, IHasMediaSources audio, string deviceId, Filter filter, StreamInfo streamInfo = null)
+ {
+ var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
+
+ if (streamInfo == null)
+ {
+ var sources = _mediaSourceManager.GetStaticMediaSources(audio, true, _user).ToList();
+
+ streamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger(options)).BuildAudioItem(new AudioOptions
+ {
+ ItemId = GetClientId(audio),
+ MediaSources = sources,
+ Profile = _profile,
+ DeviceId = deviceId
+ });
+ }
+
+ var url = streamInfo.ToDlnaUrl(_serverAddress, _accessToken);
+
+ res.InnerText = url;
+
+ var mediaSource = streamInfo.MediaSource;
+
+ if (mediaSource.RunTimeTicks.HasValue)
+ {
+ res.SetAttribute("duration", TimeSpan.FromTicks(mediaSource.RunTimeTicks.Value).ToString("c", _usCulture));
+ }
+
+ if (filter.Contains("res@size"))
+ {
+ if (streamInfo.IsDirectStream || streamInfo.EstimateContentLength)
+ {
+ var size = streamInfo.TargetSize;
+
+ if (size.HasValue)
+ {
+ res.SetAttribute("size", size.Value.ToString(_usCulture));
+ }
+ }
+ }
+
+ var targetAudioBitrate = streamInfo.TargetAudioBitrate;
+ var targetSampleRate = streamInfo.TargetAudioSampleRate;
+ var targetChannels = streamInfo.TargetAudioChannels;
+
+ if (targetChannels.HasValue)
+ {
+ res.SetAttribute("nrAudioChannels", targetChannels.Value.ToString(_usCulture));
+ }
+
+ if (targetSampleRate.HasValue)
+ {
+ res.SetAttribute("sampleFrequency", targetSampleRate.Value.ToString(_usCulture));
+ }
+
+ if (targetAudioBitrate.HasValue)
+ {
+ res.SetAttribute("bitrate", targetAudioBitrate.Value.ToString(_usCulture));
+ }
+
+ var mediaProfile = _profile.GetAudioMediaProfile(streamInfo.Container,
+ streamInfo.TargetAudioCodec,
+ targetChannels,
+ targetAudioBitrate);
+
+ var filename = url.Substring(0, url.IndexOf('?'));
+
+ var mimeType = mediaProfile == null || string.IsNullOrEmpty(mediaProfile.MimeType)
+ ? MimeTypes.GetMimeType(filename)
+ : mediaProfile.MimeType;
+
+ var contentFeatures = new ContentFeatureBuilder(_profile).BuildAudioHeader(streamInfo.Container,
+ streamInfo.TargetAudioCodec,
+ targetAudioBitrate,
+ targetSampleRate,
+ targetChannels,
+ streamInfo.IsDirectStream,
+ streamInfo.RunTimeTicks,
+ streamInfo.TranscodeSeekInfo);
+
+ res.SetAttribute("protocolInfo", String.Format(
+ "http-get:*:{0}:{1}",
+ mimeType,
+ contentFeatures
+ ));
+
+ container.AppendChild(res);
+ }
+
+ public static bool IsIdRoot(string id)
+ {
+ if (string.IsNullOrWhiteSpace(id) ||
+
+ string.Equals(id, "0", StringComparison.OrdinalIgnoreCase)
+
+ // Samsung sometimes uses 1 as root
+ || string.Equals(id, "1", StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public XmlElement GetFolderElement(XmlDocument doc, BaseItem folder, StubType? stubType, BaseItem context, int childCount, Filter filter, string requestedId = null)
+ {
+ var container = doc.CreateElement(string.Empty, "container", NS_DIDL);
+ container.SetAttribute("restricted", "0");
+ container.SetAttribute("searchable", "1");
+ container.SetAttribute("childCount", childCount.ToString(_usCulture));
+
+ var clientId = GetClientId(folder, stubType);
+
+ if (string.Equals(requestedId, "0"))
+ {
+ container.SetAttribute("id", "0");
+ container.SetAttribute("parentID", "-1");
+ }
+ else
+ {
+ container.SetAttribute("id", clientId);
+
+ if (context != null)
+ {
+ container.SetAttribute("parentID", GetClientId(context, null));
+ }
+ else
+ {
+ var parent = folder.DisplayParentId;
+ if (!parent.HasValue)
+ {
+ container.SetAttribute("parentID", "0");
+ }
+ else
+ {
+ container.SetAttribute("parentID", GetClientId(parent.Value, null));
+ }
+ }
+ }
+
+ AddCommonFields(folder, stubType, null, container, filter);
+
+ AddCover(folder, context, stubType, container);
+
+ return container;
+ }
+
+ //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);
+ // }
+ //}
+
+ /// <summary>
+ /// Adds fields used by both items and folders
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="itemStubType">Type of the item stub.</param>
+ /// <param name="context">The context.</param>
+ /// <param name="element">The element.</param>
+ /// <param name="filter">The filter.</param>
+ private void AddCommonFields(BaseItem item, StubType? itemStubType, BaseItem context, XmlElement element, Filter filter)
+ {
+ // Don't filter on dc:title because not all devices will include it in the filter
+ // MediaMonkey for example won't display content without a title
+ //if (filter.Contains("dc:title"))
+ {
+ AddValue(element, "dc", "title", GetDisplayName(item, itemStubType, context), NS_DC);
+ }
+
+ element.AppendChild(CreateObjectClass(element.OwnerDocument, item, itemStubType));
+
+ if (filter.Contains("dc:date"))
+ {
+ if (item.PremiereDate.HasValue)
+ {
+ AddValue(element, "dc", "date", item.PremiereDate.Value.ToString("o"), NS_DC);
+ }
+ }
+
+ if (filter.Contains("upnp:genre"))
+ {
+ foreach (var genre in item.Genres)
+ {
+ AddValue(element, "upnp", "genre", genre, NS_UPNP);
+ }
+ }
+
+ foreach (var studio in item.Studios)
+ {
+ AddValue(element, "upnp", "publisher", studio, NS_UPNP);
+ }
+
+ if (filter.Contains("dc:description"))
+ {
+ var desc = item.Overview;
+
+ if (!string.IsNullOrEmpty(item.ShortOverview))
+ {
+ desc = item.ShortOverview;
+ }
+
+ if (!string.IsNullOrWhiteSpace(desc))
+ {
+ AddValue(element, "dc", "description", desc, NS_DC);
+ }
+ }
+ if (filter.Contains("upnp:longDescription"))
+ {
+ if (!string.IsNullOrWhiteSpace(item.Overview))
+ {
+ AddValue(element, "upnp", "longDescription", item.Overview, NS_UPNP);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(item.OfficialRating))
+ {
+ if (filter.Contains("dc:rating"))
+ {
+ AddValue(element, "dc", "rating", item.OfficialRating, NS_DC);
+ }
+ if (filter.Contains("upnp:rating"))
+ {
+ AddValue(element, "upnp", "rating", item.OfficialRating, NS_UPNP);
+ }
+ }
+
+ AddPeople(item, element);
+ }
+
+ private XmlElement CreateObjectClass(XmlDocument result, BaseItem item, StubType? stubType)
+ {
+ // More types here
+ // http://oss.linn.co.uk/repos/Public/LibUpnpCil/DidlLite/UpnpAv/Test/TestDidlLite.cs
+
+ var objectClass = result.CreateElement("upnp", "class", NS_UPNP);
+
+ if (item.IsFolder || stubType.HasValue)
+ {
+ string classType = null;
+
+ if (!_profile.RequiresPlainFolders)
+ {
+ if (item is MusicAlbum)
+ {
+ classType = "object.container.album.musicAlbum";
+ }
+ else if (item is MusicArtist)
+ {
+ classType = "object.container.person.musicArtist";
+ }
+ else if (item is Series || item is Season || item is BoxSet || item is Video)
+ {
+ classType = "object.container.album.videoAlbum";
+ }
+ else if (item is Playlist)
+ {
+ classType = "object.container.playlistContainer";
+ }
+ else if (item is PhotoAlbum)
+ {
+ classType = "object.container.album.photoAlbum";
+ }
+ }
+
+ objectClass.InnerText = classType ?? "object.container.storageFolder";
+ }
+ else if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
+ {
+ objectClass.InnerText = "object.item.audioItem.musicTrack";
+ }
+ else if (string.Equals(item.MediaType, MediaType.Photo, StringComparison.OrdinalIgnoreCase))
+ {
+ objectClass.InnerText = "object.item.imageItem.photo";
+ }
+ else if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ {
+ if (!_profile.RequiresPlainVideoItems && item is Movie)
+ {
+ objectClass.InnerText = "object.item.videoItem.movie";
+ }
+ else if (!_profile.RequiresPlainVideoItems && item is MusicVideo)
+ {
+ objectClass.InnerText = "object.item.videoItem.musicVideoClip";
+ }
+ else
+ {
+ objectClass.InnerText = "object.item.videoItem";
+ }
+ }
+ else if (item is MusicGenre)
+ {
+ objectClass.InnerText = _profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre.musicGenre";
+ }
+ else if (item is Genre || item is GameGenre)
+ {
+ objectClass.InnerText = _profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre";
+ }
+ else
+ {
+ objectClass.InnerText = "object.item";
+ }
+
+ return objectClass;
+ }
+
+ private void AddPeople(BaseItem item, XmlElement element)
+ {
+ var types = new[]
+ {
+ PersonType.Director,
+ PersonType.Writer,
+ PersonType.Producer,
+ PersonType.Composer,
+ "Creator"
+ };
+
+ var people = _libraryManager.GetPeople(item);
+
+ var index = 0;
+
+ // Seeing some LG models locking up due content with large lists of people
+ // The actual issue might just be due to processing a more metadata than it can handle
+ var limit = 10;
+
+ foreach (var actor in people)
+ {
+ var type = types.FirstOrDefault(i => string.Equals(i, actor.Type, StringComparison.OrdinalIgnoreCase) || string.Equals(i, actor.Role, StringComparison.OrdinalIgnoreCase))
+ ?? PersonType.Actor;
+
+ AddValue(element, "upnp", type.ToLower(), actor.Name, NS_UPNP);
+
+ index++;
+
+ if (index >= limit)
+ {
+ break;
+ }
+ }
+ }
+
+ private void AddGeneralProperties(BaseItem item, StubType? itemStubType, BaseItem context, XmlElement element, Filter filter)
+ {
+ AddCommonFields(item, itemStubType, context, element, filter);
+
+ var audio = item as Audio;
+
+ if (audio != null)
+ {
+ foreach (var artist in audio.Artists)
+ {
+ AddValue(element, "upnp", "artist", artist, NS_UPNP);
+ }
+
+ if (!string.IsNullOrEmpty(audio.Album))
+ {
+ AddValue(element, "upnp", "album", audio.Album, NS_UPNP);
+ }
+
+ foreach (var artist in audio.AlbumArtists)
+ {
+ AddAlbumArtist(element, artist);
+ }
+ }
+
+ var album = item as MusicAlbum;
+
+ if (album != null)
+ {
+ foreach (var artist in album.AlbumArtists)
+ {
+ AddAlbumArtist(element, artist);
+ AddValue(element, "upnp", "artist", artist, NS_UPNP);
+ }
+ foreach (var artist in album.Artists)
+ {
+ AddValue(element, "upnp", "artist", artist, NS_UPNP);
+ }
+ }
+
+ var musicVideo = item as MusicVideo;
+
+ if (musicVideo != null)
+ {
+ foreach (var artist in musicVideo.Artists)
+ {
+ AddValue(element, "upnp", "artist", artist, NS_UPNP);
+ AddAlbumArtist(element, artist);
+ }
+
+ if (!string.IsNullOrEmpty(musicVideo.Album))
+ {
+ AddValue(element, "upnp", "album", musicVideo.Album, NS_UPNP);
+ }
+ }
+
+ if (item.IndexNumber.HasValue)
+ {
+ AddValue(element, "upnp", "originalTrackNumber", item.IndexNumber.Value.ToString(_usCulture), NS_UPNP);
+
+ if (item is Episode)
+ {
+ AddValue(element, "upnp", "episodeNumber", item.IndexNumber.Value.ToString(_usCulture), NS_UPNP);
+ }
+ }
+ }
+
+ private void AddAlbumArtist(XmlElement elem, string name)
+ {
+ try
+ {
+ var newNode = elem.OwnerDocument.CreateElement("upnp", "artist", NS_UPNP);
+ newNode.InnerText = name;
+
+ newNode.SetAttribute("role", "AlbumArtist");
+
+ elem.AppendChild(newNode);
+ }
+ catch (XmlException)
+ {
+ //_logger.Error("Error adding xml value: " + value);
+ }
+ }
+
+ private void AddValue(XmlElement elem, string prefix, string name, string value, string namespaceUri)
+ {
+ try
+ {
+ var date = elem.OwnerDocument.CreateElement(prefix, name, namespaceUri);
+ date.InnerText = value;
+ elem.AppendChild(date);
+ }
+ catch (XmlException)
+ {
+ //_logger.Error("Error adding xml value: " + value);
+ }
+ }
+
+ private void AddCover(BaseItem item, BaseItem context, StubType? stubType, XmlElement element)
+ {
+ if (stubType.HasValue && stubType.Value == StubType.People)
+ {
+ AddEmbeddedImageAsCover("people", element);
+ return;
+ }
+
+ ImageDownloadInfo imageInfo = null;
+
+ if (context is UserView)
+ {
+ var episode = item as Episode;
+ if (episode != null)
+ {
+ var parent = episode.Series;
+ if (parent != null)
+ {
+ imageInfo = GetImageInfo(parent);
+ }
+ }
+ }
+
+ // Finally, just use the image from the item
+ if (imageInfo == null)
+ {
+ imageInfo = GetImageInfo(item);
+ }
+
+ if (imageInfo == null)
+ {
+ return;
+ }
+
+ var result = element.OwnerDocument;
+
+ var playbackPercentage = 0;
+ var unplayedCount = 0;
+
+ if (item is Video)
+ {
+ var userData = _userDataManager.GetUserDataDto(item, _user).Result;
+
+ playbackPercentage = Convert.ToInt32(userData.PlayedPercentage ?? 0);
+ if (playbackPercentage >= 100 || userData.Played)
+ {
+ playbackPercentage = 100;
+ }
+ }
+ else if (item is Series || item is Season || item is BoxSet)
+ {
+ var userData = _userDataManager.GetUserDataDto(item, _user).Result;
+
+ if (userData.Played)
+ {
+ playbackPercentage = 100;
+ }
+ else
+ {
+ unplayedCount = userData.UnplayedItemCount ?? 0;
+ }
+ }
+
+ var albumartUrlInfo = GetImageUrl(imageInfo, _profile.MaxAlbumArtWidth, _profile.MaxAlbumArtHeight, playbackPercentage, unplayedCount, "jpg");
+
+ var icon = result.CreateElement("upnp", "albumArtURI", NS_UPNP);
+ var profile = result.CreateAttribute("dlna", "profileID", NS_DLNA);
+ profile.InnerText = _profile.AlbumArtPn;
+ icon.SetAttributeNode(profile);
+ icon.InnerText = albumartUrlInfo.Url;
+ element.AppendChild(icon);
+
+ // TOOD: Remove these default values
+ var iconUrlInfo = GetImageUrl(imageInfo, _profile.MaxIconWidth ?? 48, _profile.MaxIconHeight ?? 48, playbackPercentage, unplayedCount, "jpg");
+ icon = result.CreateElement("upnp", "icon", NS_UPNP);
+ icon.InnerText = iconUrlInfo.Url;
+ element.AppendChild(icon);
+
+ if (!_profile.EnableAlbumArtInDidl)
+ {
+ if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase)
+ || string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ {
+ if (!stubType.HasValue)
+ {
+ return;
+ }
+ }
+ }
+
+ AddImageResElement(item, element, 160, 160, playbackPercentage, unplayedCount, "jpg", "JPEG_TN");
+
+ if (!_profile.EnableSingleAlbumArtLimit)
+ {
+ AddImageResElement(item, element, 4096, 4096, playbackPercentage, unplayedCount, "jpg", "JPEG_LRG");
+ AddImageResElement(item, element, 1024, 768, playbackPercentage, unplayedCount, "jpg", "JPEG_MED");
+ AddImageResElement(item, element, 640, 480, playbackPercentage, unplayedCount, "jpg", "JPEG_SM");
+ AddImageResElement(item, element, 4096, 4096, playbackPercentage, unplayedCount, "png", "PNG_LRG");
+ AddImageResElement(item, element, 160, 160, playbackPercentage, unplayedCount, "png", "PNG_TN");
+ }
+ }
+
+ private void AddEmbeddedImageAsCover(string name, XmlElement element)
+ {
+ var result = element.OwnerDocument;
+
+ var icon = result.CreateElement("upnp", "albumArtURI", NS_UPNP);
+ var profile = result.CreateAttribute("dlna", "profileID", NS_DLNA);
+ profile.InnerText = _profile.AlbumArtPn;
+ icon.SetAttributeNode(profile);
+ icon.InnerText = _serverAddress + "/Dlna/icons/people480.jpg";
+ element.AppendChild(icon);
+
+ icon = result.CreateElement("upnp", "icon", NS_UPNP);
+ icon.InnerText = _serverAddress + "/Dlna/icons/people48.jpg";
+ element.AppendChild(icon);
+ }
+
+ private void AddImageResElement(BaseItem item,
+ XmlElement element,
+ int maxWidth,
+ int maxHeight,
+ int playbackPercentage,
+ int unplayedCount,
+ string format,
+ string org_Pn)
+ {
+ var imageInfo = GetImageInfo(item);
+
+ if (imageInfo == null)
+ {
+ return;
+ }
+
+ var result = element.OwnerDocument;
+
+ var albumartUrlInfo = GetImageUrl(imageInfo, maxWidth, maxHeight, playbackPercentage, unplayedCount, format);
+
+ var res = result.CreateElement(string.Empty, "res", NS_DIDL);
+
+ res.InnerText = albumartUrlInfo.Url;
+
+ var width = albumartUrlInfo.Width;
+ var height = albumartUrlInfo.Height;
+
+ var contentFeatures = new ContentFeatureBuilder(_profile)
+ .BuildImageHeader(format, width, height, imageInfo.IsDirectStream, org_Pn);
+
+ res.SetAttribute("protocolInfo", String.Format(
+ "http-get:*:{0}:{1}",
+ MimeTypes.GetMimeType("file." + format),
+ contentFeatures
+ ));
+
+ if (width.HasValue && height.HasValue)
+ {
+ res.SetAttribute("resolution", string.Format("{0}x{1}", width.Value, height.Value));
+ }
+
+ element.AppendChild(res);
+ }
+
+ private ImageDownloadInfo GetImageInfo(BaseItem item)
+ {
+ if (item.HasImage(ImageType.Primary))
+ {
+ return GetImageInfo(item, ImageType.Primary);
+ }
+ if (item.HasImage(ImageType.Thumb))
+ {
+ return GetImageInfo(item, ImageType.Thumb);
+ }
+ if (item.HasImage(ImageType.Backdrop))
+ {
+ if (item is Channel)
+ {
+ return GetImageInfo(item, ImageType.Backdrop);
+ }
+ }
+
+ item = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
+
+ if (item != null)
+ {
+ if (item.HasImage(ImageType.Primary))
+ {
+ return GetImageInfo(item, ImageType.Primary);
+ }
+ }
+
+ return null;
+ }
+
+ private ImageDownloadInfo GetImageInfo(BaseItem item, ImageType type)
+ {
+ var imageInfo = item.GetImageInfo(type, 0);
+ string tag = null;
+
+ try
+ {
+ tag = _imageProcessor.GetImageCacheTag(item, type);
+ }
+ catch
+ {
+
+ }
+
+ int? width = null;
+ int? height = null;
+
+ try
+ {
+ var size = _imageProcessor.GetImageSize(imageInfo);
+
+ width = Convert.ToInt32(size.Width);
+ height = Convert.ToInt32(size.Height);
+ }
+ catch
+ {
+
+ }
+
+ var inputFormat = (Path.GetExtension(imageInfo.Path) ?? string.Empty)
+ .TrimStart('.')
+ .Replace("jpeg", "jpg", StringComparison.OrdinalIgnoreCase);
+
+ return new ImageDownloadInfo
+ {
+ ItemId = item.Id.ToString("N"),
+ Type = type,
+ ImageTag = tag,
+ Width = width,
+ Height = height,
+ Format = inputFormat,
+ ItemImageInfo = imageInfo
+ };
+ }
+
+ class ImageDownloadInfo
+ {
+ internal string ItemId;
+ internal string ImageTag;
+ internal ImageType Type;
+
+ internal int? Width;
+ internal int? Height;
+
+ internal bool IsDirectStream;
+
+ internal string Format;
+
+ internal ItemImageInfo ItemImageInfo;
+ }
+
+ class ImageUrlInfo
+ {
+ internal string Url;
+
+ internal int? Width;
+ internal int? Height;
+ }
+
+ public static string GetClientId(BaseItem item, StubType? stubType)
+ {
+ return GetClientId(item.Id, stubType);
+ }
+
+ public static string GetClientId(Guid idValue, StubType? stubType)
+ {
+ var id = idValue.ToString("N");
+
+ if (stubType.HasValue)
+ {
+ id = stubType.Value.ToString().ToLower() + "_" + id;
+ }
+
+ return id;
+ }
+
+ public static string GetClientId(IHasMediaSources item)
+ {
+ var id = item.Id.ToString("N");
+
+ return id;
+ }
+
+ private ImageUrlInfo GetImageUrl(ImageDownloadInfo info, int maxWidth, int maxHeight, int playbackPercentage, int unplayedCount, string format)
+ {
+ var url = string.Format("{0}/Items/{1}/Images/{2}/0/{3}/{4}/{5}/{6}/{7}/{8}",
+ _serverAddress,
+ info.ItemId,
+ info.Type,
+ info.ImageTag,
+ format,
+ maxWidth.ToString(CultureInfo.InvariantCulture),
+ maxHeight.ToString(CultureInfo.InvariantCulture),
+ playbackPercentage.ToString(CultureInfo.InvariantCulture),
+ unplayedCount.ToString(CultureInfo.InvariantCulture)
+ );
+
+ var width = info.Width;
+ var height = info.Height;
+
+ info.IsDirectStream = false;
+
+ if (width.HasValue && height.HasValue)
+ {
+ var newSize = DrawingUtils.Resize(new ImageSize
+ {
+ Height = height.Value,
+ Width = width.Value
+
+ }, null, null, maxWidth, maxHeight);
+
+ width = Convert.ToInt32(newSize.Width);
+ height = Convert.ToInt32(newSize.Height);
+
+ var normalizedFormat = format
+ .Replace("jpeg", "jpg", StringComparison.OrdinalIgnoreCase);
+
+ if (string.Equals(info.Format, normalizedFormat, StringComparison.OrdinalIgnoreCase))
+ {
+ info.IsDirectStream = maxWidth >= width.Value && maxHeight >= height.Value;
+ }
+ }
+
+ return new ImageUrlInfo
+ {
+ Url = url,
+ Width = width,
+ Height = height
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Didl/Filter.cs b/Emby.Dlna/Didl/Filter.cs
new file mode 100644
index 0000000000..5e9aeb530a
--- /dev/null
+++ b/Emby.Dlna/Didl/Filter.cs
@@ -0,0 +1,35 @@
+using MediaBrowser.Model.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Emby.Dlna.Didl
+{
+ public class Filter
+ {
+ private readonly List<string> _fields;
+ private readonly bool _all;
+
+ public Filter()
+ : this("*")
+ {
+
+ }
+
+ public Filter(string filter)
+ {
+ _all = StringHelper.EqualsIgnoreCase(filter, "*");
+
+ var list = (filter ?? string.Empty).Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).ToList();
+
+ _fields = list;
+ }
+
+ public bool Contains(string field)
+ {
+ // Don't bother with this. Some clients (media monkey) use the filter and then don't display very well when very little data comes back.
+ return true;
+ //return _all || ListHelper.ContainsIgnoreCase(_fields, field);
+ }
+ }
+}
diff --git a/Emby.Dlna/DlnaManager.cs b/Emby.Dlna/DlnaManager.cs
new file mode 100644
index 0000000000..c5798a5d1b
--- /dev/null
+++ b/Emby.Dlna/DlnaManager.cs
@@ -0,0 +1,648 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Plugins;
+using Emby.Dlna.Profiles;
+using Emby.Dlna.Server;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Drawing;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.IO;
+using MediaBrowser.Model.IO;
+#if NETSTANDARD1_6
+using System.Reflection;
+#endif
+
+namespace Emby.Dlna
+{
+ public class DlnaManager : IDlnaManager
+ {
+ private readonly IApplicationPaths _appPaths;
+ private readonly IXmlSerializer _xmlSerializer;
+ private readonly IFileSystem _fileSystem;
+ private readonly ILogger _logger;
+ private readonly IJsonSerializer _jsonSerializer;
+ private readonly IServerApplicationHost _appHost;
+
+ private readonly Dictionary<string, Tuple<InternalProfileInfo, DeviceProfile>> _profiles = new Dictionary<string, Tuple<InternalProfileInfo, DeviceProfile>>(StringComparer.Ordinal);
+
+ public DlnaManager(IXmlSerializer xmlSerializer,
+ IFileSystem fileSystem,
+ IApplicationPaths appPaths,
+ ILogger logger,
+ IJsonSerializer jsonSerializer, IServerApplicationHost appHost)
+ {
+ _xmlSerializer = xmlSerializer;
+ _fileSystem = fileSystem;
+ _appPaths = appPaths;
+ _logger = logger;
+ _jsonSerializer = jsonSerializer;
+ _appHost = appHost;
+ }
+
+ public void InitProfiles()
+ {
+ try
+ {
+ ExtractSystemProfiles();
+ LoadProfiles();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error extracting DLNA profiles.", ex);
+ }
+ }
+
+ private void LoadProfiles()
+ {
+ var list = GetProfiles(UserProfilesPath, DeviceProfileType.User)
+ .OrderBy(i => i.Name)
+ .ToList();
+
+ list.AddRange(GetProfiles(SystemProfilesPath, DeviceProfileType.System)
+ .OrderBy(i => i.Name));
+ }
+
+ public IEnumerable<DeviceProfile> GetProfiles()
+ {
+ lock (_profiles)
+ {
+ var list = _profiles.Values.ToList();
+ return list
+ .OrderBy(i => i.Item1.Info.Type == DeviceProfileType.User ? 0 : 1)
+ .ThenBy(i => i.Item1.Info.Name)
+ .Select(i => i.Item2)
+ .ToList();
+ }
+
+ }
+
+ public DeviceProfile GetDefaultProfile()
+ {
+ return new DefaultProfile();
+ }
+
+ public DeviceProfile GetProfile(DeviceIdentification deviceInfo)
+ {
+ if (deviceInfo == null)
+ {
+ throw new ArgumentNullException("deviceInfo");
+ }
+
+ var profile = GetProfiles()
+ .FirstOrDefault(i => i.Identification != null && IsMatch(deviceInfo, i.Identification));
+
+ if (profile != null)
+ {
+ _logger.Debug("Found matching device profile: {0}", profile.Name);
+ }
+ else
+ {
+ _logger.Debug("No matching device profile found. The default will need to be used.");
+ LogUnmatchedProfile(deviceInfo);
+ }
+
+ return profile;
+ }
+
+ private void LogUnmatchedProfile(DeviceIdentification profile)
+ {
+ var builder = new StringBuilder();
+
+ builder.AppendLine(string.Format("DeviceDescription:{0}", profile.DeviceDescription ?? string.Empty));
+ builder.AppendLine(string.Format("FriendlyName:{0}", profile.FriendlyName ?? string.Empty));
+ builder.AppendLine(string.Format("Manufacturer:{0}", profile.Manufacturer ?? string.Empty));
+ builder.AppendLine(string.Format("ManufacturerUrl:{0}", profile.ManufacturerUrl ?? string.Empty));
+ builder.AppendLine(string.Format("ModelDescription:{0}", profile.ModelDescription ?? string.Empty));
+ builder.AppendLine(string.Format("ModelName:{0}", profile.ModelName ?? string.Empty));
+ builder.AppendLine(string.Format("ModelNumber:{0}", profile.ModelNumber ?? string.Empty));
+ builder.AppendLine(string.Format("ModelUrl:{0}", profile.ModelUrl ?? string.Empty));
+ builder.AppendLine(string.Format("SerialNumber:{0}", profile.SerialNumber ?? string.Empty));
+
+ _logger.LogMultiline("No matching device profile found. The default will need to be used.", LogSeverity.Info, builder);
+ }
+
+ private bool IsMatch(DeviceIdentification deviceInfo, DeviceIdentification profileInfo)
+ {
+ if (!string.IsNullOrWhiteSpace(profileInfo.DeviceDescription))
+ {
+ if (deviceInfo.DeviceDescription == null || !IsRegexMatch(deviceInfo.DeviceDescription, profileInfo.DeviceDescription))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.FriendlyName))
+ {
+ if (deviceInfo.FriendlyName == null || !IsRegexMatch(deviceInfo.FriendlyName, profileInfo.FriendlyName))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.Manufacturer))
+ {
+ if (deviceInfo.Manufacturer == null || !IsRegexMatch(deviceInfo.Manufacturer, profileInfo.Manufacturer))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.ManufacturerUrl))
+ {
+ if (deviceInfo.ManufacturerUrl == null || !IsRegexMatch(deviceInfo.ManufacturerUrl, profileInfo.ManufacturerUrl))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.ModelDescription))
+ {
+ if (deviceInfo.ModelDescription == null || !IsRegexMatch(deviceInfo.ModelDescription, profileInfo.ModelDescription))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.ModelName))
+ {
+ if (deviceInfo.ModelName == null || !IsRegexMatch(deviceInfo.ModelName, profileInfo.ModelName))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.ModelNumber))
+ {
+ if (deviceInfo.ModelNumber == null || !IsRegexMatch(deviceInfo.ModelNumber, profileInfo.ModelNumber))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.ModelUrl))
+ {
+ if (deviceInfo.ModelUrl == null || !IsRegexMatch(deviceInfo.ModelUrl, profileInfo.ModelUrl))
+ return false;
+ }
+
+ if (!string.IsNullOrWhiteSpace(profileInfo.SerialNumber))
+ {
+ if (deviceInfo.SerialNumber == null || !IsRegexMatch(deviceInfo.SerialNumber, profileInfo.SerialNumber))
+ return false;
+ }
+
+ return true;
+ }
+
+ private bool IsRegexMatch(string input, string pattern)
+ {
+ try
+ {
+ return Regex.IsMatch(input, pattern);
+ }
+ catch (ArgumentException ex)
+ {
+ _logger.ErrorException("Error evaluating regex pattern {0}", ex, pattern);
+ return false;
+ }
+ }
+
+ public DeviceProfile GetProfile(IDictionary<string, string> headers)
+ {
+ if (headers == null)
+ {
+ throw new ArgumentNullException("headers");
+ }
+
+ // Convert to case insensitive
+ headers = new Dictionary<string, string>(headers, StringComparer.OrdinalIgnoreCase);
+
+ var profile = GetProfiles().FirstOrDefault(i => i.Identification != null && IsMatch(headers, i.Identification));
+
+ if (profile != null)
+ {
+ _logger.Debug("Found matching device profile: {0}", profile.Name);
+ }
+ else
+ {
+ var msg = new StringBuilder();
+ foreach (var header in headers)
+ {
+ msg.AppendLine(header.Key + ": " + header.Value);
+ }
+ _logger.LogMultiline("No matching device profile found. The default will need to be used.", LogSeverity.Info, msg);
+ }
+
+ return profile;
+ }
+
+ private bool IsMatch(IDictionary<string, string> headers, DeviceIdentification profileInfo)
+ {
+ return profileInfo.Headers.Any(i => IsMatch(headers, i));
+ }
+
+ private bool IsMatch(IDictionary<string, string> headers, HttpHeaderInfo header)
+ {
+ string value;
+
+ if (headers.TryGetValue(header.Name, out value))
+ {
+ switch (header.Match)
+ {
+ case HeaderMatchType.Equals:
+ return string.Equals(value, header.Value, StringComparison.OrdinalIgnoreCase);
+ case HeaderMatchType.Substring:
+ var isMatch = value.IndexOf(header.Value, StringComparison.OrdinalIgnoreCase) != -1;
+ //_logger.Debug("IsMatch-Substring value: {0} testValue: {1} isMatch: {2}", value, header.Value, isMatch);
+ return isMatch;
+ case HeaderMatchType.Regex:
+ return Regex.IsMatch(value, header.Value, RegexOptions.IgnoreCase);
+ default:
+ throw new ArgumentException("Unrecognized HeaderMatchType");
+ }
+ }
+
+ return false;
+ }
+
+ private string UserProfilesPath
+ {
+ get
+ {
+ return Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "user");
+ }
+ }
+
+ private string SystemProfilesPath
+ {
+ get
+ {
+ return Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "system");
+ }
+ }
+
+ private IEnumerable<DeviceProfile> GetProfiles(string path, DeviceProfileType type)
+ {
+ try
+ {
+ var allFiles = _fileSystem.GetFiles(path)
+ .ToList();
+
+ var xmlFies = allFiles
+ .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase))
+ .ToList();
+
+ var jsonFiles = allFiles
+ .Where(i => string.Equals(i.Extension, ".json", StringComparison.OrdinalIgnoreCase))
+ .ToList();
+
+ var jsonFileNames = jsonFiles
+ .Select(i => Path.GetFileNameWithoutExtension(i.Name))
+ .ToList();
+
+ var parseFiles = jsonFiles.ToList();
+
+ parseFiles.AddRange(xmlFies.Where(i => !jsonFileNames.Contains(Path.GetFileNameWithoutExtension(i.Name), StringComparer.Ordinal)));
+
+ return parseFiles
+ .Select(i => ParseProfileFile(i.FullName, type))
+ .Where(i => i != null)
+ .ToList();
+ }
+ catch (DirectoryNotFoundException)
+ {
+ return new List<DeviceProfile>();
+ }
+ }
+
+ private DeviceProfile ParseProfileFile(string path, DeviceProfileType type)
+ {
+ lock (_profiles)
+ {
+ Tuple<InternalProfileInfo, DeviceProfile> profileTuple;
+ if (_profiles.TryGetValue(path, out profileTuple))
+ {
+ return profileTuple.Item2;
+ }
+
+ try
+ {
+ DeviceProfile profile;
+
+ if (string.Equals(Path.GetExtension(path), ".xml", StringComparison.OrdinalIgnoreCase))
+ {
+ var tempProfile = (Emby.Dlna.ProfileSerialization.DeviceProfile)_xmlSerializer.DeserializeFromFile(typeof(Emby.Dlna.ProfileSerialization.DeviceProfile), path);
+
+ var json = _jsonSerializer.SerializeToString(tempProfile);
+ profile = (DeviceProfile)_jsonSerializer.DeserializeFromString<DeviceProfile>(json);
+ }
+ else
+ {
+ profile = (DeviceProfile)_jsonSerializer.DeserializeFromFile(typeof(DeviceProfile), path);
+ }
+
+ profile.Id = path.ToLower().GetMD5().ToString("N");
+ profile.ProfileType = type;
+
+ _profiles[path] = new Tuple<InternalProfileInfo, DeviceProfile>(GetInternalProfileInfo(_fileSystem.GetFileInfo(path), type), profile);
+
+ return profile;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error parsing profile file: {0}", ex, path);
+
+ return null;
+ }
+ }
+ }
+
+ public DeviceProfile GetProfile(string id)
+ {
+ if (string.IsNullOrWhiteSpace(id))
+ {
+ throw new ArgumentNullException("id");
+ }
+
+ var info = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, id, StringComparison.OrdinalIgnoreCase));
+
+ return ParseProfileFile(info.Path, info.Info.Type);
+ }
+
+ private IEnumerable<InternalProfileInfo> GetProfileInfosInternal()
+ {
+ lock (_profiles)
+ {
+ var list = _profiles.Values.ToList();
+ return list
+ .Select(i => i.Item1)
+ .OrderBy(i => i.Info.Type == DeviceProfileType.User ? 0 : 1)
+ .ThenBy(i => i.Info.Name);
+ }
+ }
+
+ public IEnumerable<DeviceProfileInfo> GetProfileInfos()
+ {
+ return GetProfileInfosInternal().Select(i => i.Info);
+ }
+
+ private InternalProfileInfo GetInternalProfileInfo(FileSystemMetadata file, DeviceProfileType type)
+ {
+ return new InternalProfileInfo
+ {
+ Path = file.FullName,
+
+ Info = new DeviceProfileInfo
+ {
+ Id = file.FullName.ToLower().GetMD5().ToString("N"),
+ Name = _fileSystem.GetFileNameWithoutExtension(file),
+ Type = type
+ }
+ };
+ }
+
+ private void ExtractSystemProfiles()
+ {
+#if NET46
+ var assembly = GetType().Assembly;
+ var namespaceName = GetType().Namespace + ".Profiles.Json.";
+#elif NETSTANDARD1_6
+ var assembly = GetType().GetTypeInfo().Assembly;
+ var namespaceName = GetType().GetTypeInfo().Namespace + ".Profiles.Json.";
+#endif
+
+ var systemProfilesPath = SystemProfilesPath;
+
+ foreach (var name in assembly.GetManifestResourceNames()
+ .Where(i => i.StartsWith(namespaceName))
+ .ToList())
+ {
+ var filename = Path.GetFileName(name).Substring(namespaceName.Length);
+
+ var path = Path.Combine(systemProfilesPath, filename);
+
+ using (var stream = assembly.GetManifestResourceStream(name))
+ {
+ var fileInfo = new FileInfo(path);
+
+ if (!fileInfo.Exists || fileInfo.Length != stream.Length)
+ {
+ _fileSystem.CreateDirectory(systemProfilesPath);
+
+ using (var fileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+ {
+ stream.CopyTo(fileStream);
+ }
+ }
+ }
+ }
+
+ // Not necessary, but just to make it easy to find
+ _fileSystem.CreateDirectory(UserProfilesPath);
+ }
+
+ public void DeleteProfile(string id)
+ {
+ var info = GetProfileInfosInternal().First(i => string.Equals(id, i.Info.Id, StringComparison.OrdinalIgnoreCase));
+
+ if (info.Info.Type == DeviceProfileType.System)
+ {
+ throw new ArgumentException("System profiles cannot be deleted.");
+ }
+
+ _fileSystem.DeleteFile(info.Path);
+
+ lock (_profiles)
+ {
+ _profiles.Remove(info.Path);
+ }
+ }
+
+ public void CreateProfile(DeviceProfile profile)
+ {
+ profile = ReserializeProfile(profile);
+
+ if (string.IsNullOrWhiteSpace(profile.Name))
+ {
+ throw new ArgumentException("Profile is missing Name");
+ }
+
+ var newFilename = _fileSystem.GetValidFilename(profile.Name) + ".json";
+ var path = Path.Combine(UserProfilesPath, newFilename);
+
+ SaveProfile(profile, path, DeviceProfileType.User);
+ }
+
+ public void UpdateProfile(DeviceProfile profile)
+ {
+ profile = ReserializeProfile(profile);
+
+ if (string.IsNullOrWhiteSpace(profile.Id))
+ {
+ throw new ArgumentException("Profile is missing Id");
+ }
+ if (string.IsNullOrWhiteSpace(profile.Name))
+ {
+ throw new ArgumentException("Profile is missing Name");
+ }
+
+ var current = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, profile.Id, StringComparison.OrdinalIgnoreCase));
+
+ var newFilename = _fileSystem.GetValidFilename(profile.Name) + ".json";
+ var path = Path.Combine(UserProfilesPath, newFilename);
+
+ if (!string.Equals(path, current.Path, StringComparison.Ordinal) &&
+ current.Info.Type != DeviceProfileType.System)
+ {
+ _fileSystem.DeleteFile(current.Path);
+ }
+
+ SaveProfile(profile, path, DeviceProfileType.User);
+ }
+
+ private void SaveProfile(DeviceProfile profile, string path, DeviceProfileType type)
+ {
+ lock (_profiles)
+ {
+ _profiles[path] = new Tuple<InternalProfileInfo, DeviceProfile>(GetInternalProfileInfo(_fileSystem.GetFileInfo(path), type), profile);
+ }
+ SerializeToJson(profile, path);
+ }
+
+ internal void SerializeToJson(DeviceProfile profile, string path)
+ {
+ _jsonSerializer.SerializeToFile(profile, path);
+
+ try
+ {
+ File.Delete(Path.ChangeExtension(path, ".xml"));
+ }
+ catch
+ {
+
+ }
+ }
+
+ /// <summary>
+ /// Recreates the object using serialization, to ensure it's not a subclass.
+ /// If it's a subclass it may not serlialize properly to xml (different root element tag name)
+ /// </summary>
+ /// <param name="profile"></param>
+ /// <returns></returns>
+ private DeviceProfile ReserializeProfile(DeviceProfile profile)
+ {
+ if (profile.GetType() == typeof(DeviceProfile))
+ {
+ return profile;
+ }
+
+ var json = _jsonSerializer.SerializeToString(profile);
+
+ return _jsonSerializer.DeserializeFromString<DeviceProfile>(json);
+ }
+
+ class InternalProfileInfo
+ {
+ internal DeviceProfileInfo Info { get; set; }
+ internal string Path { get; set; }
+ }
+
+ public string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId, string serverAddress)
+ {
+ var profile = GetProfile(headers) ??
+ GetDefaultProfile();
+
+ var serverId = _appHost.SystemId;
+
+ return new DescriptionXmlBuilder(profile, serverUuId, serverAddress, _appHost.FriendlyName, serverId).GetXml();
+ }
+
+ public ImageStream GetIcon(string filename)
+ {
+ var format = filename.EndsWith(".png", StringComparison.OrdinalIgnoreCase)
+ ? ImageFormat.Png
+ : ImageFormat.Jpg;
+
+#if NET46
+ return new ImageStream
+ {
+ Format = format,
+ Stream = GetType().Assembly.GetManifestResourceStream("MediaBrowser.Dlna.Images." + filename.ToLower())
+ };
+#elif NETSTANDARD1_6
+ return new ImageStream
+ {
+ Format = format,
+ Stream = GetType().GetTypeInfo().Assembly.GetManifestResourceStream("MediaBrowser.Dlna.Images." + filename.ToLower())
+ };
+#endif
+ throw new NotImplementedException();
+ }
+ }
+
+ class DlnaProfileEntryPoint : IServerEntryPoint
+ {
+ private readonly IApplicationPaths _appPaths;
+ private readonly IJsonSerializer _jsonSerializer;
+ private readonly IFileSystem _fileSystem;
+
+ public DlnaProfileEntryPoint(IApplicationPaths appPaths, IFileSystem fileSystem, IJsonSerializer jsonSerializer)
+ {
+ _appPaths = appPaths;
+ _fileSystem = fileSystem;
+ _jsonSerializer = jsonSerializer;
+ }
+
+ public void Run()
+ {
+ //DumpProfiles();
+ }
+
+ private void DumpProfiles()
+ {
+ var list = new List<DeviceProfile>
+ {
+ new SamsungSmartTvProfile(),
+ new Xbox360Profile(),
+ new XboxOneProfile(),
+ new SonyPs3Profile(),
+ new SonyPs4Profile(),
+ new SonyBravia2010Profile(),
+ new SonyBravia2011Profile(),
+ new SonyBravia2012Profile(),
+ new SonyBravia2013Profile(),
+ new SonyBravia2014Profile(),
+ new SonyBlurayPlayer2013(),
+ new SonyBlurayPlayer2014(),
+ new SonyBlurayPlayer2015(),
+ new SonyBlurayPlayer2016(),
+ new SonyBlurayPlayerProfile(),
+ new PanasonicVieraProfile(),
+ new WdtvLiveProfile(),
+ new DenonAvrProfile(),
+ new LinksysDMA2100Profile(),
+ new LgTvProfile(),
+ new Foobar2000Profile(),
+ new MediaMonkeyProfile(),
+ //new Windows81Profile(),
+ //new WindowsMediaCenterProfile(),
+ //new WindowsPhoneProfile(),
+ new DirectTvProfile(),
+ new DishHopperJoeyProfile(),
+ new DefaultProfile(),
+ new PopcornHourProfile(),
+ new VlcProfile(),
+ new BubbleUpnpProfile(),
+ new KodiProfile(),
+ };
+
+ foreach (var item in list)
+ {
+ var path = Path.Combine(_appPaths.ProgramDataPath, _fileSystem.GetValidFilename(item.Name) + ".json");
+
+ _jsonSerializer.SerializeToFile(item, path);
+ }
+ }
+
+ public void Dispose()
+ {
+ }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/Emby.Dlna.xproj b/Emby.Dlna/Emby.Dlna.xproj
new file mode 100644
index 0000000000..ad5cf50f58
--- /dev/null
+++ b/Emby.Dlna/Emby.Dlna.xproj
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
+ <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+ </PropertyGroup>
+ <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>f40e364d-01d9-4bbf-b82c-5d6c55e0a1f5</ProjectGuid>
+ <RootNamespace>Emby.Dlna</RootNamespace>
+ <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
+ <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
+ <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup>
+ <SchemaVersion>2.0</SchemaVersion>
+ </PropertyGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
+ <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
+ <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
+ </ItemGroup>
+ <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
+</Project> \ No newline at end of file
diff --git a/Emby.Dlna/Eventing/EventManager.cs b/Emby.Dlna/Eventing/EventManager.cs
new file mode 100644
index 0000000000..cf2c8d9956
--- /dev/null
+++ b/Emby.Dlna/Eventing/EventManager.cs
@@ -0,0 +1,170 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Emby.Dlna.Eventing
+{
+ public class EventManager : IEventManager
+ {
+ private readonly ConcurrentDictionary<string, EventSubscription> _subscriptions =
+ new ConcurrentDictionary<string, EventSubscription>(StringComparer.OrdinalIgnoreCase);
+
+ private readonly ILogger _logger;
+ private readonly IHttpClient _httpClient;
+
+ public EventManager(ILogger logger, IHttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ _logger = logger;
+ }
+
+ public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, int? timeoutSeconds)
+ {
+ var timeout = timeoutSeconds ?? 300;
+
+ var subscription = GetSubscription(subscriptionId, true);
+
+ _logger.Debug("Renewing event subscription for {0} with timeout of {1} to {2}",
+ subscription.NotificationType,
+ timeout,
+ subscription.CallbackUrl);
+
+ subscription.TimeoutSeconds = timeout;
+ subscription.SubscriptionTime = DateTime.UtcNow;
+
+ return GetEventSubscriptionResponse(subscriptionId, timeout);
+ }
+
+ public EventSubscriptionResponse CreateEventSubscription(string notificationType, int? timeoutSeconds, string callbackUrl)
+ {
+ var timeout = timeoutSeconds ?? 300;
+ var id = "uuid:" + Guid.NewGuid().ToString("N");
+
+ _logger.Debug("Creating event subscription for {0} with timeout of {1} to {2}",
+ notificationType,
+ timeout,
+ callbackUrl);
+
+ _subscriptions.TryAdd(id, new EventSubscription
+ {
+ Id = id,
+ CallbackUrl = callbackUrl,
+ SubscriptionTime = DateTime.UtcNow,
+ TimeoutSeconds = timeout
+ });
+
+ return GetEventSubscriptionResponse(id, timeout);
+ }
+
+ public EventSubscriptionResponse CancelEventSubscription(string subscriptionId)
+ {
+ _logger.Debug("Cancelling event subscription {0}", subscriptionId);
+
+ EventSubscription sub;
+ _subscriptions.TryRemove(subscriptionId, out sub);
+
+ return new EventSubscriptionResponse
+ {
+ Content = "\r\n",
+ ContentType = "text/plain"
+ };
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+ private EventSubscriptionResponse GetEventSubscriptionResponse(string subscriptionId, int timeoutSeconds)
+ {
+ var response = new EventSubscriptionResponse
+ {
+ Content = "\r\n",
+ ContentType = "text/plain"
+ };
+
+ response.Headers["SID"] = subscriptionId;
+ response.Headers["TIMEOUT"] = "SECOND-" + timeoutSeconds.ToString(_usCulture);
+
+ return response;
+ }
+
+ public EventSubscription GetSubscription(string id)
+ {
+ return GetSubscription(id, false);
+ }
+
+ private EventSubscription GetSubscription(string id, bool throwOnMissing)
+ {
+ EventSubscription e;
+
+ if (!_subscriptions.TryGetValue(id, out e) && throwOnMissing)
+ {
+ throw new ResourceNotFoundException("Event with Id " + id + " not found.");
+ }
+
+ return e;
+ }
+
+ public Task TriggerEvent(string notificationType, IDictionary<string, string> stateVariables)
+ {
+ var subs = _subscriptions.Values
+ .Where(i => !i.IsExpired && string.Equals(notificationType, i.NotificationType, StringComparison.OrdinalIgnoreCase))
+ .ToList();
+
+ var tasks = subs.Select(i => TriggerEvent(i, stateVariables));
+
+ return Task.WhenAll(tasks);
+ }
+
+ private async Task TriggerEvent(EventSubscription subscription, IDictionary<string, string> stateVariables)
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\"?>");
+ builder.Append("<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">");
+ foreach (var key in stateVariables.Keys)
+ {
+ builder.Append("<e:property>");
+ builder.Append("<" + key + ">");
+ builder.Append(stateVariables[key]);
+ builder.Append("</" + key + ">");
+ builder.Append("</e:property>");
+ }
+ builder.Append("</e:propertyset>");
+
+ var options = new HttpRequestOptions
+ {
+ RequestContent = builder.ToString(),
+ RequestContentType = "text/xml",
+ Url = subscription.CallbackUrl,
+ BufferContent = false
+ };
+
+ options.RequestHeaders.Add("NT", subscription.NotificationType);
+ options.RequestHeaders.Add("NTS", "upnp:propchange");
+ options.RequestHeaders.Add("SID", subscription.Id);
+ options.RequestHeaders.Add("SEQ", subscription.TriggerCount.ToString(_usCulture));
+
+ try
+ {
+ await _httpClient.SendAsync(options, "NOTIFY").ConfigureAwait(false);
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch
+ {
+ // Already logged at lower levels
+ }
+ finally
+ {
+ subscription.IncrementTriggerCount();
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/Eventing/EventSubscription.cs b/Emby.Dlna/Eventing/EventSubscription.cs
new file mode 100644
index 0000000000..adb042d6c4
--- /dev/null
+++ b/Emby.Dlna/Eventing/EventSubscription.cs
@@ -0,0 +1,34 @@
+using System;
+
+namespace Emby.Dlna.Eventing
+{
+ public class EventSubscription
+ {
+ public string Id { get; set; }
+ public string CallbackUrl { get; set; }
+ public string NotificationType { get; set; }
+
+ public DateTime SubscriptionTime { get; set; }
+ public int TimeoutSeconds { get; set; }
+
+ public long TriggerCount { get; set; }
+
+ public void IncrementTriggerCount()
+ {
+ if (TriggerCount == long.MaxValue)
+ {
+ TriggerCount = 0;
+ }
+
+ TriggerCount++;
+ }
+
+ public bool IsExpired
+ {
+ get
+ {
+ return SubscriptionTime.AddSeconds(TimeoutSeconds) >= DateTime.UtcNow;
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/Images/logo120.jpg b/Emby.Dlna/Images/logo120.jpg
new file mode 100644
index 0000000000..bbf2df4699
--- /dev/null
+++ b/Emby.Dlna/Images/logo120.jpg
Binary files differ
diff --git a/Emby.Dlna/Images/logo120.png b/Emby.Dlna/Images/logo120.png
new file mode 100644
index 0000000000..90e5222f26
--- /dev/null
+++ b/Emby.Dlna/Images/logo120.png
Binary files differ
diff --git a/Emby.Dlna/Images/logo240.jpg b/Emby.Dlna/Images/logo240.jpg
new file mode 100644
index 0000000000..8ff0b69bf9
--- /dev/null
+++ b/Emby.Dlna/Images/logo240.jpg
Binary files differ
diff --git a/Emby.Dlna/Images/logo240.png b/Emby.Dlna/Images/logo240.png
new file mode 100644
index 0000000000..014363e00d
--- /dev/null
+++ b/Emby.Dlna/Images/logo240.png
Binary files differ
diff --git a/Emby.Dlna/Images/logo48.jpg b/Emby.Dlna/Images/logo48.jpg
new file mode 100644
index 0000000000..00045065b4
--- /dev/null
+++ b/Emby.Dlna/Images/logo48.jpg
Binary files differ
diff --git a/Emby.Dlna/Images/logo48.png b/Emby.Dlna/Images/logo48.png
new file mode 100644
index 0000000000..606b2ab80d
--- /dev/null
+++ b/Emby.Dlna/Images/logo48.png
Binary files differ
diff --git a/Emby.Dlna/Images/people48.jpg b/Emby.Dlna/Images/people48.jpg
new file mode 100644
index 0000000000..06f49a8a2d
--- /dev/null
+++ b/Emby.Dlna/Images/people48.jpg
Binary files differ
diff --git a/Emby.Dlna/Images/people48.png b/Emby.Dlna/Images/people48.png
new file mode 100644
index 0000000000..7f846373f8
--- /dev/null
+++ b/Emby.Dlna/Images/people48.png
Binary files differ
diff --git a/Emby.Dlna/Images/people480.jpg b/Emby.Dlna/Images/people480.jpg
new file mode 100644
index 0000000000..5b78216349
--- /dev/null
+++ b/Emby.Dlna/Images/people480.jpg
Binary files differ
diff --git a/Emby.Dlna/Images/people480.png b/Emby.Dlna/Images/people480.png
new file mode 100644
index 0000000000..6d9a668d4e
--- /dev/null
+++ b/Emby.Dlna/Images/people480.png
Binary files differ
diff --git a/Emby.Dlna/Main/DlnaEntryPoint.cs b/Emby.Dlna/Main/DlnaEntryPoint.cs
new file mode 100644
index 0000000000..69f63189e8
--- /dev/null
+++ b/Emby.Dlna/Main/DlnaEntryPoint.cs
@@ -0,0 +1,393 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Plugins;
+using MediaBrowser.Controller.Session;
+using Emby.Dlna.PlayTo;
+using Emby.Dlna.Ssdp;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Globalization;
+using Rssdp;
+using Rssdp.Infrastructure;
+
+namespace Emby.Dlna.Main
+{
+ public class DlnaEntryPoint : IServerEntryPoint
+ {
+ private readonly IServerConfigurationManager _config;
+ private readonly ILogger _logger;
+ private readonly IServerApplicationHost _appHost;
+ private readonly INetworkManager _network;
+
+ private PlayToManager _manager;
+ private readonly ISessionManager _sessionManager;
+ private readonly IHttpClient _httpClient;
+ private readonly ILibraryManager _libraryManager;
+ private readonly IUserManager _userManager;
+ private readonly IDlnaManager _dlnaManager;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly IUserDataManager _userDataManager;
+ private readonly ILocalizationManager _localization;
+ private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IMediaEncoder _mediaEncoder;
+
+ private readonly IDeviceDiscovery _deviceDiscovery;
+
+ private bool _ssdpHandlerStarted;
+ private bool _dlnaServerStarted;
+ private SsdpDevicePublisher _Publisher;
+
+ public DlnaEntryPoint(IServerConfigurationManager config,
+ ILogManager logManager,
+ IServerApplicationHost appHost,
+ INetworkManager network,
+ ISessionManager sessionManager,
+ IHttpClient httpClient,
+ ILibraryManager libraryManager,
+ IUserManager userManager,
+ IDlnaManager dlnaManager,
+ IImageProcessor imageProcessor,
+ IUserDataManager userDataManager,
+ ILocalizationManager localization,
+ IMediaSourceManager mediaSourceManager,
+ IDeviceDiscovery deviceDiscovery, IMediaEncoder mediaEncoder)
+ {
+ _config = config;
+ _appHost = appHost;
+ _network = network;
+ _sessionManager = sessionManager;
+ _httpClient = httpClient;
+ _libraryManager = libraryManager;
+ _userManager = userManager;
+ _dlnaManager = dlnaManager;
+ _imageProcessor = imageProcessor;
+ _userDataManager = userDataManager;
+ _localization = localization;
+ _mediaSourceManager = mediaSourceManager;
+ _deviceDiscovery = deviceDiscovery;
+ _mediaEncoder = mediaEncoder;
+ _logger = logManager.GetLogger("Dlna");
+ }
+
+ public void Run()
+ {
+ ((DlnaManager)_dlnaManager).InitProfiles();
+
+ ReloadComponents();
+
+ _config.ConfigurationUpdated += _config_ConfigurationUpdated;
+ _config.NamedConfigurationUpdated += _config_NamedConfigurationUpdated;
+ }
+
+ private bool _lastEnableUpnP;
+ void _config_ConfigurationUpdated(object sender, EventArgs e)
+ {
+ if (_lastEnableUpnP != _config.Configuration.EnableUPnP)
+ {
+ ReloadComponents();
+ }
+ _lastEnableUpnP = _config.Configuration.EnableUPnP;
+ }
+
+ void _config_NamedConfigurationUpdated(object sender, ConfigurationUpdateEventArgs e)
+ {
+ if (string.Equals(e.Key, "dlna", StringComparison.OrdinalIgnoreCase))
+ {
+ ReloadComponents();
+ }
+ }
+
+ private async void ReloadComponents()
+ {
+ var options = _config.GetDlnaConfiguration();
+
+ if (!_ssdpHandlerStarted)
+ {
+ StartSsdpHandler();
+ }
+
+ var isServerStarted = _dlnaServerStarted;
+
+ if (options.EnableServer && !isServerStarted)
+ {
+ await StartDlnaServer().ConfigureAwait(false);
+ }
+ else if (!options.EnableServer && isServerStarted)
+ {
+ DisposeDlnaServer();
+ }
+
+ var isPlayToStarted = _manager != null;
+
+ if (options.EnablePlayTo && !isPlayToStarted)
+ {
+ StartPlayToManager();
+ }
+ else if (!options.EnablePlayTo && isPlayToStarted)
+ {
+ DisposePlayToManager();
+ }
+ }
+
+ private void StartSsdpHandler()
+ {
+ try
+ {
+ StartPublishing();
+ _ssdpHandlerStarted = true;
+
+ StartDeviceDiscovery();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error starting ssdp handlers", ex);
+ }
+ }
+
+ private void LogMessage(string msg)
+ {
+ //_logger.Debug(msg);
+ }
+
+ private void StartPublishing()
+ {
+ SsdpDevicePublisherBase.LogFunction = LogMessage;
+ _Publisher = new SsdpDevicePublisher();
+ }
+
+ private void StartDeviceDiscovery()
+ {
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Start();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error starting device discovery", ex);
+ }
+ }
+
+ private void DisposeDeviceDiscovery()
+ {
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error stopping device discovery", ex);
+ }
+ }
+
+ private void DisposeSsdpHandler()
+ {
+ DisposeDeviceDiscovery();
+
+ try
+ {
+ ((DeviceDiscovery)_deviceDiscovery).Dispose();
+
+ _ssdpHandlerStarted = false;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error stopping ssdp handlers", ex);
+ }
+ }
+
+ public async Task StartDlnaServer()
+ {
+ try
+ {
+ await RegisterServerEndpoints().ConfigureAwait(false);
+
+ _dlnaServerStarted = true;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error registering endpoint", ex);
+ }
+ }
+
+ private async Task RegisterServerEndpoints()
+ {
+ if (!_config.GetDlnaConfiguration().BlastAliveMessages)
+ {
+ return;
+ }
+
+ var cacheLength = _config.GetDlnaConfiguration().BlastAliveMessageIntervalSeconds;
+ _Publisher.SupportPnpRootDevice = false;
+
+ var addresses = (await _appHost.GetLocalIpAddresses().ConfigureAwait(false)).ToList();
+
+ foreach (var address in addresses)
+ {
+ //if (IPAddress.IsLoopback(address))
+ //{
+ // // Should we allow this?
+ // continue;
+ //}
+
+ var addressString = address.ToString();
+
+ var udn = CreateUuid(addressString);
+
+ var fullService = "urn:schemas-upnp-org:device:MediaServer:1";
+
+ _logger.Info("Registering publisher for {0} on {1}", fullService, addressString);
+
+ var descriptorUri = "/dlna/" + udn + "/description.xml";
+ var uri = new Uri(_appHost.GetLocalApiUrl(addressString, address.IsIpv6) + descriptorUri);
+
+ var device = new SsdpRootDevice
+ {
+ CacheLifetime = TimeSpan.FromSeconds(cacheLength), //How long SSDP clients can cache this info.
+ Location = uri, // Must point to the URL that serves your devices UPnP description document.
+ FriendlyName = "Emby Server",
+ Manufacturer = "Emby",
+ ModelName = "Emby Server",
+ Uuid = udn
+ // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
+ };
+
+ SetProperies(device, fullService);
+ _Publisher.AddDevice(device);
+
+ var embeddedDevices = new List<string>
+ {
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1"
+ };
+
+ foreach (var subDevice in embeddedDevices)
+ {
+ var embeddedDevice = new SsdpEmbeddedDevice
+ {
+ FriendlyName = device.FriendlyName,
+ Manufacturer = device.Manufacturer,
+ ModelName = device.ModelName,
+ Uuid = udn
+ // This must be a globally unique value that survives reboots etc. Get from storage or embedded hardware etc.
+ };
+
+ SetProperies(embeddedDevice, subDevice);
+ device.AddDevice(embeddedDevice);
+ }
+ }
+ }
+
+ private string CreateUuid(string text)
+ {
+ return text.GetMD5().ToString("N");
+ }
+
+ private void SetProperies(SsdpDevice device, string fullDeviceType)
+ {
+ var service = fullDeviceType.Replace("urn:", string.Empty).Replace(":1", string.Empty);
+
+ var serviceParts = service.Split(':');
+
+ var deviceTypeNamespace = serviceParts[0].Replace('.', '-');
+
+ device.DeviceTypeNamespace = deviceTypeNamespace;
+ device.DeviceClass = serviceParts[1];
+ device.DeviceType = serviceParts[2];
+ }
+
+ private readonly object _syncLock = new object();
+ private void StartPlayToManager()
+ {
+ lock (_syncLock)
+ {
+ try
+ {
+ _manager = new PlayToManager(_logger,
+ _sessionManager,
+ _libraryManager,
+ _userManager,
+ _dlnaManager,
+ _appHost,
+ _imageProcessor,
+ _deviceDiscovery,
+ _httpClient,
+ _config,
+ _userDataManager,
+ _localization,
+ _mediaSourceManager,
+ _mediaEncoder);
+
+ _manager.Start();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error starting PlayTo manager", ex);
+ }
+ }
+ }
+
+ private void DisposePlayToManager()
+ {
+ lock (_syncLock)
+ {
+ if (_manager != null)
+ {
+ try
+ {
+ _manager.Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error disposing PlayTo manager", ex);
+ }
+ _manager = null;
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ DisposeDlnaServer();
+ DisposePlayToManager();
+ DisposeSsdpHandler();
+ }
+
+ public void DisposeDlnaServer()
+ {
+ if (_Publisher != null)
+ {
+ var devices = _Publisher.Devices.ToList();
+ var tasks = devices.Select(i => _Publisher.RemoveDevice(i)).ToArray();
+
+ Task.WaitAll(tasks);
+ //foreach (var device in devices)
+ //{
+ // try
+ // {
+ // _Publisher.RemoveDevice(device);
+ // }
+ // catch (Exception ex)
+ // {
+ // _logger.ErrorException("Error sending bye bye", ex);
+ // }
+ //}
+ _Publisher.Dispose();
+ }
+
+ _dlnaServerStarted = false;
+ }
+ }
+}
diff --git a/Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs b/Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs
new file mode 100644
index 0000000000..572fcb6629
--- /dev/null
+++ b/Emby.Dlna/MediaReceiverRegistrar/ControlHandler.cs
@@ -0,0 +1,43 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
+using Emby.Dlna.Server;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.MediaReceiverRegistrar
+{
+ public class ControlHandler : BaseControlHandler
+ {
+ public ControlHandler(IServerConfigurationManager config, ILogger logger) : base(config, logger)
+ {
+ }
+
+ protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams)
+ {
+ if (string.Equals(methodName, "IsAuthorized", StringComparison.OrdinalIgnoreCase))
+ return HandleIsAuthorized();
+ if (string.Equals(methodName, "IsValidated", StringComparison.OrdinalIgnoreCase))
+ return HandleIsValidated();
+
+ throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleIsAuthorized()
+ {
+ return new Headers(true)
+ {
+ { "Result", "1" }
+ };
+ }
+
+ private IEnumerable<KeyValuePair<string, string>> HandleIsValidated()
+ {
+ return new Headers(true)
+ {
+ { "Result", "1" }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrar.cs b/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrar.cs
new file mode 100644
index 0000000000..b96aabf62c
--- /dev/null
+++ b/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrar.cs
@@ -0,0 +1,39 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using Emby.Dlna.Service;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.MediaReceiverRegistrar
+{
+ public class MediaReceiverRegistrar : BaseService, IMediaReceiverRegistrar, IDisposable
+ {
+ private readonly IServerConfigurationManager _config;
+
+ public MediaReceiverRegistrar(ILogger logger, IHttpClient httpClient, IServerConfigurationManager config)
+ : base(logger, httpClient)
+ {
+ _config = config;
+ }
+
+ public string GetServiceXml(IDictionary<string, string> headers)
+ {
+ return new MediaReceiverRegistrarXmlBuilder().GetXml();
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ return new ControlHandler(
+ _config,
+ Logger)
+ .ProcessControlRequest(request);
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs b/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs
new file mode 100644
index 0000000000..bc4bee7c92
--- /dev/null
+++ b/Emby.Dlna/MediaReceiverRegistrar/MediaReceiverRegistrarXmlBuilder.cs
@@ -0,0 +1,78 @@
+using Emby.Dlna.Common;
+using Emby.Dlna.Service;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.MediaReceiverRegistrar
+{
+ public class MediaReceiverRegistrarXmlBuilder
+ {
+ public string GetXml()
+ {
+ return new ServiceXmlBuilder().GetXml(new ServiceActionListBuilder().GetActions(),
+ GetStateVariables());
+ }
+
+ private IEnumerable<StateVariable> GetStateVariables()
+ {
+ var list = new List<StateVariable>();
+
+ list.Add(new StateVariable
+ {
+ Name = "AuthorizationGrantedUpdateID",
+ DataType = "ui4",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_DeviceID",
+ DataType = "string",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "AuthorizationDeniedUpdateID",
+ DataType = "ui4",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "ValidationSucceededUpdateID",
+ DataType = "ui4",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_RegistrationRespMsg",
+ DataType = "bin.base64",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_RegistrationReqMsg",
+ DataType = "bin.base64",
+ SendsEvents = false
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "ValidationRevokedUpdateID",
+ DataType = "ui4",
+ SendsEvents = true
+ });
+
+ list.Add(new StateVariable
+ {
+ Name = "A_ARG_TYPE_Result",
+ DataType = "int",
+ SendsEvents = false
+ });
+
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs b/Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs
new file mode 100644
index 0000000000..691ba3061a
--- /dev/null
+++ b/Emby.Dlna/MediaReceiverRegistrar/ServiceActionListBuilder.cs
@@ -0,0 +1,154 @@
+using Emby.Dlna.Common;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.MediaReceiverRegistrar
+{
+ public class ServiceActionListBuilder
+ {
+ public IEnumerable<ServiceAction> GetActions()
+ {
+ var list = new List<ServiceAction>
+ {
+ GetIsValidated(),
+ GetIsAuthorized(),
+ GetRegisterDevice(),
+ GetGetAuthorizationDeniedUpdateID(),
+ GetGetAuthorizationGrantedUpdateID(),
+ GetGetValidationRevokedUpdateID(),
+ GetGetValidationSucceededUpdateID()
+ };
+
+ return list;
+ }
+
+ private ServiceAction GetIsValidated()
+ {
+ var action = new ServiceAction
+ {
+ Name = "IsValidated"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "DeviceID",
+ Direction = "in"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetIsAuthorized()
+ {
+ var action = new ServiceAction
+ {
+ Name = "IsAuthorized"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "DeviceID",
+ Direction = "in"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetRegisterDevice()
+ {
+ var action = new ServiceAction
+ {
+ Name = "RegisterDevice"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RegistrationReqMsg",
+ Direction = "in"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RegistrationRespMsg",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetGetValidationSucceededUpdateID()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetValidationSucceededUpdateID"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ValidationSucceededUpdateID",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetGetAuthorizationDeniedUpdateID()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetAuthorizationDeniedUpdateID"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "AuthorizationDeniedUpdateID",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetGetValidationRevokedUpdateID()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetValidationRevokedUpdateID"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ValidationRevokedUpdateID",
+ Direction = "out"
+ });
+
+ return action;
+ }
+
+ private ServiceAction GetGetAuthorizationGrantedUpdateID()
+ {
+ var action = new ServiceAction
+ {
+ Name = "GetAuthorizationGrantedUpdateID"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "AuthorizationGrantedUpdateID",
+ Direction = "out"
+ });
+
+ return action;
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/CurrentIdEventArgs.cs b/Emby.Dlna/PlayTo/CurrentIdEventArgs.cs
new file mode 100644
index 0000000000..99aa50bd91
--- /dev/null
+++ b/Emby.Dlna/PlayTo/CurrentIdEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class CurrentIdEventArgs : EventArgs
+ {
+ public string Id { get; set; }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs
new file mode 100644
index 0000000000..5f3555de19
--- /dev/null
+++ b/Emby.Dlna/PlayTo/Device.cs
@@ -0,0 +1,1092 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using Emby.Dlna.Common;
+using Emby.Dlna.Ssdp;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Net;
+using System.Security;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+using Emby.Dlna.Server;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class Device : IDisposable
+ {
+ const string ServiceAvtransportType = "urn:schemas-upnp-org:service:AVTransport:1";
+ const string ServiceRenderingType = "urn:schemas-upnp-org:service:RenderingControl:1";
+
+ #region Fields & Properties
+
+ private Timer _timer;
+
+ public DeviceInfo Properties { get; set; }
+
+ private int _muteVol;
+ public bool IsMuted { get; set; }
+
+ private int _volume;
+
+ public int Volume
+ {
+ get
+ {
+ RefreshVolumeIfNeeded();
+ return _volume;
+ }
+ set
+ {
+ _volume = value;
+ }
+ }
+
+ public TimeSpan? Duration { get; set; }
+
+ private TimeSpan _position = TimeSpan.FromSeconds(0);
+ public TimeSpan Position
+ {
+ get
+ {
+ return _position;
+ }
+ set
+ {
+ _position = value;
+ }
+ }
+
+ public TRANSPORTSTATE TransportState { get; private set; }
+
+ public bool IsPlaying
+ {
+ get
+ {
+ return TransportState == TRANSPORTSTATE.PLAYING;
+ }
+ }
+
+ public bool IsPaused
+ {
+ get
+ {
+ return TransportState == TRANSPORTSTATE.PAUSED || TransportState == TRANSPORTSTATE.PAUSED_PLAYBACK;
+ }
+ }
+
+ public bool IsStopped
+ {
+ get
+ {
+ return TransportState == TRANSPORTSTATE.STOPPED;
+ }
+ }
+
+ #endregion
+
+ private readonly IHttpClient _httpClient;
+ private readonly ILogger _logger;
+ private readonly IServerConfigurationManager _config;
+
+ public DateTime DateLastActivity { get; private set; }
+ public Action OnDeviceUnavailable { get; set; }
+
+ public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config)
+ {
+ Properties = deviceProperties;
+ _httpClient = httpClient;
+ _logger = logger;
+ _config = config;
+ }
+
+ private int GetPlaybackTimerIntervalMs()
+ {
+ return 1000;
+ }
+
+ private int GetInactiveTimerIntervalMs()
+ {
+ return 20000;
+ }
+
+ public void Start()
+ {
+ _timer = new Timer(TimerCallback, null, GetPlaybackTimerIntervalMs(), GetInactiveTimerIntervalMs());
+
+ _timerActive = false;
+ }
+
+ private DateTime _lastVolumeRefresh;
+ private void RefreshVolumeIfNeeded()
+ {
+ if (!_timerActive)
+ {
+ return;
+ }
+
+ if (DateTime.UtcNow >= _lastVolumeRefresh.AddSeconds(5))
+ {
+ _lastVolumeRefresh = DateTime.UtcNow;
+ RefreshVolume();
+ }
+ }
+
+ private async void RefreshVolume()
+ {
+ if (_disposed)
+ return;
+
+ try
+ {
+ await GetVolume().ConfigureAwait(false);
+ await GetMute().ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error updating device volume info for {0}", ex, Properties.Name);
+ }
+ }
+
+ private readonly object _timerLock = new object();
+ private bool _timerActive;
+ private void RestartTimer()
+ {
+ if (_disposed)
+ return;
+
+ if (!_timerActive)
+ {
+ lock (_timerLock)
+ {
+ if (!_timerActive)
+ {
+ _logger.Debug("RestartTimer");
+ _timer.Change(10, GetPlaybackTimerIntervalMs());
+ }
+
+ _timerActive = true;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Restarts the timer in inactive mode.
+ /// </summary>
+ private void RestartTimerInactive()
+ {
+ if (_disposed)
+ return;
+
+ if (_timerActive)
+ {
+ lock (_timerLock)
+ {
+ if (_timerActive)
+ {
+ _logger.Debug("RestartTimerInactive");
+ var interval = GetInactiveTimerIntervalMs();
+
+ if (_timer != null)
+ {
+ _timer.Change(interval, interval);
+ }
+ }
+
+ _timerActive = false;
+ }
+ }
+ }
+
+ #region Commanding
+
+ public Task VolumeDown()
+ {
+ var sendVolume = Math.Max(Volume - 5, 0);
+
+ return SetVolume(sendVolume);
+ }
+
+ public Task VolumeUp()
+ {
+ var sendVolume = Math.Min(Volume + 5, 100);
+
+ return SetVolume(sendVolume);
+ }
+
+ public Task ToggleMute()
+ {
+ if (IsMuted)
+ {
+ return Unmute();
+ }
+
+ return Mute();
+ }
+
+ public async Task Mute()
+ {
+ var success = await SetMute(true).ConfigureAwait(true);
+
+ if (!success)
+ {
+ await SetVolume(0).ConfigureAwait(false);
+ }
+ }
+
+ public async Task Unmute()
+ {
+ var success = await SetMute(false).ConfigureAwait(true);
+
+ if (!success)
+ {
+ var sendVolume = _muteVol <= 0 ? 20 : _muteVol;
+
+ await SetVolume(sendVolume).ConfigureAwait(false);
+ }
+ }
+
+ private async Task<bool> SetMute(bool mute)
+ {
+ var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetMute");
+ if (command == null)
+ return false;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
+
+ if (service == null)
+ {
+ return false;
+ }
+
+ _logger.Debug("Setting mute");
+ var value = mute ? 1 : 0;
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, value))
+ .ConfigureAwait(false);
+
+ IsMuted = mute;
+
+ return true;
+ }
+
+ /// <summary>
+ /// Sets volume on a scale of 0-100
+ /// </summary>
+ public async Task SetVolume(int value)
+ {
+ var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetVolume");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ // Set it early and assume it will succeed
+ // Remote control will perform better
+ Volume = value;
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, value))
+ .ConfigureAwait(false);
+ }
+
+ public async Task Seek(TimeSpan value)
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Seek");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, String.Format("{0:hh}:{0:mm}:{0:ss}", value), "REL_TIME"))
+ .ConfigureAwait(false);
+ }
+
+ public async Task SetAvTransport(string url, string header, string metaData)
+ {
+ _logger.Debug("{0} - SetAvTransport Uri: {1} DlnaHeaders: {2}", Properties.Name, url, header);
+
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI");
+ if (command == null)
+ return;
+
+ var dictionary = new Dictionary<string, string>
+ {
+ {"CurrentURI", url},
+ {"CurrentURIMetaData", CreateDidlMeta(metaData)}
+ };
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ var post = AvCommands.BuildPost(command, service.ServiceType, url, dictionary);
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, post, header: header)
+ .ConfigureAwait(false);
+
+ await Task.Delay(50).ConfigureAwait(false);
+
+ try
+ {
+ await SetPlay().ConfigureAwait(false);
+ }
+ catch
+ {
+ // Some devices will throw an error if you tell it to play when it's already playing
+ // Others won't
+ }
+
+ RestartTimer();
+ }
+
+ private string CreateDidlMeta(string value)
+ {
+ if (string.IsNullOrEmpty(value))
+ return String.Empty;
+
+ return DescriptionXmlBuilder.Escape(value);
+ }
+
+ public async Task SetPlay()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
+ .ConfigureAwait(false);
+ }
+
+ public async Task SetStop()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.First(s => s.ServiceType == ServiceAvtransportType);
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
+ .ConfigureAwait(false);
+ }
+
+ public async Task SetPause()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.First(s => s.ServiceType == ServiceAvtransportType);
+
+ await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
+ .ConfigureAwait(false);
+
+ TransportState = TRANSPORTSTATE.PAUSED;
+ }
+
+ #endregion
+
+ #region Get data
+
+ private int _successiveStopCount;
+ private int _connectFailureCount;
+ private async void TimerCallback(object sender)
+ {
+ if (_disposed)
+ return;
+
+ const int maxSuccessiveStopReturns = 5;
+
+ try
+ {
+ var transportState = await GetTransportInfo().ConfigureAwait(false);
+
+ DateLastActivity = DateTime.UtcNow;
+
+ if (transportState.HasValue)
+ {
+ // If we're not playing anything no need to get additional data
+ if (transportState.Value == TRANSPORTSTATE.STOPPED)
+ {
+ UpdateMediaInfo(null, transportState.Value);
+ }
+ else
+ {
+ var tuple = await GetPositionInfo().ConfigureAwait(false);
+
+ var currentObject = tuple.Item2;
+
+ if (tuple.Item1 && currentObject == null)
+ {
+ currentObject = await GetMediaInfo().ConfigureAwait(false);
+ }
+
+ if (currentObject != null)
+ {
+ UpdateMediaInfo(currentObject, transportState.Value);
+ }
+ }
+
+ _connectFailureCount = 0;
+
+ if (_disposed)
+ return;
+
+ // If we're not playing anything make sure we don't get data more often than neccessry to keep the Session alive
+ if (transportState.Value == TRANSPORTSTATE.STOPPED)
+ {
+ _successiveStopCount++;
+
+ if (_successiveStopCount >= maxSuccessiveStopReturns)
+ {
+ RestartTimerInactive();
+ }
+ }
+ else
+ {
+ _successiveStopCount = 0;
+ RestartTimer();
+ }
+ }
+ }
+ catch (HttpException ex)
+ {
+ if (_disposed)
+ return;
+
+ //_logger.ErrorException("Error updating device info for {0}", ex, Properties.Name);
+
+ _successiveStopCount++;
+ _connectFailureCount++;
+
+ if (_connectFailureCount >= 3)
+ {
+ if (OnDeviceUnavailable != null)
+ {
+ _logger.Debug("Disposing device due to loss of connection");
+ OnDeviceUnavailable();
+ return;
+ }
+ }
+ if (_successiveStopCount >= maxSuccessiveStopReturns)
+ {
+ RestartTimerInactive();
+ }
+ }
+ catch (Exception ex)
+ {
+ if (_disposed)
+ return;
+
+ _logger.ErrorException("Error updating device info for {0}", ex, Properties.Name);
+
+ _successiveStopCount++;
+
+ if (_successiveStopCount >= maxSuccessiveStopReturns)
+ {
+ RestartTimerInactive();
+ }
+ }
+ }
+
+ private async Task GetVolume()
+ {
+ var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetVolume");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
+
+ if (service == null)
+ {
+ return;
+ }
+
+ var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType), true)
+ .ConfigureAwait(false);
+
+ if (result == null || result.Document == null)
+ return;
+
+ var volume = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetVolumeResponse").Select(i => i.Element("CurrentVolume")).FirstOrDefault(i => i != null);
+ var volumeValue = volume == null ? null : volume.Value;
+
+ if (string.IsNullOrWhiteSpace(volumeValue))
+ return;
+
+ Volume = int.Parse(volumeValue, UsCulture);
+
+ if (Volume > 0)
+ {
+ _muteVol = Volume;
+ }
+ }
+
+ private async Task GetMute()
+ {
+ var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMute");
+ if (command == null)
+ return;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
+
+ if (service == null)
+ {
+ return;
+ }
+
+ var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType), true)
+ .ConfigureAwait(false);
+
+ if (result == null || result.Document == null)
+ return;
+
+ var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse").Select(i => i.Element("CurrentMute")).FirstOrDefault(i => i != null);
+ var value = valueNode == null ? null : valueNode.Value;
+
+ IsMuted = string.Equals(value, "1", StringComparison.OrdinalIgnoreCase);
+ }
+
+ private async Task<TRANSPORTSTATE?> GetTransportInfo()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetTransportInfo");
+ if (command == null)
+ return null;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+ if (service == null)
+ return null;
+
+ var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType), false)
+ .ConfigureAwait(false);
+
+ if (result == null || result.Document == null)
+ return null;
+
+ var transportState =
+ result.Document.Descendants(uPnpNamespaces.AvTransport + "GetTransportInfoResponse").Select(i => i.Element("CurrentTransportState")).FirstOrDefault(i => i != null);
+
+ var transportStateValue = transportState == null ? null : transportState.Value;
+
+ if (transportStateValue != null)
+ {
+ TRANSPORTSTATE state;
+
+ if (Enum.TryParse(transportStateValue, true, out state))
+ {
+ return state;
+ }
+ }
+
+ return null;
+ }
+
+ private async Task<uBaseObject> GetMediaInfo()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMediaInfo");
+ if (command == null)
+ return null;
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType), false)
+ .ConfigureAwait(false);
+
+ if (result == null || result.Document == null)
+ return null;
+
+ var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault();
+
+ if (track == null)
+ {
+ return null;
+ }
+
+ var e = track.Element(uPnpNamespaces.items) ?? track;
+
+ return UpnpContainer.Create(e);
+ }
+
+ private async Task<Tuple<bool, uBaseObject>> GetPositionInfo()
+ {
+ var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetPositionInfo");
+ if (command == null)
+ return new Tuple<bool, uBaseObject>(false, null);
+
+ var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+
+ if (service == null)
+ {
+ throw new InvalidOperationException("Unable to find service");
+ }
+
+ var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType), false)
+ .ConfigureAwait(false);
+
+ if (result == null || result.Document == null)
+ return new Tuple<bool, uBaseObject>(false, null);
+
+ var trackUriElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackURI")).FirstOrDefault(i => i != null);
+ var trackUri = trackUriElem == null ? null : trackUriElem.Value;
+
+ var durationElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackDuration")).FirstOrDefault(i => i != null);
+ var duration = durationElem == null ? null : durationElem.Value;
+
+ if (!string.IsNullOrWhiteSpace(duration) &&
+ !string.Equals(duration, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
+ {
+ Duration = TimeSpan.Parse(duration, UsCulture);
+ }
+ else
+ {
+ Duration = null;
+ }
+
+ var positionElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("RelTime")).FirstOrDefault(i => i != null);
+ var position = positionElem == null ? null : positionElem.Value;
+
+ if (!string.IsNullOrWhiteSpace(position) && !string.Equals(position, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
+ {
+ Position = TimeSpan.Parse(position, UsCulture);
+ }
+
+ var track = result.Document.Descendants("TrackMetaData").FirstOrDefault();
+
+ if (track == null)
+ {
+ //If track is null, some vendors do this, use GetMediaInfo instead
+ return new Tuple<bool, uBaseObject>(true, null);
+ }
+
+ var trackString = (string)track;
+
+ if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
+ {
+ return new Tuple<bool, uBaseObject>(false, null);
+ }
+
+ XElement uPnpResponse;
+
+ // Handle different variations sent back by devices
+ try
+ {
+ uPnpResponse = XElement.Parse(trackString);
+ }
+ catch (Exception)
+ {
+ // first try to add a root node with a dlna namesapce
+ try
+ {
+ uPnpResponse = XElement.Parse("<data xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">" + trackString + "</data>");
+ uPnpResponse = uPnpResponse.Descendants().First();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Unable to parse xml {0}", ex, trackString);
+ return new Tuple<bool, uBaseObject>(true, null);
+ }
+ }
+
+ var e = uPnpResponse.Element(uPnpNamespaces.items);
+
+ var uTrack = CreateUBaseObject(e, trackUri);
+
+ return new Tuple<bool, uBaseObject>(true, uTrack);
+ }
+
+ private static uBaseObject CreateUBaseObject(XElement container, string trackUri)
+ {
+ if (container == null)
+ {
+ throw new ArgumentNullException("container");
+ }
+
+ var url = container.GetValue(uPnpNamespaces.Res);
+
+ if (string.IsNullOrWhiteSpace(url))
+ {
+ url = trackUri;
+ }
+
+ return new uBaseObject
+ {
+ Id = container.GetAttributeValue(uPnpNamespaces.Id),
+ ParentId = container.GetAttributeValue(uPnpNamespaces.ParentId),
+ Title = container.GetValue(uPnpNamespaces.title),
+ IconUrl = container.GetValue(uPnpNamespaces.Artwork),
+ SecondText = "",
+ Url = url,
+ ProtocolInfo = GetProtocolInfo(container),
+ MetaData = container.ToString()
+ };
+ }
+
+ private static string[] GetProtocolInfo(XElement container)
+ {
+ if (container == null)
+ {
+ throw new ArgumentNullException("container");
+ }
+
+ var resElement = container.Element(uPnpNamespaces.Res);
+
+ if (resElement != null)
+ {
+ var info = resElement.Attribute(uPnpNamespaces.ProtocolInfo);
+
+ if (info != null && !string.IsNullOrWhiteSpace(info.Value))
+ {
+ return info.Value.Split(':');
+ }
+ }
+
+ return new string[4];
+ }
+
+ #endregion
+
+ #region From XML
+
+ private async Task GetAVProtocolAsync()
+ {
+ var avService = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
+ if (avService == null)
+ return;
+
+ string url = NormalizeUrl(Properties.BaseUrl, avService.ScpdUrl);
+
+ var httpClient = new SsdpHttpClient(_httpClient, _config);
+ var document = await httpClient.GetDataAsync(url);
+
+ AvCommands = TransportCommands.Create(document);
+ }
+
+ private async Task GetRenderingProtocolAsync()
+ {
+ var avService = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
+
+ if (avService == null)
+ return;
+ string url = NormalizeUrl(Properties.BaseUrl, avService.ScpdUrl);
+
+ var httpClient = new SsdpHttpClient(_httpClient, _config);
+ var document = await httpClient.GetDataAsync(url);
+
+ RendererCommands = TransportCommands.Create(document);
+ }
+
+ private string NormalizeUrl(string baseUrl, string url)
+ {
+ // If it's already a complete url, don't stick anything onto the front of it
+ if (url.StartsWith("http", StringComparison.OrdinalIgnoreCase))
+ {
+ return url;
+ }
+
+ if (!url.Contains("/"))
+ url = "/dmr/" + url;
+ if (!url.StartsWith("/"))
+ url = "/" + url;
+
+ return baseUrl + url;
+ }
+
+ private TransportCommands AvCommands
+ {
+ get;
+ set;
+ }
+
+ internal TransportCommands RendererCommands
+ {
+ get;
+ set;
+ }
+
+ public static async Task<Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, IServerConfigurationManager config, ILogger logger)
+ {
+ var ssdpHttpClient = new SsdpHttpClient(httpClient, config);
+
+ var document = await ssdpHttpClient.GetDataAsync(url.ToString()).ConfigureAwait(false);
+
+ var deviceProperties = new DeviceInfo();
+
+ var friendlyNames = new List<string>();
+
+ var name = document.Descendants(uPnpNamespaces.ud.GetName("friendlyName")).FirstOrDefault();
+ if (name != null && !string.IsNullOrWhiteSpace(name.Value))
+ friendlyNames.Add(name.Value);
+
+ var room = document.Descendants(uPnpNamespaces.ud.GetName("roomName")).FirstOrDefault();
+ if (room != null && !string.IsNullOrWhiteSpace(room.Value))
+ friendlyNames.Add(room.Value);
+
+ deviceProperties.Name = string.Join(" ", friendlyNames.ToArray());
+
+ var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault();
+ if (model != null)
+ deviceProperties.ModelName = model.Value;
+
+ var modelNumber = document.Descendants(uPnpNamespaces.ud.GetName("modelNumber")).FirstOrDefault();
+ if (modelNumber != null)
+ deviceProperties.ModelNumber = modelNumber.Value;
+
+ var uuid = document.Descendants(uPnpNamespaces.ud.GetName("UDN")).FirstOrDefault();
+ if (uuid != null)
+ deviceProperties.UUID = uuid.Value;
+
+ var manufacturer = document.Descendants(uPnpNamespaces.ud.GetName("manufacturer")).FirstOrDefault();
+ if (manufacturer != null)
+ deviceProperties.Manufacturer = manufacturer.Value;
+
+ var manufacturerUrl = document.Descendants(uPnpNamespaces.ud.GetName("manufacturerURL")).FirstOrDefault();
+ if (manufacturerUrl != null)
+ deviceProperties.ManufacturerUrl = manufacturerUrl.Value;
+
+ var presentationUrl = document.Descendants(uPnpNamespaces.ud.GetName("presentationURL")).FirstOrDefault();
+ if (presentationUrl != null)
+ deviceProperties.PresentationUrl = presentationUrl.Value;
+
+ var modelUrl = document.Descendants(uPnpNamespaces.ud.GetName("modelURL")).FirstOrDefault();
+ if (modelUrl != null)
+ deviceProperties.ModelUrl = modelUrl.Value;
+
+ var serialNumber = document.Descendants(uPnpNamespaces.ud.GetName("serialNumber")).FirstOrDefault();
+ if (serialNumber != null)
+ deviceProperties.SerialNumber = serialNumber.Value;
+
+ var modelDescription = document.Descendants(uPnpNamespaces.ud.GetName("modelDescription")).FirstOrDefault();
+ if (modelDescription != null)
+ deviceProperties.ModelDescription = modelDescription.Value;
+
+ deviceProperties.BaseUrl = String.Format("http://{0}:{1}", url.Host, url.Port);
+
+ var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault();
+
+ if (icon != null)
+ {
+ deviceProperties.Icon = CreateIcon(icon);
+ }
+
+ var isRenderer = false;
+
+ foreach (var services in document.Descendants(uPnpNamespaces.ud.GetName("serviceList")))
+ {
+ if (services == null)
+ continue;
+
+ var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service"));
+
+ if (servicesList == null)
+ continue;
+
+ foreach (var element in servicesList)
+ {
+ var service = Create(element);
+
+ if (service != null)
+ {
+ deviceProperties.Services.Add(service);
+ if (service.ServiceType == ServiceAvtransportType)
+ {
+ isRenderer = true;
+ }
+ }
+ }
+ }
+
+ var device = new Device(deviceProperties, httpClient, logger, config);
+
+ if (isRenderer)
+ {
+ await device.GetRenderingProtocolAsync().ConfigureAwait(false);
+ await device.GetAVProtocolAsync().ConfigureAwait(false);
+ }
+
+ return device;
+ }
+
+ #endregion
+
+ private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+ private static DeviceIcon CreateIcon(XElement element)
+ {
+ if (element == null)
+ {
+ throw new ArgumentNullException("element");
+ }
+
+ var mimeType = element.GetDescendantValue(uPnpNamespaces.ud.GetName("mimetype"));
+ var width = element.GetDescendantValue(uPnpNamespaces.ud.GetName("width"));
+ var height = element.GetDescendantValue(uPnpNamespaces.ud.GetName("height"));
+ var depth = element.GetDescendantValue(uPnpNamespaces.ud.GetName("depth"));
+ var url = element.GetDescendantValue(uPnpNamespaces.ud.GetName("url"));
+
+ var widthValue = int.Parse(width, NumberStyles.Any, UsCulture);
+ var heightValue = int.Parse(height, NumberStyles.Any, UsCulture);
+
+ return new DeviceIcon
+ {
+ Depth = depth,
+ Height = heightValue,
+ MimeType = mimeType,
+ Url = url,
+ Width = widthValue
+ };
+ }
+
+ private static DeviceService Create(XElement element)
+ {
+ var type = element.GetDescendantValue(uPnpNamespaces.ud.GetName("serviceType"));
+ var id = element.GetDescendantValue(uPnpNamespaces.ud.GetName("serviceId"));
+ var scpdUrl = element.GetDescendantValue(uPnpNamespaces.ud.GetName("SCPDURL"));
+ var controlURL = element.GetDescendantValue(uPnpNamespaces.ud.GetName("controlURL"));
+ var eventSubURL = element.GetDescendantValue(uPnpNamespaces.ud.GetName("eventSubURL"));
+
+ return new DeviceService
+ {
+ ControlUrl = controlURL,
+ EventSubUrl = eventSubURL,
+ ScpdUrl = scpdUrl,
+ ServiceId = id,
+ ServiceType = type
+ };
+ }
+
+ public event EventHandler<PlaybackStartEventArgs> PlaybackStart;
+ public event EventHandler<PlaybackProgressEventArgs> PlaybackProgress;
+ public event EventHandler<PlaybackStoppedEventArgs> PlaybackStopped;
+ public event EventHandler<MediaChangedEventArgs> MediaChanged;
+
+ public uBaseObject CurrentMediaInfo { get; private set; }
+
+ private void UpdateMediaInfo(uBaseObject mediaInfo, TRANSPORTSTATE state)
+ {
+ TransportState = state;
+
+ var previousMediaInfo = CurrentMediaInfo;
+ CurrentMediaInfo = mediaInfo;
+
+ if (previousMediaInfo == null && mediaInfo != null)
+ {
+ if (state != TRANSPORTSTATE.STOPPED)
+ {
+ OnPlaybackStart(mediaInfo);
+ }
+ }
+ else if (mediaInfo != null && previousMediaInfo != null && !mediaInfo.Equals(previousMediaInfo))
+ {
+ OnMediaChanged(previousMediaInfo, mediaInfo);
+ }
+ else if (mediaInfo == null && previousMediaInfo != null)
+ {
+ OnPlaybackStop(previousMediaInfo);
+ }
+ else if (mediaInfo != null && mediaInfo.Equals(previousMediaInfo))
+ {
+ OnPlaybackProgress(mediaInfo);
+ }
+ }
+
+ private void OnPlaybackStart(uBaseObject mediaInfo)
+ {
+ if (PlaybackStart != null)
+ {
+ PlaybackStart.Invoke(this, new PlaybackStartEventArgs
+ {
+ MediaInfo = mediaInfo
+ });
+ }
+ }
+
+ private void OnPlaybackProgress(uBaseObject mediaInfo)
+ {
+ if (PlaybackProgress != null)
+ {
+ PlaybackProgress.Invoke(this, new PlaybackProgressEventArgs
+ {
+ MediaInfo = mediaInfo
+ });
+ }
+ }
+
+ private void OnPlaybackStop(uBaseObject mediaInfo)
+ {
+ if (PlaybackStopped != null)
+ {
+ PlaybackStopped.Invoke(this, new PlaybackStoppedEventArgs
+ {
+ MediaInfo = mediaInfo
+ });
+ }
+ }
+
+ private void OnMediaChanged(uBaseObject old, uBaseObject newMedia)
+ {
+ if (MediaChanged != null)
+ {
+ MediaChanged.Invoke(this, new MediaChangedEventArgs
+ {
+ OldMediaInfo = old,
+ NewMediaInfo = newMedia
+ });
+ }
+ }
+
+ #region IDisposable
+
+ bool _disposed;
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ _disposed = true;
+
+ DisposeTimer();
+ }
+ }
+
+ private void DisposeTimer()
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ _timer = null;
+ }
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/DeviceInfo.cs b/Emby.Dlna/PlayTo/DeviceInfo.cs
new file mode 100644
index 0000000000..d293bcea14
--- /dev/null
+++ b/Emby.Dlna/PlayTo/DeviceInfo.cs
@@ -0,0 +1,76 @@
+using Emby.Dlna.Common;
+using MediaBrowser.Model.Dlna;
+using System.Collections.Generic;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class DeviceInfo
+ {
+ public DeviceInfo()
+ {
+ ClientType = "DLNA";
+ Name = "Generic Device";
+ }
+
+ public string UUID { get; set; }
+
+ public string Name { get; set; }
+
+ public string ClientType { get; set; }
+
+ public string ModelName { get; set; }
+
+ public string ModelNumber { get; set; }
+
+ public string ModelDescription { get; set; }
+
+ public string ModelUrl { get; set; }
+
+ public string Manufacturer { get; set; }
+
+ public string SerialNumber { get; set; }
+
+ public string ManufacturerUrl { get; set; }
+
+ public string PresentationUrl { get; set; }
+
+ private string _baseUrl = string.Empty;
+ public string BaseUrl
+ {
+ get
+ {
+ return _baseUrl;
+ }
+ set
+ {
+ _baseUrl = value;
+ }
+ }
+
+ public DeviceIcon Icon { get; set; }
+
+ private readonly List<DeviceService> _services = new List<DeviceService>();
+ public List<DeviceService> Services
+ {
+ get
+ {
+ return _services;
+ }
+ }
+
+ public DeviceIdentification ToDeviceIdentification()
+ {
+ return new DeviceIdentification
+ {
+ Manufacturer = Manufacturer,
+ ModelName = ModelName,
+ ModelNumber = ModelNumber,
+ FriendlyName = Name,
+ ManufacturerUrl = ManufacturerUrl,
+ ModelUrl = ModelUrl,
+ ModelDescription = ModelDescription,
+ SerialNumber = SerialNumber
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs
new file mode 100644
index 0000000000..7dff8bda13
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlayToController.cs
@@ -0,0 +1,941 @@
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Session;
+using Emby.Dlna.Didl;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Session;
+using MediaBrowser.Model.System;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Globalization;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlayToController : ISessionController, IDisposable
+ {
+ private Device _device;
+ private readonly SessionInfo _session;
+ private readonly ISessionManager _sessionManager;
+ private readonly ILibraryManager _libraryManager;
+ private readonly ILogger _logger;
+ private readonly IDlnaManager _dlnaManager;
+ private readonly IUserManager _userManager;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly IUserDataManager _userDataManager;
+ private readonly ILocalizationManager _localization;
+ private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IConfigurationManager _config;
+ private readonly IMediaEncoder _mediaEncoder;
+
+ private readonly IDeviceDiscovery _deviceDiscovery;
+ private readonly string _serverAddress;
+ private readonly string _accessToken;
+ private readonly DateTime _creationTime;
+
+ public bool IsSessionActive
+ {
+ get
+ {
+ var lastDateKnownActivity = new[] { _creationTime, _device.DateLastActivity }.Max();
+
+ if (DateTime.UtcNow >= lastDateKnownActivity.AddSeconds(120))
+ {
+ try
+ {
+ // Session is inactive, mark it for Disposal and don't start the elapsed timer.
+ _sessionManager.ReportSessionEnded(_session.Id);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in ReportSessionEnded", ex);
+ }
+ return false;
+ }
+
+ return _device != null;
+ }
+ }
+
+ public void OnActivity()
+ {
+ }
+
+ public bool SupportsMediaControl
+ {
+ get { return IsSessionActive; }
+ }
+
+ public PlayToController(SessionInfo session, ISessionManager sessionManager, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, string accessToken, IDeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IConfigurationManager config, IMediaEncoder mediaEncoder)
+ {
+ _session = session;
+ _sessionManager = sessionManager;
+ _libraryManager = libraryManager;
+ _dlnaManager = dlnaManager;
+ _userManager = userManager;
+ _imageProcessor = imageProcessor;
+ _serverAddress = serverAddress;
+ _deviceDiscovery = deviceDiscovery;
+ _userDataManager = userDataManager;
+ _localization = localization;
+ _mediaSourceManager = mediaSourceManager;
+ _config = config;
+ _mediaEncoder = mediaEncoder;
+ _accessToken = accessToken;
+ _logger = logger;
+ _creationTime = DateTime.UtcNow;
+ }
+
+ public void Init(Device device)
+ {
+ _device = device;
+ _device.OnDeviceUnavailable = OnDeviceUnavailable;
+ _device.PlaybackStart += _device_PlaybackStart;
+ _device.PlaybackProgress += _device_PlaybackProgress;
+ _device.PlaybackStopped += _device_PlaybackStopped;
+ _device.MediaChanged += _device_MediaChanged;
+
+ _device.Start();
+
+ _deviceDiscovery.DeviceLeft += _deviceDiscovery_DeviceLeft;
+ }
+
+ private void OnDeviceUnavailable()
+ {
+ try
+ {
+ _sessionManager.ReportSessionEnded(_session.Id);
+ }
+ catch
+ {
+ // Could throw if the session is already gone
+ }
+ }
+
+ void _deviceDiscovery_DeviceLeft(object sender, GenericEventArgs<UpnpDeviceInfo> e)
+ {
+ var info = e.Argument;
+
+ string nts;
+ info.Headers.TryGetValue("NTS", out nts);
+
+ string usn;
+ if (!info.Headers.TryGetValue("USN", out usn)) usn = String.Empty;
+
+ string nt;
+ if (!info.Headers.TryGetValue("NT", out nt)) nt = String.Empty;
+
+ if (usn.IndexOf(_device.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1 &&
+ !_disposed)
+ {
+ if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1 ||
+ nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) != -1)
+ {
+ OnDeviceUnavailable();
+ }
+ }
+ }
+
+ async void _device_MediaChanged(object sender, MediaChangedEventArgs e)
+ {
+ try
+ {
+ var streamInfo = await StreamParams.ParseFromUrl(e.OldMediaInfo.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+ if (streamInfo.Item != null)
+ {
+ var progress = GetProgressInfo(e.OldMediaInfo, streamInfo);
+
+ var positionTicks = progress.PositionTicks;
+
+ ReportPlaybackStopped(e.OldMediaInfo, streamInfo, positionTicks);
+ }
+
+ streamInfo = await StreamParams.ParseFromUrl(e.NewMediaInfo.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+ if (streamInfo.Item == null) return;
+
+ var newItemProgress = GetProgressInfo(e.NewMediaInfo, streamInfo);
+
+ await _sessionManager.OnPlaybackStart(newItemProgress).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error reporting progress", ex);
+ }
+ }
+
+ async void _device_PlaybackStopped(object sender, PlaybackStoppedEventArgs e)
+ {
+ try
+ {
+ var streamInfo = await StreamParams.ParseFromUrl(e.MediaInfo.Url, _libraryManager, _mediaSourceManager)
+ .ConfigureAwait(false);
+
+ if (streamInfo.Item == null) return;
+
+ var progress = GetProgressInfo(e.MediaInfo, streamInfo);
+
+ var positionTicks = progress.PositionTicks;
+
+ ReportPlaybackStopped(e.MediaInfo, streamInfo, positionTicks);
+
+ var duration = streamInfo.MediaSource == null ?
+ (_device.Duration == null ? (long?)null : _device.Duration.Value.Ticks) :
+ streamInfo.MediaSource.RunTimeTicks;
+
+ var playedToCompletion = (positionTicks.HasValue && positionTicks.Value == 0);
+
+ if (!playedToCompletion && duration.HasValue && positionTicks.HasValue)
+ {
+ double percent = positionTicks.Value;
+ percent /= duration.Value;
+
+ playedToCompletion = Math.Abs(1 - percent) <= .1;
+ }
+
+ if (playedToCompletion)
+ {
+ await SetPlaylistIndex(_currentPlaylistIndex + 1).ConfigureAwait(false);
+ }
+ else
+ {
+ Playlist.Clear();
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error reporting playback stopped", ex);
+ }
+ }
+
+ private async void ReportPlaybackStopped(uBaseObject mediaInfo, StreamParams streamInfo, long? positionTicks)
+ {
+ try
+ {
+ await _sessionManager.OnPlaybackStopped(new PlaybackStopInfo
+ {
+ ItemId = streamInfo.ItemId,
+ SessionId = _session.Id,
+ PositionTicks = positionTicks,
+ MediaSourceId = streamInfo.MediaSourceId
+
+ }).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error reporting progress", ex);
+ }
+ }
+
+ async void _device_PlaybackStart(object sender, PlaybackStartEventArgs e)
+ {
+ try
+ {
+ var info = await StreamParams.ParseFromUrl(e.MediaInfo.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+
+ if (info.Item != null)
+ {
+ var progress = GetProgressInfo(e.MediaInfo, info);
+
+ await _sessionManager.OnPlaybackStart(progress).ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error reporting progress", ex);
+ }
+ }
+
+ async void _device_PlaybackProgress(object sender, PlaybackProgressEventArgs e)
+ {
+ try
+ {
+ var info = await StreamParams.ParseFromUrl(e.MediaInfo.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+
+ if (info.Item != null)
+ {
+ var progress = GetProgressInfo(e.MediaInfo, info);
+
+ await _sessionManager.OnPlaybackProgress(progress).ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error reporting progress", ex);
+ }
+ }
+
+ private PlaybackStartInfo GetProgressInfo(uBaseObject mediaInfo, StreamParams info)
+ {
+ var ticks = _device.Position.Ticks;
+
+ if (!EnableClientSideSeek(info))
+ {
+ ticks += info.StartPositionTicks;
+ }
+
+ return new PlaybackStartInfo
+ {
+ ItemId = info.ItemId,
+ SessionId = _session.Id,
+ PositionTicks = ticks,
+ IsMuted = _device.IsMuted,
+ IsPaused = _device.IsPaused,
+ MediaSourceId = info.MediaSourceId,
+ AudioStreamIndex = info.AudioStreamIndex,
+ SubtitleStreamIndex = info.SubtitleStreamIndex,
+ VolumeLevel = _device.Volume,
+
+ CanSeek = info.MediaSource == null ? _device.Duration.HasValue : info.MediaSource.RunTimeTicks.HasValue,
+
+ PlayMethod = info.IsDirectStream ? PlayMethod.DirectStream : PlayMethod.Transcode,
+ QueueableMediaTypes = new List<string> { mediaInfo.MediaType }
+ };
+ }
+
+ #region SendCommands
+
+ public async Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
+ {
+ _logger.Debug("{0} - Received PlayRequest: {1}", this._session.DeviceName, command.PlayCommand);
+
+ var user = String.IsNullOrEmpty(command.ControllingUserId) ? null : _userManager.GetUserById(command.ControllingUserId);
+
+ var items = new List<BaseItem>();
+ foreach (string id in command.ItemIds)
+ {
+ AddItemFromId(Guid.Parse(id), items);
+ }
+
+ var playlist = new List<PlaylistItem>();
+ var isFirst = true;
+
+ foreach (var item in items)
+ {
+ if (isFirst && command.StartPositionTicks.HasValue)
+ {
+ playlist.Add(CreatePlaylistItem(item, user, command.StartPositionTicks.Value, null, null, null));
+ isFirst = false;
+ }
+ else
+ {
+ playlist.Add(CreatePlaylistItem(item, user, 0, null, null, null));
+ }
+ }
+
+ _logger.Debug("{0} - Playlist created", _session.DeviceName);
+
+ if (command.PlayCommand == PlayCommand.PlayLast)
+ {
+ Playlist.AddRange(playlist);
+ }
+ if (command.PlayCommand == PlayCommand.PlayNext)
+ {
+ Playlist.AddRange(playlist);
+ }
+
+ if (!String.IsNullOrWhiteSpace(command.ControllingUserId))
+ {
+ await _sessionManager.LogSessionActivity(_session.Client, _session.ApplicationVersion, _session.DeviceId,
+ _session.DeviceName, _session.RemoteEndPoint, user).ConfigureAwait(false);
+ }
+
+ await PlayItems(playlist).ConfigureAwait(false);
+ }
+
+ public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken)
+ {
+ switch (command.Command)
+ {
+ case PlaystateCommand.Stop:
+ Playlist.Clear();
+ return _device.SetStop();
+
+ case PlaystateCommand.Pause:
+ return _device.SetPause();
+
+ case PlaystateCommand.Unpause:
+ return _device.SetPlay();
+
+ case PlaystateCommand.Seek:
+ {
+ return Seek(command.SeekPositionTicks ?? 0);
+ }
+
+ case PlaystateCommand.NextTrack:
+ return SetPlaylistIndex(_currentPlaylistIndex + 1);
+
+ case PlaystateCommand.PreviousTrack:
+ return SetPlaylistIndex(_currentPlaylistIndex - 1);
+ }
+
+ return Task.FromResult(true);
+ }
+
+ private async Task Seek(long newPosition)
+ {
+ var media = _device.CurrentMediaInfo;
+
+ if (media != null)
+ {
+ var info = await StreamParams.ParseFromUrl(media.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+
+ if (info.Item != null && !EnableClientSideSeek(info))
+ {
+ var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
+ var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, info.SubtitleStreamIndex);
+
+ await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
+ return;
+ }
+ await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
+ }
+ }
+
+ private bool EnableClientSideSeek(StreamParams info)
+ {
+ return info.IsDirectStream;
+ }
+
+ private bool EnableClientSideSeek(StreamInfo info)
+ {
+ return info.IsDirectStream;
+ }
+
+ public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendServerRestartNotification(CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendPlaybackStartNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendPlaybackStoppedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendServerShutdownNotification(CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ #endregion
+
+ #region Playlist
+
+ private int _currentPlaylistIndex;
+ private readonly List<PlaylistItem> _playlist = new List<PlaylistItem>();
+ private List<PlaylistItem> Playlist
+ {
+ get
+ {
+ return _playlist;
+ }
+ }
+
+ private void AddItemFromId(Guid id, List<BaseItem> list)
+ {
+ var item = _libraryManager.GetItemById(id);
+ if (item.MediaType == MediaType.Audio || item.MediaType == MediaType.Video)
+ {
+ list.Add(item);
+ }
+ }
+
+ private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks, string mediaSourceId, int? audioStreamIndex, int? subtitleStreamIndex)
+ {
+ var deviceInfo = _device.Properties;
+
+ var profile = _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification()) ??
+ _dlnaManager.GetDefaultProfile();
+
+ var hasMediaSources = item as IHasMediaSources;
+ var mediaSources = hasMediaSources != null
+ ? (_mediaSourceManager.GetStaticMediaSources(hasMediaSources, true, user)).ToList()
+ : new List<MediaSourceInfo>();
+
+ var playlistItem = GetPlaylistItem(item, mediaSources, profile, _session.DeviceId, mediaSourceId, audioStreamIndex, subtitleStreamIndex);
+ playlistItem.StreamInfo.StartPositionTicks = startPostionTicks;
+
+ 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);
+
+ playlistItem.Didl = itemXml;
+
+ return playlistItem;
+ }
+
+ private string GetDlnaHeaders(PlaylistItem item)
+ {
+ var profile = item.Profile;
+ var streamInfo = item.StreamInfo;
+
+ if (streamInfo.MediaType == DlnaProfileType.Audio)
+ {
+ return new ContentFeatureBuilder(profile)
+ .BuildAudioHeader(streamInfo.Container,
+ streamInfo.TargetAudioCodec,
+ streamInfo.TargetAudioBitrate,
+ streamInfo.TargetAudioSampleRate,
+ streamInfo.TargetAudioChannels,
+ streamInfo.IsDirectStream,
+ streamInfo.RunTimeTicks,
+ streamInfo.TranscodeSeekInfo);
+ }
+
+ if (streamInfo.MediaType == DlnaProfileType.Video)
+ {
+ var list = new ContentFeatureBuilder(profile)
+ .BuildVideoHeader(streamInfo.Container,
+ streamInfo.VideoCodec,
+ streamInfo.TargetAudioCodec,
+ streamInfo.TargetWidth,
+ streamInfo.TargetHeight,
+ streamInfo.TargetVideoBitDepth,
+ streamInfo.TargetVideoBitrate,
+ streamInfo.TargetTimestamp,
+ streamInfo.IsDirectStream,
+ streamInfo.RunTimeTicks,
+ streamInfo.TargetVideoProfile,
+ streamInfo.TargetVideoLevel,
+ streamInfo.TargetFramerate,
+ streamInfo.TargetPacketLength,
+ streamInfo.TranscodeSeekInfo,
+ streamInfo.IsTargetAnamorphic,
+ streamInfo.TargetRefFrames,
+ streamInfo.TargetVideoStreamCount,
+ streamInfo.TargetAudioStreamCount,
+ streamInfo.TargetVideoCodecTag,
+ streamInfo.IsTargetAVC);
+
+ return list.FirstOrDefault();
+ }
+
+ return null;
+ }
+
+ private ILogger GetStreamBuilderLogger()
+ {
+ if (_config.GetDlnaConfiguration().EnableDebugLog)
+ {
+ return _logger;
+ }
+
+ return new NullLogger();
+ }
+
+ private PlaylistItem GetPlaylistItem(BaseItem item, List<MediaSourceInfo> mediaSources, DeviceProfile profile, string deviceId, string mediaSourceId, int? audioStreamIndex, int? subtitleStreamIndex)
+ {
+ if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase))
+ {
+ return new PlaylistItem
+ {
+ StreamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger()).BuildVideoItem(new VideoOptions
+ {
+ ItemId = item.Id.ToString("N"),
+ MediaSources = mediaSources,
+ Profile = profile,
+ DeviceId = deviceId,
+ MaxBitrate = profile.MaxStreamingBitrate,
+ MediaSourceId = mediaSourceId,
+ AudioStreamIndex = audioStreamIndex,
+ SubtitleStreamIndex = subtitleStreamIndex
+ }),
+
+ Profile = profile
+ };
+ }
+
+ if (string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
+ {
+ return new PlaylistItem
+ {
+ StreamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger()).BuildAudioItem(new AudioOptions
+ {
+ ItemId = item.Id.ToString("N"),
+ MediaSources = mediaSources,
+ Profile = profile,
+ DeviceId = deviceId,
+ MaxBitrate = profile.MaxStreamingBitrate,
+ MediaSourceId = mediaSourceId
+ }),
+
+ Profile = profile
+ };
+ }
+
+ if (string.Equals(item.MediaType, MediaType.Photo, StringComparison.OrdinalIgnoreCase))
+ {
+ return new PlaylistItemFactory().Create((Photo)item, profile);
+ }
+
+ throw new ArgumentException("Unrecognized item type.");
+ }
+
+ /// <summary>
+ /// Plays the items.
+ /// </summary>
+ /// <param name="items">The items.</param>
+ /// <returns></returns>
+ private async Task<bool> PlayItems(IEnumerable<PlaylistItem> items)
+ {
+ Playlist.Clear();
+ Playlist.AddRange(items);
+ _logger.Debug("{0} - Playing {1} items", _session.DeviceName, Playlist.Count);
+
+ await SetPlaylistIndex(0).ConfigureAwait(false);
+ return true;
+ }
+
+ private async Task SetPlaylistIndex(int index)
+ {
+ if (index < 0 || index >= Playlist.Count)
+ {
+ Playlist.Clear();
+ await _device.SetStop();
+ return;
+ }
+
+ _currentPlaylistIndex = index;
+ var currentitem = Playlist[index];
+
+ await _device.SetAvTransport(currentitem.StreamUrl, GetDlnaHeaders(currentitem), currentitem.Didl);
+
+ var streamInfo = currentitem.StreamInfo;
+ if (streamInfo.StartPositionTicks > 0 && EnableClientSideSeek(streamInfo))
+ {
+ await SeekAfterTransportChange(streamInfo.StartPositionTicks).ConfigureAwait(false);
+ }
+ }
+
+ #endregion
+
+ private bool _disposed;
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ _disposed = true;
+
+ _device.PlaybackStart -= _device_PlaybackStart;
+ _device.PlaybackProgress -= _device_PlaybackProgress;
+ _device.PlaybackStopped -= _device_PlaybackStopped;
+ _device.MediaChanged -= _device_MediaChanged;
+ //_deviceDiscovery.DeviceLeft -= _deviceDiscovery_DeviceLeft;
+ _device.OnDeviceUnavailable = null;
+
+ _device.Dispose();
+ }
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken)
+ {
+ GeneralCommandType commandType;
+
+ if (Enum.TryParse(command.Name, true, out commandType))
+ {
+ switch (commandType)
+ {
+ case GeneralCommandType.VolumeDown:
+ return _device.VolumeDown();
+ case GeneralCommandType.VolumeUp:
+ return _device.VolumeUp();
+ case GeneralCommandType.Mute:
+ return _device.Mute();
+ case GeneralCommandType.Unmute:
+ return _device.Unmute();
+ case GeneralCommandType.ToggleMute:
+ return _device.ToggleMute();
+ case GeneralCommandType.SetAudioStreamIndex:
+ {
+ string arg;
+
+ if (command.Arguments.TryGetValue("Index", out arg))
+ {
+ int val;
+
+ if (Int32.TryParse(arg, NumberStyles.Any, _usCulture, out val))
+ {
+ return SetAudioStreamIndex(val);
+ }
+
+ throw new ArgumentException("Unsupported SetAudioStreamIndex value supplied.");
+ }
+
+ throw new ArgumentException("SetAudioStreamIndex argument cannot be null");
+ }
+ case GeneralCommandType.SetSubtitleStreamIndex:
+ {
+ string arg;
+
+ if (command.Arguments.TryGetValue("Index", out arg))
+ {
+ int val;
+
+ if (Int32.TryParse(arg, NumberStyles.Any, _usCulture, out val))
+ {
+ return SetSubtitleStreamIndex(val);
+ }
+
+ throw new ArgumentException("Unsupported SetSubtitleStreamIndex value supplied.");
+ }
+
+ throw new ArgumentException("SetSubtitleStreamIndex argument cannot be null");
+ }
+ case GeneralCommandType.SetVolume:
+ {
+ string arg;
+
+ if (command.Arguments.TryGetValue("Volume", out arg))
+ {
+ int volume;
+
+ if (Int32.TryParse(arg, NumberStyles.Any, _usCulture, out volume))
+ {
+ return _device.SetVolume(volume);
+ }
+
+ throw new ArgumentException("Unsupported volume value supplied.");
+ }
+
+ throw new ArgumentException("Volume argument cannot be null");
+ }
+ default:
+ return Task.FromResult(true);
+ }
+ }
+
+ return Task.FromResult(true);
+ }
+
+ private async Task SetAudioStreamIndex(int? newIndex)
+ {
+ var media = _device.CurrentMediaInfo;
+
+ if (media != null)
+ {
+ var info = await StreamParams.ParseFromUrl(media.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+
+ if (info.Item != null)
+ {
+ var progress = GetProgressInfo(media, info);
+ var newPosition = progress.PositionTicks ?? 0;
+
+ var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
+ var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, newIndex, info.SubtitleStreamIndex);
+
+ await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
+
+ if (EnableClientSideSeek(newItem.StreamInfo))
+ {
+ await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
+ }
+ }
+ }
+ }
+
+ private async Task SetSubtitleStreamIndex(int? newIndex)
+ {
+ var media = _device.CurrentMediaInfo;
+
+ if (media != null)
+ {
+ var info = await StreamParams.ParseFromUrl(media.Url, _libraryManager, _mediaSourceManager).ConfigureAwait(false);
+
+ if (info.Item != null)
+ {
+ var progress = GetProgressInfo(media, info);
+ var newPosition = progress.PositionTicks ?? 0;
+
+ var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
+ var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, newIndex);
+
+ await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
+
+ if (EnableClientSideSeek(newItem.StreamInfo) && newPosition > 0)
+ {
+ await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
+ }
+ }
+ }
+ }
+
+ private async Task SeekAfterTransportChange(long positionTicks)
+ {
+ const int maxWait = 15000000;
+ const int interval = 500;
+ var currentWait = 0;
+ while (_device.TransportState != TRANSPORTSTATE.PLAYING && currentWait < maxWait)
+ {
+ await Task.Delay(interval).ConfigureAwait(false);
+ currentWait += interval;
+ }
+
+ await _device.Seek(TimeSpan.FromTicks(positionTicks)).ConfigureAwait(false);
+ }
+
+ private class StreamParams
+ {
+ public string ItemId { get; set; }
+
+ public bool IsDirectStream { get; set; }
+
+ public long StartPositionTicks { get; set; }
+
+ public int? AudioStreamIndex { get; set; }
+
+ public int? SubtitleStreamIndex { get; set; }
+
+ public string DeviceProfileId { get; set; }
+ public string DeviceId { get; set; }
+
+ public string MediaSourceId { get; set; }
+ public string LiveStreamId { get; set; }
+
+ public BaseItem Item { get; set; }
+ public MediaSourceInfo MediaSource { get; set; }
+
+ private static string GetItemId(string url)
+ {
+ var parts = url.Split('/');
+
+ for (var i = 0; i < parts.Length; i++)
+ {
+ var part = parts[i];
+
+ if (string.Equals(part, "audio", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(part, "videos", StringComparison.OrdinalIgnoreCase))
+ {
+ if (parts.Length > i + 1)
+ {
+ return parts[i + 1];
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public static async Task<StreamParams> ParseFromUrl(string url, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager)
+ {
+ var request = new StreamParams
+ {
+ ItemId = GetItemId(url)
+ };
+
+ Guid parsedId;
+
+ if (string.IsNullOrWhiteSpace(request.ItemId) || !Guid.TryParse(request.ItemId, out parsedId))
+ {
+ return request;
+ }
+
+ const string srch = "params=";
+ var index = url.IndexOf(srch, StringComparison.OrdinalIgnoreCase);
+
+ if (index == -1) return request;
+
+ var vals = url.Substring(index + srch.Length).Split(';');
+
+ for (var i = 0; i < vals.Length; i++)
+ {
+ var val = vals[i];
+
+ if (string.IsNullOrWhiteSpace(val))
+ {
+ continue;
+ }
+
+ if (i == 0)
+ {
+ request.DeviceProfileId = val;
+ }
+ else if (i == 1)
+ {
+ request.DeviceId = val;
+ }
+ else if (i == 2)
+ {
+ request.MediaSourceId = val;
+ }
+ else if (i == 3)
+ {
+ request.IsDirectStream = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
+ }
+ else if (i == 6)
+ {
+ request.AudioStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
+ }
+ else if (i == 7)
+ {
+ request.SubtitleStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
+ }
+ else if (i == 14)
+ {
+ request.StartPositionTicks = long.Parse(val, CultureInfo.InvariantCulture);
+ }
+ else if (i == 22)
+ {
+ request.LiveStreamId = val;
+ }
+ }
+
+ request.Item = string.IsNullOrWhiteSpace(request.ItemId)
+ ? null
+ : libraryManager.GetItemById(parsedId);
+
+ var hasMediaSources = request.Item as IHasMediaSources;
+
+ request.MediaSource = hasMediaSources == null
+ ? null
+ : (await mediaSourceManager.GetMediaSource(hasMediaSources, request.MediaSourceId, request.LiveStreamId, false, CancellationToken.None).ConfigureAwait(false));
+
+ return request;
+ }
+ }
+
+ public Task SendMessage<T>(string name, T data, CancellationToken cancellationToken)
+ {
+ // Not supported or needed right now
+ return Task.FromResult(true);
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/PlayToManager.cs b/Emby.Dlna/PlayTo/PlayToManager.cs
new file mode 100644
index 0000000000..8b4d57b82c
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlayToManager.cs
@@ -0,0 +1,205 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Session;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Globalization;
+
+namespace Emby.Dlna.PlayTo
+{
+ class PlayToManager : IDisposable
+ {
+ private readonly ILogger _logger;
+ private readonly ISessionManager _sessionManager;
+
+ private readonly ILibraryManager _libraryManager;
+ private readonly IUserManager _userManager;
+ private readonly IDlnaManager _dlnaManager;
+ private readonly IServerApplicationHost _appHost;
+ private readonly IImageProcessor _imageProcessor;
+ private readonly IHttpClient _httpClient;
+ private readonly IServerConfigurationManager _config;
+ private readonly IUserDataManager _userDataManager;
+ private readonly ILocalizationManager _localization;
+
+ private readonly IDeviceDiscovery _deviceDiscovery;
+ private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IMediaEncoder _mediaEncoder;
+
+ private readonly List<string> _nonRendererUrls = new List<string>();
+ private DateTime _lastRendererClear;
+
+ public PlayToManager(ILogger logger, ISessionManager sessionManager, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, IDeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IMediaEncoder mediaEncoder)
+ {
+ _logger = logger;
+ _sessionManager = sessionManager;
+ _libraryManager = libraryManager;
+ _userManager = userManager;
+ _dlnaManager = dlnaManager;
+ _appHost = appHost;
+ _imageProcessor = imageProcessor;
+ _deviceDiscovery = deviceDiscovery;
+ _httpClient = httpClient;
+ _config = config;
+ _userDataManager = userDataManager;
+ _localization = localization;
+ _mediaSourceManager = mediaSourceManager;
+ _mediaEncoder = mediaEncoder;
+ }
+
+ public void Start()
+ {
+ _deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
+ }
+
+ async void _deviceDiscovery_DeviceDiscovered(object sender, GenericEventArgs<UpnpDeviceInfo> e)
+ {
+ var info = e.Argument;
+
+ string usn;
+ if (!info.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
+
+ string nt;
+ if (!info.Headers.TryGetValue("NT", out nt)) nt = string.Empty;
+
+ string location = info.Location.ToString();
+
+ // It has to report that it's a media renderer
+ if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 &&
+ nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1)
+ {
+ return;
+ }
+
+ if (_sessionManager.Sessions.Any(i => usn.IndexOf(i.DeviceId, StringComparison.OrdinalIgnoreCase) != -1))
+ {
+ return;
+ }
+
+ try
+ {
+ lock (_nonRendererUrls)
+ {
+ if ((DateTime.UtcNow - _lastRendererClear).TotalMinutes >= 10)
+ {
+ _nonRendererUrls.Clear();
+ _lastRendererClear = DateTime.UtcNow;
+ }
+
+ if (_nonRendererUrls.Contains(location, StringComparer.OrdinalIgnoreCase))
+ {
+ return;
+ }
+ }
+
+ var uri = info.Location;
+ _logger.Debug("Attempting to create PlayToController from location {0}", location);
+ var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
+
+ if (device.RendererCommands == null)
+ {
+ lock (_nonRendererUrls)
+ {
+ _nonRendererUrls.Add(location);
+ return;
+ }
+ }
+
+ _logger.Debug("Logging session activity from location {0}", location);
+ var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null)
+ .ConfigureAwait(false);
+
+ var controller = sessionInfo.SessionController as PlayToController;
+
+ if (controller == null)
+ {
+ string serverAddress;
+ if (info.LocalIpAddress == null)
+ {
+ serverAddress = await GetServerAddress(null, false).ConfigureAwait(false);
+ }
+ else
+ {
+ serverAddress = await GetServerAddress(info.LocalIpAddress.Address, info.LocalIpAddress.IsIpv6).ConfigureAwait(false);
+ }
+
+ string accessToken = null;
+
+ sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
+ _sessionManager,
+ _libraryManager,
+ _logger,
+ _dlnaManager,
+ _userManager,
+ _imageProcessor,
+ serverAddress,
+ accessToken,
+ _deviceDiscovery,
+ _userDataManager,
+ _localization,
+ _mediaSourceManager,
+ _config,
+ _mediaEncoder);
+
+ controller.Init(device);
+
+ var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ??
+ _dlnaManager.GetDefaultProfile();
+
+ _sessionManager.ReportCapabilities(sessionInfo.Id, new ClientCapabilities
+ {
+ PlayableMediaTypes = profile.GetSupportedMediaTypes(),
+
+ SupportedCommands = new List<string>
+ {
+ GeneralCommandType.VolumeDown.ToString(),
+ GeneralCommandType.VolumeUp.ToString(),
+ GeneralCommandType.Mute.ToString(),
+ GeneralCommandType.Unmute.ToString(),
+ GeneralCommandType.ToggleMute.ToString(),
+ GeneralCommandType.SetVolume.ToString(),
+ GeneralCommandType.SetAudioStreamIndex.ToString(),
+ GeneralCommandType.SetSubtitleStreamIndex.ToString()
+ },
+
+ SupportsMediaControl = true
+ });
+
+ _logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error creating PlayTo device.", ex);
+ }
+ }
+
+ private Task<string> GetServerAddress(string ipAddress, bool isIpv6)
+ {
+ if (string.IsNullOrWhiteSpace(ipAddress))
+ {
+ return _appHost.GetLocalApiUrl();
+ }
+
+ return Task.FromResult(_appHost.GetLocalApiUrl(ipAddress, isIpv6));
+ }
+
+ public void Dispose()
+ {
+ _deviceDiscovery.DeviceDiscovered -= _deviceDiscovery_DeviceDiscovered;
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/PlaybackProgressEventArgs.cs b/Emby.Dlna/PlayTo/PlaybackProgressEventArgs.cs
new file mode 100644
index 0000000000..b89f7a8645
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlaybackProgressEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlaybackProgressEventArgs : EventArgs
+ {
+ public uBaseObject MediaInfo { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/PlayTo/PlaybackStartEventArgs.cs b/Emby.Dlna/PlayTo/PlaybackStartEventArgs.cs
new file mode 100644
index 0000000000..17d2540a50
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlaybackStartEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlaybackStartEventArgs : EventArgs
+ {
+ public uBaseObject MediaInfo { get; set; }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs b/Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs
new file mode 100644
index 0000000000..847c33ff78
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlaybackStoppedEventArgs : EventArgs
+ {
+ public uBaseObject MediaInfo { get; set; }
+ }
+
+ public class MediaChangedEventArgs : EventArgs
+ {
+ public uBaseObject OldMediaInfo { get; set; }
+ public uBaseObject NewMediaInfo { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/PlayTo/PlaylistItem.cs b/Emby.Dlna/PlayTo/PlaylistItem.cs
new file mode 100644
index 0000000000..b60e6a6fb6
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlaylistItem.cs
@@ -0,0 +1,15 @@
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlaylistItem
+ {
+ public string StreamUrl { get; set; }
+
+ public string Didl { get; set; }
+
+ public StreamInfo StreamInfo { get; set; }
+
+ public DeviceProfile Profile { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/PlayTo/PlaylistItemFactory.cs b/Emby.Dlna/PlayTo/PlaylistItemFactory.cs
new file mode 100644
index 0000000000..3eb2bc1d5c
--- /dev/null
+++ b/Emby.Dlna/PlayTo/PlaylistItemFactory.cs
@@ -0,0 +1,69 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Session;
+using System;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class PlaylistItemFactory
+ {
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ public PlaylistItem Create(Photo item, DeviceProfile profile)
+ {
+ var playlistItem = new PlaylistItem
+ {
+ StreamInfo = new StreamInfo
+ {
+ ItemId = item.Id.ToString("N"),
+ MediaType = DlnaProfileType.Photo,
+ DeviceProfile = profile
+ },
+
+ Profile = profile
+ };
+
+ var directPlay = profile.DirectPlayProfiles
+ .FirstOrDefault(i => i.Type == DlnaProfileType.Photo && IsSupported(i, item));
+
+ if (directPlay != null)
+ {
+ playlistItem.StreamInfo.PlayMethod = PlayMethod.DirectStream;
+ playlistItem.StreamInfo.Container = Path.GetExtension(item.Path);
+
+ return playlistItem;
+ }
+
+ var transcodingProfile = profile.TranscodingProfiles
+ .FirstOrDefault(i => i.Type == DlnaProfileType.Photo);
+
+ if (transcodingProfile != null)
+ {
+ playlistItem.StreamInfo.PlayMethod = PlayMethod.Transcode;
+ playlistItem.StreamInfo.Container = "." + transcodingProfile.Container.TrimStart('.');
+ }
+
+ return playlistItem;
+ }
+
+ private bool IsSupported(DirectPlayProfile profile, Photo item)
+ {
+ var mediaPath = item.Path;
+
+ if (profile.Container.Length > 0)
+ {
+ // Check container type
+ var mediaContainer = Path.GetExtension(mediaPath);
+ if (!profile.GetContainers().Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/SsdpHttpClient.cs b/Emby.Dlna/PlayTo/SsdpHttpClient.cs
new file mode 100644
index 0000000000..1aa671b8ff
--- /dev/null
+++ b/Emby.Dlna/PlayTo/SsdpHttpClient.cs
@@ -0,0 +1,139 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using Emby.Dlna.Common;
+using System;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class SsdpHttpClient
+ {
+ private const string USERAGENT = "Microsoft-Windows/6.2 UPnP/1.0 Microsoft-DLNA DLNADOC/1.50";
+ private const string FriendlyName = "Emby";
+
+ private readonly IHttpClient _httpClient;
+ private readonly IServerConfigurationManager _config;
+
+ public SsdpHttpClient(IHttpClient httpClient, IServerConfigurationManager config)
+ {
+ _httpClient = httpClient;
+ _config = config;
+ }
+
+ public async Task<XDocument> SendCommandAsync(string baseUrl,
+ DeviceService service,
+ string command,
+ string postData,
+ bool logRequest = true,
+ string header = null)
+ {
+ var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest)
+ .ConfigureAwait(false);
+
+ using (var stream = response.Content)
+ {
+ using (var reader = new StreamReader(stream, Encoding.UTF8))
+ {
+ return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace);
+ }
+ }
+ }
+
+ private string NormalizeServiceUrl(string baseUrl, string serviceUrl)
+ {
+ // If it's already a complete url, don't stick anything onto the front of it
+ if (serviceUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase))
+ {
+ return serviceUrl;
+ }
+
+ if (!serviceUrl.StartsWith("/"))
+ serviceUrl = "/" + serviceUrl;
+
+ return baseUrl + serviceUrl;
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ public async Task SubscribeAsync(string url,
+ string ip,
+ int port,
+ string localIp,
+ int eventport,
+ int timeOut = 3600)
+ {
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture);
+ options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport.ToString(_usCulture) + ">";
+ options.RequestHeaders["NT"] = "upnp:event";
+ options.RequestHeaders["TIMEOUT"] = "Second-" + timeOut.ToString(_usCulture);
+
+ await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false);
+ }
+
+ public async Task<XDocument> GetDataAsync(string url)
+ {
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
+
+ using (var stream = await _httpClient.Get(options).ConfigureAwait(false))
+ {
+ using (var reader = new StreamReader(stream, Encoding.UTF8))
+ {
+ return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace);
+ }
+ }
+ }
+
+ private Task<HttpResponseInfo> PostSoapDataAsync(string url,
+ string soapAction,
+ string postData,
+ string header,
+ bool logRequest)
+ {
+ if (!soapAction.StartsWith("\""))
+ soapAction = "\"" + soapAction + "\"";
+
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["SOAPAction"] = soapAction;
+ options.RequestHeaders["Pragma"] = "no-cache";
+ options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
+
+ if (!string.IsNullOrWhiteSpace(header))
+ {
+ options.RequestHeaders["contentFeatures.dlna.org"] = header;
+ }
+
+ options.RequestContentType = "text/xml; charset=\"utf-8\"";
+ options.RequestContent = postData;
+
+ return _httpClient.Post(options);
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/TRANSPORTSTATE.cs b/Emby.Dlna/PlayTo/TRANSPORTSTATE.cs
new file mode 100644
index 0000000000..93d306a178
--- /dev/null
+++ b/Emby.Dlna/PlayTo/TRANSPORTSTATE.cs
@@ -0,0 +1,11 @@
+namespace Emby.Dlna.PlayTo
+{
+ public enum TRANSPORTSTATE
+ {
+ STOPPED,
+ PLAYING,
+ TRANSITIONING,
+ PAUSED_PLAYBACK,
+ PAUSED
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/PlayTo/TransportCommands.cs b/Emby.Dlna/PlayTo/TransportCommands.cs
new file mode 100644
index 0000000000..d7d44573c7
--- /dev/null
+++ b/Emby.Dlna/PlayTo/TransportCommands.cs
@@ -0,0 +1,185 @@
+using System;
+using Emby.Dlna.Common;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+using Emby.Dlna.Ssdp;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class TransportCommands
+ {
+ private List<StateVariable> _stateVariables = new List<StateVariable>();
+ public List<StateVariable> StateVariables
+ {
+ get
+ {
+ return _stateVariables;
+ }
+ set
+ {
+ _stateVariables = value;
+ }
+ }
+
+ private List<ServiceAction> _serviceActions = new List<ServiceAction>();
+ public List<ServiceAction> ServiceActions
+ {
+ get
+ {
+ return _serviceActions;
+ }
+ set
+ {
+ _serviceActions = value;
+ }
+ }
+
+ public static TransportCommands Create(XDocument document)
+ {
+ var command = new TransportCommands();
+
+ var actionList = document.Descendants(uPnpNamespaces.svc + "actionList");
+
+ foreach (var container in actionList.Descendants(uPnpNamespaces.svc + "action"))
+ {
+ command.ServiceActions.Add(ServiceActionFromXml(container));
+ }
+
+ var stateValues = document.Descendants(uPnpNamespaces.ServiceStateTable).FirstOrDefault();
+
+ if (stateValues != null)
+ {
+ foreach (var container in stateValues.Elements(uPnpNamespaces.svc + "stateVariable"))
+ {
+ command.StateVariables.Add(FromXml(container));
+ }
+ }
+
+ return command;
+ }
+
+ private static ServiceAction ServiceActionFromXml(XElement container)
+ {
+ var argumentList = new List<Argument>();
+
+ foreach (var arg in container.Descendants(uPnpNamespaces.svc + "argument"))
+ {
+ argumentList.Add(ArgumentFromXml(arg));
+ }
+
+ return new ServiceAction
+ {
+ Name = container.GetValue(uPnpNamespaces.svc + "name"),
+
+ ArgumentList = argumentList
+ };
+ }
+
+ private static Argument ArgumentFromXml(XElement container)
+ {
+ if (container == null)
+ {
+ throw new ArgumentNullException("container");
+ }
+
+ return new Argument
+ {
+ Name = container.GetValue(uPnpNamespaces.svc + "name"),
+ Direction = container.GetValue(uPnpNamespaces.svc + "direction"),
+ RelatedStateVariable = container.GetValue(uPnpNamespaces.svc + "relatedStateVariable")
+ };
+ }
+
+ public static StateVariable FromXml(XElement container)
+ {
+ var allowedValues = new List<string>();
+ var element = container.Descendants(uPnpNamespaces.svc + "allowedValueList")
+ .FirstOrDefault();
+
+ if (element != null)
+ {
+ var values = element.Descendants(uPnpNamespaces.svc + "allowedValue");
+
+ allowedValues.AddRange(values.Select(child => child.Value));
+ }
+
+ return new StateVariable
+ {
+ Name = container.GetValue(uPnpNamespaces.svc + "name"),
+ DataType = container.GetValue(uPnpNamespaces.svc + "dataType"),
+ AllowedValues = allowedValues
+ };
+ }
+
+ public string BuildPost(ServiceAction action, string xmlNamespace)
+ {
+ var stateString = string.Empty;
+
+ foreach (var arg in action.ArgumentList)
+ {
+ if (arg.Direction == "out")
+ continue;
+
+ if (arg.Name == "InstanceID")
+ stateString += BuildArgumentXml(arg, "0");
+ else
+ stateString += BuildArgumentXml(arg, null);
+ }
+
+ return string.Format(CommandBase, action.Name, xmlNamespace, stateString);
+ }
+
+ public string BuildPost(ServiceAction action, string xmlNamesapce, object value, string commandParameter = "")
+ {
+ var stateString = string.Empty;
+
+ foreach (var arg in action.ArgumentList)
+ {
+ if (arg.Direction == "out")
+ continue;
+ if (arg.Name == "InstanceID")
+ stateString += BuildArgumentXml(arg, "0");
+ else
+ stateString += BuildArgumentXml(arg, value.ToString(), commandParameter);
+ }
+
+ return string.Format(CommandBase, action.Name, xmlNamesapce, stateString);
+ }
+
+ public string BuildPost(ServiceAction action, string xmlNamesapce, object value, Dictionary<string, string> dictionary)
+ {
+ var stateString = string.Empty;
+
+ foreach (var arg in action.ArgumentList)
+ {
+ if (arg.Name == "InstanceID")
+ stateString += BuildArgumentXml(arg, "0");
+ else if (dictionary.ContainsKey(arg.Name))
+ stateString += BuildArgumentXml(arg, dictionary[arg.Name]);
+ else
+ stateString += BuildArgumentXml(arg, value.ToString());
+ }
+
+ return string.Format(CommandBase, action.Name, xmlNamesapce, stateString);
+ }
+
+ private string BuildArgumentXml(Argument argument, string value, string commandParameter = "")
+ {
+ var state = StateVariables.FirstOrDefault(a => string.Equals(a.Name, argument.RelatedStateVariable, StringComparison.OrdinalIgnoreCase));
+
+ if (state != null)
+ {
+ var sendValue = state.AllowedValues.FirstOrDefault(a => string.Equals(a, commandParameter, StringComparison.OrdinalIgnoreCase)) ??
+ state.AllowedValues.FirstOrDefault() ??
+ value;
+
+ return string.Format("<{0} xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"{1}\">{2}</{0}>", argument.Name, state.DataType ?? "string", sendValue);
+ }
+
+ return string.Format("<{0}>{1}</{0}>", argument.Name, value);
+ }
+
+ private const string CommandBase = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + "<SOAP-ENV:Body>" + "<m:{0} xmlns:m=\"{1}\">" + "{2}" + "</m:{0}>" + "</SOAP-ENV:Body></SOAP-ENV:Envelope>";
+ }
+}
diff --git a/Emby.Dlna/PlayTo/TransportStateEventArgs.cs b/Emby.Dlna/PlayTo/TransportStateEventArgs.cs
new file mode 100644
index 0000000000..c6a96f58c1
--- /dev/null
+++ b/Emby.Dlna/PlayTo/TransportStateEventArgs.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class TransportStateEventArgs : EventArgs
+ {
+ public TRANSPORTSTATE State { get; set; }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/UpnpContainer.cs b/Emby.Dlna/PlayTo/UpnpContainer.cs
new file mode 100644
index 0000000000..5bfc56bff9
--- /dev/null
+++ b/Emby.Dlna/PlayTo/UpnpContainer.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Xml.Linq;
+using Emby.Dlna.Ssdp;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class UpnpContainer : uBaseObject
+ {
+ public static uBaseObject Create(XElement container)
+ {
+ if (container == null)
+ {
+ throw new ArgumentNullException("container");
+ }
+
+ return new uBaseObject
+ {
+ Id = container.GetAttributeValue(uPnpNamespaces.Id),
+ ParentId = container.GetAttributeValue(uPnpNamespaces.ParentId),
+ Title = container.GetValue(uPnpNamespaces.title),
+ IconUrl = container.GetValue(uPnpNamespaces.Artwork),
+ UpnpClass = container.GetValue(uPnpNamespaces.uClass)
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/uBaseObject.cs b/Emby.Dlna/PlayTo/uBaseObject.cs
new file mode 100644
index 0000000000..1de46317eb
--- /dev/null
+++ b/Emby.Dlna/PlayTo/uBaseObject.cs
@@ -0,0 +1,58 @@
+using System;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class uBaseObject
+ {
+ public string Id { get; set; }
+
+ public string ParentId { get; set; }
+
+ public string Title { get; set; }
+
+ public string SecondText { get; set; }
+
+ public string IconUrl { get; set; }
+
+ public string MetaData { get; set; }
+
+ public string Url { get; set; }
+
+ public string[] ProtocolInfo { get; set; }
+
+ public string UpnpClass { get; set; }
+
+ public bool Equals(uBaseObject obj)
+ {
+ if (obj == null)
+ {
+ throw new ArgumentNullException("obj");
+ }
+
+ return string.Equals(Id, obj.Id);
+ }
+
+ public string MediaType
+ {
+ get
+ {
+ var classType = UpnpClass ?? string.Empty;
+
+ if (classType.IndexOf(MediaBrowser.Model.Entities.MediaType.Audio, StringComparison.Ordinal) != -1)
+ {
+ return MediaBrowser.Model.Entities.MediaType.Audio;
+ }
+ if (classType.IndexOf(MediaBrowser.Model.Entities.MediaType.Video, StringComparison.Ordinal) != -1)
+ {
+ return MediaBrowser.Model.Entities.MediaType.Video;
+ }
+ if (classType.IndexOf("image", StringComparison.Ordinal) != -1)
+ {
+ return MediaBrowser.Model.Entities.MediaType.Photo;
+ }
+
+ return null;
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/uParser.cs b/Emby.Dlna/PlayTo/uParser.cs
new file mode 100644
index 0000000000..5caf83a9a6
--- /dev/null
+++ b/Emby.Dlna/PlayTo/uParser.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class uParser
+ {
+ public static IList<uBaseObject> ParseBrowseXml(XDocument doc)
+ {
+ if (doc == null)
+ {
+ throw new ArgumentException("doc");
+ }
+
+ var list = new List<uBaseObject>();
+
+ var document = doc.Document;
+
+ if (document == null)
+ return list;
+
+ var item = (from result in document.Descendants("Result") select result).FirstOrDefault();
+
+ if (item == null)
+ return list;
+
+ var uPnpResponse = XElement.Parse((String)item);
+
+ var uObjects = from container in uPnpResponse.Elements(uPnpNamespaces.containers)
+ select new uParserObject { Element = container };
+
+ var uObjects2 = from container in uPnpResponse.Elements(uPnpNamespaces.items)
+ select new uParserObject { Element = container };
+
+ list.AddRange(uObjects.Concat(uObjects2).Select(CreateObjectFromXML).Where(uObject => uObject != null));
+
+ return list;
+ }
+
+ public static uBaseObject CreateObjectFromXML(uParserObject uItem)
+ {
+ return UpnpContainer.Create(uItem.Element);
+ }
+ }
+}
diff --git a/Emby.Dlna/PlayTo/uParserObject.cs b/Emby.Dlna/PlayTo/uParserObject.cs
new file mode 100644
index 0000000000..4e75adf1f1
--- /dev/null
+++ b/Emby.Dlna/PlayTo/uParserObject.cs
@@ -0,0 +1,9 @@
+using System.Xml.Linq;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class uParserObject
+ {
+ public XElement Element { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/PlayTo/uPnpNamespaces.cs b/Emby.Dlna/PlayTo/uPnpNamespaces.cs
new file mode 100644
index 0000000000..81acb5e414
--- /dev/null
+++ b/Emby.Dlna/PlayTo/uPnpNamespaces.cs
@@ -0,0 +1,39 @@
+using System.Xml.Linq;
+
+namespace Emby.Dlna.PlayTo
+{
+ public class uPnpNamespaces
+ {
+ public static XNamespace dc = "http://purl.org/dc/elements/1.1/";
+ public static XNamespace ns = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
+ public static XNamespace svc = "urn:schemas-upnp-org:service-1-0";
+ public static XNamespace ud = "urn:schemas-upnp-org:device-1-0";
+ public static XNamespace upnp = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+ public static XNamespace RenderingControl = "urn:schemas-upnp-org:service:RenderingControl:1";
+ public static XNamespace AvTransport = "urn:schemas-upnp-org:service:AVTransport:1";
+ public static XNamespace ContentDirectory = "urn:schemas-upnp-org:service:ContentDirectory:1";
+
+ public static XName containers = ns + "container";
+ public static XName items = ns + "item";
+ public static XName title = dc + "title";
+ public static XName creator = dc + "creator";
+ public static XName artist = upnp + "artist";
+ public static XName Id = "id";
+ public static XName ParentId = "parentID";
+ public static XName uClass = upnp + "class";
+ public static XName Artwork = upnp + "albumArtURI";
+ public static XName Description = dc + "description";
+ public static XName LongDescription = upnp + "longDescription";
+ public static XName Album = upnp + "album";
+ public static XName Author = upnp + "author";
+ public static XName Director = upnp + "director";
+ public static XName PlayCount = upnp + "playbackCount";
+ public static XName Tracknumber = upnp + "originalTrackNumber";
+ public static XName Res = ns + "res";
+ public static XName Duration = "duration";
+ public static XName ProtocolInfo = "protocolInfo";
+
+ public static XName ServiceStateTable = svc + "serviceStateTable";
+ public static XName StateVariable = svc + "stateVariable";
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/CodecProfile.cs b/Emby.Dlna/ProfileSerialization/CodecProfile.cs
new file mode 100644
index 0000000000..73fbca990e
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/CodecProfile.cs
@@ -0,0 +1,68 @@
+using MediaBrowser.Model.Extensions;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class CodecProfile
+ {
+ [XmlAttribute("type")]
+ public CodecType Type { get; set; }
+
+ public ProfileCondition[] Conditions { get; set; }
+
+ public ProfileCondition[] ApplyConditions { get; set; }
+
+ [XmlAttribute("codec")]
+ public string Codec { get; set; }
+
+ [XmlAttribute("container")]
+ public string Container { get; set; }
+
+ public CodecProfile()
+ {
+ Conditions = new ProfileCondition[] {};
+ ApplyConditions = new ProfileCondition[] { };
+ }
+
+ public List<string> GetCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Codec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public List<string> GetContainers()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Container ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ private bool ContainsContainer(string container)
+ {
+ List<string> containers = GetContainers();
+
+ return containers.Count == 0 || ListHelper.ContainsIgnoreCase(containers, container ?? string.Empty);
+ }
+
+ public bool ContainsCodec(string codec, string container)
+ {
+ if (!ContainsContainer(container))
+ {
+ return false;
+ }
+
+ List<string> codecs = GetCodecs();
+
+ return codecs.Count == 0 || ListHelper.ContainsIgnoreCase(codecs, codec);
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/ContainerProfile.cs b/Emby.Dlna/ProfileSerialization/ContainerProfile.cs
new file mode 100644
index 0000000000..112f25a7e1
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/ContainerProfile.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class ContainerProfile
+ {
+ [XmlAttribute("type")]
+ public DlnaProfileType Type { get; set; }
+ public ProfileCondition[] Conditions { get; set; }
+
+ [XmlAttribute("container")]
+ public string Container { get; set; }
+
+ public ContainerProfile()
+ {
+ Conditions = new ProfileCondition[] { };
+ }
+
+ public List<string> GetContainers()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Container ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/DeviceProfile.cs b/Emby.Dlna/ProfileSerialization/DeviceProfile.cs
new file mode 100644
index 0000000000..3932f647ab
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/DeviceProfile.cs
@@ -0,0 +1,351 @@
+using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.MediaInfo;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ [XmlRoot("Profile")]
+ public class DeviceProfile
+ {
+ /// <summary>
+ /// Gets or sets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public string Name { get; set; }
+
+ [XmlIgnore]
+ public string Id { get; set; }
+
+ [XmlIgnore]
+ public MediaBrowser.Model.Dlna.DeviceProfileType ProfileType { get; set; }
+
+ /// <summary>
+ /// Gets or sets the identification.
+ /// </summary>
+ /// <value>The identification.</value>
+ public MediaBrowser.Model.Dlna.DeviceIdentification Identification { get; set; }
+
+ public string FriendlyName { get; set; }
+ public string Manufacturer { get; set; }
+ public string ManufacturerUrl { get; set; }
+ public string ModelName { get; set; }
+ public string ModelDescription { get; set; }
+ public string ModelNumber { get; set; }
+ public string ModelUrl { get; set; }
+ public string SerialNumber { get; set; }
+
+ public bool EnableAlbumArtInDidl { get; set; }
+ public bool EnableSingleAlbumArtLimit { get; set; }
+ public bool EnableSingleSubtitleLimit { get; set; }
+
+ public string SupportedMediaTypes { get; set; }
+
+ public string UserId { get; set; }
+
+ public string AlbumArtPn { get; set; }
+
+ public int MaxAlbumArtWidth { get; set; }
+ public int MaxAlbumArtHeight { get; set; }
+
+ public int? MaxIconWidth { get; set; }
+ public int? MaxIconHeight { get; set; }
+
+ public int? MaxStreamingBitrate { get; set; }
+ public int? MaxStaticBitrate { get; set; }
+
+ public int? MusicStreamingTranscodingBitrate { get; set; }
+ public int? MaxStaticMusicBitrate { get; set; }
+
+ /// <summary>
+ /// Controls the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.
+ /// </summary>
+ public string XDlnaDoc { get; set; }
+ /// <summary>
+ /// Controls the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.
+ /// </summary>
+ public string XDlnaCap { get; set; }
+ /// <summary>
+ /// Controls the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.
+ /// </summary>
+ public string SonyAggregationFlags { get; set; }
+
+ public string ProtocolInfo { get; set; }
+
+ public int TimelineOffsetSeconds { get; set; }
+ public bool RequiresPlainVideoItems { get; set; }
+ public bool RequiresPlainFolders { get; set; }
+
+ public bool EnableMSMediaReceiverRegistrar { get; set; }
+ public bool IgnoreTranscodeByteRangeRequests { get; set; }
+
+ public XmlAttribute[] XmlRootAttributes { get; set; }
+
+ /// <summary>
+ /// Gets or sets the direct play profiles.
+ /// </summary>
+ /// <value>The direct play profiles.</value>
+ public DirectPlayProfile[] DirectPlayProfiles { get; set; }
+
+ /// <summary>
+ /// Gets or sets the transcoding profiles.
+ /// </summary>
+ /// <value>The transcoding profiles.</value>
+ public TranscodingProfile[] TranscodingProfiles { get; set; }
+
+ public ContainerProfile[] ContainerProfiles { get; set; }
+
+ public CodecProfile[] CodecProfiles { get; set; }
+ public ResponseProfile[] ResponseProfiles { get; set; }
+
+ public SubtitleProfile[] SubtitleProfiles { get; set; }
+
+ public DeviceProfile()
+ {
+ DirectPlayProfiles = new DirectPlayProfile[] { };
+ TranscodingProfiles = new TranscodingProfile[] { };
+ ResponseProfiles = new ResponseProfile[] { };
+ CodecProfiles = new CodecProfile[] { };
+ ContainerProfiles = new ContainerProfile[] { };
+ SubtitleProfiles = new SubtitleProfile[] { };
+
+ XmlRootAttributes = new XmlAttribute[] { };
+
+ SupportedMediaTypes = "Audio,Photo,Video";
+ MaxStreamingBitrate = 8000000;
+ MaxStaticBitrate = 8000000;
+ MusicStreamingTranscodingBitrate = 128000;
+ }
+
+ public List<string> GetSupportedMediaTypes()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (SupportedMediaTypes ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i))
+ list.Add(i);
+ }
+ return list;
+ }
+
+ public TranscodingProfile GetAudioTranscodingProfile(string container, string audioCodec)
+ {
+ container = StringHelper.TrimStart(container ?? string.Empty, '.');
+
+ foreach (var i in TranscodingProfiles)
+ {
+ if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Audio)
+ {
+ continue;
+ }
+
+ if (!StringHelper.EqualsIgnoreCase(container, i.Container))
+ {
+ continue;
+ }
+
+ if (!ListHelper.ContainsIgnoreCase(i.GetAudioCodecs(), audioCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ return i;
+ }
+ return null;
+ }
+
+ public TranscodingProfile GetVideoTranscodingProfile(string container, string audioCodec, string videoCodec)
+ {
+ container = StringHelper.TrimStart(container ?? string.Empty, '.');
+
+ foreach (var i in TranscodingProfiles)
+ {
+ if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Video)
+ {
+ continue;
+ }
+
+ if (!StringHelper.EqualsIgnoreCase(container, i.Container))
+ {
+ continue;
+ }
+
+ if (!ListHelper.ContainsIgnoreCase(i.GetAudioCodecs(), audioCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ if (!StringHelper.EqualsIgnoreCase(videoCodec, i.VideoCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ return i;
+ }
+ return null;
+ }
+
+ public ResponseProfile GetAudioMediaProfile(string container, string audioCodec, int? audioChannels, int? audioBitrate)
+ {
+ container = StringHelper.TrimStart(container ?? string.Empty, '.');
+
+ foreach (var i in ResponseProfiles)
+ {
+ if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Audio)
+ {
+ continue;
+ }
+
+ List<string> containers = i.GetContainers();
+ if (containers.Count > 0 && !ListHelper.ContainsIgnoreCase(containers, container))
+ {
+ continue;
+ }
+
+ List<string> audioCodecs = i.GetAudioCodecs();
+ if (audioCodecs.Count > 0 && !ListHelper.ContainsIgnoreCase(audioCodecs, audioCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ var conditionProcessor = new MediaBrowser.Model.Dlna.ConditionProcessor();
+
+ var anyOff = false;
+ foreach (ProfileCondition c in i.Conditions)
+ {
+ if (!conditionProcessor.IsAudioConditionSatisfied(GetModelProfileCondition(c), audioChannels, audioBitrate))
+ {
+ anyOff = true;
+ break;
+ }
+ }
+
+ if (anyOff)
+ {
+ continue;
+ }
+
+ return i;
+ }
+ return null;
+ }
+
+ private MediaBrowser.Model.Dlna.ProfileCondition GetModelProfileCondition(ProfileCondition c)
+ {
+ return new MediaBrowser.Model.Dlna.ProfileCondition
+ {
+ Condition = c.Condition,
+ IsRequired = c.IsRequired,
+ Property = c.Property,
+ Value = c.Value
+ };
+ }
+
+ public ResponseProfile GetImageMediaProfile(string container, int? width, int? height)
+ {
+ container = StringHelper.TrimStart(container ?? string.Empty, '.');
+
+ foreach (var i in ResponseProfiles)
+ {
+ if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Photo)
+ {
+ continue;
+ }
+
+ List<string> containers = i.GetContainers();
+ if (containers.Count > 0 && !ListHelper.ContainsIgnoreCase(containers, container))
+ {
+ continue;
+ }
+
+ var conditionProcessor = new MediaBrowser.Model.Dlna.ConditionProcessor();
+
+ var anyOff = false;
+ foreach (ProfileCondition c in i.Conditions)
+ {
+ if (!conditionProcessor.IsImageConditionSatisfied(GetModelProfileCondition(c), width, height))
+ {
+ anyOff = true;
+ break;
+ }
+ }
+
+ if (anyOff)
+ {
+ continue;
+ }
+
+ return i;
+ }
+ return null;
+ }
+
+ public ResponseProfile GetVideoMediaProfile(string container,
+ string audioCodec,
+ string videoCodec,
+ int? width,
+ int? height,
+ int? bitDepth,
+ int? videoBitrate,
+ string videoProfile,
+ double? videoLevel,
+ float? videoFramerate,
+ int? packetLength,
+ TransportStreamTimestamp timestamp,
+ bool? isAnamorphic,
+ int? refFrames,
+ int? numVideoStreams,
+ int? numAudioStreams,
+ string videoCodecTag,
+ bool? isAvc)
+ {
+ container = StringHelper.TrimStart(container ?? string.Empty, '.');
+
+ foreach (var i in ResponseProfiles)
+ {
+ if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Video)
+ {
+ continue;
+ }
+
+ List<string> containers = i.GetContainers();
+ if (containers.Count > 0 && !ListHelper.ContainsIgnoreCase(containers, container ?? string.Empty))
+ {
+ continue;
+ }
+
+ List<string> audioCodecs = i.GetAudioCodecs();
+ if (audioCodecs.Count > 0 && !ListHelper.ContainsIgnoreCase(audioCodecs, audioCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ List<string> videoCodecs = i.GetVideoCodecs();
+ if (videoCodecs.Count > 0 && !ListHelper.ContainsIgnoreCase(videoCodecs, videoCodec ?? string.Empty))
+ {
+ continue;
+ }
+
+ var conditionProcessor = new MediaBrowser.Model.Dlna.ConditionProcessor();
+
+ var anyOff = false;
+ foreach (ProfileCondition c in i.Conditions)
+ {
+ if (!conditionProcessor.IsVideoConditionSatisfied(GetModelProfileCondition(c), width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ {
+ anyOff = true;
+ break;
+ }
+ }
+
+ if (anyOff)
+ {
+ continue;
+ }
+
+ return i;
+ }
+ return null;
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/DirectPlayProfile.cs b/Emby.Dlna/ProfileSerialization/DirectPlayProfile.cs
new file mode 100644
index 0000000000..4976b6844b
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/DirectPlayProfile.cs
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class DirectPlayProfile
+ {
+ [XmlAttribute("container")]
+ public string Container { get; set; }
+
+ [XmlAttribute("audioCodec")]
+ public string AudioCodec { get; set; }
+
+ [XmlAttribute("videoCodec")]
+ public string VideoCodec { get; set; }
+
+ [XmlAttribute("type")]
+ public DlnaProfileType Type { get; set; }
+
+ public List<string> GetContainers()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Container ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public List<string> GetAudioCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (AudioCodec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public List<string> GetVideoCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (VideoCodec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/HttpHeaderInfo.cs b/Emby.Dlna/ProfileSerialization/HttpHeaderInfo.cs
new file mode 100644
index 0000000000..dce0f30221
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/HttpHeaderInfo.cs
@@ -0,0 +1,17 @@
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class HttpHeaderInfo
+ {
+ [XmlAttribute("name")]
+ public string Name { get; set; }
+
+ [XmlAttribute("value")]
+ public string Value { get; set; }
+
+ [XmlAttribute("match")]
+ public HeaderMatchType Match { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/ProfileSerialization/ProfileCondition.cs b/Emby.Dlna/ProfileSerialization/ProfileCondition.cs
new file mode 100644
index 0000000000..cb0a3de4ff
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/ProfileCondition.cs
@@ -0,0 +1,39 @@
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class ProfileCondition
+ {
+ [XmlAttribute("condition")]
+ public ProfileConditionType Condition { get; set; }
+
+ [XmlAttribute("property")]
+ public ProfileConditionValue Property { get; set; }
+
+ [XmlAttribute("value")]
+ public string Value { get; set; }
+
+ [XmlAttribute("isRequired")]
+ public bool IsRequired { get; set; }
+
+ public ProfileCondition()
+ {
+ IsRequired = true;
+ }
+
+ public ProfileCondition(ProfileConditionType condition, ProfileConditionValue property, string value)
+ : this(condition, property, value, false)
+ {
+
+ }
+
+ public ProfileCondition(ProfileConditionType condition, ProfileConditionValue property, string value, bool isRequired)
+ {
+ Condition = condition;
+ Property = property;
+ Value = value;
+ IsRequired = isRequired;
+ }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/ProfileSerialization/ResponseProfile.cs b/Emby.Dlna/ProfileSerialization/ResponseProfile.cs
new file mode 100644
index 0000000000..6a5a49d79d
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/ResponseProfile.cs
@@ -0,0 +1,64 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class ResponseProfile
+ {
+ [XmlAttribute("container")]
+ public string Container { get; set; }
+
+ [XmlAttribute("audioCodec")]
+ public string AudioCodec { get; set; }
+
+ [XmlAttribute("videoCodec")]
+ public string VideoCodec { get; set; }
+
+ [XmlAttribute("type")]
+ public DlnaProfileType Type { get; set; }
+
+ [XmlAttribute("orgPn")]
+ public string OrgPn { get; set; }
+
+ [XmlAttribute("mimeType")]
+ public string MimeType { get; set; }
+
+ public ProfileCondition[] Conditions { get; set; }
+
+ public ResponseProfile()
+ {
+ Conditions = new ProfileCondition[] {};
+ }
+
+ public List<string> GetContainers()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Container ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public List<string> GetAudioCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (AudioCodec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public List<string> GetVideoCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (VideoCodec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/SubtitleProfile.cs b/Emby.Dlna/ProfileSerialization/SubtitleProfile.cs
new file mode 100644
index 0000000000..a2f7291088
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/SubtitleProfile.cs
@@ -0,0 +1,48 @@
+using MediaBrowser.Model.Extensions;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class SubtitleProfile
+ {
+ [XmlAttribute("format")]
+ public string Format { get; set; }
+
+ [XmlAttribute("method")]
+ public SubtitleDeliveryMethod Method { get; set; }
+
+ [XmlAttribute("didlMode")]
+ public string DidlMode { get; set; }
+
+ [XmlAttribute("language")]
+ public string Language { get; set; }
+
+ public List<string> GetLanguages()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (Language ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+
+ public bool SupportsLanguage(string subLanguage)
+ {
+ if (string.IsNullOrEmpty(Language))
+ {
+ return true;
+ }
+
+ if (string.IsNullOrEmpty(subLanguage))
+ {
+ subLanguage = "und";
+ }
+
+ List<string> languages = GetLanguages();
+ return languages.Count == 0 || ListHelper.ContainsIgnoreCase(languages, subLanguage);
+ }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/ProfileSerialization/TranscodingProfile.cs b/Emby.Dlna/ProfileSerialization/TranscodingProfile.cs
new file mode 100644
index 0000000000..4d7bfee201
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/TranscodingProfile.cs
@@ -0,0 +1,58 @@
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class TranscodingProfile
+ {
+ [XmlAttribute("container")]
+ public string Container { get; set; }
+
+ [XmlAttribute("type")]
+ public DlnaProfileType Type { get; set; }
+
+ [XmlAttribute("videoCodec")]
+ public string VideoCodec { get; set; }
+
+ [XmlAttribute("audioCodec")]
+ public string AudioCodec { get; set; }
+
+ [XmlAttribute("protocol")]
+ public string Protocol { get; set; }
+
+ [XmlAttribute("estimateContentLength")]
+ public bool EstimateContentLength { get; set; }
+
+ [XmlAttribute("enableMpegtsM2TsMode")]
+ public bool EnableMpegtsM2TsMode { get; set; }
+
+ [XmlAttribute("transcodeSeekInfo")]
+ public TranscodeSeekInfo TranscodeSeekInfo { get; set; }
+
+ [XmlAttribute("copyTimestamps")]
+ public bool CopyTimestamps { get; set; }
+
+ [XmlAttribute("context")]
+ public EncodingContext Context { get; set; }
+
+ [XmlAttribute("enableSubtitlesInManifest")]
+ public bool EnableSubtitlesInManifest { get; set; }
+
+ [XmlAttribute("enableSplittingOnNonKeyFrames")]
+ public bool EnableSplittingOnNonKeyFrames { get; set; }
+
+ [XmlAttribute("maxAudioChannels")]
+ public string MaxAudioChannels { get; set; }
+
+ public List<string> GetAudioCodecs()
+ {
+ List<string> list = new List<string>();
+ foreach (string i in (AudioCodec ?? string.Empty).Split(','))
+ {
+ if (!string.IsNullOrEmpty(i)) list.Add(i);
+ }
+ return list;
+ }
+ }
+}
diff --git a/Emby.Dlna/ProfileSerialization/XmlAttribute.cs b/Emby.Dlna/ProfileSerialization/XmlAttribute.cs
new file mode 100644
index 0000000000..011eb3b45a
--- /dev/null
+++ b/Emby.Dlna/ProfileSerialization/XmlAttribute.cs
@@ -0,0 +1,13 @@
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.ProfileSerialization
+{
+ public class XmlAttribute
+ {
+ [XmlAttribute("name")]
+ public string Name { get; set; }
+
+ [XmlAttribute("value")]
+ public string Value { get; set; }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/BubbleUpnpProfile.cs b/Emby.Dlna/Profiles/BubbleUpnpProfile.cs
new file mode 100644
index 0000000000..b551bff2ae
--- /dev/null
+++ b/Emby.Dlna/Profiles/BubbleUpnpProfile.cs
@@ -0,0 +1,146 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class BubbleUpnpProfile : DefaultProfile
+ {
+ public BubbleUpnpProfile()
+ {
+ Name = "BubbleUPnp";
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "BubbleUPnp",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo {Name = "User-Agent", Value = "BubbleUPnp", Match = HeaderMatchType.Substring}
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Photo,
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+
+ ContainerProfiles = new ContainerProfile[] { };
+
+ CodecProfiles = new CodecProfile[] { };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ass",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ssa",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "smi",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "dvdsub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgs",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgssub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/DefaultProfile.cs b/Emby.Dlna/Profiles/DefaultProfile.cs
new file mode 100644
index 0000000000..12b48a8ef1
--- /dev/null
+++ b/Emby.Dlna/Profiles/DefaultProfile.cs
@@ -0,0 +1,114 @@
+using MediaBrowser.Model.Dlna;
+using System.Linq;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class DefaultProfile : DeviceProfile
+ {
+ public DefaultProfile()
+ {
+ Name = "Generic Device";
+
+ ProtocolInfo = "http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000";
+
+ XDlnaDoc = "DMS-1.50";
+
+ Manufacturer = "Emby";
+ ModelDescription = "Emby";
+ ModelName = "Emby Server";
+ ModelNumber = "Emby";
+ ModelUrl = "http://emby.media/";
+ ManufacturerUrl = "http://emby.media/";
+
+ AlbumArtPn = "JPEG_SM";
+
+ MaxAlbumArtHeight = 480;
+ MaxAlbumArtWidth = 480;
+
+ MaxIconWidth = 48;
+ MaxIconHeight = 48;
+
+ MaxStreamingBitrate = 20000000;
+ MaxStaticBitrate = 20000000;
+ MusicStreamingTranscodingBitrate = 192000;
+
+ EnableAlbumArtInDidl = false;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "m4v,ts,mkv,avi,mpg,mpeg,mp4",
+ VideoCodec = "h264",
+ AudioCodec = "aac,mp3,ac3",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp3,wma,aac,wav",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "m4v",
+ Type = DlnaProfileType.Video,
+ MimeType = "video/mp4"
+ }
+ };
+ }
+
+ public void AddXmlRootAttribute(string name, string value)
+ {
+ var atts = XmlRootAttributes ?? new XmlAttribute[] { };
+ var list = atts.ToList();
+
+ list.Add(new XmlAttribute
+ {
+ Name = name,
+ Value = value
+ });
+
+ XmlRootAttributes = list.ToArray();
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/DenonAvrProfile.cs b/Emby.Dlna/Profiles/DenonAvrProfile.cs
new file mode 100644
index 0000000000..eed2449891
--- /dev/null
+++ b/Emby.Dlna/Profiles/DenonAvrProfile.cs
@@ -0,0 +1,31 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class DenonAvrProfile : DefaultProfile
+ {
+ public DenonAvrProfile()
+ {
+ Name = "Denon AVR";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"Denon:\[AVR:.*",
+ Manufacturer = "Denon"
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp3,flac,m4a,wma",
+ Type = DlnaProfileType.Audio
+ },
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/DirectTvProfile.cs b/Emby.Dlna/Profiles/DirectTvProfile.cs
new file mode 100644
index 0000000000..153d552045
--- /dev/null
+++ b/Emby.Dlna/Profiles/DirectTvProfile.cs
@@ -0,0 +1,119 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class DirectTvProfile : DefaultProfile
+ {
+ public DirectTvProfile()
+ {
+ Name = "DirecTV HD-DVR";
+
+ TimelineOffsetSeconds = 10;
+ RequiresPlainFolders = true;
+ RequiresPlainVideoItems = true;
+
+ Identification = new DeviceIdentification
+ {
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Match = HeaderMatchType.Substring,
+ Name = "User-Agent",
+ Value = "DIRECTV"
+ }
+ },
+
+ FriendlyName = "^DIRECTV.*$"
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,jpg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp2",
+ Type = DlnaProfileType.Video
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Codec = "mpeg2video",
+ Type = CodecType.Video,
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "8192000"
+ }
+ }
+ },
+ new CodecProfile
+ {
+ Codec = "mp2",
+ Type = CodecType.Audio,
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs
new file mode 100644
index 0000000000..9f31377101
--- /dev/null
+++ b/Emby.Dlna/Profiles/DishHopperJoeyProfile.cs
@@ -0,0 +1,219 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class DishHopperJoeyProfile : DefaultProfile
+ {
+ public DishHopperJoeyProfile()
+ {
+ Name = "Dish Hopper-Joey";
+
+ ProtocolInfo = "http-get:*:video/mp2t:*,http-get:*:video/MP1S:*,http-get:*:video/mpeg2:*,http-get:*:video/mp4:*,http-get:*:video/x-matroska:*,http-get:*:audio/mpeg:*,http-get:*:audio/mpeg3:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/mp4a-latm:*,http-get:*:image/jpeg:*";
+
+ Identification = new DeviceIdentification
+ {
+ Manufacturer = "Echostar Technologies LLC",
+ ManufacturerUrl = "http://www.echostar.com",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Match = HeaderMatchType.Substring,
+ Name = "User-Agent",
+ Value ="XiP"
+ }
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "mp4",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp4,mkv,mpeg,ts",
+ VideoCodec = "h264,mpeg2video",
+ AudioCodec = "mp3,ac3,aac,he-aac,pcm",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "alac",
+ AudioCodec = "alac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flac",
+ AudioCodec = "flac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41",
+ IsRequired = true
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = true
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000",
+ IsRequired = true
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3,he-aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = true
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = true
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "mkv,ts",
+ Type = DlnaProfileType.Video,
+ MimeType = "video/mp4"
+ }
+ };
+
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/Foobar2000Profile.cs b/Emby.Dlna/Profiles/Foobar2000Profile.cs
new file mode 100644
index 0000000000..915c490484
--- /dev/null
+++ b/Emby.Dlna/Profiles/Foobar2000Profile.cs
@@ -0,0 +1,77 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class Foobar2000Profile : DefaultProfile
+ {
+ public Foobar2000Profile()
+ {
+ Name = "foobar2000";
+
+ SupportedMediaTypes = "Audio";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"foobar",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = "foobar",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp2,mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "mp4",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "aac,wav",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flac",
+ AudioCodec = "flac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ogg",
+ AudioCodec = "vorbis",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/Json/BubbleUPnp.json b/Emby.Dlna/Profiles/Json/BubbleUPnp.json
new file mode 100644
index 0000000000..03d9add967
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/BubbleUPnp.json
@@ -0,0 +1 @@
+{"Name":"BubbleUPnp","Identification":{"ModelName":"BubbleUPnp","Headers":[{"Name":"User-Agent","Value":"BubbleUPnp","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"","Type":"Video"},{"Container":"","Type":"Audio"},{"Container":"","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"External"},{"Format":"sub","Method":"External"},{"Format":"srt","Method":"Embed","DidlMode":""},{"Format":"ass","Method":"Embed","DidlMode":""},{"Format":"ssa","Method":"Embed","DidlMode":""},{"Format":"smi","Method":"Embed","DidlMode":""},{"Format":"dvdsub","Method":"Embed","DidlMode":""},{"Format":"pgs","Method":"Embed","DidlMode":""},{"Format":"pgssub","Method":"Embed","DidlMode":""},{"Format":"sub","Method":"Embed","DidlMode":""}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Default.json b/Emby.Dlna/Profiles/Json/Default.json
new file mode 100644
index 0000000000..157d91366c
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Default.json
@@ -0,0 +1 @@
+{"Name":"Generic Device","Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"m4v,ts,mkv,avi,mpg,mpeg,mp4","AudioCodec":"aac,mp3,ac3","VideoCodec":"h264","Type":"Video"},{"Container":"mp3,wma,aac,wav","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[{"Container":"m4v","Type":"Video","MimeType":"video/mp4","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Denon AVR.json b/Emby.Dlna/Profiles/Json/Denon AVR.json
new file mode 100644
index 0000000000..28966fa127
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Denon AVR.json
@@ -0,0 +1 @@
+{"Name":"Denon AVR","Identification":{"FriendlyName":"Denon:\\[AVR:.*","Manufacturer":"Denon","Headers":[]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp3,flac,m4a,wma","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/DirecTV HD-DVR.json b/Emby.Dlna/Profiles/Json/DirecTV HD-DVR.json
new file mode 100644
index 0000000000..6807578020
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/DirecTV HD-DVR.json
@@ -0,0 +1 @@
+{"Name":"DirecTV HD-DVR","Identification":{"FriendlyName":"^DIRECTV.*$","Headers":[{"Name":"User-Agent","Value":"DIRECTV","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":10,"RequiresPlainVideoItems":true,"RequiresPlainFolders":true,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mpeg","AudioCodec":"mp2","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"jpeg,jpg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mpeg","Type":"Video","VideoCodec":"mpeg2video","AudioCodec":"mp2","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"8192000","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg2video"},{"Type":"Audio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp2"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Dish Hopper-Joey.json b/Emby.Dlna/Profiles/Json/Dish Hopper-Joey.json
new file mode 100644
index 0000000000..58fa313c28
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Dish Hopper-Joey.json
@@ -0,0 +1 @@
+{"Name":"Dish Hopper-Joey","Identification":{"Manufacturer":"Echostar Technologies LLC","ManufacturerUrl":"http://www.echostar.com","Headers":[{"Name":"User-Agent","Value":"XiP","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/mp2t:*,http-get:*:video/MP1S:*,http-get:*:video/mpeg2:*,http-get:*:video/mp4:*,http-get:*:video/x-matroska:*,http-get:*:audio/mpeg:*,http-get:*:audio/mpeg3:*,http-get:*:audio/mp3:*,http-get:*:audio/mp4:*,http-get:*:audio/mp4a-latm:*,http-get:*:image/jpeg:*","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp4,mkv,mpeg,ts","AudioCodec":"mp3,ac3,aac,he-aac,pcm","VideoCodec":"h264,mpeg2video","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"alac","AudioCodec":"alac","Type":"Audio"},{"Container":"flac","AudioCodec":"flac","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mp4","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3,he-aac"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"mkv,ts","Type":"Video","MimeType":"video/mp4","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Kodi.json b/Emby.Dlna/Profiles/Json/Kodi.json
new file mode 100644
index 0000000000..268bffb206
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Kodi.json
@@ -0,0 +1 @@
+{"Name":"Kodi","Identification":{"ModelName":"Kodi","Headers":[{"Name":"User-Agent","Value":"Kodi","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":100000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":1280000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":5,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"","Type":"Video"},{"Container":"","Type":"Audio"},{"Container":"","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"External"},{"Format":"sub","Method":"External"},{"Format":"srt","Method":"Embed","DidlMode":""},{"Format":"ass","Method":"Embed","DidlMode":""},{"Format":"ssa","Method":"Embed","DidlMode":""},{"Format":"smi","Method":"Embed","DidlMode":""},{"Format":"dvdsub","Method":"Embed","DidlMode":""},{"Format":"pgs","Method":"Embed","DidlMode":""},{"Format":"pgssub","Method":"Embed","DidlMode":""},{"Format":"sub","Method":"Embed","DidlMode":""}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/LG Smart TV.json b/Emby.Dlna/Profiles/Json/LG Smart TV.json
new file mode 100644
index 0000000000..9faac24cae
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/LG Smart TV.json
@@ -0,0 +1 @@
+{"Name":"LG Smart TV","Identification":{"FriendlyName":"LG.*","Headers":[{"Name":"User-Agent","Value":"LG","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":10,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"aac,ac3,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"mkv","AudioCodec":"aac,ac3,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"mp4","AudioCodec":"aac,ac3,mp3","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg4"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3,aac,mp3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"},{"Format":"srt","Method":"External"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Linksys DMA2100.json b/Emby.Dlna/Profiles/Json/Linksys DMA2100.json
new file mode 100644
index 0000000000..7d85f8163c
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Linksys DMA2100.json
@@ -0,0 +1 @@
+{"Name":"Linksys DMA2100","Identification":{"ModelName":"DMA2100us","Headers":[]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp3,flac,m4a,wma","Type":"Audio"},{"Container":"avi,mp4,mkv,ts","Type":"Video"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/MediaMonkey.json b/Emby.Dlna/Profiles/Json/MediaMonkey.json
new file mode 100644
index 0000000000..7566c33a13
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/MediaMonkey.json
@@ -0,0 +1 @@
+{"Name":"MediaMonkey","Identification":{"FriendlyName":"MediaMonkey","Headers":[{"Name":"User-Agent","Value":"MediaMonkey","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp3","AudioCodec":"mp2,mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"mp4","Type":"Audio"},{"Container":"aac,wav","Type":"Audio"},{"Container":"flac","AudioCodec":"flac","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"ogg","AudioCodec":"vorbis","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Panasonic Viera.json b/Emby.Dlna/Profiles/Json/Panasonic Viera.json
new file mode 100644
index 0000000000..ccd48be326
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Panasonic Viera.json
@@ -0,0 +1 @@
+{"Name":"Panasonic Viera","Identification":{"FriendlyName":"VIERA","Manufacturer":"Panasonic","Headers":[{"Name":"User-Agent","Value":"Panasonic MIL DLNA","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":10,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:pv","Value":"http://www.pv.com/pvns/"}],"DirectPlayProfiles":[{"Container":"mpeg,mpg","AudioCodec":"ac3,mp3,pcm_dvd","VideoCodec":"mpeg2video,mpeg4","Type":"Video"},{"Container":"mkv","AudioCodec":"aac,ac3,dca,mp3,mp2,pcm,dts","VideoCodec":"h264,mpeg2video","Type":"Video"},{"Container":"ts","AudioCodec":"aac,mp3,mp2","VideoCodec":"h264,mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"aac,ac3,mp3,pcm","VideoCodec":"h264","Type":"Video"},{"Container":"mov","AudioCodec":"aac,pcm","VideoCodec":"h264","Type":"Video"},{"Container":"avi","AudioCodec":"pcm","VideoCodec":"mpeg4","Type":"Video"},{"Container":"flv","AudioCodec":"aac","VideoCodec":"h264","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"aac","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitDepth","Value":"8","IsRequired":false}],"ApplyConditions":[]}],"ResponseProfiles":[{"Container":"ts","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"},{"Format":"srt","Method":"External"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Popcorn Hour.json b/Emby.Dlna/Profiles/Json/Popcorn Hour.json
new file mode 100644
index 0000000000..e657ceb553
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Popcorn Hour.json
@@ -0,0 +1 @@
+{"Name":"Popcorn Hour","Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp4,mov","AudioCodec":"aac","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"ts","AudioCodec":"aac,ac3,eac3,mp3,mp2,pcm","VideoCodec":"h264","Type":"Video"},{"Container":"asf,wmv","AudioCodec":"wmav2,wmapro","VideoCodec":"wmv3,vc1","Type":"Video"},{"Container":"avi","AudioCodec":"mp3,ac3,eac3,mp2,pcm","VideoCodec":"mpeg4,msmpeg4","Type":"Video"},{"Container":"mkv","AudioCodec":"aac,mp3,ac3,eac3,mp2,pcm","VideoCodec":"h264","Type":"Video"},{"Container":"aac,mp3,flac,ogg,wma,wav","Type":"Audio"},{"Container":"jpeg,gif,bmp,png","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mp4","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"EqualsAny","Property":"VideoProfile","Value":"baseline|constrained baseline","IsRequired":false},{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"},{"Type":"Audio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"},{"Type":"Audio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false},{"Condition":"LessThanEqual","Property":"AudioBitrate","Value":"320000","IsRequired":false}],"ApplyConditions":[],"Codec":"mp3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Samsung Smart TV.json b/Emby.Dlna/Profiles/Json/Samsung Smart TV.json
new file mode 100644
index 0000000000..97b775fe2c
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Samsung Smart TV.json
@@ -0,0 +1 @@
+{"Name":"Samsung Smart TV","Identification":{"ModelUrl":"samsung.com","Headers":[{"Name":"User-Agent","Value":"SEC_","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:sec","Value":"http://www.sec.co.kr/"}],"DirectPlayProfiles":[{"Container":"asf","AudioCodec":"mp3,ac3,wmav2,wmapro,wmavoice","VideoCodec":"h264,mpeg4,mjpeg","Type":"Video"},{"Container":"avi","AudioCodec":"mp3,ac3,dca,dts","VideoCodec":"h264,mpeg4,mjpeg","Type":"Video"},{"Container":"mkv","AudioCodec":"mp3,ac3,dca,aac,dts","VideoCodec":"h264,mpeg4,mjpeg4","Type":"Video"},{"Container":"mp4","AudioCodec":"mp3,aac","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"3gp","AudioCodec":"aac,he-aac","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"mpg,mpeg","AudioCodec":"ac3,mp2,mp3,aac","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"vro,vob","AudioCodec":"ac3,mp2,mp3","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"ts","AudioCodec":"ac3,aac,mp3,eac3","VideoCodec":"mpeg2video,h264,vc1","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmavoice","VideoCodec":"wmv2,wmv3","Type":"Video"},{"Container":"mp3,flac","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":true,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"30720000","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg2video"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"8192000","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg4"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"37500000","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"25600000","IsRequired":true}],"ApplyConditions":[],"Codec":"wmv2,wmv3,vc1"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3,wmav2,dca,aac,mp3,dts"}],"ResponseProfiles":[{"Container":"avi","Type":"Video","MimeType":"video/x-msvideo","Conditions":[]},{"Container":"mkv","Type":"Video","MimeType":"video/x-mkv","Conditions":[]},{"Container":"flac","Type":"Audio","MimeType":"audio/x-flac","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"},{"Format":"srt","Method":"External","DidlMode":"CaptionInfoEx"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2013.json b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2013.json
new file mode 100644
index 0000000000..fbc7f003bc
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2013.json
@@ -0,0 +1 @@
+{"Name":"Sony Blu-ray Player 2013","Identification":{"ModelNumber":"BDP-2013","Headers":[{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S1100","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S3100","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S5100","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S6100","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S7100","Match":"Substring"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://emby.media/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts,mpegts","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg,mpg","AudioCodec":"ac3,mp3,mp2,pcm","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4,m4v","AudioCodec":"ac3,aac,pcm,mp3","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,dca,aac,mp3,pcm,dts","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"m2ts,mts","AudioCodec":"aac,mp3,ac3,dca,dts","VideoCodec":"h264,mpeg4,vc1","Type":"Video"},{"Container":"wmv,asf","Type":"Video"},{"Container":"mp3,m4a,wma,wav","Type":"Audio"},{"Container":"jpeg,png,gif","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mkv","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2014.json b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2014.json
new file mode 100644
index 0000000000..e16cebaa44
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2014.json
@@ -0,0 +1 @@
+{"Name":"Sony Blu-ray Player 2014","Identification":{"ModelNumber":"BDP-2014","Headers":[{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S1200","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S3200","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S5200","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S6200","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S7200","Match":"Substring"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://emby.media/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts,mpegts","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg,mpg","AudioCodec":"ac3,mp3,mp2,pcm","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4,m4v","AudioCodec":"ac3,aac,pcm,mp3","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,dca,aac,mp3,pcm,dts","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"m2ts,mts","AudioCodec":"aac,mp3,ac3,dca,dts","VideoCodec":"h264,mpeg4,vc1","Type":"Video"},{"Container":"wmv,asf","Type":"Video"},{"Container":"mp3,m4a,wma,wav","Type":"Audio"},{"Container":"jpeg,png,gif","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mkv","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2015.json b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2015.json
new file mode 100644
index 0000000000..98a209f906
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2015.json
@@ -0,0 +1 @@
+{"Name":"Sony Blu-ray Player 2015","Identification":{"ModelNumber":"BDP-2015","Headers":[{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S1500","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S3500","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S6500","Match":"Substring"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://emby.media/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts,mpegts","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg,mpg","AudioCodec":"ac3,mp3,mp2,pcm","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4,m4v","AudioCodec":"ac3,aac,pcm,mp3","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,dca,aac,mp3,pcm,dts","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"m2ts,mts","AudioCodec":"aac,mp3,ac3,dca,dts","VideoCodec":"h264,mpeg4,vc1","Type":"Video"},{"Container":"wmv,asf","Type":"Video"},{"Container":"mp3,m4a,wma,wav","Type":"Audio"},{"Container":"jpeg,png,gif","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mkv","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2016.json b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2016.json
new file mode 100644
index 0000000000..b8e79624bf
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player 2016.json
@@ -0,0 +1 @@
+{"Name":"Sony Blu-ray Player 2016","Identification":{"ModelNumber":"BDP-2016","Headers":[{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S1700","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S3700","Match":"Substring"},{"Name":"X-AV-Physical-Unit-Info","Value":"BDP-S6700","Match":"Substring"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://emby.media/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts,mpegts","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg,mpg","AudioCodec":"ac3,mp3,mp2,pcm","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4,m4v","AudioCodec":"ac3,aac,pcm,mp3","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,dca,aac,mp3,pcm,dts","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"m2ts,mts","AudioCodec":"aac,mp3,ac3,dca,dts","VideoCodec":"h264,mpeg4,vc1","Type":"Video"},{"Container":"wmv,asf","Type":"Video"},{"Container":"mp3,m4a,wma,wav","Type":"Audio"},{"Container":"jpeg,png,gif","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"mkv","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"}],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Blu-ray Player.json b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player.json
new file mode 100644
index 0000000000..3ba5f9aa44
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Blu-ray Player.json
@@ -0,0 +1 @@
+{"Name":"Sony Blu-ray Player","Identification":{"FriendlyName":"Blu-ray Disc Player","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":"(Blu-ray Disc Player|Home Theater System|Home Theatre System|Media Player)","Match":"Regex"},{"Name":"X-AV-Physical-Unit-Info","Value":"(Blu-ray Disc Player|Home Theater System|Home Theatre System|Media Player)","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://emby.media/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg","AudioCodec":"ac3,mp3,pcm","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"avi,mp4","AudioCodec":"ac3,aac,mp3,pcm","VideoCodec":"mpeg4,h264","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"mpeg2video","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"15360000","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264,mpeg4,vc1","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"avi","Type":"Video","MimeType":"video/mpeg","Conditions":[]},{"Container":"mkv","Type":"Video","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","Type":"Video","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mp4","Type":"Video","MimeType":"video/mpeg","Conditions":[]},{"Container":"mpeg","Type":"Video","MimeType":"video/mpeg","Conditions":[]},{"Container":"mp3","Type":"Audio","MimeType":"audio/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Bravia (2010).json b/Emby.Dlna/Profiles/Json/Sony Bravia (2010).json
new file mode 100644
index 0000000000..6490ebcb57
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Bravia (2010).json
@@ -0,0 +1 @@
+{"Name":"Sony Bravia (2010)","Identification":{"FriendlyName":"KDL-\\d{2}[EHLNPB]X\\d[01]\\d.*","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":".*KDL-\\d{2}[EHLNPB]X\\d[01]\\d.*","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://www.microsoft.com/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"ts","AudioCodec":"mp3,mp2","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video,mpeg1video","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":true,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg2video"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true},{"Condition":"NotEquals","Property":"AudioProfile","Value":"he-aac","IsRequired":true}],"ApplyConditions":[],"Codec":"aac"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp3,mp2"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"192","IsRequired":true},{"Condition":"Equals","Property":"VideoTimestamp","Value":"Valid","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO","MimeType":"video/mpeg","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"188","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","VideoCodec":"mpeg2video","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mpeg","VideoCodec":"mpeg1video,mpeg2video","Type":"Video","OrgPn":"MPEG_PS_NTSC,MPEG_PS_PAL","MimeType":"video/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Bravia (2011).json b/Emby.Dlna/Profiles/Json/Sony Bravia (2011).json
new file mode 100644
index 0000000000..78f85fba9b
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Bravia (2011).json
@@ -0,0 +1 @@
+{"Name":"Sony Bravia (2011)","Identification":{"FriendlyName":"KDL-\\d{2}([A-Z]X\\d2\\d|CX400).*","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":".*KDL-\\d{2}([A-Z]X\\d2\\d|CX400).*","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://www.microsoft.com/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"ts","AudioCodec":"mp3","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp3","VideoCodec":"mpeg2video,mpeg1video","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":true,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"20000000","IsRequired":true}],"ApplyConditions":[],"Codec":"mpeg2video"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true},{"Condition":"NotEquals","Property":"AudioProfile","Value":"he-aac","IsRequired":true}],"ApplyConditions":[],"Codec":"aac"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp3,mp2"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"192","IsRequired":true},{"Condition":"Equals","Property":"VideoTimestamp","Value":"Valid","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO","MimeType":"video/mpeg","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"188","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","VideoCodec":"mpeg2video","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mpeg","VideoCodec":"mpeg1video,mpeg2video","Type":"Video","OrgPn":"MPEG_PS_NTSC,MPEG_PS_PAL","MimeType":"video/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Bravia (2012).json b/Emby.Dlna/Profiles/Json/Sony Bravia (2012).json
new file mode 100644
index 0000000000..d9af0990cd
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Bravia (2012).json
@@ -0,0 +1 @@
+{"Name":"Sony Bravia (2012)","Identification":{"FriendlyName":"KDL-\\d{2}[A-Z]X\\d5(\\d|G).*","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":".*KDL-\\d{2}[A-Z]X\\d5(\\d|G).*","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://www.microsoft.com/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"ts","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"ac3,aac,mp3,mp2","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video,mpeg1video","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":true,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":true}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp3,mp2"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"192","IsRequired":true},{"Condition":"Equals","Property":"VideoTimestamp","Value":"Valid","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO","MimeType":"video/mpeg","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"188","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","VideoCodec":"mpeg2video","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mpeg","VideoCodec":"mpeg1video,mpeg2video","Type":"Video","OrgPn":"MPEG_PS_NTSC,MPEG_PS_PAL","MimeType":"video/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Bravia (2013).json b/Emby.Dlna/Profiles/Json/Sony Bravia (2013).json
new file mode 100644
index 0000000000..8ad2c771e1
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Bravia (2013).json
@@ -0,0 +1 @@
+{"Name":"Sony Bravia (2013)","Identification":{"FriendlyName":"KDL-\\d{2}[WR][5689]\\d{2}A.*","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":".*KDL-\\d{2}[WR][5689]\\d{2}A.*","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://www.microsoft.com/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,eac3,aac,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"ts","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"ac3,eac3,aac,mp3,mp2","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"mov","AudioCodec":"ac3,eac3,aac,mp3,mp2","VideoCodec":"h264,mpeg4,mjpeg","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,eac3,aac,mp3,mp2,pcm,vorbis","VideoCodec":"h264,mpeg4,vp8","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,eac3,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"avi","AudioCodec":"pcm","VideoCodec":"mjpeg","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video,mpeg1video","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"aac","Type":"Audio"},{"Container":"wav","AudioCodec":"pcm","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":true,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp3,mp2"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"192","IsRequired":true},{"Condition":"Equals","Property":"VideoTimestamp","Value":"Valid","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO","MimeType":"video/mpeg","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"188","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","VideoCodec":"mpeg2video","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mpeg","VideoCodec":"mpeg1video,mpeg2video","Type":"Video","OrgPn":"MPEG_PS_NTSC,MPEG_PS_PAL","MimeType":"video/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony Bravia (2014).json b/Emby.Dlna/Profiles/Json/Sony Bravia (2014).json
new file mode 100644
index 0000000000..b72cfae28a
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony Bravia (2014).json
@@ -0,0 +1 @@
+{"Name":"Sony Bravia (2014)","Identification":{"FriendlyName":"(KDL-\\d{2}W[5-9]\\d{2}B|KDL-\\d{2}R480|XBR-\\d{2}X[89]\\d{2}B|KD-\\d{2}[SX][89]\\d{3}B).*","Manufacturer":"Sony","Headers":[{"Name":"X-AV-Client-Info","Value":".*(KDL-\\d{2}W[5-9]\\d{2}B|KDL-\\d{2}R480|XBR-\\d{2}X[89]\\d{2}B|KD-\\d{2}[SX][89]\\d{3}B).*","Match":"Regex"}]},"Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com/","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby","ModelNumber":"3.0","ModelUrl":"http://www.microsoft.com/","EnableAlbumArtInDidl":true,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[{"Name":"xmlns:av","Value":"urn:schemas-sony-com:av"}],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,eac3,aac,mp3","VideoCodec":"h264","Type":"Video"},{"Container":"ts","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"ac3,eac3,aac,mp3,mp2","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"mov","AudioCodec":"ac3,eac3,aac,mp3,mp2","VideoCodec":"h264,mpeg4,mjpeg","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,eac3,aac,mp3,mp2,pcm,vorbis","VideoCodec":"h264,mpeg4,vp8","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,eac3,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"avi","AudioCodec":"pcm","VideoCodec":"mjpeg","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp3,mp2","VideoCodec":"mpeg2video,mpeg1video","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"aac","Type":"Audio"},{"Container":"wav","AudioCodec":"pcm","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3","EstimateContentLength":false,"EnableMpegtsM2TsMode":true,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":true}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"mp3,mp2"}],"ResponseProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"192","IsRequired":true},{"Condition":"Equals","Property":"VideoTimestamp","Value":"Valid","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO","MimeType":"video/mpeg","Conditions":[{"Condition":"Equals","Property":"PacketLength","Value":"188","IsRequired":true}]},{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264","Type":"Video","OrgPn":"AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"ts","VideoCodec":"mpeg2video","Type":"Video","OrgPn":"MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO","MimeType":"video/vnd.dlna.mpeg-tts","Conditions":[]},{"Container":"mpeg","VideoCodec":"mpeg1video,mpeg2video","Type":"Video","OrgPn":"MPEG_PS_NTSC,MPEG_PS_PAL","MimeType":"video/mpeg","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony PlayStation 3.json b/Emby.Dlna/Profiles/Json/Sony PlayStation 3.json
new file mode 100644
index 0000000000..02a169a49e
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony PlayStation 3.json
@@ -0,0 +1 @@
+{"Name":"Sony PlayStation 3","Identification":{"FriendlyName":"PLAYSTATION 3","Headers":[{"Name":"User-Agent","Value":"PLAYSTATION 3","Match":"Substring"},{"Name":"X-AV-Client-Info","Value":"PLAYSTATION 3","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"avi","AudioCodec":"mp2,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"ts","AudioCodec":"ac3,mp2,mp3,aac","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp2","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4","AudioCodec":"aac,ac3","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"aac,mp3,wav","Type":"Audio"},{"Container":"jpeg,png,gif,bmp,tiff","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"ac3,aac,mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"15360000","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false},{"Condition":"LessThanEqual","Property":"AudioBitrate","Value":"640000","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"wmapro"},{"Type":"VideoAudio","Conditions":[{"Condition":"NotEquals","Property":"AudioProfile","Value":"he-aac","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"mp4,mov","AudioCodec":"aac","Type":"Video","MimeType":"video/mp4","Conditions":[]},{"Container":"avi","Type":"Video","OrgPn":"AVI","MimeType":"video/divx","Conditions":[]},{"Container":"wav","Type":"Audio","MimeType":"audio/wav","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Sony PlayStation 4.json b/Emby.Dlna/Profiles/Json/Sony PlayStation 4.json
new file mode 100644
index 0000000000..2fc6076896
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Sony PlayStation 4.json
@@ -0,0 +1 @@
+{"Name":"Sony PlayStation 4","Identification":{"FriendlyName":"PLAYSTATION 4","Headers":[{"Name":"User-Agent","Value":"PLAYSTATION 4","Match":"Substring"},{"Name":"X-AV-Client-Info","Value":"PLAYSTATION 4","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":true,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_TN","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","SonyAggregationFlags":"10","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"avi","AudioCodec":"mp2,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"ts","AudioCodec":"ac3,mp2,mp3,aac","VideoCodec":"mpeg1video,mpeg2video,h264","Type":"Video"},{"Container":"mpeg","AudioCodec":"mp2","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mp4,mkv","AudioCodec":"aac,ac3","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"aac,mp3,wav","Type":"Audio"},{"Container":"jpeg,png,gif,bmp,tiff","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"15360000","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false},{"Condition":"LessThanEqual","Property":"AudioBitrate","Value":"640000","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"wmapro"},{"Type":"VideoAudio","Conditions":[{"Condition":"NotEquals","Property":"AudioProfile","Value":"he-aac","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"mp4,mov","AudioCodec":"aac","Type":"Video","MimeType":"video/mp4","Conditions":[]},{"Container":"avi","Type":"Video","OrgPn":"AVI","MimeType":"video/divx","Conditions":[]},{"Container":"wav","Type":"Audio","MimeType":"audio/wav","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Vlc.json b/Emby.Dlna/Profiles/Json/Vlc.json
new file mode 100644
index 0000000000..35c87bcedf
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Vlc.json
@@ -0,0 +1 @@
+{"Name":"Vlc","Identification":{"ModelName":"Vlc","Headers":[{"Name":"User-Agent","Value":"vlc","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":5,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"","Type":"Video"},{"Container":"","Type":"Audio"},{"Container":"","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"External"},{"Format":"sub","Method":"External"},{"Format":"srt","Method":"Embed","DidlMode":""},{"Format":"ass","Method":"Embed","DidlMode":""},{"Format":"ssa","Method":"Embed","DidlMode":""},{"Format":"smi","Method":"Embed","DidlMode":""},{"Format":"dvdsub","Method":"Embed","DidlMode":""},{"Format":"pgs","Method":"Embed","DidlMode":""},{"Format":"pgssub","Method":"Embed","DidlMode":""},{"Format":"sub","Method":"Embed","DidlMode":""}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/WDTV Live.json b/Emby.Dlna/Profiles/Json/WDTV Live.json
new file mode 100644
index 0000000000..92376435b5
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/WDTV Live.json
@@ -0,0 +1 @@
+{"Name":"WDTV Live","Identification":{"ModelName":"WD TV","Headers":[{"Name":"User-Agent","Value":"alphanetworks","Match":"Substring"},{"Name":"User-Agent","Value":"ALPHA Networks","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":5,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":true,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"avi","AudioCodec":"ac3,dca,mp2,mp3,pcm,dts","VideoCodec":"mpeg1video,mpeg2video,mpeg4,h264,vc1","Type":"Video"},{"Container":"mpeg","AudioCodec":"ac3,dca,mp2,mp3,pcm,dts","VideoCodec":"mpeg1video,mpeg2video","Type":"Video"},{"Container":"mkv","AudioCodec":"ac3,dca,aac,mp2,mp3,pcm,dts","VideoCodec":"mpeg1video,mpeg2video,mpeg4,h264,vc1","Type":"Video"},{"Container":"ts,m2ts","AudioCodec":"ac3,dca,mp2,mp3,aac,dts","VideoCodec":"mpeg1video,mpeg2video,h264,vc1","Type":"Video"},{"Container":"mp4,mov","AudioCodec":"ac3,aac,mp2,mp3,dca,dts","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro","VideoCodec":"vc1","Type":"Video"},{"Container":"asf","AudioCodec":"mp2,ac3","VideoCodec":"mpeg2video","Type":"Video"},{"Container":"mp3","AudioCodec":"mp2,mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"mp4","Type":"Audio"},{"Container":"flac","AudioCodec":"flac","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"ogg","AudioCodec":"vorbis","Type":"Audio"},{"Container":"jpeg,png,gif,bmp,tiff","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":true}],"ApplyConditions":[],"Codec":"h264"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":true}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"ts","Type":"Video","OrgPn":"MPEG_TS_SD_NA","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"External"},{"Format":"srt","Method":"Embed"},{"Format":"sub","Method":"Embed"},{"Format":"subrip","Method":"Embed"},{"Format":"idx","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Xbox 360.json b/Emby.Dlna/Profiles/Json/Xbox 360.json
new file mode 100644
index 0000000000..fa4a8c79a8
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Xbox 360.json
@@ -0,0 +1 @@
+{"Name":"Xbox 360","Identification":{"ModelName":"Xbox 360","Headers":[{"Name":"User-Agent","Value":"Xbox","Match":"Substring"},{"Name":"User-Agent","Value":"Xenon","Match":"Substring"}]},"FriendlyName":"${HostName}: 1","Manufacturer":"Microsoft Corporation","ManufacturerUrl":"http://www.microsoft.com","ModelName":"Windows Media Player Sharing","ModelDescription":"Emby : UPnP Media Server","ModelNumber":"12.0","ModelUrl":"http://go.microsoft.com/fwlink/?LinkId=105926","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":40,"RequiresPlainVideoItems":true,"RequiresPlainFolders":true,"EnableMSMediaReceiverRegistrar":true,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"avi","AudioCodec":"ac3,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"avi","AudioCodec":"aac","VideoCodec":"h264","Type":"Video"},{"Container":"mp4,mov","AudioCodec":"aac,ac3","VideoCodec":"h264,mpeg4","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"asf","Type":"Video","VideoCodec":"wmv2","AudioCodec":"wmav2","EstimateContentLength":true,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Bytes","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Video","Conditions":[{"Condition":"Equals","Property":"Has64BitOffsets","Value":"false","IsRequired":false}],"Container":"mp4,mov"},{"Type":"Photo","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true}]}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1280","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"720","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"5120000","IsRequired":false}],"ApplyConditions":[],"Codec":"mpeg4"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"10240000","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"15360000","IsRequired":false}],"ApplyConditions":[],"Codec":"wmv2,wmv3,vc1"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3,wmav2,wmapro"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false},{"Condition":"Equals","Property":"AudioProfile","Value":"lc","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"avi","Type":"Video","MimeType":"video/avi","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/Xbox One.json b/Emby.Dlna/Profiles/Json/Xbox One.json
new file mode 100644
index 0000000000..378798673b
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/Xbox One.json
@@ -0,0 +1 @@
+{"Name":"Xbox One","Identification":{"ModelName":"Xbox One","Headers":[{"Name":"FriendlyName.DLNA.ORG","Value":"XboxOne","Match":"Substring"},{"Name":"User-Agent","Value":"NSPlayer/12","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio,Photo,Video","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":40,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"ts","AudioCodec":"ac3,aac,mp3","VideoCodec":"h264,mpeg2video","Type":"Video"},{"Container":"avi","AudioCodec":"ac3,mp3","VideoCodec":"mpeg4","Type":"Video"},{"Container":"avi","AudioCodec":"aac","VideoCodec":"h264","Type":"Video"},{"Container":"mp4,mov,mkv","AudioCodec":"aac,ac3","VideoCodec":"h264,mpeg4,mpeg2video","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro","VideoCodec":"wmv2,wmv3,vc1","Type":"Video"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"mp3","AudioCodec":"mp3","Type":"Audio"},{"Container":"jpeg","Type":"Photo"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","VideoCodec":"jpeg","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[{"Type":"Video","Conditions":[{"Condition":"Equals","Property":"Has64BitOffsets","Value":"false","IsRequired":false}],"Container":"mp4,mov"}],"CodecProfiles":[{"Type":"Video","Conditions":[{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitDepth","Value":"8","IsRequired":false},{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"5120000","IsRequired":false}],"ApplyConditions":[],"Codec":"mpeg4"},{"Type":"Video","Conditions":[{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitDepth","Value":"8","IsRequired":false},{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoLevel","Value":"41","IsRequired":false},{"Condition":"EqualsAny","Property":"VideoProfile","Value":"high|main|baseline|constrained baseline","IsRequired":false}],"ApplyConditions":[],"Codec":"h264"},{"Type":"Video","Conditions":[{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitDepth","Value":"8","IsRequired":false},{"Condition":"LessThanEqual","Property":"Width","Value":"1920","IsRequired":true},{"Condition":"LessThanEqual","Property":"Height","Value":"1080","IsRequired":true},{"Condition":"LessThanEqual","Property":"VideoFramerate","Value":"30","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitrate","Value":"15360000","IsRequired":false}],"ApplyConditions":[],"Codec":"wmv2,wmv3,vc1"},{"Type":"Video","Conditions":[{"Condition":"NotEquals","Property":"IsAnamorphic","Value":"true","IsRequired":false},{"Condition":"LessThanEqual","Property":"VideoBitDepth","Value":"8","IsRequired":false}],"ApplyConditions":[]},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"6","IsRequired":false}],"ApplyConditions":[],"Codec":"ac3,wmav2,wmapro"},{"Type":"VideoAudio","Conditions":[{"Condition":"LessThanEqual","Property":"AudioChannels","Value":"2","IsRequired":false},{"Condition":"Equals","Property":"AudioProfile","Value":"lc","IsRequired":false}],"ApplyConditions":[],"Codec":"aac"}],"ResponseProfiles":[{"Container":"avi","Type":"Video","MimeType":"video/avi","Conditions":[]}],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Json/foobar2000.json b/Emby.Dlna/Profiles/Json/foobar2000.json
new file mode 100644
index 0000000000..02efb9dc59
--- /dev/null
+++ b/Emby.Dlna/Profiles/Json/foobar2000.json
@@ -0,0 +1 @@
+{"Name":"foobar2000","Identification":{"FriendlyName":"foobar","Headers":[{"Name":"User-Agent","Value":"foobar","Match":"Substring"}]},"Manufacturer":"Emby","ManufacturerUrl":"http://emby.media/","ModelName":"Emby Server","ModelDescription":"Emby","ModelNumber":"Emby","ModelUrl":"http://emby.media/","EnableAlbumArtInDidl":false,"EnableSingleAlbumArtLimit":false,"EnableSingleSubtitleLimit":false,"SupportedMediaTypes":"Audio","AlbumArtPn":"JPEG_SM","MaxAlbumArtWidth":480,"MaxAlbumArtHeight":480,"MaxIconWidth":48,"MaxIconHeight":48,"MaxStreamingBitrate":20000000,"MaxStaticBitrate":20000000,"MusicStreamingTranscodingBitrate":192000,"XDlnaDoc":"DMS-1.50","ProtocolInfo":"http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_AC3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_HD_50_AC3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_BASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMA_FULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-matroska:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_HD_1080i_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_HP_HD_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_LPCM;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_ASP_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_SP_L6_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=MPEG4_P2_MP4_NDSD;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_SD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_AAC_MULT5_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=AVC_TS_HD_50_LPCM_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=01500000000000000000000000000000","TimelineOffsetSeconds":0,"RequiresPlainVideoItems":false,"RequiresPlainFolders":false,"EnableMSMediaReceiverRegistrar":false,"IgnoreTranscodeByteRangeRequests":false,"XmlRootAttributes":[],"DirectPlayProfiles":[{"Container":"mp3","AudioCodec":"mp2,mp3","Type":"Audio"},{"Container":"mp4","AudioCodec":"mp4","Type":"Audio"},{"Container":"aac,wav","Type":"Audio"},{"Container":"flac","AudioCodec":"flac","Type":"Audio"},{"Container":"asf","AudioCodec":"wmav2,wmapro,wmavoice","Type":"Audio"},{"Container":"ogg","AudioCodec":"vorbis","Type":"Audio"}],"TranscodingProfiles":[{"Container":"mp3","Type":"Audio","AudioCodec":"mp3","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"ts","Type":"Video","VideoCodec":"h264","AudioCodec":"aac","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false},{"Container":"jpeg","Type":"Photo","EstimateContentLength":false,"EnableMpegtsM2TsMode":false,"TranscodeSeekInfo":"Auto","CopyTimestamps":false,"Context":"Streaming","EnableSubtitlesInManifest":false,"EnableSplittingOnNonKeyFrames":false}],"ContainerProfiles":[],"CodecProfiles":[],"ResponseProfiles":[],"SubtitleProfiles":[{"Format":"srt","Method":"Embed"}]} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/KodiProfile.cs b/Emby.Dlna/Profiles/KodiProfile.cs
new file mode 100644
index 0000000000..dbcac6652c
--- /dev/null
+++ b/Emby.Dlna/Profiles/KodiProfile.cs
@@ -0,0 +1,151 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class KodiProfile : DefaultProfile
+ {
+ public KodiProfile()
+ {
+ Name = "Kodi";
+
+ MaxStreamingBitrate = 100000000;
+ MusicStreamingTranscodingBitrate = 1280000;
+
+ TimelineOffsetSeconds = 5;
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "Kodi",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo {Name = "User-Agent", Value = "Kodi", Match = HeaderMatchType.Substring}
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Photo,
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+
+ ContainerProfiles = new ContainerProfile[] { };
+
+ CodecProfiles = new CodecProfile[] { };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ass",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ssa",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "smi",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "dvdsub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgs",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgssub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/LgTvProfile.cs b/Emby.Dlna/Profiles/LgTvProfile.cs
new file mode 100644
index 0000000000..faaf63b314
--- /dev/null
+++ b/Emby.Dlna/Profiles/LgTvProfile.cs
@@ -0,0 +1,210 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class LgTvProfile : DefaultProfile
+ {
+ public LgTvProfile()
+ {
+ Name = "LG Smart TV";
+
+ TimelineOffsetSeconds = 10;
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"LG.*",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = "LG",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ AudioCodec = "ac3,aac,mp3",
+ VideoCodec = "h264",
+ Type = DlnaProfileType.Video
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "aac,ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264",
+ AudioCodec = "aac,ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac,ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg4",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3,aac,mp3",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/LinksysDMA2100Profile.cs b/Emby.Dlna/Profiles/LinksysDMA2100Profile.cs
new file mode 100644
index 0000000000..4a4ecdc589
--- /dev/null
+++ b/Emby.Dlna/Profiles/LinksysDMA2100Profile.cs
@@ -0,0 +1,37 @@
+using System.Xml.Serialization;
+using MediaBrowser.Model.Dlna;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class LinksysDMA2100Profile : DefaultProfile
+ {
+ public LinksysDMA2100Profile()
+ {
+ // Linksys DMA2100us does not need any transcoding of the formats we support statically
+ Name = "Linksys DMA2100";
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "DMA2100us"
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp3,flac,m4a,wma",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "avi,mp4,mkv,ts",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/MediaMonkeyProfile.cs b/Emby.Dlna/Profiles/MediaMonkeyProfile.cs
new file mode 100644
index 0000000000..66bde1045b
--- /dev/null
+++ b/Emby.Dlna/Profiles/MediaMonkeyProfile.cs
@@ -0,0 +1,77 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class MediaMonkeyProfile : DefaultProfile
+ {
+ public MediaMonkeyProfile()
+ {
+ Name = "MediaMonkey";
+
+ SupportedMediaTypes = "Audio";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"MediaMonkey",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = "MediaMonkey",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp2,mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "mp4",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "aac,wav",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flac",
+ AudioCodec = "flac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ogg",
+ AudioCodec = "vorbis",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/PanasonicVieraProfile.cs b/Emby.Dlna/Profiles/PanasonicVieraProfile.cs
new file mode 100644
index 0000000000..f3d7f59512
--- /dev/null
+++ b/Emby.Dlna/Profiles/PanasonicVieraProfile.cs
@@ -0,0 +1,215 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class PanasonicVieraProfile : DefaultProfile
+ {
+ public PanasonicVieraProfile()
+ {
+ Name = "Panasonic Viera";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"VIERA",
+ Manufacturer = "Panasonic",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = "Panasonic MIL DLNA",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:pv", "http://www.pv.com/pvns/");
+
+ TimelineOffsetSeconds = 10;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ AudioCodec = "ac3",
+ VideoCodec = "h264",
+ Type = DlnaProfileType.Video
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mpeg,mpg",
+ VideoCodec = "mpeg2video,mpeg4",
+ AudioCodec = "ac3,mp3,pcm_dvd",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264,mpeg2video",
+ AudioCodec = "aac,ac3,dca,mp3,mp2,pcm,dts",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264,mpeg2video",
+ AudioCodec = "aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264",
+ AudioCodec = "aac,ac3,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mov",
+ VideoCodec = "h264",
+ AudioCodec = "aac,pcm",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "pcm",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flv",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitDepth,
+ Value = "8",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Type = DlnaProfileType.Video,
+ Container = "ts",
+ OrgPn = "MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ MimeType = "video/vnd.dlna.mpeg-tts"
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/PopcornHourProfile.cs b/Emby.Dlna/Profiles/PopcornHourProfile.cs
new file mode 100644
index 0000000000..0095c80a28
--- /dev/null
+++ b/Emby.Dlna/Profiles/PopcornHourProfile.cs
@@ -0,0 +1,207 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class PopcornHourProfile : DefaultProfile
+ {
+ public PopcornHourProfile()
+ {
+ Name = "Popcorn Hour";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "mp4",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "mp4,mov",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264",
+ AudioCodec = "aac,ac3,eac3,mp3,mp2,pcm"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf,wmv",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "wmv3,vc1",
+ AudioCodec = "wmav2,wmapro"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg4,msmpeg4",
+ AudioCodec = "mp3,ac3,eac3,mp2,pcm"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264",
+ AudioCodec = "aac,mp3,ac3,eac3,mp2,pcm"
+ },
+ new DirectPlayProfile
+ {
+ Container = "aac,mp3,flac,ogg,wma,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,gif,bmp,png",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec="h264",
+ Conditions = new []
+ {
+ new ProfileCondition(ProfileConditionType.EqualsAny, ProfileConditionValue.VideoProfile, "baseline|constrained baseline"),
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Audio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Audio,
+ Codec = "mp3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioBitrate,
+ Value = "320000",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SamsungSmartTvProfile.cs b/Emby.Dlna/Profiles/SamsungSmartTvProfile.cs
new file mode 100644
index 0000000000..5acdde327b
--- /dev/null
+++ b/Emby.Dlna/Profiles/SamsungSmartTvProfile.cs
@@ -0,0 +1,357 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SamsungSmartTvProfile : DefaultProfile
+ {
+ public SamsungSmartTvProfile()
+ {
+ Name = "Samsung Smart TV";
+
+ EnableAlbumArtInDidl = true;
+
+ Identification = new DeviceIdentification
+ {
+ ModelUrl = "samsung.com",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = @"SEC_",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:sec", "http://www.sec.co.kr/");
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ AudioCodec = "ac3",
+ VideoCodec = "h264",
+ Type = DlnaProfileType.Video,
+ EstimateContentLength = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "h264,mpeg4,mjpeg",
+ AudioCodec = "mp3,ac3,wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "h264,mpeg4,mjpeg",
+ AudioCodec = "mp3,ac3,dca,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264,mpeg4,mjpeg4",
+ AudioCodec = "mp3,ac3,dca,aac,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "mp3,aac",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "3gp",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac,he-aac",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpg,mpeg",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,mp2,mp3,aac",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "vro,vob",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp2,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video,h264,vc1",
+ AudioCodec = "ac3,aac,mp3,eac3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3",
+ AudioCodec = "wmav2,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3,flac",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg2video",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "30720000"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg4",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "8192000"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "37500000"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "wmv2,wmv3,vc1",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "25600000"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3,wmav2,dca,aac,mp3,dts",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/x-msvideo",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mkv",
+ MimeType = "video/x-mkv",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "flac",
+ MimeType = "audio/x-flac",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External,
+ DidlMode = "CaptionInfoEx"
+ }
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/SonyBlurayPlayer2013.cs b/Emby.Dlna/Profiles/SonyBlurayPlayer2013.cs
new file mode 100644
index 0000000000..ac7f56b46f
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBlurayPlayer2013.cs
@@ -0,0 +1,228 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBlurayPlayer2013 : DefaultProfile
+ {
+ public SonyBlurayPlayer2013()
+ {
+ Name = "Sony Blu-ray Player 2013";
+
+ Identification = new DeviceIdentification
+ {
+ ModelNumber = "BDP-2013",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S1100",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S3100",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S5100",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S6100",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S7100",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ Manufacturer = "Microsoft Corporation";
+
+ ProtocolInfo = "http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts,mpegts",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg,mpg",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp3,mp2,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,m4v",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,pcm,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,dca,aac,mp3,pcm,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "m2ts,mts",
+ VideoCodec = "h264,mpeg4,vc1",
+ AudioCodec = "aac,mp3,ac3,dca,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "wmv,asf",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3,m4a,wma,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBlurayPlayer2014.cs b/Emby.Dlna/Profiles/SonyBlurayPlayer2014.cs
new file mode 100644
index 0000000000..961ff30f28
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBlurayPlayer2014.cs
@@ -0,0 +1,228 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBlurayPlayer2014 : DefaultProfile
+ {
+ public SonyBlurayPlayer2014()
+ {
+ Name = "Sony Blu-ray Player 2014";
+
+ Identification = new DeviceIdentification
+ {
+ ModelNumber = "BDP-2014",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S1200",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S3200",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S5200",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S6200",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S7200",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ Manufacturer = "Microsoft Corporation";
+
+ ProtocolInfo = "http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts,mpegts",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg,mpg",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp3,mp2,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,m4v",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,pcm,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,dca,aac,mp3,pcm,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "m2ts,mts",
+ VideoCodec = "h264,mpeg4,vc1",
+ AudioCodec = "aac,mp3,ac3,dca,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "wmv,asf",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3,m4a,wma,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBlurayPlayer2015.cs b/Emby.Dlna/Profiles/SonyBlurayPlayer2015.cs
new file mode 100644
index 0000000000..2573121b17
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBlurayPlayer2015.cs
@@ -0,0 +1,216 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBlurayPlayer2015 : DefaultProfile
+ {
+ public SonyBlurayPlayer2015()
+ {
+ Name = "Sony Blu-ray Player 2015";
+
+ Identification = new DeviceIdentification
+ {
+ ModelNumber = "BDP-2015",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S1500",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S3500",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S6500",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ Manufacturer = "Microsoft Corporation";
+
+ ProtocolInfo = "http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts,mpegts",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg,mpg",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp3,mp2,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,m4v",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,pcm,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,dca,aac,mp3,pcm,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "m2ts,mts",
+ VideoCodec = "h264,mpeg4,vc1",
+ AudioCodec = "aac,mp3,ac3,dca,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "wmv,asf",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3,m4a,wma,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBlurayPlayer2016.cs b/Emby.Dlna/Profiles/SonyBlurayPlayer2016.cs
new file mode 100644
index 0000000000..1ffed3d62c
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBlurayPlayer2016.cs
@@ -0,0 +1,216 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBlurayPlayer2016 : DefaultProfile
+ {
+ public SonyBlurayPlayer2016()
+ {
+ Name = "Sony Blu-ray Player 2016";
+
+ Identification = new DeviceIdentification
+ {
+ ModelNumber = "BDP-2016",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S1700",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S3700",
+ Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = "BDP-S6700",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ Manufacturer = "Microsoft Corporation";
+
+ ProtocolInfo = "http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts,mpegts",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg,mpg",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp3,mp2,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,m4v",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,pcm,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,dca,aac,mp3,pcm,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "m2ts,mts",
+ VideoCodec = "h264,mpeg4,vc1",
+ AudioCodec = "aac,mp3,ac3,dca,dts",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "wmv,asf",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3,m4a,wma,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBlurayPlayerProfile.cs b/Emby.Dlna/Profiles/SonyBlurayPlayerProfile.cs
new file mode 100644
index 0000000000..d1305d4246
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBlurayPlayerProfile.cs
@@ -0,0 +1,267 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBlurayPlayerProfile : DefaultProfile
+ {
+ public SonyBlurayPlayerProfile()
+ {
+ Name = "Sony Blu-ray Player";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"Blu-ray Disc Player",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @"(Blu-ray Disc Player|Home Theater System|Home Theatre System|Media Player)",
+ Match = HeaderMatchType.Regex
+ },
+
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Physical-Unit-Info",
+ Value = @"(Blu-ray Disc Player|Home Theater System|Home Theatre System|Media Player)",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ Manufacturer = "Microsoft Corporation";
+
+ ProtocolInfo = "http-get:*:video/divx:DLNA.ORG_PN=MATROSKA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mp4:DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/L16;rate=48000;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/flac:DLNA.ORG_PN=FLAC;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:audio/ogg:DLNA.ORG_PN=OGG;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_MED;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/png:DLNA.ORG_PN=PNG_TN;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:image/gif:DLNA.ORG_PN=GIF_LRG;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_EU_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_EU_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_NA_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_SD_KO_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_TS_SD_KO_ISO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.dlna.mpeg-tts:DLNA.ORG_PN=MPEG_TS_JP_T;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-msvideo:DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-flv:DLNA.ORG_PN=FLV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-dvr:DLNA.ORG_PN=DVR_MS;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/wtv:DLNA.ORG_PN=WTV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/ogg:DLNA.ORG_PN=OGV;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/vnd.rn-realvideo:DLNA.ORG_PN=REAL_VIDEO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-wmv:DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L2_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/x-ms-asf:DLNA.ORG_PN=VC1_ASF_AP_L3_WMA;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_P2_3GPP_SP_L0B_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_3GPP_P0_L10_AMR;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:video/3gpp:DLNA.ORG_PN=MPEG4_H263_MP4_P0_L10_AAC;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi,mp4",
+ VideoCodec = "mpeg4,h264",
+ AudioCodec = "ac3,aac,mp3,pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "15360000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264,mpeg4,vc1",
+ AudioCodec = "ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/mpeg",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mkv",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mp4",
+ MimeType = "video/mpeg",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ MimeType = "video/mpeg",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mp3",
+ MimeType = "audio/mpeg",
+ Type = DlnaProfileType.Audio
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBravia2010Profile.cs b/Emby.Dlna/Profiles/SonyBravia2010Profile.cs
new file mode 100644
index 0000000000..5185503711
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBravia2010Profile.cs
@@ -0,0 +1,356 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBravia2010Profile : DefaultProfile
+ {
+ public SonyBravia2010Profile()
+ {
+ Name = "Sony Bravia (2010)";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"KDL-\d{2}[EHLNPB]X\d[01]\d.*",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @".*KDL-\d{2}[EHLNPB]X\d[01]\d.*",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ AlbumArtPn = "JPEG_TN";
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ ModelUrl = "http://www.microsoft.com/";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com/";
+ SonyAggregationFlags = "10";
+ ProtocolInfo =
+ "http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+ EnableSingleAlbumArtLimit = true;
+ EnableAlbumArtInDidl = true;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video,
+ EnableMpegtsM2TsMode = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video,mpeg1video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "192"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.VideoTimestamp,
+ Value = "Valid"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/mpeg",
+ OrgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "188"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="mpeg2video",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ VideoCodec="mpeg1video,mpeg2video",
+ MimeType = "video/mpeg",
+ OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg2video",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "he-aac"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "mp3,mp2",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBravia2011Profile.cs b/Emby.Dlna/Profiles/SonyBravia2011Profile.cs
new file mode 100644
index 0000000000..c21022aa3a
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBravia2011Profile.cs
@@ -0,0 +1,373 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBravia2011Profile : DefaultProfile
+ {
+ public SonyBravia2011Profile()
+ {
+ Name = "Sony Bravia (2011)";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"KDL-\d{2}([A-Z]X\d2\d|CX400).*",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @".*KDL-\d{2}([A-Z]X\d2\d|CX400).*",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ AlbumArtPn = "JPEG_TN";
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ ModelUrl = "http://www.microsoft.com/";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com/";
+ SonyAggregationFlags = "10";
+ EnableSingleAlbumArtLimit = true;
+ EnableAlbumArtInDidl = true;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video,
+ EnableMpegtsM2TsMode = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video,mpeg1video",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "192"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.VideoTimestamp,
+ Value = "Valid"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/mpeg",
+ OrgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "188"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="mpeg2video",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ VideoCodec="mpeg1video,mpeg2video",
+ MimeType = "video/mpeg",
+ OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg2video",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "20000000"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "he-aac"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "mp3,mp2",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBravia2012Profile.cs b/Emby.Dlna/Profiles/SonyBravia2012Profile.cs
new file mode 100644
index 0000000000..1bbd40e914
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBravia2012Profile.cs
@@ -0,0 +1,291 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBravia2012Profile : DefaultProfile
+ {
+ public SonyBravia2012Profile()
+ {
+ Name = "Sony Bravia (2012)";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"KDL-\d{2}[A-Z]X\d5(\d|G).*",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @".*KDL-\d{2}[A-Z]X\d5(\d|G).*",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ AlbumArtPn = "JPEG_TN";
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ ModelUrl = "http://www.microsoft.com/";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com/";
+ SonyAggregationFlags = "10";
+ EnableSingleAlbumArtLimit = true;
+ EnableAlbumArtInDidl = true;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video,
+ EnableMpegtsM2TsMode = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "ac3,aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video,mpeg1video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "192"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.VideoTimestamp,
+ Value = "Valid"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/mpeg",
+ OrgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "188"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="mpeg2video",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ VideoCodec="mpeg1video,mpeg2video",
+ MimeType = "video/mpeg",
+ OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+
+ Conditions = new[]
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "mp3,mp2",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBravia2013Profile.cs b/Emby.Dlna/Profiles/SonyBravia2013Profile.cs
new file mode 100644
index 0000000000..019bbafcb4
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBravia2013Profile.cs
@@ -0,0 +1,309 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBravia2013Profile : DefaultProfile
+ {
+ public SonyBravia2013Profile()
+ {
+ Name = "Sony Bravia (2013)";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"KDL-\d{2}[WR][5689]\d{2}A.*",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @".*KDL-\d{2}[WR][5689]\d{2}A.*",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ AlbumArtPn = "JPEG_TN";
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ ModelUrl = "http://www.microsoft.com/";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com/";
+ SonyAggregationFlags = "10";
+ EnableSingleAlbumArtLimit = true;
+ EnableAlbumArtInDidl = true;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video,
+ EnableMpegtsM2TsMode = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,eac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mov",
+ VideoCodec = "h264,mpeg4,mjpeg",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264,mpeg4,vp8",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2,pcm,vorbis",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "ac3,eac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mjpeg",
+ AudioCodec = "pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video,mpeg1video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "wav",
+ AudioCodec = "pcm",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "192"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.VideoTimestamp,
+ Value = "Valid"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/mpeg",
+ OrgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "188"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="mpeg2video",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ VideoCodec="mpeg1video,mpeg2video",
+ MimeType = "video/mpeg",
+ OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "mp3,mp2",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyBravia2014Profile.cs b/Emby.Dlna/Profiles/SonyBravia2014Profile.cs
new file mode 100644
index 0000000000..910786b839
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyBravia2014Profile.cs
@@ -0,0 +1,309 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyBravia2014Profile : DefaultProfile
+ {
+ public SonyBravia2014Profile()
+ {
+ Name = "Sony Bravia (2014)";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = @"(KDL-\d{2}W[5-9]\d{2}B|KDL-\d{2}R480|XBR-\d{2}X[89]\d{2}B|KD-\d{2}[SX][89]\d{3}B).*",
+ Manufacturer = "Sony",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @".*(KDL-\d{2}W[5-9]\d{2}B|KDL-\d{2}R480|XBR-\d{2}X[89]\d{2}B|KD-\d{2}[SX][89]\d{3}B).*",
+ Match = HeaderMatchType.Regex
+ }
+ }
+ };
+
+ AddXmlRootAttribute("xmlns:av", "urn:schemas-sony-com:av");
+
+ AlbumArtPn = "JPEG_TN";
+
+ ModelName = "Windows Media Player Sharing";
+ ModelNumber = "3.0";
+ ModelUrl = "http://www.microsoft.com/";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com/";
+ SonyAggregationFlags = "10";
+ EnableSingleAlbumArtLimit = true;
+ EnableAlbumArtInDidl = true;
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3",
+ Type = DlnaProfileType.Video,
+ EnableMpegtsM2TsMode = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,eac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mov",
+ VideoCodec = "h264,mpeg4,mjpeg",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ VideoCodec = "h264,mpeg4,vp8",
+ AudioCodec = "ac3,eac3,aac,mp3,mp2,pcm,vorbis",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "ac3,eac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mjpeg",
+ AudioCodec = "pcm",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ VideoCodec = "mpeg2video,mpeg1video",
+ AudioCodec = "mp3,mp2",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "wav",
+ AudioCodec = "pcm",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "192"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.VideoTimestamp,
+ Value = "Valid"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/mpeg",
+ OrgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO",
+ Type = DlnaProfileType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.PacketLength,
+ Value = "188"
+ }
+ }
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="h264",
+ AudioCodec="ac3,aac,mp3",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "ts",
+ VideoCodec="mpeg2video",
+ MimeType = "video/vnd.dlna.mpeg-tts",
+ OrgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "mpeg",
+ VideoCodec="mpeg1video,mpeg2video",
+ MimeType = "video/mpeg",
+ OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "mp3,mp2",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyPs3Profile.cs b/Emby.Dlna/Profiles/SonyPs3Profile.cs
new file mode 100644
index 0000000000..001ef2bd8e
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyPs3Profile.cs
@@ -0,0 +1,260 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyPs3Profile : DefaultProfile
+ {
+ public SonyPs3Profile()
+ {
+ Name = "Sony PlayStation 3";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = "PLAYSTATION 3",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = @"PLAYSTATION 3",
+ Match = HeaderMatchType.Substring
+ },
+
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @"PLAYSTATION 3",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AlbumArtPn = "JPEG_TN";
+
+ SonyAggregationFlags = "10";
+ XDlnaDoc = "DMS-1.50";
+ EnableSingleAlbumArtLimit = true;
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg4",
+ AudioCodec = "mp2,mp3"
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,mp2,mp3,aac"
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "mp2"
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac,ac3"
+ },
+ new DirectPlayProfile
+ {
+ Container = "aac,mp3,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif,bmp,tiff",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "15360000",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ },
+
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioBitrate,
+ Value = "640000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "wmapro",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "he-aac",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "mp4,mov",
+ AudioCodec="aac",
+ MimeType = "video/mp4",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/divx",
+ OrgPn="AVI",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "wav",
+ MimeType = "audio/wav",
+ Type = DlnaProfileType.Audio
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/SonyPs4Profile.cs b/Emby.Dlna/Profiles/SonyPs4Profile.cs
new file mode 100644
index 0000000000..44649911dc
--- /dev/null
+++ b/Emby.Dlna/Profiles/SonyPs4Profile.cs
@@ -0,0 +1,260 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class SonyPs4Profile : DefaultProfile
+ {
+ public SonyPs4Profile()
+ {
+ Name = "Sony PlayStation 4";
+
+ Identification = new DeviceIdentification
+ {
+ FriendlyName = "PLAYSTATION 4",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = @"PLAYSTATION 4",
+ Match = HeaderMatchType.Substring
+ },
+
+ new HttpHeaderInfo
+ {
+ Name = "X-AV-Client-Info",
+ Value = @"PLAYSTATION 4",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ AlbumArtPn = "JPEG_TN";
+
+ SonyAggregationFlags = "10";
+ XDlnaDoc = "DMS-1.50";
+ EnableSingleAlbumArtLimit = true;
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg4",
+ AudioCodec = "mp2,mp3"
+ },
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video,h264",
+ AudioCodec = "ac3,mp2,mp3,aac"
+ },
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "mp2"
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,mkv",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac,ac3"
+ },
+ new DirectPlayProfile
+ {
+ Container = "aac,mp3,wav",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg,png,gif,bmp,tiff",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Video
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "15360000",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ },
+
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioBitrate,
+ Value = "640000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "wmapro",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "he-aac",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "mp4,mov",
+ AudioCodec="aac",
+ MimeType = "video/mp4",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/divx",
+ OrgPn="AVI",
+ Type = DlnaProfileType.Video
+ },
+
+ new ResponseProfile
+ {
+ Container = "wav",
+ MimeType = "audio/wav",
+ Type = DlnaProfileType.Audio
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/VlcProfile.cs b/Emby.Dlna/Profiles/VlcProfile.cs
new file mode 100644
index 0000000000..2cd0e5cae7
--- /dev/null
+++ b/Emby.Dlna/Profiles/VlcProfile.cs
@@ -0,0 +1,149 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class VlcProfile : DefaultProfile
+ {
+ public VlcProfile()
+ {
+ Name = "Vlc";
+
+
+ TimelineOffsetSeconds = 5;
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "Vlc",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo {Name = "User-Agent", Value = "vlc", Match = HeaderMatchType.Substring}
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new TranscodingProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ AudioCodec = "aac",
+ VideoCodec = "h264"
+ },
+
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Video
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "",
+ Type = DlnaProfileType.Photo,
+ }
+ };
+
+ ResponseProfiles = new ResponseProfile[] { };
+
+ ContainerProfiles = new ContainerProfile[] { };
+
+ CodecProfiles = new CodecProfile[] { };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.External,
+ },
+
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ass",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "ssa",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "smi",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "dvdsub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgs",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "pgssub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ },
+
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.Embed,
+ DidlMode = "",
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/WdtvLiveProfile.cs b/Emby.Dlna/Profiles/WdtvLiveProfile.cs
new file mode 100644
index 0000000000..e524816afe
--- /dev/null
+++ b/Emby.Dlna/Profiles/WdtvLiveProfile.cs
@@ -0,0 +1,266 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class WdtvLiveProfile : DefaultProfile
+ {
+ public WdtvLiveProfile()
+ {
+ Name = "WDTV Live";
+
+ TimelineOffsetSeconds = 5;
+ IgnoreTranscodeByteRangeRequests = true;
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "WD TV",
+
+ Headers = new []
+ {
+ new HttpHeaderInfo {Name = "User-Agent", Value = "alphanetworks", Match = HeaderMatchType.Substring},
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent",
+ Value = "ALPHA Networks",
+ Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ Type = DlnaProfileType.Audio,
+ AudioCodec = "mp3"
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264",
+ AudioCodec = "aac"
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video,mpeg4,h264,vc1",
+ AudioCodec = "ac3,dca,mp2,mp3,pcm,dts"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mpeg",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video",
+ AudioCodec = "ac3,dca,mp2,mp3,pcm,dts"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mkv",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video,mpeg4,h264,vc1",
+ AudioCodec = "ac3,dca,aac,mp2,mp3,pcm,dts"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ts,m2ts",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg1video,mpeg2video,h264,vc1",
+ AudioCodec = "ac3,dca,mp2,mp3,aac,dts"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4,mov",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "ac3,aac,mp2,mp3,dca,dts"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "vc1",
+ AudioCodec = "wmav2,wmapro"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ Type = DlnaProfileType.Video,
+ VideoCodec = "mpeg2video",
+ AudioCodec = "mp2,ac3"
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp2,mp3",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "mp4",
+ AudioCodec = "mp4",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "flac",
+ AudioCodec = "flac",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "ogg",
+ AudioCodec = "vorbis",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Container = "jpeg,png,gif,bmp,tiff"
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "ts",
+ OrgPn = "MPEG_TS_SD_NA",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41"
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2"
+ }
+ }
+ }
+ };
+
+ SubtitleProfiles = new[]
+ {
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.External
+ },
+ new SubtitleProfile
+ {
+ Format = "srt",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "sub",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "subrip",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+ new SubtitleProfile
+ {
+ Format = "idx",
+ Method = SubtitleDeliveryMethod.Embed
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/Xbox360Profile.cs b/Emby.Dlna/Profiles/Xbox360Profile.cs
new file mode 100644
index 0000000000..9f0130856f
--- /dev/null
+++ b/Emby.Dlna/Profiles/Xbox360Profile.cs
@@ -0,0 +1,317 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ /// <summary>
+ /// Good info on xbox 360 requirements: https://code.google.com/p/jems/wiki/XBox360Notes
+ /// </summary>
+ [XmlRoot("Profile")]
+ public class Xbox360Profile : DefaultProfile
+ {
+ public Xbox360Profile()
+ {
+ Name = "Xbox 360";
+
+ // Required according to above
+ ModelName = "Windows Media Player Sharing";
+
+ ModelNumber = "12.0";
+
+ FriendlyName = "${HostName}: 1";
+
+ ModelUrl = "http://go.microsoft.com/fwlink/?LinkId=105926";
+ Manufacturer = "Microsoft Corporation";
+ ManufacturerUrl = "http://www.microsoft.com";
+ XDlnaDoc = "DMS-1.50";
+ ModelDescription = "Emby : UPnP Media Server";
+
+ TimelineOffsetSeconds = 40;
+ RequiresPlainFolders = true;
+ RequiresPlainVideoItems = true;
+ EnableMSMediaReceiverRegistrar = true;
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "Xbox 360",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo {Name = "User-Agent", Value = "Xbox", Match = HeaderMatchType.Substring},
+ new HttpHeaderInfo {Name = "User-Agent", Value = "Xenon", Match = HeaderMatchType.Substring}
+ }
+ };
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2",
+ AudioCodec = "wmav2",
+ Type = DlnaProfileType.Video,
+ TranscodeSeekInfo = TranscodeSeekInfo.Bytes,
+ EstimateContentLength = true
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,mov",
+ VideoCodec = "h264,mpeg4",
+ AudioCodec = "aac,ac3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/avi",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Video,
+ Container = "mp4,mov",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.Has64BitOffsets,
+ Value = "false",
+ IsRequired = false
+ }
+ }
+ },
+
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Photo,
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg4",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1280"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "720"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "5120000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = "41",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "10240000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "wmv2,wmv3,vc1",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "15360000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3,wmav2,wmapro",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "lc",
+ IsRequired = false
+ }
+ }
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Profiles/XboxOneProfile.cs b/Emby.Dlna/Profiles/XboxOneProfile.cs
new file mode 100644
index 0000000000..370534a676
--- /dev/null
+++ b/Emby.Dlna/Profiles/XboxOneProfile.cs
@@ -0,0 +1,356 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace Emby.Dlna.Profiles
+{
+ [XmlRoot("Profile")]
+ public class XboxOneProfile : DefaultProfile
+ {
+ public XboxOneProfile()
+ {
+ Name = "Xbox One";
+
+ TimelineOffsetSeconds = 40;
+
+ Identification = new DeviceIdentification
+ {
+ ModelName = "Xbox One",
+
+ Headers = new[]
+ {
+ new HttpHeaderInfo
+ {
+ Name = "FriendlyName.DLNA.ORG", Value = "XboxOne", Match = HeaderMatchType.Substring
+ },
+ new HttpHeaderInfo
+ {
+ Name = "User-Agent", Value = "NSPlayer/12", Match = HeaderMatchType.Substring
+ }
+ }
+ };
+
+ var videoProfile = "high|main|baseline|constrained baseline";
+ var videoLevel = "41";
+
+ TranscodingProfiles = new[]
+ {
+ new TranscodingProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new TranscodingProfile
+ {
+ Container = "jpeg",
+ VideoCodec = "jpeg",
+ Type = DlnaProfileType.Photo
+ },
+ new TranscodingProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video
+ }
+ };
+
+ DirectPlayProfiles = new[]
+ {
+ new DirectPlayProfile
+ {
+ Container = "ts",
+ VideoCodec = "h264,mpeg2video",
+ AudioCodec = "ac3,aac,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "mpeg4",
+ AudioCodec = "ac3,mp3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "avi",
+ VideoCodec = "h264",
+ AudioCodec = "aac",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp4,mov,mkv",
+ VideoCodec = "h264,mpeg4,mpeg2video",
+ AudioCodec = "aac,ac3",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ VideoCodec = "wmv2,wmv3,vc1",
+ AudioCodec = "wmav2,wmapro",
+ Type = DlnaProfileType.Video
+ },
+ new DirectPlayProfile
+ {
+ Container = "asf",
+ AudioCodec = "wmav2,wmapro,wmavoice",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "mp3",
+ AudioCodec = "mp3",
+ Type = DlnaProfileType.Audio
+ },
+ new DirectPlayProfile
+ {
+ Container = "jpeg",
+ Type = DlnaProfileType.Photo
+ }
+ };
+
+ ContainerProfiles = new[]
+ {
+ new ContainerProfile
+ {
+ Type = DlnaProfileType.Video,
+ Container = "mp4,mov",
+
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.Has64BitOffsets,
+ Value = "false",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ CodecProfiles = new[]
+ {
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "mpeg4",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitDepth,
+ Value = "8",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "5120000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "h264",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitDepth,
+ Value = "8",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoLevel,
+ Value = videoLevel,
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.EqualsAny,
+ Property = ProfileConditionValue.VideoProfile,
+ Value = videoProfile,
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Codec = "wmv2,wmv3,vc1",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitDepth,
+ Value = "8",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Width,
+ Value = "1920"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.Height,
+ Value = "1080"
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoFramerate,
+ Value = "30",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitrate,
+ Value = "15360000",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.Video,
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.NotEquals,
+ Property = ProfileConditionValue.IsAnamorphic,
+ Value = "true",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.VideoBitDepth,
+ Value = "8",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "ac3,wmav2,wmapro",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "6",
+ IsRequired = false
+ }
+ }
+ },
+
+ new CodecProfile
+ {
+ Type = CodecType.VideoAudio,
+ Codec = "aac",
+ Conditions = new []
+ {
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = "2",
+ IsRequired = false
+ },
+ new ProfileCondition
+ {
+ Condition = ProfileConditionType.Equals,
+ Property = ProfileConditionValue.AudioProfile,
+ Value = "lc",
+ IsRequired = false
+ }
+ }
+ }
+ };
+
+ ResponseProfiles = new[]
+ {
+ new ResponseProfile
+ {
+ Container = "avi",
+ MimeType = "video/avi",
+ Type = DlnaProfileType.Video
+ }
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Properties/AssemblyInfo.cs b/Emby.Dlna/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..04c8f83d84
--- /dev/null
+++ b/Emby.Dlna/Properties/AssemblyInfo.cs
@@ -0,0 +1,19 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Emby.Dlna")]
+[assembly: AssemblyTrademark("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f40e364d-01d9-4bbf-b82c-5d6c55e0a1f5")]
diff --git a/Emby.Dlna/Server/DescriptionXmlBuilder.cs b/Emby.Dlna/Server/DescriptionXmlBuilder.cs
new file mode 100644
index 0000000000..a7a243c660
--- /dev/null
+++ b/Emby.Dlna/Server/DescriptionXmlBuilder.cs
@@ -0,0 +1,390 @@
+using Emby.Dlna.Common;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Security;
+using System.Text;
+
+namespace Emby.Dlna.Server
+{
+ public class DescriptionXmlBuilder
+ {
+ private readonly DeviceProfile _profile;
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+ private readonly string _serverUdn;
+ private readonly string _serverAddress;
+ private readonly string _serverName;
+ private readonly string _serverId;
+
+ public DescriptionXmlBuilder(DeviceProfile profile, string serverUdn, string serverAddress, string serverName, string serverId)
+ {
+ if (string.IsNullOrWhiteSpace(serverUdn))
+ {
+ throw new ArgumentNullException("serverUdn");
+ }
+
+ if (string.IsNullOrWhiteSpace(serverAddress))
+ {
+ throw new ArgumentNullException("serverAddress");
+ }
+
+ _profile = profile;
+ _serverUdn = serverUdn;
+ _serverAddress = serverAddress;
+ _serverName = serverName;
+ _serverId = serverId;
+ }
+
+ private bool EnableAbsoluteUrls
+ {
+ get { return false; }
+ }
+
+ public string GetXml()
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\"?>");
+
+ builder.Append("<root");
+
+ var attributes = _profile.XmlRootAttributes.ToList();
+
+ attributes.Insert(0, new XmlAttribute
+ {
+ Name = "xmlns:dlna",
+ Value = "urn:schemas-dlna-org:device-1-0"
+ });
+ attributes.Insert(0, new XmlAttribute
+ {
+ Name = "xmlns",
+ Value = "urn:schemas-upnp-org:device-1-0"
+ });
+
+ foreach (var att in attributes)
+ {
+ builder.AppendFormat(" {0}=\"{1}\"", att.Name, att.Value);
+ }
+
+ builder.Append(">");
+
+ builder.Append("<specVersion>");
+ builder.Append("<major>1</major>");
+ builder.Append("<minor>0</minor>");
+ builder.Append("</specVersion>");
+
+ AppendDeviceInfo(builder);
+
+ builder.Append("</root>");
+
+ return builder.ToString();
+ }
+
+ private void AppendDeviceInfo(StringBuilder builder)
+ {
+ builder.Append("<device>");
+ AppendDeviceProperties(builder);
+
+ AppendIconList(builder);
+ AppendServiceList(builder);
+ builder.Append("</device>");
+ }
+
+ private static readonly char[] s_escapeChars = new char[]
+ {
+ '<',
+ '>',
+ '"',
+ '\'',
+ '&'
+ };
+
+ private static readonly string[] s_escapeStringPairs = new string[]
+{
+ "<",
+ "&lt;",
+ ">",
+ "&gt;",
+ "\"",
+ "&quot;",
+ "'",
+ "&apos;",
+ "&",
+ "&amp;"
+};
+
+ private static string GetEscapeSequence(char c)
+ {
+ int num = s_escapeStringPairs.Length;
+ for (int i = 0; i < num; i += 2)
+ {
+ string text = s_escapeStringPairs[i];
+ string result = s_escapeStringPairs[i + 1];
+ if (text[0] == c)
+ {
+ return result;
+ }
+ }
+ return c.ToString();
+ }
+
+ /// <summary>Replaces invalid XML characters in a string with their valid XML equivalent.</summary>
+ /// <returns>The input string with invalid characters replaced.</returns>
+ /// <param name="str">The string within which to escape invalid characters. </param>
+ public static string Escape(string str)
+ {
+ if (str == null)
+ {
+ return null;
+ }
+ StringBuilder stringBuilder = null;
+ int length = str.Length;
+ int num = 0;
+ while (true)
+ {
+ int num2 = str.IndexOfAny(s_escapeChars, num);
+ if (num2 == -1)
+ {
+ break;
+ }
+ if (stringBuilder == null)
+ {
+ stringBuilder = new StringBuilder();
+ }
+ stringBuilder.Append(str, num, num2 - num);
+ stringBuilder.Append(GetEscapeSequence(str[num2]));
+ num = num2 + 1;
+ }
+ if (stringBuilder == null)
+ {
+ return str;
+ }
+ stringBuilder.Append(str, num, length - num);
+ return stringBuilder.ToString();
+ }
+
+ private void AppendDeviceProperties(StringBuilder builder)
+ {
+ builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
+
+ builder.Append("<dlna:X_DLNACAP>" + Escape(_profile.XDlnaCap ?? string.Empty) + "</dlna:X_DLNACAP>");
+
+ builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">M-DMS-1.50</dlna:X_DLNADOC>");
+ builder.Append("<dlna:X_DLNADOC xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\">" + Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>");
+
+ builder.Append("<friendlyName>" + Escape(GetFriendlyName()) + "</friendlyName>");
+ builder.Append("<manufacturer>" + Escape(_profile.Manufacturer ?? string.Empty) + "</manufacturer>");
+ builder.Append("<manufacturerURL>" + Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>");
+
+ builder.Append("<modelDescription>" + Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
+ builder.Append("<modelName>" + Escape(_profile.ModelName ?? string.Empty) + "</modelName>");
+
+ builder.Append("<modelNumber>" + Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>");
+ builder.Append("<modelURL>" + Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>");
+
+ if (string.IsNullOrWhiteSpace(_profile.SerialNumber))
+ {
+ builder.Append("<serialNumber>" + Escape(_serverId) + "</serialNumber>");
+ }
+ else
+ {
+ builder.Append("<serialNumber>" + Escape(_profile.SerialNumber) + "</serialNumber>");
+ }
+
+ builder.Append("<UDN>uuid:" + Escape(_serverUdn) + "</UDN>");
+ builder.Append("<presentationURL>" + Escape(_serverAddress) + "</presentationURL>");
+
+ if (!EnableAbsoluteUrls)
+ {
+ //builder.Append("<URLBase>" + Escape(_serverAddress) + "</URLBase>");
+ }
+
+ if (!string.IsNullOrWhiteSpace(_profile.SonyAggregationFlags))
+ {
+ builder.Append("<av:aggregationFlags xmlns:av=\"urn:schemas-sony-com:av\">" + Escape(_profile.SonyAggregationFlags) + "</av:aggregationFlags>");
+ }
+ }
+
+ private string GetFriendlyName()
+ {
+ if (string.IsNullOrWhiteSpace(_profile.FriendlyName))
+ {
+ return "Emby - " + _serverName;
+ }
+
+ var characters = _serverName.Where(c => (char.IsLetterOrDigit(c) || c == '-')).ToArray();
+
+ var serverName = new string(characters);
+
+ var name = (_profile.FriendlyName ?? string.Empty).Replace("${HostName}", serverName, StringComparison.OrdinalIgnoreCase);
+
+ return name;
+ }
+
+ private void AppendIconList(StringBuilder builder)
+ {
+ builder.Append("<iconList>");
+
+ foreach (var icon in GetIcons())
+ {
+ builder.Append("<icon>");
+
+ builder.Append("<mimetype>" + Escape(icon.MimeType ?? string.Empty) + "</mimetype>");
+ builder.Append("<width>" + Escape(icon.Width.ToString(_usCulture)) + "</width>");
+ builder.Append("<height>" + Escape(icon.Height.ToString(_usCulture)) + "</height>");
+ builder.Append("<depth>" + Escape(icon.Depth ?? string.Empty) + "</depth>");
+ builder.Append("<url>" + BuildUrl(icon.Url) + "</url>");
+
+ builder.Append("</icon>");
+ }
+
+ builder.Append("</iconList>");
+ }
+
+ private void AppendServiceList(StringBuilder builder)
+ {
+ builder.Append("<serviceList>");
+
+ foreach (var service in GetServices())
+ {
+ builder.Append("<service>");
+
+ builder.Append("<serviceType>" + Escape(service.ServiceType ?? string.Empty) + "</serviceType>");
+ builder.Append("<serviceId>" + Escape(service.ServiceId ?? string.Empty) + "</serviceId>");
+ builder.Append("<SCPDURL>" + BuildUrl(service.ScpdUrl) + "</SCPDURL>");
+ builder.Append("<controlURL>" + BuildUrl(service.ControlUrl) + "</controlURL>");
+ builder.Append("<eventSubURL>" + BuildUrl(service.EventSubUrl) + "</eventSubURL>");
+
+ builder.Append("</service>");
+ }
+
+ builder.Append("</serviceList>");
+ }
+
+ private string BuildUrl(string url)
+ {
+ if (string.IsNullOrWhiteSpace(url))
+ {
+ return string.Empty;
+ }
+
+ url = url.TrimStart('/');
+
+ url = "/dlna/" + _serverUdn + "/" + url;
+
+ if (EnableAbsoluteUrls)
+ {
+ url = _serverAddress.TrimEnd('/') + url;
+ }
+
+ return Escape(url);
+ }
+
+ private IEnumerable<DeviceIcon> GetIcons()
+ {
+ var list = new List<DeviceIcon>();
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/png",
+ Depth = "24",
+ Width = 240,
+ Height = 240,
+ Url = "icons/logo240.png"
+ });
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/jpeg",
+ Depth = "24",
+ Width = 240,
+ Height = 240,
+ Url = "icons/logo240.jpg"
+ });
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/png",
+ Depth = "24",
+ Width = 120,
+ Height = 120,
+ Url = "icons/logo120.png"
+ });
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/jpeg",
+ Depth = "24",
+ Width = 120,
+ Height = 120,
+ Url = "icons/logo120.jpg"
+ });
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/png",
+ Depth = "24",
+ Width = 48,
+ Height = 48,
+ Url = "icons/logo48.png"
+ });
+
+ list.Add(new DeviceIcon
+ {
+ MimeType = "image/jpeg",
+ Depth = "24",
+ Width = 48,
+ Height = 48,
+ Url = "icons/logo48.jpg"
+ });
+
+ return list;
+ }
+
+ private IEnumerable<DeviceService> GetServices()
+ {
+ var list = new List<DeviceService>();
+
+ list.Add(new DeviceService
+ {
+ ServiceType = "urn:schemas-upnp-org:service:ContentDirectory:1",
+ ServiceId = "urn:upnp-org:serviceId:ContentDirectory",
+ ScpdUrl = "contentdirectory/contentdirectory.xml",
+ ControlUrl = "contentdirectory/control",
+ EventSubUrl = "contentdirectory/events"
+ });
+
+ list.Add(new DeviceService
+ {
+ ServiceType = "urn:schemas-upnp-org:service:ConnectionManager:1",
+ ServiceId = "urn:upnp-org:serviceId:ConnectionManager",
+ ScpdUrl = "connectionmanager/connectionmanager.xml",
+ ControlUrl = "connectionmanager/control",
+ EventSubUrl = "connectionmanager/events"
+ });
+
+ if (_profile.EnableMSMediaReceiverRegistrar)
+ {
+ list.Add(new DeviceService
+ {
+ ServiceType = "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
+ ServiceId = "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar",
+ ScpdUrl = "mediareceiverregistrar/mediareceiverregistrar.xml",
+ ControlUrl = "mediareceiverregistrar/control",
+ EventSubUrl = "mediareceiverregistrar/events"
+ });
+ }
+
+ return list;
+ }
+
+ public override string ToString()
+ {
+ return GetXml();
+ }
+ }
+}
diff --git a/Emby.Dlna/Server/Headers.cs b/Emby.Dlna/Server/Headers.cs
new file mode 100644
index 0000000000..9899937521
--- /dev/null
+++ b/Emby.Dlna/Server/Headers.cs
@@ -0,0 +1,176 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace Emby.Dlna.Server
+{
+ public class Headers : IDictionary<string, string>
+ {
+ private readonly bool _asIs = false;
+ private readonly Dictionary<string, string> _dict = new Dictionary<string, string>();
+ private readonly static Regex Validator = new Regex(@"^[a-z\d][a-z\d_.-]+$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+ public Headers(bool asIs)
+ {
+ _asIs = asIs;
+ }
+
+ public Headers()
+ : this(asIs: false)
+ {
+ }
+
+ public int Count
+ {
+ get
+ {
+ return _dict.Count;
+ }
+ }
+ public string HeaderBlock
+ {
+ get
+ {
+ var hb = new StringBuilder();
+ foreach (var h in this)
+ {
+ hb.AppendFormat("{0}: {1}\r\n", h.Key, h.Value);
+ }
+ return hb.ToString();
+ }
+ }
+ public Stream HeaderStream
+ {
+ get
+ {
+ return new MemoryStream(Encoding.ASCII.GetBytes(HeaderBlock));
+ }
+ }
+ public bool IsReadOnly
+ {
+ get
+ {
+ return false;
+ }
+ }
+ public ICollection<string> Keys
+ {
+ get
+ {
+ return _dict.Keys;
+ }
+ }
+ public ICollection<string> Values
+ {
+ get
+ {
+ return _dict.Values;
+ }
+ }
+
+
+ public string this[string key]
+ {
+ get
+ {
+ return _dict[Normalize(key)];
+ }
+ set
+ {
+ _dict[Normalize(key)] = value;
+ }
+ }
+
+
+ private string Normalize(string header)
+ {
+ if (!_asIs)
+ {
+ header = header.ToLower();
+ }
+ header = header.Trim();
+ if (!Validator.IsMatch(header))
+ {
+ throw new ArgumentException("Invalid header: " + header);
+ }
+ return header;
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return _dict.GetEnumerator();
+ }
+
+ public void Add(KeyValuePair<string, string> item)
+ {
+ Add(item.Key, item.Value);
+ }
+
+ public void Add(string key, string value)
+ {
+ _dict.Add(Normalize(key), value);
+ }
+
+ public void Clear()
+ {
+ _dict.Clear();
+ }
+
+ public bool Contains(KeyValuePair<string, string> item)
+ {
+ var p = new KeyValuePair<string, string>(Normalize(item.Key), item.Value);
+ return _dict.Contains(p);
+ }
+
+ public bool ContainsKey(string key)
+ {
+ return _dict.ContainsKey(Normalize(key));
+ }
+
+ public void CopyTo(KeyValuePair<string, string>[] array, int arrayIndex)
+ {
+ throw new NotImplementedException();
+ }
+
+ public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
+ {
+ return _dict.GetEnumerator();
+ }
+
+ public bool Remove(string key)
+ {
+ return _dict.Remove(Normalize(key));
+ }
+
+ public bool Remove(KeyValuePair<string, string> item)
+ {
+ return Remove(item.Key);
+ }
+
+ public override string ToString()
+ {
+ return string.Format("({0})", string.Join(", ", (from x in _dict
+ select string.Format("{0}={1}", x.Key, x.Value))));
+ }
+
+ public bool TryGetValue(string key, out string value)
+ {
+ return _dict.TryGetValue(Normalize(key), out value);
+ }
+
+ public string GetValueOrDefault(string key, string defaultValue)
+ {
+ string val;
+
+ if (TryGetValue(key, out val))
+ {
+ return val;
+ }
+
+ return defaultValue;
+ }
+ }
+}
diff --git a/Emby.Dlna/Server/UpnpDevice.cs b/Emby.Dlna/Server/UpnpDevice.cs
new file mode 100644
index 0000000000..457cdc1ab8
--- /dev/null
+++ b/Emby.Dlna/Server/UpnpDevice.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Net;
+
+namespace Emby.Dlna.Server
+{
+ public sealed class UpnpDevice
+ {
+ public readonly Uri Descriptor;
+ public readonly string Type;
+ public readonly string USN;
+ public readonly string Uuid;
+ public readonly IPAddress Address;
+
+ public UpnpDevice(string aUuid, string aType, Uri aDescriptor, IPAddress address)
+ {
+ Uuid = aUuid;
+ Type = aType;
+ Descriptor = aDescriptor;
+
+ Address = address;
+
+ USN = CreateUSN(aUuid, aType);
+ }
+
+ private static string CreateUSN(string aUuid, string aType)
+ {
+ if (aType.StartsWith("uuid:", StringComparison.OrdinalIgnoreCase))
+ {
+ return aType;
+ }
+ else
+ {
+ return String.Format("uuid:{0}::{1}", aUuid, aType);
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/Service/BaseControlHandler.cs b/Emby.Dlna/Service/BaseControlHandler.cs
new file mode 100644
index 0000000000..7bf119111e
--- /dev/null
+++ b/Emby.Dlna/Service/BaseControlHandler.cs
@@ -0,0 +1,137 @@
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using Emby.Dlna.Server;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+
+namespace Emby.Dlna.Service
+{
+ public abstract class BaseControlHandler
+ {
+ private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
+
+ protected readonly IServerConfigurationManager Config;
+ protected readonly ILogger Logger;
+
+ protected BaseControlHandler(IServerConfigurationManager config, ILogger logger)
+ {
+ Config = config;
+ Logger = logger;
+ }
+
+ public ControlResponse ProcessControlRequest(ControlRequest request)
+ {
+ try
+ {
+ var enableDebugLogging = Config.GetDlnaConfiguration().EnableDebugLog;
+
+ if (enableDebugLogging)
+ {
+ LogRequest(request);
+ }
+
+ var response = ProcessControlRequestInternal(request);
+
+ if (enableDebugLogging)
+ {
+ LogResponse(response);
+ }
+
+ return response;
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error processing control request", ex);
+
+ return new ControlErrorHandler().GetResponse(ex);
+ }
+ }
+
+ private ControlResponse ProcessControlRequestInternal(ControlRequest request)
+ {
+ var soap = new XmlDocument();
+ soap.LoadXml(request.InputXml);
+ var sparams = new Headers();
+ var body = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);
+
+ var method = body.FirstChild;
+
+ foreach (var p in method.ChildNodes)
+ {
+ var e = p as XmlElement;
+ if (e == null)
+ {
+ continue;
+ }
+ sparams.Add(e.LocalName, e.InnerText.Trim());
+ }
+
+ Logger.Debug("Received control request {0}", method.LocalName);
+
+ var result = GetResult(method.LocalName, sparams);
+
+ var env = new XmlDocument();
+ env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", string.Empty));
+ var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);
+ env.AppendChild(envelope);
+ envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");
+
+ var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);
+ env.DocumentElement.AppendChild(rbody);
+
+ var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);
+ rbody.AppendChild(response);
+
+ foreach (var i in result)
+ {
+ var ri = env.CreateElement(i.Key);
+ ri.InnerText = i.Value;
+ response.AppendChild(ri);
+ }
+
+ var xml = env.OuterXml.Replace("xmlns:m=", "xmlns:u=");
+
+ var controlResponse = new ControlResponse
+ {
+ Xml = xml,
+ IsSuccessful = true
+ };
+
+ //Logger.Debug(xml);
+
+ controlResponse.Headers.Add("EXT", string.Empty);
+
+ return controlResponse;
+ }
+
+ protected abstract IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, Headers methodParams);
+
+ private void LogRequest(ControlRequest request)
+ {
+ var builder = new StringBuilder();
+
+ var headers = string.Join(", ", request.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
+ builder.AppendFormat("Headers: {0}", headers);
+ builder.AppendLine();
+ builder.Append(request.InputXml);
+
+ Logger.LogMultiline("Control request", LogSeverity.Debug, builder);
+ }
+
+ private void LogResponse(ControlResponse response)
+ {
+ var builder = new StringBuilder();
+
+ var headers = string.Join(", ", response.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
+ builder.AppendFormat("Headers: {0}", headers);
+ builder.AppendLine();
+ builder.Append(response.Xml);
+
+ Logger.LogMultiline("Control response", LogSeverity.Debug, builder);
+ }
+ }
+}
diff --git a/Emby.Dlna/Service/BaseService.cs b/Emby.Dlna/Service/BaseService.cs
new file mode 100644
index 0000000000..574d749588
--- /dev/null
+++ b/Emby.Dlna/Service/BaseService.cs
@@ -0,0 +1,37 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Dlna;
+using Emby.Dlna.Eventing;
+using MediaBrowser.Model.Logging;
+
+namespace Emby.Dlna.Service
+{
+ public class BaseService : IEventManager
+ {
+ protected IEventManager EventManager;
+ protected IHttpClient HttpClient;
+ protected ILogger Logger;
+
+ protected BaseService(ILogger logger, IHttpClient httpClient)
+ {
+ Logger = logger;
+ HttpClient = httpClient;
+
+ EventManager = new EventManager(Logger, HttpClient);
+ }
+
+ public EventSubscriptionResponse CancelEventSubscription(string subscriptionId)
+ {
+ return EventManager.CancelEventSubscription(subscriptionId);
+ }
+
+ public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, int? timeoutSeconds)
+ {
+ return EventManager.RenewEventSubscription(subscriptionId, timeoutSeconds);
+ }
+
+ public EventSubscriptionResponse CreateEventSubscription(string notificationType, int? timeoutSeconds, string callbackUrl)
+ {
+ return EventManager.CreateEventSubscription(notificationType, timeoutSeconds, callbackUrl);
+ }
+ }
+}
diff --git a/Emby.Dlna/Service/ControlErrorHandler.cs b/Emby.Dlna/Service/ControlErrorHandler.cs
new file mode 100644
index 0000000000..139f99931e
--- /dev/null
+++ b/Emby.Dlna/Service/ControlErrorHandler.cs
@@ -0,0 +1,41 @@
+using MediaBrowser.Controller.Dlna;
+using System;
+using System.Xml;
+
+namespace Emby.Dlna.Service
+{
+ public class ControlErrorHandler
+ {
+ private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
+
+ public ControlResponse GetResponse(Exception ex)
+ {
+ var env = new XmlDocument();
+ env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", "yes"));
+ var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);
+ env.AppendChild(envelope);
+ envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");
+
+ var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);
+ env.DocumentElement.AppendChild(rbody);
+
+ var fault = env.CreateElement("SOAP-ENV", "Fault", NS_SOAPENV);
+ var faultCode = env.CreateElement("faultcode");
+ faultCode.InnerText = "500";
+ fault.AppendChild(faultCode);
+ var faultString = env.CreateElement("faultstring");
+ faultString.InnerText = ex.ToString();
+ fault.AppendChild(faultString);
+ var detail = env.CreateDocumentFragment();
+ detail.InnerXml = "<detail><UPnPError xmlns=\"urn:schemas-upnp-org:control-1-0\"><errorCode>401</errorCode><errorDescription>Invalid Action</errorDescription></UPnPError></detail>";
+ fault.AppendChild(detail);
+ rbody.AppendChild(fault);
+
+ return new ControlResponse
+ {
+ Xml = env.OuterXml,
+ IsSuccessful = false
+ };
+ }
+ }
+}
diff --git a/Emby.Dlna/Service/ServiceXmlBuilder.cs b/Emby.Dlna/Service/ServiceXmlBuilder.cs
new file mode 100644
index 0000000000..08eb804033
--- /dev/null
+++ b/Emby.Dlna/Service/ServiceXmlBuilder.cs
@@ -0,0 +1,91 @@
+using Emby.Dlna.Common;
+using System.Collections.Generic;
+using System.Security;
+using System.Text;
+using Emby.Dlna.Server;
+
+namespace Emby.Dlna.Service
+{
+ public class ServiceXmlBuilder
+ {
+ public string GetXml(IEnumerable<ServiceAction> actions, IEnumerable<StateVariable> stateVariables)
+ {
+ var builder = new StringBuilder();
+
+ builder.Append("<?xml version=\"1.0\"?>");
+ builder.Append("<scpd xmlns=\"urn:schemas-upnp-org:service-1-0\">");
+
+ builder.Append("<specVersion>");
+ builder.Append("<major>1</major>");
+ builder.Append("<minor>0</minor>");
+ builder.Append("</specVersion>");
+
+ AppendActionList(builder, actions);
+ AppendServiceStateTable(builder, stateVariables);
+
+ builder.Append("</scpd>");
+
+ return builder.ToString();
+ }
+
+ private void AppendActionList(StringBuilder builder, IEnumerable<ServiceAction> actions)
+ {
+ builder.Append("<actionList>");
+
+ foreach (var item in actions)
+ {
+ builder.Append("<action>");
+
+ builder.Append("<name>" + DescriptionXmlBuilder.Escape(item.Name ?? string.Empty) + "</name>");
+
+ builder.Append("<argumentList>");
+
+ foreach (var argument in item.ArgumentList)
+ {
+ builder.Append("<argument>");
+
+ builder.Append("<name>" + DescriptionXmlBuilder.Escape(argument.Name ?? string.Empty) + "</name>");
+ builder.Append("<direction>" + DescriptionXmlBuilder.Escape(argument.Direction ?? string.Empty) + "</direction>");
+ builder.Append("<relatedStateVariable>" + DescriptionXmlBuilder.Escape(argument.RelatedStateVariable ?? string.Empty) + "</relatedStateVariable>");
+
+ builder.Append("</argument>");
+ }
+
+ builder.Append("</argumentList>");
+
+ builder.Append("</action>");
+ }
+
+ builder.Append("</actionList>");
+ }
+
+ private void AppendServiceStateTable(StringBuilder builder, IEnumerable<StateVariable> stateVariables)
+ {
+ builder.Append("<serviceStateTable>");
+
+ foreach (var item in stateVariables)
+ {
+ var sendEvents = item.SendsEvents ? "yes" : "no";
+
+ builder.Append("<stateVariable sendEvents=\"" + sendEvents + "\">");
+
+ builder.Append("<name>" + DescriptionXmlBuilder.Escape(item.Name ?? string.Empty) + "</name>");
+ builder.Append("<dataType>" + DescriptionXmlBuilder.Escape(item.DataType ?? string.Empty) + "</dataType>");
+
+ if (item.AllowedValues.Count > 0)
+ {
+ builder.Append("<allowedValueList>");
+ foreach (var allowedValue in item.AllowedValues)
+ {
+ builder.Append("<allowedValue>" + DescriptionXmlBuilder.Escape(allowedValue) + "</allowedValue>");
+ }
+ builder.Append("</allowedValueList>");
+ }
+
+ builder.Append("</stateVariable>");
+ }
+
+ builder.Append("</serviceStateTable>");
+ }
+ }
+}
diff --git a/Emby.Dlna/Ssdp/DeviceDiscovery.cs b/Emby.Dlna/Ssdp/DeviceDiscovery.cs
new file mode 100644
index 0000000000..f106496b9d
--- /dev/null
+++ b/Emby.Dlna/Ssdp/DeviceDiscovery.cs
@@ -0,0 +1,141 @@
+using MediaBrowser.Common.Events;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Events;
+using Rssdp;
+
+namespace Emby.Dlna.Ssdp
+{
+ public class DeviceDiscovery : IDeviceDiscovery, IDisposable
+ {
+ private bool _disposed;
+
+ private readonly ILogger _logger;
+ private readonly IServerConfigurationManager _config;
+ private readonly CancellationTokenSource _tokenSource;
+
+ public event EventHandler<GenericEventArgs<UpnpDeviceInfo>> DeviceDiscovered;
+ public event EventHandler<GenericEventArgs<UpnpDeviceInfo>> DeviceLeft;
+
+ private SsdpDeviceLocator _DeviceLocator;
+
+ public DeviceDiscovery(ILogger logger, IServerConfigurationManager config)
+ {
+ _tokenSource = new CancellationTokenSource();
+
+ _logger = logger;
+ _config = config;
+ }
+
+ // Call this method from somewhere in your code to start the search.
+ public void BeginSearch()
+ {
+ _DeviceLocator = new SsdpDeviceLocator();
+
+ // (Optional) Set the filter so we only see notifications for devices we care about
+ // (can be any search target value i.e device type, uuid value etc - any value that appears in the
+ // DiscoverdSsdpDevice.NotificationType property or that is used with the searchTarget parameter of the Search method).
+ //_DeviceLocator.NotificationFilter = "upnp:rootdevice";
+
+ // Connect our event handler so we process devices as they are found
+ _DeviceLocator.DeviceAvailable += deviceLocator_DeviceAvailable;
+ _DeviceLocator.DeviceUnavailable += _DeviceLocator_DeviceUnavailable;
+
+ // Perform a search so we don't have to wait for devices to broadcast notifications
+ // again to get any results right away (notifications are broadcast periodically).
+ StartAsyncSearch();
+ }
+
+ private void StartAsyncSearch()
+ {
+ Task.Factory.StartNew(async (o) =>
+ {
+ while (!_tokenSource.IsCancellationRequested)
+ {
+ try
+ {
+ // Enable listening for notifications (optional)
+ _DeviceLocator.StartListeningForNotifications();
+
+ await _DeviceLocator.SearchAsync().ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error searching for devices", ex);
+ }
+
+ var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;
+
+ await Task.Delay(delay, _tokenSource.Token).ConfigureAwait(false);
+ }
+
+ }, CancellationToken.None, TaskCreationOptions.LongRunning);
+ }
+
+ // Process each found device in the event handler
+ void deviceLocator_DeviceAvailable(object sender, DeviceAvailableEventArgs e)
+ {
+ var originalHeaders = e.DiscoveredDevice.ResponseHeaders;
+
+ var headerDict = originalHeaders == null ? new Dictionary<string, KeyValuePair<string, IEnumerable<string>>>() : originalHeaders.ToDictionary(i => i.Key, StringComparer.OrdinalIgnoreCase);
+
+ var headers = headerDict.ToDictionary(i => i.Key, i => i.Value.Value.FirstOrDefault(), StringComparer.OrdinalIgnoreCase);
+
+ var args = new GenericEventArgs<UpnpDeviceInfo>
+ {
+ Argument = new UpnpDeviceInfo
+ {
+ Location = e.DiscoveredDevice.DescriptionLocation,
+ Headers = headers
+ }
+ };
+
+ EventHelper.FireEventIfNotNull(DeviceDiscovered, this, args, _logger);
+ }
+
+ private void _DeviceLocator_DeviceUnavailable(object sender, DeviceUnavailableEventArgs e)
+ {
+ var originalHeaders = e.DiscoveredDevice.ResponseHeaders;
+
+ var headerDict = originalHeaders == null ? new Dictionary<string, KeyValuePair<string, IEnumerable<string>>>() : originalHeaders.ToDictionary(i => i.Key, StringComparer.OrdinalIgnoreCase);
+
+ var headers = headerDict.ToDictionary(i => i.Key, i => i.Value.Value.FirstOrDefault(), StringComparer.OrdinalIgnoreCase);
+
+ var args = new GenericEventArgs<UpnpDeviceInfo>
+ {
+ Argument = new UpnpDeviceInfo
+ {
+ Location = e.DiscoveredDevice.DescriptionLocation,
+ Headers = headers
+ }
+ };
+
+ EventHelper.FireEventIfNotNull(DeviceLeft, this, args, _logger);
+ }
+
+ public void Start()
+ {
+ BeginSearch();
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ _disposed = true;
+ _tokenSource.Cancel();
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/Ssdp/Extensions.cs b/Emby.Dlna/Ssdp/Extensions.cs
new file mode 100644
index 0000000000..731f3ab0b5
--- /dev/null
+++ b/Emby.Dlna/Ssdp/Extensions.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace Emby.Dlna.Ssdp
+{
+ public static class Extensions
+ {
+ public static string GetValue(this XElement container, XName name)
+ {
+ var node = container.Element(name);
+
+ return node == null ? null : node.Value;
+ }
+
+ public static string GetAttributeValue(this XElement container, XName name)
+ {
+ var node = container.Attribute(name);
+
+ return node == null ? null : node.Value;
+ }
+
+ public static string GetDescendantValue(this XElement container, XName name)
+ {
+ var node = container.Descendants(name)
+ .FirstOrDefault();
+
+ return node == null ? null : node.Value;
+ }
+ }
+}
diff --git a/Emby.Dlna/project.fragment.lock.json b/Emby.Dlna/project.fragment.lock.json
new file mode 100644
index 0000000000..09e853c1cb
--- /dev/null
+++ b/Emby.Dlna/project.fragment.lock.json
@@ -0,0 +1,56 @@
+{
+ "version": 2,
+ "exports": {
+ "MediaBrowser.Common/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7",
+ "compile": {
+ "bin/Debug/MediaBrowser.Common.dll": {}
+ },
+ "runtime": {
+ "bin/Debug/MediaBrowser.Common.dll": {}
+ },
+ "contentFiles": {
+ "bin/Debug/MediaBrowser.Common.pdb": {
+ "buildAction": "None",
+ "codeLanguage": "any",
+ "copyToOutput": true
+ }
+ }
+ },
+ "MediaBrowser.Controller/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7",
+ "compile": {
+ "bin/Debug/MediaBrowser.Controller.dll": {}
+ },
+ "runtime": {
+ "bin/Debug/MediaBrowser.Controller.dll": {}
+ },
+ "contentFiles": {
+ "bin/Debug/MediaBrowser.Controller.pdb": {
+ "buildAction": "None",
+ "codeLanguage": "any",
+ "copyToOutput": true
+ }
+ }
+ },
+ "MediaBrowser.Model/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7",
+ "compile": {
+ "bin/Debug/MediaBrowser.Model.dll": {}
+ },
+ "runtime": {
+ "bin/Debug/MediaBrowser.Model.dll": {}
+ },
+ "contentFiles": {
+ "bin/Debug/MediaBrowser.Model.pdb": {
+ "buildAction": "None",
+ "codeLanguage": "any",
+ "copyToOutput": true
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Emby.Dlna/project.json b/Emby.Dlna/project.json
new file mode 100644
index 0000000000..2410a0593b
--- /dev/null
+++ b/Emby.Dlna/project.json
@@ -0,0 +1,57 @@
+{
+ "version": "1.0.0-*",
+
+ "dependencies": {
+
+ },
+
+ "frameworks": {
+ "net46": {
+ "frameworkAssemblies": {
+ "System.Collections": "4.0.0.0",
+ "System.IO": "4.0.0.0",
+ "System.Xml": "4.0.0.0",
+ "System.Xml.Linq": "4.0.0.0",
+ "System.Xml.Serialization": "4.0.0.0"
+ },
+ "dependencies": {
+ "MediaBrowser.Controller": {
+ "target": "project"
+ },
+ "MediaBrowser.Common": {
+ "target": "project"
+ },
+ "MediaBrowser.Model": {
+ "target": "project"
+ },
+ "RSSDP": {
+ "target": "project"
+ }
+ }
+ },
+ "netstandard1.6": {
+ "imports": "dnxcore50",
+ "dependencies": {
+ "NETStandard.Library": "1.6.0",
+ "MediaBrowser.Controller": {
+ "target": "project"
+ },
+ "MediaBrowser.Common": {
+ "target": "project"
+ },
+ "MediaBrowser.Model": {
+ "target": "project"
+ },
+ "System.Xml.XmlSerializer": "4.0.11",
+ "System.Xml.XDocument": "4.0.11",
+ "System.Xml.XmlDocument": "4.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime.Loader": "4.0.0",
+ "RSSDP": {
+ "target": "project"
+ }
+ }
+ }
+ }
+}
diff --git a/Emby.Dlna/project.lock.json b/Emby.Dlna/project.lock.json
new file mode 100644
index 0000000000..e205f529fd
--- /dev/null
+++ b/Emby.Dlna/project.lock.json
@@ -0,0 +1,4355 @@
+{
+ "locked": false,
+ "version": 2,
+ "targets": {
+ ".NETFramework,Version=v4.6": {
+ "MediaBrowser.Common/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7",
+ "dependencies": {
+ "MediaBrowser.Model": "1.0.0"
+ }
+ },
+ "MediaBrowser.Controller/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7",
+ "dependencies": {
+ "MediaBrowser.Common": "1.0.0",
+ "MediaBrowser.Model": "1.0.0"
+ }
+ },
+ "MediaBrowser.Model/1.0.0": {
+ "type": "project",
+ "framework": ".NETPortable,Version=v4.5,Profile=Profile7"
+ },
+ "RSSDP/1.0.0": {
+ "type": "project",
+ "framework": ".NETFramework,Version=v4.6",
+ "frameworkAssemblies": [
+ "System.Collections",
+ "System.Net",
+ "System.Net.Http",
+ "System.Runtime",
+ "System.Threading",
+ "System.Threading.Tasks",
+ "System.Xml"
+ ],
+ "compile": {
+ "net46/RSSDP.dll": {}
+ },
+ "runtime": {
+ "net46/RSSDP.dll": {}
+ }
+ }
+ },
+ ".NETStandard,Version=v1.6": {
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "Microsoft.Win32.Primitives/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": {}
+ }
+ },
+ "NETStandard.Library/1.6.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.Win32.Primitives": "4.0.1",
+ "System.AppContext": "4.1.0",
+ "System.Collections": "4.0.11",
+ "System.Collections.Concurrent": "4.0.12",
+ "System.Console": "4.0.0",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Diagnostics.Tracing": "4.1.0",
+ "System.Globalization": "4.0.11",
+ "System.Globalization.Calendars": "4.0.1",
+ "System.IO": "4.1.0",
+ "System.IO.Compression": "4.1.0",
+ "System.IO.Compression.ZipFile": "4.0.1",
+ "System.IO.FileSystem": "4.0.1",
+ "System.IO.FileSystem.Primitives": "4.0.1",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.Net.Http": "4.1.0",
+ "System.Net.Primitives": "4.0.11",
+ "System.Net.Sockets": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Runtime.InteropServices.RuntimeInformation": "4.0.0",
+ "System.Runtime.Numerics": "4.0.1",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Security.Cryptography.X509Certificates": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11",
+ "System.Threading.Timer": "4.0.1",
+ "System.Xml.ReaderWriter": "4.0.11",
+ "System.Xml.XDocument": "4.0.11"
+ }
+ },
+ "runtime.native.System/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "runtime.native.System.IO.Compression/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "runtime.native.System.Net.Http/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "runtime.native.System.Security.Cryptography/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ }
+ },
+ "System.AppContext/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.6/System.AppContext.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.6/System.AppContext.dll": {}
+ }
+ },
+ "System.Buffers/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tracing": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "lib/netstandard1.1/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.1/System.Buffers.dll": {}
+ }
+ },
+ "System.Collections/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Collections.dll": {}
+ }
+ },
+ "System.Collections.Concurrent/4.0.12": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tracing": "4.1.0",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Collections.Concurrent.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Collections.Concurrent.dll": {}
+ }
+ },
+ "System.Console/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Console.dll": {}
+ }
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Diagnostics.Debug.dll": {}
+ }
+ },
+ "System.Diagnostics.DiagnosticSource/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Tracing": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "lib/netstandard1.3/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {}
+ }
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/System.Diagnostics.Tools.dll": {}
+ }
+ },
+ "System.Diagnostics.Tracing/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Diagnostics.Tracing.dll": {}
+ }
+ },
+ "System.Globalization/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Globalization.dll": {}
+ }
+ },
+ "System.Globalization.Calendars/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Globalization.Calendars.dll": {}
+ }
+ },
+ "System.Globalization.Extensions/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.IO/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.IO.dll": {}
+ }
+ },
+ "System.IO.Compression/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11",
+ "runtime.native.System": "4.0.0",
+ "runtime.native.System.IO.Compression": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.IO.Compression.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.IO.Compression.ZipFile/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Buffers": "4.0.0",
+ "System.IO": "4.1.0",
+ "System.IO.Compression": "4.1.0",
+ "System.IO.FileSystem": "4.0.1",
+ "System.IO.FileSystem.Primitives": "4.0.1",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.IO.Compression.ZipFile.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.IO.Compression.ZipFile.dll": {}
+ }
+ },
+ "System.IO.FileSystem/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.IO.FileSystem.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.IO.FileSystem.dll": {}
+ }
+ },
+ "System.IO.FileSystem.Primitives/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {}
+ }
+ },
+ "System.Linq/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.6/System.Linq.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.6/System.Linq.dll": {}
+ }
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Emit.Lightweight": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.6/System.Linq.Expressions.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.6/System.Linq.Expressions.dll": {}
+ }
+ },
+ "System.Net.Http/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.DiagnosticSource": "4.0.0",
+ "System.Diagnostics.Tracing": "4.1.0",
+ "System.Globalization": "4.0.11",
+ "System.Globalization.Extensions": "4.0.1",
+ "System.IO": "4.1.0",
+ "System.IO.FileSystem": "4.0.1",
+ "System.Net.Primitives": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.OpenSsl": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Security.Cryptography.X509Certificates": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11",
+ "runtime.native.System": "4.0.0",
+ "runtime.native.System.Net.Http": "4.0.1",
+ "runtime.native.System.Security.Cryptography": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Net.Http.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.3/System.Net.Http.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Net.Primitives/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Handles": "4.0.1"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Net.Primitives.dll": {}
+ }
+ },
+ "System.Net.Sockets/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Net.Primitives": "4.0.11",
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Net.Sockets.dll": {}
+ }
+ },
+ "System.ObjectModel/4.0.12": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.ObjectModel.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.ObjectModel.dll": {}
+ }
+ },
+ "System.Reflection/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Reflection.dll": {}
+ }
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.1/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Reflection.Emit.dll": {}
+ }
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {}
+ }
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {}
+ }
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/System.Reflection.Extensions.dll": {}
+ }
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/System.Reflection.Primitives.dll": {}
+ }
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.5/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {}
+ }
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Globalization": "4.0.11",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.0/System.Resources.ResourceManager.dll": {}
+ }
+ },
+ "System.Runtime/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Runtime.dll": {}
+ }
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Runtime.Extensions.dll": {}
+ }
+ },
+ "System.Runtime.Handles/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Runtime.Handles.dll": {}
+ }
+ },
+ "System.Runtime.InteropServices/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Handles": "4.0.1"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Runtime.InteropServices.dll": {}
+ }
+ },
+ "System.Runtime.InteropServices.RuntimeInformation/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Reflection": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Threading": "4.0.11",
+ "runtime.native.System": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Runtime.Loader/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.5/System.Runtime.Loader.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.5/System.Runtime.Loader.dll": {}
+ }
+ },
+ "System.Runtime.Numerics/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.1/System.Runtime.Numerics.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Runtime.Numerics.dll": {}
+ }
+ },
+ "System.Security.Cryptography.Algorithms/4.2.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Collections": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Runtime.Numerics": "4.0.1",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "runtime.native.System.Security.Cryptography": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Security.Cryptography.Cng/4.2.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.6/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Security.Cryptography.Csp/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Security.Cryptography.Encoding/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Collections": "4.0.11",
+ "System.Collections.Concurrent": "4.0.12",
+ "System.Linq": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "runtime.native.System.Security.Cryptography": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Security.Cryptography.OpenSsl/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Runtime.Numerics": "4.0.1",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "runtime.native.System.Security.Cryptography": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.6/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ }
+ }
+ },
+ "System.Security.Cryptography.Primitives/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {}
+ }
+ },
+ "System.Security.Cryptography.X509Certificates/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Globalization.Calendars": "4.0.1",
+ "System.IO": "4.1.0",
+ "System.IO.FileSystem": "4.0.1",
+ "System.IO.FileSystem.Primitives": "4.0.1",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Handles": "4.0.1",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Runtime.Numerics": "4.0.1",
+ "System.Security.Cryptography.Algorithms": "4.2.0",
+ "System.Security.Cryptography.Cng": "4.2.0",
+ "System.Security.Cryptography.Csp": "4.0.0",
+ "System.Security.Cryptography.Encoding": "4.0.0",
+ "System.Security.Cryptography.OpenSsl": "4.0.0",
+ "System.Security.Cryptography.Primitives": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11",
+ "runtime.native.System": "4.0.0",
+ "runtime.native.System.Net.Http": "4.0.1",
+ "runtime.native.System.Security.Cryptography": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll": {}
+ },
+ "runtimeTargets": {
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": {
+ "assetType": "runtime",
+ "rid": "unix"
+ },
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": {
+ "assetType": "runtime",
+ "rid": "win"
+ }
+ }
+ },
+ "System.Text.Encoding/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Text.Encoding.dll": {}
+ }
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Text.Encoding": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {}
+ }
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.6/System.Text.RegularExpressions.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.6/System.Text.RegularExpressions.dll": {}
+ }
+ },
+ "System.Threading/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Threading.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Threading.dll": {}
+ }
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Threading.Tasks.dll": {}
+ }
+ },
+ "System.Threading.Tasks.Extensions/4.0.0": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Runtime": "4.1.0",
+ "System.Threading.Tasks": "4.0.11"
+ },
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {}
+ }
+ },
+ "System.Threading.Timer/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.0.1",
+ "Microsoft.NETCore.Targets": "1.0.1",
+ "System.Runtime": "4.1.0"
+ },
+ "compile": {
+ "ref/netstandard1.2/System.Threading.Timer.dll": {}
+ }
+ },
+ "System.Xml.ReaderWriter/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.IO.FileSystem": "4.0.1",
+ "System.IO.FileSystem.Primitives": "4.0.1",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0",
+ "System.Threading.Tasks": "4.0.11",
+ "System.Threading.Tasks.Extensions": "4.0.0"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Xml.ReaderWriter.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {}
+ }
+ },
+ "System.Xml.XDocument/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11",
+ "System.Xml.ReaderWriter": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Xml.XDocument.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Xml.XDocument.dll": {}
+ }
+ },
+ "System.Xml.XmlDocument/4.0.1": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Threading": "4.0.11",
+ "System.Xml.ReaderWriter": "4.0.11"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Xml.XmlDocument.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Xml.XmlDocument.dll": {}
+ }
+ },
+ "System.Xml.XmlSerializer/4.0.11": {
+ "type": "package",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.RegularExpressions": "4.1.0",
+ "System.Threading": "4.0.11",
+ "System.Xml.ReaderWriter": "4.0.11",
+ "System.Xml.XmlDocument": "4.0.1"
+ },
+ "compile": {
+ "ref/netstandard1.3/System.Xml.XmlSerializer.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard1.3/System.Xml.XmlSerializer.dll": {}
+ }
+ },
+ "MediaBrowser.Common/1.0.0": {
+ "type": "project",
+ "framework": ".NETStandard,Version=v1.6",
+ "dependencies": {
+ "MediaBrowser.Model": "1.0.0",
+ "NETStandard.Library": "1.6.0"
+ }
+ },
+ "MediaBrowser.Controller/1.0.0": {
+ "type": "project",
+ "framework": ".NETStandard,Version=v1.6",
+ "dependencies": {
+ "MediaBrowser.Common": "1.0.0",
+ "MediaBrowser.Model": "1.0.0",
+ "NETStandard.Library": "1.6.0"
+ }
+ },
+ "MediaBrowser.Model/1.0.0": {
+ "type": "project",
+ "framework": ".NETStandard,Version=v1.6",
+ "dependencies": {
+ "NETStandard.Library": "1.6.0"
+ }
+ },
+ "RSSDP/1.0.0": {
+ "type": "project",
+ "framework": ".NETStandard,Version=v1.6",
+ "dependencies": {
+ "NETStandard.Library": "1.6.0",
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Diagnostics.Tools": "4.0.1",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.Net.Http": "4.1.0",
+ "System.Net.Primitives": "4.0.11",
+ "System.Net.Sockets": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.InteropServices.RuntimeInformation": "4.0.0",
+ "System.Text.Encoding": "4.0.11",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11",
+ "System.Threading.Timer": "4.0.1",
+ "System.Xml.ReaderWriter": "4.0.11"
+ },
+ "compile": {
+ "netstandard1.6/RSSDP.dll": {}
+ },
+ "runtime": {
+ "netstandard1.6/RSSDP.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Microsoft.NETCore.Platforms/1.0.1": {
+ "sha512": "2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==",
+ "type": "package",
+ "path": "Microsoft.NETCore.Platforms/1.0.1",
+ "files": [
+ "Microsoft.NETCore.Platforms.1.0.1.nupkg.sha512",
+ "Microsoft.NETCore.Platforms.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.json"
+ ]
+ },
+ "Microsoft.NETCore.Targets/1.0.1": {
+ "sha512": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==",
+ "type": "package",
+ "path": "Microsoft.NETCore.Targets/1.0.1",
+ "files": [
+ "Microsoft.NETCore.Targets.1.0.1.nupkg.sha512",
+ "Microsoft.NETCore.Targets.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.json"
+ ]
+ },
+ "Microsoft.Win32.Primitives/4.0.1": {
+ "sha512": "fQnBHO9DgcmkC9dYSJoBqo6sH1VJwJprUHh8F3hbcRlxiQiBUuTntdk8tUwV490OqC2kQUrinGwZyQHTieuXRA==",
+ "type": "package",
+ "path": "Microsoft.Win32.Primitives/4.0.1",
+ "files": [
+ "Microsoft.Win32.Primitives.4.0.1.nupkg.sha512",
+ "Microsoft.Win32.Primitives.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/Microsoft.Win32.Primitives.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/Microsoft.Win32.Primitives.dll",
+ "ref/netstandard1.3/Microsoft.Win32.Primitives.dll",
+ "ref/netstandard1.3/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml",
+ "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "NETStandard.Library/1.6.0": {
+ "sha512": "ypsCvIdCZ4IoYASJHt6tF2fMo7N30NLgV1EbmC+snO490OMl9FvVxmumw14rhReWU3j3g7BYudG6YCrchwHJlA==",
+ "type": "package",
+ "path": "NETStandard.Library/1.6.0",
+ "files": [
+ "NETStandard.Library.1.6.0.nupkg.sha512",
+ "NETStandard.Library.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt"
+ ]
+ },
+ "runtime.native.System/4.0.0": {
+ "sha512": "QfS/nQI7k/BLgmLrw7qm7YBoULEvgWnPI+cYsbfCVFTW8Aj+i8JhccxcFMu1RWms0YZzF+UHguNBK4Qn89e2Sg==",
+ "type": "package",
+ "path": "runtime.native.System/4.0.0",
+ "files": [
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.native.System.4.0.0.nupkg.sha512",
+ "runtime.native.System.nuspec"
+ ]
+ },
+ "runtime.native.System.IO.Compression/4.1.0": {
+ "sha512": "Ob7nvnJBox1aaB222zSVZSkf4WrebPG4qFscfK7vmD7P7NxoSxACQLtO7ytWpqXDn2wcd/+45+EAZ7xjaPip8A==",
+ "type": "package",
+ "path": "runtime.native.System.IO.Compression/4.1.0",
+ "files": [
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.native.System.IO.Compression.4.1.0.nupkg.sha512",
+ "runtime.native.System.IO.Compression.nuspec"
+ ]
+ },
+ "runtime.native.System.Net.Http/4.0.1": {
+ "sha512": "Nh0UPZx2Vifh8r+J+H2jxifZUD3sBrmolgiFWJd2yiNrxO0xTa6bAw3YwRn1VOiSen/tUXMS31ttNItCZ6lKuA==",
+ "type": "package",
+ "path": "runtime.native.System.Net.Http/4.0.1",
+ "files": [
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.native.System.Net.Http.4.0.1.nupkg.sha512",
+ "runtime.native.System.Net.Http.nuspec"
+ ]
+ },
+ "runtime.native.System.Security.Cryptography/4.0.0": {
+ "sha512": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==",
+ "type": "package",
+ "path": "runtime.native.System.Security.Cryptography/4.0.0",
+ "files": [
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/_._",
+ "runtime.native.System.Security.Cryptography.4.0.0.nupkg.sha512",
+ "runtime.native.System.Security.Cryptography.nuspec"
+ ]
+ },
+ "System.AppContext/4.1.0": {
+ "sha512": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==",
+ "type": "package",
+ "path": "System.AppContext/4.1.0",
+ "files": [
+ "System.AppContext.4.1.0.nupkg.sha512",
+ "System.AppContext.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.AppContext.dll",
+ "lib/net463/System.AppContext.dll",
+ "lib/netcore50/System.AppContext.dll",
+ "lib/netstandard1.6/System.AppContext.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.AppContext.dll",
+ "ref/net463/System.AppContext.dll",
+ "ref/netstandard/_._",
+ "ref/netstandard1.3/System.AppContext.dll",
+ "ref/netstandard1.3/System.AppContext.xml",
+ "ref/netstandard1.3/de/System.AppContext.xml",
+ "ref/netstandard1.3/es/System.AppContext.xml",
+ "ref/netstandard1.3/fr/System.AppContext.xml",
+ "ref/netstandard1.3/it/System.AppContext.xml",
+ "ref/netstandard1.3/ja/System.AppContext.xml",
+ "ref/netstandard1.3/ko/System.AppContext.xml",
+ "ref/netstandard1.3/ru/System.AppContext.xml",
+ "ref/netstandard1.3/zh-hans/System.AppContext.xml",
+ "ref/netstandard1.3/zh-hant/System.AppContext.xml",
+ "ref/netstandard1.6/System.AppContext.dll",
+ "ref/netstandard1.6/System.AppContext.xml",
+ "ref/netstandard1.6/de/System.AppContext.xml",
+ "ref/netstandard1.6/es/System.AppContext.xml",
+ "ref/netstandard1.6/fr/System.AppContext.xml",
+ "ref/netstandard1.6/it/System.AppContext.xml",
+ "ref/netstandard1.6/ja/System.AppContext.xml",
+ "ref/netstandard1.6/ko/System.AppContext.xml",
+ "ref/netstandard1.6/ru/System.AppContext.xml",
+ "ref/netstandard1.6/zh-hans/System.AppContext.xml",
+ "ref/netstandard1.6/zh-hant/System.AppContext.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.AppContext.dll"
+ ]
+ },
+ "System.Buffers/4.0.0": {
+ "sha512": "msXumHfjjURSkvxUjYuq4N2ghHoRi2VpXcKMA7gK6ujQfU3vGpl+B6ld0ATRg+FZFpRyA6PgEPA+VlIkTeNf2w==",
+ "type": "package",
+ "path": "System.Buffers/4.0.0",
+ "files": [
+ "System.Buffers.4.0.0.nupkg.sha512",
+ "System.Buffers.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.1/.xml",
+ "lib/netstandard1.1/System.Buffers.dll"
+ ]
+ },
+ "System.Collections/4.0.11": {
+ "sha512": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==",
+ "type": "package",
+ "path": "System.Collections/4.0.11",
+ "files": [
+ "System.Collections.4.0.11.nupkg.sha512",
+ "System.Collections.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Collections.dll",
+ "ref/netcore50/System.Collections.xml",
+ "ref/netcore50/de/System.Collections.xml",
+ "ref/netcore50/es/System.Collections.xml",
+ "ref/netcore50/fr/System.Collections.xml",
+ "ref/netcore50/it/System.Collections.xml",
+ "ref/netcore50/ja/System.Collections.xml",
+ "ref/netcore50/ko/System.Collections.xml",
+ "ref/netcore50/ru/System.Collections.xml",
+ "ref/netcore50/zh-hans/System.Collections.xml",
+ "ref/netcore50/zh-hant/System.Collections.xml",
+ "ref/netstandard1.0/System.Collections.dll",
+ "ref/netstandard1.0/System.Collections.xml",
+ "ref/netstandard1.0/de/System.Collections.xml",
+ "ref/netstandard1.0/es/System.Collections.xml",
+ "ref/netstandard1.0/fr/System.Collections.xml",
+ "ref/netstandard1.0/it/System.Collections.xml",
+ "ref/netstandard1.0/ja/System.Collections.xml",
+ "ref/netstandard1.0/ko/System.Collections.xml",
+ "ref/netstandard1.0/ru/System.Collections.xml",
+ "ref/netstandard1.0/zh-hans/System.Collections.xml",
+ "ref/netstandard1.0/zh-hant/System.Collections.xml",
+ "ref/netstandard1.3/System.Collections.dll",
+ "ref/netstandard1.3/System.Collections.xml",
+ "ref/netstandard1.3/de/System.Collections.xml",
+ "ref/netstandard1.3/es/System.Collections.xml",
+ "ref/netstandard1.3/fr/System.Collections.xml",
+ "ref/netstandard1.3/it/System.Collections.xml",
+ "ref/netstandard1.3/ja/System.Collections.xml",
+ "ref/netstandard1.3/ko/System.Collections.xml",
+ "ref/netstandard1.3/ru/System.Collections.xml",
+ "ref/netstandard1.3/zh-hans/System.Collections.xml",
+ "ref/netstandard1.3/zh-hant/System.Collections.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Collections.Concurrent/4.0.12": {
+ "sha512": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==",
+ "type": "package",
+ "path": "System.Collections.Concurrent/4.0.12",
+ "files": [
+ "System.Collections.Concurrent.4.0.12.nupkg.sha512",
+ "System.Collections.Concurrent.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Collections.Concurrent.dll",
+ "lib/netstandard1.3/System.Collections.Concurrent.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Collections.Concurrent.dll",
+ "ref/netcore50/System.Collections.Concurrent.xml",
+ "ref/netcore50/de/System.Collections.Concurrent.xml",
+ "ref/netcore50/es/System.Collections.Concurrent.xml",
+ "ref/netcore50/fr/System.Collections.Concurrent.xml",
+ "ref/netcore50/it/System.Collections.Concurrent.xml",
+ "ref/netcore50/ja/System.Collections.Concurrent.xml",
+ "ref/netcore50/ko/System.Collections.Concurrent.xml",
+ "ref/netcore50/ru/System.Collections.Concurrent.xml",
+ "ref/netcore50/zh-hans/System.Collections.Concurrent.xml",
+ "ref/netcore50/zh-hant/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/System.Collections.Concurrent.dll",
+ "ref/netstandard1.1/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/de/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/es/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/fr/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/it/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/ja/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/ko/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/ru/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/zh-hans/System.Collections.Concurrent.xml",
+ "ref/netstandard1.1/zh-hant/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/System.Collections.Concurrent.dll",
+ "ref/netstandard1.3/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/de/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/es/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/fr/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/it/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/ja/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/ko/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/ru/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/zh-hans/System.Collections.Concurrent.xml",
+ "ref/netstandard1.3/zh-hant/System.Collections.Concurrent.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Console/4.0.0": {
+ "sha512": "qSKUSOIiYA/a0g5XXdxFcUFmv1hNICBD7QZ0QhGYVipPIhvpiydY8VZqr1thmCXvmn8aipMg64zuanB4eotK9A==",
+ "type": "package",
+ "path": "System.Console/4.0.0",
+ "files": [
+ "System.Console.4.0.0.nupkg.sha512",
+ "System.Console.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Console.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Console.dll",
+ "ref/netstandard1.3/System.Console.dll",
+ "ref/netstandard1.3/System.Console.xml",
+ "ref/netstandard1.3/de/System.Console.xml",
+ "ref/netstandard1.3/es/System.Console.xml",
+ "ref/netstandard1.3/fr/System.Console.xml",
+ "ref/netstandard1.3/it/System.Console.xml",
+ "ref/netstandard1.3/ja/System.Console.xml",
+ "ref/netstandard1.3/ko/System.Console.xml",
+ "ref/netstandard1.3/ru/System.Console.xml",
+ "ref/netstandard1.3/zh-hans/System.Console.xml",
+ "ref/netstandard1.3/zh-hant/System.Console.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Diagnostics.Debug/4.0.11": {
+ "sha512": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==",
+ "type": "package",
+ "path": "System.Diagnostics.Debug/4.0.11",
+ "files": [
+ "System.Diagnostics.Debug.4.0.11.nupkg.sha512",
+ "System.Diagnostics.Debug.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Diagnostics.Debug.dll",
+ "ref/netcore50/System.Diagnostics.Debug.xml",
+ "ref/netcore50/de/System.Diagnostics.Debug.xml",
+ "ref/netcore50/es/System.Diagnostics.Debug.xml",
+ "ref/netcore50/fr/System.Diagnostics.Debug.xml",
+ "ref/netcore50/it/System.Diagnostics.Debug.xml",
+ "ref/netcore50/ja/System.Diagnostics.Debug.xml",
+ "ref/netcore50/ko/System.Diagnostics.Debug.xml",
+ "ref/netcore50/ru/System.Diagnostics.Debug.xml",
+ "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml",
+ "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/System.Diagnostics.Debug.dll",
+ "ref/netstandard1.0/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/de/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/es/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/it/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/System.Diagnostics.Debug.dll",
+ "ref/netstandard1.3/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/de/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/es/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/it/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml",
+ "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Diagnostics.DiagnosticSource/4.0.0": {
+ "sha512": "YKglnq4BMTJxfcr6nuT08g+yJ0UxdePIHxosiLuljuHIUR6t4KhFsyaHOaOc1Ofqp0PUvJ0EmcgiEz6T7vEx3w==",
+ "type": "package",
+ "path": "System.Diagnostics.DiagnosticSource/4.0.0",
+ "files": [
+ "System.Diagnostics.DiagnosticSource.4.0.0.nupkg.sha512",
+ "System.Diagnostics.DiagnosticSource.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/net46/System.Diagnostics.DiagnosticSource.dll",
+ "lib/net46/System.Diagnostics.DiagnosticSource.xml",
+ "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll",
+ "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml",
+ "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll",
+ "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml",
+ "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll",
+ "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml"
+ ]
+ },
+ "System.Diagnostics.Tools/4.0.1": {
+ "sha512": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==",
+ "type": "package",
+ "path": "System.Diagnostics.Tools/4.0.1",
+ "files": [
+ "System.Diagnostics.Tools.4.0.1.nupkg.sha512",
+ "System.Diagnostics.Tools.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Diagnostics.Tools.dll",
+ "ref/netcore50/System.Diagnostics.Tools.xml",
+ "ref/netcore50/de/System.Diagnostics.Tools.xml",
+ "ref/netcore50/es/System.Diagnostics.Tools.xml",
+ "ref/netcore50/fr/System.Diagnostics.Tools.xml",
+ "ref/netcore50/it/System.Diagnostics.Tools.xml",
+ "ref/netcore50/ja/System.Diagnostics.Tools.xml",
+ "ref/netcore50/ko/System.Diagnostics.Tools.xml",
+ "ref/netcore50/ru/System.Diagnostics.Tools.xml",
+ "ref/netcore50/zh-hans/System.Diagnostics.Tools.xml",
+ "ref/netcore50/zh-hant/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/System.Diagnostics.Tools.dll",
+ "ref/netstandard1.0/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/de/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/es/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/fr/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/it/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/ja/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/ko/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/ru/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/zh-hans/System.Diagnostics.Tools.xml",
+ "ref/netstandard1.0/zh-hant/System.Diagnostics.Tools.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Diagnostics.Tracing/4.1.0": {
+ "sha512": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==",
+ "type": "package",
+ "path": "System.Diagnostics.Tracing/4.1.0",
+ "files": [
+ "System.Diagnostics.Tracing.4.1.0.nupkg.sha512",
+ "System.Diagnostics.Tracing.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.Diagnostics.Tracing.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.Diagnostics.Tracing.dll",
+ "ref/netcore50/System.Diagnostics.Tracing.dll",
+ "ref/netcore50/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/de/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/es/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/fr/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/it/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/ja/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/ko/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/ru/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml",
+ "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/System.Diagnostics.Tracing.dll",
+ "ref/netstandard1.1/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/System.Diagnostics.Tracing.dll",
+ "ref/netstandard1.2/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/System.Diagnostics.Tracing.dll",
+ "ref/netstandard1.3/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/System.Diagnostics.Tracing.dll",
+ "ref/netstandard1.5/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml",
+ "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Globalization/4.0.11": {
+ "sha512": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==",
+ "type": "package",
+ "path": "System.Globalization/4.0.11",
+ "files": [
+ "System.Globalization.4.0.11.nupkg.sha512",
+ "System.Globalization.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Globalization.dll",
+ "ref/netcore50/System.Globalization.xml",
+ "ref/netcore50/de/System.Globalization.xml",
+ "ref/netcore50/es/System.Globalization.xml",
+ "ref/netcore50/fr/System.Globalization.xml",
+ "ref/netcore50/it/System.Globalization.xml",
+ "ref/netcore50/ja/System.Globalization.xml",
+ "ref/netcore50/ko/System.Globalization.xml",
+ "ref/netcore50/ru/System.Globalization.xml",
+ "ref/netcore50/zh-hans/System.Globalization.xml",
+ "ref/netcore50/zh-hant/System.Globalization.xml",
+ "ref/netstandard1.0/System.Globalization.dll",
+ "ref/netstandard1.0/System.Globalization.xml",
+ "ref/netstandard1.0/de/System.Globalization.xml",
+ "ref/netstandard1.0/es/System.Globalization.xml",
+ "ref/netstandard1.0/fr/System.Globalization.xml",
+ "ref/netstandard1.0/it/System.Globalization.xml",
+ "ref/netstandard1.0/ja/System.Globalization.xml",
+ "ref/netstandard1.0/ko/System.Globalization.xml",
+ "ref/netstandard1.0/ru/System.Globalization.xml",
+ "ref/netstandard1.0/zh-hans/System.Globalization.xml",
+ "ref/netstandard1.0/zh-hant/System.Globalization.xml",
+ "ref/netstandard1.3/System.Globalization.dll",
+ "ref/netstandard1.3/System.Globalization.xml",
+ "ref/netstandard1.3/de/System.Globalization.xml",
+ "ref/netstandard1.3/es/System.Globalization.xml",
+ "ref/netstandard1.3/fr/System.Globalization.xml",
+ "ref/netstandard1.3/it/System.Globalization.xml",
+ "ref/netstandard1.3/ja/System.Globalization.xml",
+ "ref/netstandard1.3/ko/System.Globalization.xml",
+ "ref/netstandard1.3/ru/System.Globalization.xml",
+ "ref/netstandard1.3/zh-hans/System.Globalization.xml",
+ "ref/netstandard1.3/zh-hant/System.Globalization.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Globalization.Calendars/4.0.1": {
+ "sha512": "L1c6IqeQ88vuzC1P81JeHmHA8mxq8a18NUBNXnIY/BVb+TCyAaGIFbhpZt60h9FJNmisymoQkHEFSE9Vslja1Q==",
+ "type": "package",
+ "path": "System.Globalization.Calendars/4.0.1",
+ "files": [
+ "System.Globalization.Calendars.4.0.1.nupkg.sha512",
+ "System.Globalization.Calendars.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Globalization.Calendars.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Globalization.Calendars.dll",
+ "ref/netstandard1.3/System.Globalization.Calendars.dll",
+ "ref/netstandard1.3/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/de/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/es/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/fr/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/it/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/ja/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/ko/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/ru/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/zh-hans/System.Globalization.Calendars.xml",
+ "ref/netstandard1.3/zh-hant/System.Globalization.Calendars.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Globalization.Extensions/4.0.1": {
+ "sha512": "KKo23iKeOaIg61SSXwjANN7QYDr/3op3OWGGzDzz7mypx0Za0fZSeG0l6cco8Ntp8YMYkIQcAqlk8yhm5/Uhcg==",
+ "type": "package",
+ "path": "System.Globalization.Extensions/4.0.1",
+ "files": [
+ "System.Globalization.Extensions.4.0.1.nupkg.sha512",
+ "System.Globalization.Extensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Globalization.Extensions.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Globalization.Extensions.dll",
+ "ref/netstandard1.3/System.Globalization.Extensions.dll",
+ "ref/netstandard1.3/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/de/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/es/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/fr/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/it/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/ja/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/ko/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/ru/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/zh-hans/System.Globalization.Extensions.xml",
+ "ref/netstandard1.3/zh-hant/System.Globalization.Extensions.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll",
+ "runtimes/win/lib/net46/System.Globalization.Extensions.dll",
+ "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll"
+ ]
+ },
+ "System.IO/4.1.0": {
+ "sha512": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==",
+ "type": "package",
+ "path": "System.IO/4.1.0",
+ "files": [
+ "System.IO.4.1.0.nupkg.sha512",
+ "System.IO.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.IO.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.IO.dll",
+ "ref/netcore50/System.IO.dll",
+ "ref/netcore50/System.IO.xml",
+ "ref/netcore50/de/System.IO.xml",
+ "ref/netcore50/es/System.IO.xml",
+ "ref/netcore50/fr/System.IO.xml",
+ "ref/netcore50/it/System.IO.xml",
+ "ref/netcore50/ja/System.IO.xml",
+ "ref/netcore50/ko/System.IO.xml",
+ "ref/netcore50/ru/System.IO.xml",
+ "ref/netcore50/zh-hans/System.IO.xml",
+ "ref/netcore50/zh-hant/System.IO.xml",
+ "ref/netstandard1.0/System.IO.dll",
+ "ref/netstandard1.0/System.IO.xml",
+ "ref/netstandard1.0/de/System.IO.xml",
+ "ref/netstandard1.0/es/System.IO.xml",
+ "ref/netstandard1.0/fr/System.IO.xml",
+ "ref/netstandard1.0/it/System.IO.xml",
+ "ref/netstandard1.0/ja/System.IO.xml",
+ "ref/netstandard1.0/ko/System.IO.xml",
+ "ref/netstandard1.0/ru/System.IO.xml",
+ "ref/netstandard1.0/zh-hans/System.IO.xml",
+ "ref/netstandard1.0/zh-hant/System.IO.xml",
+ "ref/netstandard1.3/System.IO.dll",
+ "ref/netstandard1.3/System.IO.xml",
+ "ref/netstandard1.3/de/System.IO.xml",
+ "ref/netstandard1.3/es/System.IO.xml",
+ "ref/netstandard1.3/fr/System.IO.xml",
+ "ref/netstandard1.3/it/System.IO.xml",
+ "ref/netstandard1.3/ja/System.IO.xml",
+ "ref/netstandard1.3/ko/System.IO.xml",
+ "ref/netstandard1.3/ru/System.IO.xml",
+ "ref/netstandard1.3/zh-hans/System.IO.xml",
+ "ref/netstandard1.3/zh-hant/System.IO.xml",
+ "ref/netstandard1.5/System.IO.dll",
+ "ref/netstandard1.5/System.IO.xml",
+ "ref/netstandard1.5/de/System.IO.xml",
+ "ref/netstandard1.5/es/System.IO.xml",
+ "ref/netstandard1.5/fr/System.IO.xml",
+ "ref/netstandard1.5/it/System.IO.xml",
+ "ref/netstandard1.5/ja/System.IO.xml",
+ "ref/netstandard1.5/ko/System.IO.xml",
+ "ref/netstandard1.5/ru/System.IO.xml",
+ "ref/netstandard1.5/zh-hans/System.IO.xml",
+ "ref/netstandard1.5/zh-hant/System.IO.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.IO.Compression/4.1.0": {
+ "sha512": "TjnBS6eztThSzeSib+WyVbLzEdLKUcEHN69VtS3u8aAsSc18FU6xCZlNWWsEd8SKcXAE+y1sOu7VbU8sUeM0sg==",
+ "type": "package",
+ "path": "System.IO.Compression/4.1.0",
+ "files": [
+ "System.IO.Compression.4.1.0.nupkg.sha512",
+ "System.IO.Compression.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net46/System.IO.Compression.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net46/System.IO.Compression.dll",
+ "ref/netcore50/System.IO.Compression.dll",
+ "ref/netcore50/System.IO.Compression.xml",
+ "ref/netcore50/de/System.IO.Compression.xml",
+ "ref/netcore50/es/System.IO.Compression.xml",
+ "ref/netcore50/fr/System.IO.Compression.xml",
+ "ref/netcore50/it/System.IO.Compression.xml",
+ "ref/netcore50/ja/System.IO.Compression.xml",
+ "ref/netcore50/ko/System.IO.Compression.xml",
+ "ref/netcore50/ru/System.IO.Compression.xml",
+ "ref/netcore50/zh-hans/System.IO.Compression.xml",
+ "ref/netcore50/zh-hant/System.IO.Compression.xml",
+ "ref/netstandard1.1/System.IO.Compression.dll",
+ "ref/netstandard1.1/System.IO.Compression.xml",
+ "ref/netstandard1.1/de/System.IO.Compression.xml",
+ "ref/netstandard1.1/es/System.IO.Compression.xml",
+ "ref/netstandard1.1/fr/System.IO.Compression.xml",
+ "ref/netstandard1.1/it/System.IO.Compression.xml",
+ "ref/netstandard1.1/ja/System.IO.Compression.xml",
+ "ref/netstandard1.1/ko/System.IO.Compression.xml",
+ "ref/netstandard1.1/ru/System.IO.Compression.xml",
+ "ref/netstandard1.1/zh-hans/System.IO.Compression.xml",
+ "ref/netstandard1.1/zh-hant/System.IO.Compression.xml",
+ "ref/netstandard1.3/System.IO.Compression.dll",
+ "ref/netstandard1.3/System.IO.Compression.xml",
+ "ref/netstandard1.3/de/System.IO.Compression.xml",
+ "ref/netstandard1.3/es/System.IO.Compression.xml",
+ "ref/netstandard1.3/fr/System.IO.Compression.xml",
+ "ref/netstandard1.3/it/System.IO.Compression.xml",
+ "ref/netstandard1.3/ja/System.IO.Compression.xml",
+ "ref/netstandard1.3/ko/System.IO.Compression.xml",
+ "ref/netstandard1.3/ru/System.IO.Compression.xml",
+ "ref/netstandard1.3/zh-hans/System.IO.Compression.xml",
+ "ref/netstandard1.3/zh-hant/System.IO.Compression.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll",
+ "runtimes/win/lib/net46/System.IO.Compression.dll",
+ "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll"
+ ]
+ },
+ "System.IO.Compression.ZipFile/4.0.1": {
+ "sha512": "hBQYJzfTbQURF10nLhd+az2NHxsU6MU7AB8RUf4IolBP5lOAm4Luho851xl+CqslmhI5ZH/el8BlngEk4lBkaQ==",
+ "type": "package",
+ "path": "System.IO.Compression.ZipFile/4.0.1",
+ "files": [
+ "System.IO.Compression.ZipFile.4.0.1.nupkg.sha512",
+ "System.IO.Compression.ZipFile.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.IO.Compression.ZipFile.dll",
+ "lib/netstandard1.3/System.IO.Compression.ZipFile.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.IO.Compression.ZipFile.dll",
+ "ref/netstandard1.3/System.IO.Compression.ZipFile.dll",
+ "ref/netstandard1.3/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml",
+ "ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.IO.FileSystem/4.0.1": {
+ "sha512": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==",
+ "type": "package",
+ "path": "System.IO.FileSystem/4.0.1",
+ "files": [
+ "System.IO.FileSystem.4.0.1.nupkg.sha512",
+ "System.IO.FileSystem.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.IO.FileSystem.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.IO.FileSystem.dll",
+ "ref/netstandard1.3/System.IO.FileSystem.dll",
+ "ref/netstandard1.3/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/de/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/es/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/fr/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/it/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/ja/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/ko/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/ru/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml",
+ "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.IO.FileSystem.Primitives/4.0.1": {
+ "sha512": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==",
+ "type": "package",
+ "path": "System.IO.FileSystem.Primitives/4.0.1",
+ "files": [
+ "System.IO.FileSystem.Primitives.4.0.1.nupkg.sha512",
+ "System.IO.FileSystem.Primitives.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.IO.FileSystem.Primitives.dll",
+ "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.IO.FileSystem.Primitives.dll",
+ "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll",
+ "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml",
+ "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Linq/4.1.0": {
+ "sha512": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==",
+ "type": "package",
+ "path": "System.Linq/4.1.0",
+ "files": [
+ "System.Linq.4.1.0.nupkg.sha512",
+ "System.Linq.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net463/System.Linq.dll",
+ "lib/netcore50/System.Linq.dll",
+ "lib/netstandard1.6/System.Linq.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net463/System.Linq.dll",
+ "ref/netcore50/System.Linq.dll",
+ "ref/netcore50/System.Linq.xml",
+ "ref/netcore50/de/System.Linq.xml",
+ "ref/netcore50/es/System.Linq.xml",
+ "ref/netcore50/fr/System.Linq.xml",
+ "ref/netcore50/it/System.Linq.xml",
+ "ref/netcore50/ja/System.Linq.xml",
+ "ref/netcore50/ko/System.Linq.xml",
+ "ref/netcore50/ru/System.Linq.xml",
+ "ref/netcore50/zh-hans/System.Linq.xml",
+ "ref/netcore50/zh-hant/System.Linq.xml",
+ "ref/netstandard1.0/System.Linq.dll",
+ "ref/netstandard1.0/System.Linq.xml",
+ "ref/netstandard1.0/de/System.Linq.xml",
+ "ref/netstandard1.0/es/System.Linq.xml",
+ "ref/netstandard1.0/fr/System.Linq.xml",
+ "ref/netstandard1.0/it/System.Linq.xml",
+ "ref/netstandard1.0/ja/System.Linq.xml",
+ "ref/netstandard1.0/ko/System.Linq.xml",
+ "ref/netstandard1.0/ru/System.Linq.xml",
+ "ref/netstandard1.0/zh-hans/System.Linq.xml",
+ "ref/netstandard1.0/zh-hant/System.Linq.xml",
+ "ref/netstandard1.6/System.Linq.dll",
+ "ref/netstandard1.6/System.Linq.xml",
+ "ref/netstandard1.6/de/System.Linq.xml",
+ "ref/netstandard1.6/es/System.Linq.xml",
+ "ref/netstandard1.6/fr/System.Linq.xml",
+ "ref/netstandard1.6/it/System.Linq.xml",
+ "ref/netstandard1.6/ja/System.Linq.xml",
+ "ref/netstandard1.6/ko/System.Linq.xml",
+ "ref/netstandard1.6/ru/System.Linq.xml",
+ "ref/netstandard1.6/zh-hans/System.Linq.xml",
+ "ref/netstandard1.6/zh-hant/System.Linq.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Linq.Expressions/4.1.0": {
+ "sha512": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==",
+ "type": "package",
+ "path": "System.Linq.Expressions/4.1.0",
+ "files": [
+ "System.Linq.Expressions.4.1.0.nupkg.sha512",
+ "System.Linq.Expressions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net463/System.Linq.Expressions.dll",
+ "lib/netcore50/System.Linq.Expressions.dll",
+ "lib/netstandard1.6/System.Linq.Expressions.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net463/System.Linq.Expressions.dll",
+ "ref/netcore50/System.Linq.Expressions.dll",
+ "ref/netcore50/System.Linq.Expressions.xml",
+ "ref/netcore50/de/System.Linq.Expressions.xml",
+ "ref/netcore50/es/System.Linq.Expressions.xml",
+ "ref/netcore50/fr/System.Linq.Expressions.xml",
+ "ref/netcore50/it/System.Linq.Expressions.xml",
+ "ref/netcore50/ja/System.Linq.Expressions.xml",
+ "ref/netcore50/ko/System.Linq.Expressions.xml",
+ "ref/netcore50/ru/System.Linq.Expressions.xml",
+ "ref/netcore50/zh-hans/System.Linq.Expressions.xml",
+ "ref/netcore50/zh-hant/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/System.Linq.Expressions.dll",
+ "ref/netstandard1.0/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/de/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/es/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/fr/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/it/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/ja/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/ko/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/ru/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/zh-hans/System.Linq.Expressions.xml",
+ "ref/netstandard1.0/zh-hant/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/System.Linq.Expressions.dll",
+ "ref/netstandard1.3/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/de/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/es/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/fr/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/it/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/ja/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/ko/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/ru/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/zh-hans/System.Linq.Expressions.xml",
+ "ref/netstandard1.3/zh-hant/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/System.Linq.Expressions.dll",
+ "ref/netstandard1.6/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/de/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/es/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/fr/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/it/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/ja/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/ko/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/ru/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/zh-hans/System.Linq.Expressions.xml",
+ "ref/netstandard1.6/zh-hant/System.Linq.Expressions.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.Linq.Expressions.dll"
+ ]
+ },
+ "System.Net.Http/4.1.0": {
+ "sha512": "ULq9g3SOPVuupt+Y3U+A37coXzdNisB1neFCSKzBwo182u0RDddKJF8I5+HfyXqK6OhJPgeoAwWXrbiUXuRDsg==",
+ "type": "package",
+ "path": "System.Net.Http/4.1.0",
+ "files": [
+ "System.Net.Http.4.1.0.nupkg.sha512",
+ "System.Net.Http.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/Xamarinmac20/_._",
+ "lib/monoandroid10/_._",
+ "lib/monotouch10/_._",
+ "lib/net45/_._",
+ "lib/net46/System.Net.Http.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/Xamarinmac20/_._",
+ "ref/monoandroid10/_._",
+ "ref/monotouch10/_._",
+ "ref/net45/_._",
+ "ref/net46/System.Net.Http.dll",
+ "ref/net46/System.Net.Http.xml",
+ "ref/net46/de/System.Net.Http.xml",
+ "ref/net46/es/System.Net.Http.xml",
+ "ref/net46/fr/System.Net.Http.xml",
+ "ref/net46/it/System.Net.Http.xml",
+ "ref/net46/ja/System.Net.Http.xml",
+ "ref/net46/ko/System.Net.Http.xml",
+ "ref/net46/ru/System.Net.Http.xml",
+ "ref/net46/zh-hans/System.Net.Http.xml",
+ "ref/net46/zh-hant/System.Net.Http.xml",
+ "ref/netcore50/System.Net.Http.dll",
+ "ref/netcore50/System.Net.Http.xml",
+ "ref/netcore50/de/System.Net.Http.xml",
+ "ref/netcore50/es/System.Net.Http.xml",
+ "ref/netcore50/fr/System.Net.Http.xml",
+ "ref/netcore50/it/System.Net.Http.xml",
+ "ref/netcore50/ja/System.Net.Http.xml",
+ "ref/netcore50/ko/System.Net.Http.xml",
+ "ref/netcore50/ru/System.Net.Http.xml",
+ "ref/netcore50/zh-hans/System.Net.Http.xml",
+ "ref/netcore50/zh-hant/System.Net.Http.xml",
+ "ref/netstandard1.1/System.Net.Http.dll",
+ "ref/netstandard1.1/System.Net.Http.xml",
+ "ref/netstandard1.1/de/System.Net.Http.xml",
+ "ref/netstandard1.1/es/System.Net.Http.xml",
+ "ref/netstandard1.1/fr/System.Net.Http.xml",
+ "ref/netstandard1.1/it/System.Net.Http.xml",
+ "ref/netstandard1.1/ja/System.Net.Http.xml",
+ "ref/netstandard1.1/ko/System.Net.Http.xml",
+ "ref/netstandard1.1/ru/System.Net.Http.xml",
+ "ref/netstandard1.1/zh-hans/System.Net.Http.xml",
+ "ref/netstandard1.1/zh-hant/System.Net.Http.xml",
+ "ref/netstandard1.3/System.Net.Http.dll",
+ "ref/netstandard1.3/System.Net.Http.xml",
+ "ref/netstandard1.3/de/System.Net.Http.xml",
+ "ref/netstandard1.3/es/System.Net.Http.xml",
+ "ref/netstandard1.3/fr/System.Net.Http.xml",
+ "ref/netstandard1.3/it/System.Net.Http.xml",
+ "ref/netstandard1.3/ja/System.Net.Http.xml",
+ "ref/netstandard1.3/ko/System.Net.Http.xml",
+ "ref/netstandard1.3/ru/System.Net.Http.xml",
+ "ref/netstandard1.3/zh-hans/System.Net.Http.xml",
+ "ref/netstandard1.3/zh-hant/System.Net.Http.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll",
+ "runtimes/win/lib/net46/System.Net.Http.dll",
+ "runtimes/win/lib/netcore50/System.Net.Http.dll",
+ "runtimes/win/lib/netstandard1.3/System.Net.Http.dll"
+ ]
+ },
+ "System.Net.Primitives/4.0.11": {
+ "sha512": "hVvfl4405DRjA2408luZekbPhplJK03j2Y2lSfMlny7GHXlkByw1iLnc9mgKW0GdQn73vvMcWrWewAhylXA4Nw==",
+ "type": "package",
+ "path": "System.Net.Primitives/4.0.11",
+ "files": [
+ "System.Net.Primitives.4.0.11.nupkg.sha512",
+ "System.Net.Primitives.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Net.Primitives.dll",
+ "ref/netcore50/System.Net.Primitives.xml",
+ "ref/netcore50/de/System.Net.Primitives.xml",
+ "ref/netcore50/es/System.Net.Primitives.xml",
+ "ref/netcore50/fr/System.Net.Primitives.xml",
+ "ref/netcore50/it/System.Net.Primitives.xml",
+ "ref/netcore50/ja/System.Net.Primitives.xml",
+ "ref/netcore50/ko/System.Net.Primitives.xml",
+ "ref/netcore50/ru/System.Net.Primitives.xml",
+ "ref/netcore50/zh-hans/System.Net.Primitives.xml",
+ "ref/netcore50/zh-hant/System.Net.Primitives.xml",
+ "ref/netstandard1.0/System.Net.Primitives.dll",
+ "ref/netstandard1.0/System.Net.Primitives.xml",
+ "ref/netstandard1.0/de/System.Net.Primitives.xml",
+ "ref/netstandard1.0/es/System.Net.Primitives.xml",
+ "ref/netstandard1.0/fr/System.Net.Primitives.xml",
+ "ref/netstandard1.0/it/System.Net.Primitives.xml",
+ "ref/netstandard1.0/ja/System.Net.Primitives.xml",
+ "ref/netstandard1.0/ko/System.Net.Primitives.xml",
+ "ref/netstandard1.0/ru/System.Net.Primitives.xml",
+ "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml",
+ "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml",
+ "ref/netstandard1.1/System.Net.Primitives.dll",
+ "ref/netstandard1.1/System.Net.Primitives.xml",
+ "ref/netstandard1.1/de/System.Net.Primitives.xml",
+ "ref/netstandard1.1/es/System.Net.Primitives.xml",
+ "ref/netstandard1.1/fr/System.Net.Primitives.xml",
+ "ref/netstandard1.1/it/System.Net.Primitives.xml",
+ "ref/netstandard1.1/ja/System.Net.Primitives.xml",
+ "ref/netstandard1.1/ko/System.Net.Primitives.xml",
+ "ref/netstandard1.1/ru/System.Net.Primitives.xml",
+ "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml",
+ "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml",
+ "ref/netstandard1.3/System.Net.Primitives.dll",
+ "ref/netstandard1.3/System.Net.Primitives.xml",
+ "ref/netstandard1.3/de/System.Net.Primitives.xml",
+ "ref/netstandard1.3/es/System.Net.Primitives.xml",
+ "ref/netstandard1.3/fr/System.Net.Primitives.xml",
+ "ref/netstandard1.3/it/System.Net.Primitives.xml",
+ "ref/netstandard1.3/ja/System.Net.Primitives.xml",
+ "ref/netstandard1.3/ko/System.Net.Primitives.xml",
+ "ref/netstandard1.3/ru/System.Net.Primitives.xml",
+ "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml",
+ "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Net.Sockets/4.1.0": {
+ "sha512": "xAz0N3dAV/aR/9g8r0Y5oEqU1JRsz29F5EGb/WVHmX3jVSLqi2/92M5hTad2aNWovruXrJpJtgZ9fccPMG9uSw==",
+ "type": "package",
+ "path": "System.Net.Sockets/4.1.0",
+ "files": [
+ "System.Net.Sockets.4.1.0.nupkg.sha512",
+ "System.Net.Sockets.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Net.Sockets.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Net.Sockets.dll",
+ "ref/netstandard1.3/System.Net.Sockets.dll",
+ "ref/netstandard1.3/System.Net.Sockets.xml",
+ "ref/netstandard1.3/de/System.Net.Sockets.xml",
+ "ref/netstandard1.3/es/System.Net.Sockets.xml",
+ "ref/netstandard1.3/fr/System.Net.Sockets.xml",
+ "ref/netstandard1.3/it/System.Net.Sockets.xml",
+ "ref/netstandard1.3/ja/System.Net.Sockets.xml",
+ "ref/netstandard1.3/ko/System.Net.Sockets.xml",
+ "ref/netstandard1.3/ru/System.Net.Sockets.xml",
+ "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml",
+ "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.ObjectModel/4.0.12": {
+ "sha512": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==",
+ "type": "package",
+ "path": "System.ObjectModel/4.0.12",
+ "files": [
+ "System.ObjectModel.4.0.12.nupkg.sha512",
+ "System.ObjectModel.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.ObjectModel.dll",
+ "lib/netstandard1.3/System.ObjectModel.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.ObjectModel.dll",
+ "ref/netcore50/System.ObjectModel.xml",
+ "ref/netcore50/de/System.ObjectModel.xml",
+ "ref/netcore50/es/System.ObjectModel.xml",
+ "ref/netcore50/fr/System.ObjectModel.xml",
+ "ref/netcore50/it/System.ObjectModel.xml",
+ "ref/netcore50/ja/System.ObjectModel.xml",
+ "ref/netcore50/ko/System.ObjectModel.xml",
+ "ref/netcore50/ru/System.ObjectModel.xml",
+ "ref/netcore50/zh-hans/System.ObjectModel.xml",
+ "ref/netcore50/zh-hant/System.ObjectModel.xml",
+ "ref/netstandard1.0/System.ObjectModel.dll",
+ "ref/netstandard1.0/System.ObjectModel.xml",
+ "ref/netstandard1.0/de/System.ObjectModel.xml",
+ "ref/netstandard1.0/es/System.ObjectModel.xml",
+ "ref/netstandard1.0/fr/System.ObjectModel.xml",
+ "ref/netstandard1.0/it/System.ObjectModel.xml",
+ "ref/netstandard1.0/ja/System.ObjectModel.xml",
+ "ref/netstandard1.0/ko/System.ObjectModel.xml",
+ "ref/netstandard1.0/ru/System.ObjectModel.xml",
+ "ref/netstandard1.0/zh-hans/System.ObjectModel.xml",
+ "ref/netstandard1.0/zh-hant/System.ObjectModel.xml",
+ "ref/netstandard1.3/System.ObjectModel.dll",
+ "ref/netstandard1.3/System.ObjectModel.xml",
+ "ref/netstandard1.3/de/System.ObjectModel.xml",
+ "ref/netstandard1.3/es/System.ObjectModel.xml",
+ "ref/netstandard1.3/fr/System.ObjectModel.xml",
+ "ref/netstandard1.3/it/System.ObjectModel.xml",
+ "ref/netstandard1.3/ja/System.ObjectModel.xml",
+ "ref/netstandard1.3/ko/System.ObjectModel.xml",
+ "ref/netstandard1.3/ru/System.ObjectModel.xml",
+ "ref/netstandard1.3/zh-hans/System.ObjectModel.xml",
+ "ref/netstandard1.3/zh-hant/System.ObjectModel.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Reflection/4.1.0": {
+ "sha512": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==",
+ "type": "package",
+ "path": "System.Reflection/4.1.0",
+ "files": [
+ "System.Reflection.4.1.0.nupkg.sha512",
+ "System.Reflection.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.Reflection.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.Reflection.dll",
+ "ref/netcore50/System.Reflection.dll",
+ "ref/netcore50/System.Reflection.xml",
+ "ref/netcore50/de/System.Reflection.xml",
+ "ref/netcore50/es/System.Reflection.xml",
+ "ref/netcore50/fr/System.Reflection.xml",
+ "ref/netcore50/it/System.Reflection.xml",
+ "ref/netcore50/ja/System.Reflection.xml",
+ "ref/netcore50/ko/System.Reflection.xml",
+ "ref/netcore50/ru/System.Reflection.xml",
+ "ref/netcore50/zh-hans/System.Reflection.xml",
+ "ref/netcore50/zh-hant/System.Reflection.xml",
+ "ref/netstandard1.0/System.Reflection.dll",
+ "ref/netstandard1.0/System.Reflection.xml",
+ "ref/netstandard1.0/de/System.Reflection.xml",
+ "ref/netstandard1.0/es/System.Reflection.xml",
+ "ref/netstandard1.0/fr/System.Reflection.xml",
+ "ref/netstandard1.0/it/System.Reflection.xml",
+ "ref/netstandard1.0/ja/System.Reflection.xml",
+ "ref/netstandard1.0/ko/System.Reflection.xml",
+ "ref/netstandard1.0/ru/System.Reflection.xml",
+ "ref/netstandard1.0/zh-hans/System.Reflection.xml",
+ "ref/netstandard1.0/zh-hant/System.Reflection.xml",
+ "ref/netstandard1.3/System.Reflection.dll",
+ "ref/netstandard1.3/System.Reflection.xml",
+ "ref/netstandard1.3/de/System.Reflection.xml",
+ "ref/netstandard1.3/es/System.Reflection.xml",
+ "ref/netstandard1.3/fr/System.Reflection.xml",
+ "ref/netstandard1.3/it/System.Reflection.xml",
+ "ref/netstandard1.3/ja/System.Reflection.xml",
+ "ref/netstandard1.3/ko/System.Reflection.xml",
+ "ref/netstandard1.3/ru/System.Reflection.xml",
+ "ref/netstandard1.3/zh-hans/System.Reflection.xml",
+ "ref/netstandard1.3/zh-hant/System.Reflection.xml",
+ "ref/netstandard1.5/System.Reflection.dll",
+ "ref/netstandard1.5/System.Reflection.xml",
+ "ref/netstandard1.5/de/System.Reflection.xml",
+ "ref/netstandard1.5/es/System.Reflection.xml",
+ "ref/netstandard1.5/fr/System.Reflection.xml",
+ "ref/netstandard1.5/it/System.Reflection.xml",
+ "ref/netstandard1.5/ja/System.Reflection.xml",
+ "ref/netstandard1.5/ko/System.Reflection.xml",
+ "ref/netstandard1.5/ru/System.Reflection.xml",
+ "ref/netstandard1.5/zh-hans/System.Reflection.xml",
+ "ref/netstandard1.5/zh-hant/System.Reflection.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Reflection.Emit/4.0.1": {
+ "sha512": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==",
+ "type": "package",
+ "path": "System.Reflection.Emit/4.0.1",
+ "files": [
+ "System.Reflection.Emit.4.0.1.nupkg.sha512",
+ "System.Reflection.Emit.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Reflection.Emit.dll",
+ "lib/netstandard1.3/System.Reflection.Emit.dll",
+ "lib/xamarinmac20/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/net45/_._",
+ "ref/netstandard1.1/System.Reflection.Emit.dll",
+ "ref/netstandard1.1/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/de/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/es/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/fr/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/it/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/ja/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/ko/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/ru/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml",
+ "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml",
+ "ref/xamarinmac20/_._"
+ ]
+ },
+ "System.Reflection.Emit.ILGeneration/4.0.1": {
+ "sha512": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==",
+ "type": "package",
+ "path": "System.Reflection.Emit.ILGeneration/4.0.1",
+ "files": [
+ "System.Reflection.Emit.ILGeneration.4.0.1.nupkg.sha512",
+ "System.Reflection.Emit.ILGeneration.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/net45/_._",
+ "lib/netcore50/System.Reflection.Emit.ILGeneration.dll",
+ "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll",
+ "lib/portable-net45+wp8/_._",
+ "lib/wp80/_._",
+ "ref/net45/_._",
+ "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll",
+ "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/de/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/es/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/fr/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/it/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/ja/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/ko/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/ru/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/zh-hans/System.Reflection.Emit.ILGeneration.xml",
+ "ref/netstandard1.0/zh-hant/System.Reflection.Emit.ILGeneration.xml",
+ "ref/portable-net45+wp8/_._",
+ "ref/wp80/_._",
+ "runtimes/aot/lib/netcore50/_._"
+ ]
+ },
+ "System.Reflection.Emit.Lightweight/4.0.1": {
+ "sha512": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==",
+ "type": "package",
+ "path": "System.Reflection.Emit.Lightweight/4.0.1",
+ "files": [
+ "System.Reflection.Emit.Lightweight.4.0.1.nupkg.sha512",
+ "System.Reflection.Emit.Lightweight.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/net45/_._",
+ "lib/netcore50/System.Reflection.Emit.Lightweight.dll",
+ "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll",
+ "lib/portable-net45+wp8/_._",
+ "lib/wp80/_._",
+ "ref/net45/_._",
+ "ref/netstandard1.0/System.Reflection.Emit.Lightweight.dll",
+ "ref/netstandard1.0/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/de/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/es/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/fr/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/it/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/ja/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/ko/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/ru/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/zh-hans/System.Reflection.Emit.Lightweight.xml",
+ "ref/netstandard1.0/zh-hant/System.Reflection.Emit.Lightweight.xml",
+ "ref/portable-net45+wp8/_._",
+ "ref/wp80/_._",
+ "runtimes/aot/lib/netcore50/_._"
+ ]
+ },
+ "System.Reflection.Extensions/4.0.1": {
+ "sha512": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==",
+ "type": "package",
+ "path": "System.Reflection.Extensions/4.0.1",
+ "files": [
+ "System.Reflection.Extensions.4.0.1.nupkg.sha512",
+ "System.Reflection.Extensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Reflection.Extensions.dll",
+ "ref/netcore50/System.Reflection.Extensions.xml",
+ "ref/netcore50/de/System.Reflection.Extensions.xml",
+ "ref/netcore50/es/System.Reflection.Extensions.xml",
+ "ref/netcore50/fr/System.Reflection.Extensions.xml",
+ "ref/netcore50/it/System.Reflection.Extensions.xml",
+ "ref/netcore50/ja/System.Reflection.Extensions.xml",
+ "ref/netcore50/ko/System.Reflection.Extensions.xml",
+ "ref/netcore50/ru/System.Reflection.Extensions.xml",
+ "ref/netcore50/zh-hans/System.Reflection.Extensions.xml",
+ "ref/netcore50/zh-hant/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/System.Reflection.Extensions.dll",
+ "ref/netstandard1.0/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/de/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/es/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/fr/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/it/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/ja/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/ko/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/ru/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml",
+ "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Reflection.Primitives/4.0.1": {
+ "sha512": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==",
+ "type": "package",
+ "path": "System.Reflection.Primitives/4.0.1",
+ "files": [
+ "System.Reflection.Primitives.4.0.1.nupkg.sha512",
+ "System.Reflection.Primitives.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Reflection.Primitives.dll",
+ "ref/netcore50/System.Reflection.Primitives.xml",
+ "ref/netcore50/de/System.Reflection.Primitives.xml",
+ "ref/netcore50/es/System.Reflection.Primitives.xml",
+ "ref/netcore50/fr/System.Reflection.Primitives.xml",
+ "ref/netcore50/it/System.Reflection.Primitives.xml",
+ "ref/netcore50/ja/System.Reflection.Primitives.xml",
+ "ref/netcore50/ko/System.Reflection.Primitives.xml",
+ "ref/netcore50/ru/System.Reflection.Primitives.xml",
+ "ref/netcore50/zh-hans/System.Reflection.Primitives.xml",
+ "ref/netcore50/zh-hant/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/System.Reflection.Primitives.dll",
+ "ref/netstandard1.0/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/de/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/es/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/fr/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/it/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/ja/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/ko/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/ru/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml",
+ "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Reflection.TypeExtensions/4.1.0": {
+ "sha512": "tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==",
+ "type": "package",
+ "path": "System.Reflection.TypeExtensions/4.1.0",
+ "files": [
+ "System.Reflection.TypeExtensions.4.1.0.nupkg.sha512",
+ "System.Reflection.TypeExtensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Reflection.TypeExtensions.dll",
+ "lib/net462/System.Reflection.TypeExtensions.dll",
+ "lib/netcore50/System.Reflection.TypeExtensions.dll",
+ "lib/netstandard1.5/System.Reflection.TypeExtensions.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Reflection.TypeExtensions.dll",
+ "ref/net462/System.Reflection.TypeExtensions.dll",
+ "ref/netstandard1.3/System.Reflection.TypeExtensions.dll",
+ "ref/netstandard1.3/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/System.Reflection.TypeExtensions.dll",
+ "ref/netstandard1.5/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml",
+ "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll"
+ ]
+ },
+ "System.Resources.ResourceManager/4.0.1": {
+ "sha512": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==",
+ "type": "package",
+ "path": "System.Resources.ResourceManager/4.0.1",
+ "files": [
+ "System.Resources.ResourceManager.4.0.1.nupkg.sha512",
+ "System.Resources.ResourceManager.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Resources.ResourceManager.dll",
+ "ref/netcore50/System.Resources.ResourceManager.xml",
+ "ref/netcore50/de/System.Resources.ResourceManager.xml",
+ "ref/netcore50/es/System.Resources.ResourceManager.xml",
+ "ref/netcore50/fr/System.Resources.ResourceManager.xml",
+ "ref/netcore50/it/System.Resources.ResourceManager.xml",
+ "ref/netcore50/ja/System.Resources.ResourceManager.xml",
+ "ref/netcore50/ko/System.Resources.ResourceManager.xml",
+ "ref/netcore50/ru/System.Resources.ResourceManager.xml",
+ "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml",
+ "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/System.Resources.ResourceManager.dll",
+ "ref/netstandard1.0/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/de/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/es/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/it/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml",
+ "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Runtime/4.1.0": {
+ "sha512": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==",
+ "type": "package",
+ "path": "System.Runtime/4.1.0",
+ "files": [
+ "System.Runtime.4.1.0.nupkg.sha512",
+ "System.Runtime.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.Runtime.dll",
+ "lib/portable-net45+win8+wp80+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.Runtime.dll",
+ "ref/netcore50/System.Runtime.dll",
+ "ref/netcore50/System.Runtime.xml",
+ "ref/netcore50/de/System.Runtime.xml",
+ "ref/netcore50/es/System.Runtime.xml",
+ "ref/netcore50/fr/System.Runtime.xml",
+ "ref/netcore50/it/System.Runtime.xml",
+ "ref/netcore50/ja/System.Runtime.xml",
+ "ref/netcore50/ko/System.Runtime.xml",
+ "ref/netcore50/ru/System.Runtime.xml",
+ "ref/netcore50/zh-hans/System.Runtime.xml",
+ "ref/netcore50/zh-hant/System.Runtime.xml",
+ "ref/netstandard1.0/System.Runtime.dll",
+ "ref/netstandard1.0/System.Runtime.xml",
+ "ref/netstandard1.0/de/System.Runtime.xml",
+ "ref/netstandard1.0/es/System.Runtime.xml",
+ "ref/netstandard1.0/fr/System.Runtime.xml",
+ "ref/netstandard1.0/it/System.Runtime.xml",
+ "ref/netstandard1.0/ja/System.Runtime.xml",
+ "ref/netstandard1.0/ko/System.Runtime.xml",
+ "ref/netstandard1.0/ru/System.Runtime.xml",
+ "ref/netstandard1.0/zh-hans/System.Runtime.xml",
+ "ref/netstandard1.0/zh-hant/System.Runtime.xml",
+ "ref/netstandard1.2/System.Runtime.dll",
+ "ref/netstandard1.2/System.Runtime.xml",
+ "ref/netstandard1.2/de/System.Runtime.xml",
+ "ref/netstandard1.2/es/System.Runtime.xml",
+ "ref/netstandard1.2/fr/System.Runtime.xml",
+ "ref/netstandard1.2/it/System.Runtime.xml",
+ "ref/netstandard1.2/ja/System.Runtime.xml",
+ "ref/netstandard1.2/ko/System.Runtime.xml",
+ "ref/netstandard1.2/ru/System.Runtime.xml",
+ "ref/netstandard1.2/zh-hans/System.Runtime.xml",
+ "ref/netstandard1.2/zh-hant/System.Runtime.xml",
+ "ref/netstandard1.3/System.Runtime.dll",
+ "ref/netstandard1.3/System.Runtime.xml",
+ "ref/netstandard1.3/de/System.Runtime.xml",
+ "ref/netstandard1.3/es/System.Runtime.xml",
+ "ref/netstandard1.3/fr/System.Runtime.xml",
+ "ref/netstandard1.3/it/System.Runtime.xml",
+ "ref/netstandard1.3/ja/System.Runtime.xml",
+ "ref/netstandard1.3/ko/System.Runtime.xml",
+ "ref/netstandard1.3/ru/System.Runtime.xml",
+ "ref/netstandard1.3/zh-hans/System.Runtime.xml",
+ "ref/netstandard1.3/zh-hant/System.Runtime.xml",
+ "ref/netstandard1.5/System.Runtime.dll",
+ "ref/netstandard1.5/System.Runtime.xml",
+ "ref/netstandard1.5/de/System.Runtime.xml",
+ "ref/netstandard1.5/es/System.Runtime.xml",
+ "ref/netstandard1.5/fr/System.Runtime.xml",
+ "ref/netstandard1.5/it/System.Runtime.xml",
+ "ref/netstandard1.5/ja/System.Runtime.xml",
+ "ref/netstandard1.5/ko/System.Runtime.xml",
+ "ref/netstandard1.5/ru/System.Runtime.xml",
+ "ref/netstandard1.5/zh-hans/System.Runtime.xml",
+ "ref/netstandard1.5/zh-hant/System.Runtime.xml",
+ "ref/portable-net45+win8+wp80+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Runtime.Extensions/4.1.0": {
+ "sha512": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==",
+ "type": "package",
+ "path": "System.Runtime.Extensions/4.1.0",
+ "files": [
+ "System.Runtime.Extensions.4.1.0.nupkg.sha512",
+ "System.Runtime.Extensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.Runtime.Extensions.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.Runtime.Extensions.dll",
+ "ref/netcore50/System.Runtime.Extensions.dll",
+ "ref/netcore50/System.Runtime.Extensions.xml",
+ "ref/netcore50/de/System.Runtime.Extensions.xml",
+ "ref/netcore50/es/System.Runtime.Extensions.xml",
+ "ref/netcore50/fr/System.Runtime.Extensions.xml",
+ "ref/netcore50/it/System.Runtime.Extensions.xml",
+ "ref/netcore50/ja/System.Runtime.Extensions.xml",
+ "ref/netcore50/ko/System.Runtime.Extensions.xml",
+ "ref/netcore50/ru/System.Runtime.Extensions.xml",
+ "ref/netcore50/zh-hans/System.Runtime.Extensions.xml",
+ "ref/netcore50/zh-hant/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/System.Runtime.Extensions.dll",
+ "ref/netstandard1.0/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/de/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/es/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/fr/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/it/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/ja/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/ko/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/ru/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml",
+ "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/System.Runtime.Extensions.dll",
+ "ref/netstandard1.3/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/de/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/es/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/fr/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/it/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/ja/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/ko/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/ru/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml",
+ "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/System.Runtime.Extensions.dll",
+ "ref/netstandard1.5/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/de/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/es/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/fr/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/it/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/ja/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/ko/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/ru/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml",
+ "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Runtime.Handles/4.0.1": {
+ "sha512": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==",
+ "type": "package",
+ "path": "System.Runtime.Handles/4.0.1",
+ "files": [
+ "System.Runtime.Handles.4.0.1.nupkg.sha512",
+ "System.Runtime.Handles.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/_._",
+ "ref/netstandard1.3/System.Runtime.Handles.dll",
+ "ref/netstandard1.3/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/de/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/es/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/fr/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/it/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/ja/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/ko/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/ru/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml",
+ "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Runtime.InteropServices/4.1.0": {
+ "sha512": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==",
+ "type": "package",
+ "path": "System.Runtime.InteropServices/4.1.0",
+ "files": [
+ "System.Runtime.InteropServices.4.1.0.nupkg.sha512",
+ "System.Runtime.InteropServices.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net462/System.Runtime.InteropServices.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net462/System.Runtime.InteropServices.dll",
+ "ref/netcore50/System.Runtime.InteropServices.dll",
+ "ref/netcore50/System.Runtime.InteropServices.xml",
+ "ref/netcore50/de/System.Runtime.InteropServices.xml",
+ "ref/netcore50/es/System.Runtime.InteropServices.xml",
+ "ref/netcore50/fr/System.Runtime.InteropServices.xml",
+ "ref/netcore50/it/System.Runtime.InteropServices.xml",
+ "ref/netcore50/ja/System.Runtime.InteropServices.xml",
+ "ref/netcore50/ko/System.Runtime.InteropServices.xml",
+ "ref/netcore50/ru/System.Runtime.InteropServices.xml",
+ "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml",
+ "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/System.Runtime.InteropServices.dll",
+ "ref/netstandard1.1/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/de/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/es/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/it/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/System.Runtime.InteropServices.dll",
+ "ref/netstandard1.2/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/de/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/es/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/it/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/System.Runtime.InteropServices.dll",
+ "ref/netstandard1.3/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/de/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/es/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/it/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/System.Runtime.InteropServices.dll",
+ "ref/netstandard1.5/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/de/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/es/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/it/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml",
+ "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Runtime.InteropServices.RuntimeInformation/4.0.0": {
+ "sha512": "hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==",
+ "type": "package",
+ "path": "System.Runtime.InteropServices.RuntimeInformation/4.0.0",
+ "files": [
+ "System.Runtime.InteropServices.RuntimeInformation.4.0.0.nupkg.sha512",
+ "System.Runtime.InteropServices.RuntimeInformation.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "lib/win8/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "lib/wpa81/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "runtimes/win/lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "runtimes/win/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll",
+ "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll"
+ ]
+ },
+ "System.Runtime.Loader/4.0.0": {
+ "sha512": "nWnqJArGw+dE8OcAWbbYMcvr7e2xrAoMC+jWfSLwBu3JOagoCeKZUm3ABAWOSph0mKuwIyK4lNQFEIYC4/2CGw==",
+ "type": "package",
+ "path": "System.Runtime.Loader/4.0.0",
+ "files": [
+ "System.Runtime.Loader.4.0.0.nupkg.sha512",
+ "System.Runtime.Loader.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/net462/_._",
+ "lib/netstandard1.5/System.Runtime.Loader.dll",
+ "ref/netstandard1.5/System.Runtime.Loader.dll",
+ "ref/netstandard1.5/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/de/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/es/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/fr/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/it/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/ja/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/ko/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/ru/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/zh-hans/System.Runtime.Loader.xml",
+ "ref/netstandard1.5/zh-hant/System.Runtime.Loader.xml"
+ ]
+ },
+ "System.Runtime.Numerics/4.0.1": {
+ "sha512": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==",
+ "type": "package",
+ "path": "System.Runtime.Numerics/4.0.1",
+ "files": [
+ "System.Runtime.Numerics.4.0.1.nupkg.sha512",
+ "System.Runtime.Numerics.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Runtime.Numerics.dll",
+ "lib/netstandard1.3/System.Runtime.Numerics.dll",
+ "lib/portable-net45+win8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Runtime.Numerics.dll",
+ "ref/netcore50/System.Runtime.Numerics.xml",
+ "ref/netcore50/de/System.Runtime.Numerics.xml",
+ "ref/netcore50/es/System.Runtime.Numerics.xml",
+ "ref/netcore50/fr/System.Runtime.Numerics.xml",
+ "ref/netcore50/it/System.Runtime.Numerics.xml",
+ "ref/netcore50/ja/System.Runtime.Numerics.xml",
+ "ref/netcore50/ko/System.Runtime.Numerics.xml",
+ "ref/netcore50/ru/System.Runtime.Numerics.xml",
+ "ref/netcore50/zh-hans/System.Runtime.Numerics.xml",
+ "ref/netcore50/zh-hant/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/System.Runtime.Numerics.dll",
+ "ref/netstandard1.1/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/de/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/es/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/fr/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/it/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/ja/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/ko/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/ru/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/zh-hans/System.Runtime.Numerics.xml",
+ "ref/netstandard1.1/zh-hant/System.Runtime.Numerics.xml",
+ "ref/portable-net45+win8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Security.Cryptography.Algorithms/4.2.0": {
+ "sha512": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==",
+ "type": "package",
+ "path": "System.Security.Cryptography.Algorithms/4.2.0",
+ "files": [
+ "System.Security.Cryptography.Algorithms.4.2.0.nupkg.sha512",
+ "System.Security.Cryptography.Algorithms.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Security.Cryptography.Algorithms.dll",
+ "lib/net461/System.Security.Cryptography.Algorithms.dll",
+ "lib/net463/System.Security.Cryptography.Algorithms.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Security.Cryptography.Algorithms.dll",
+ "ref/net461/System.Security.Cryptography.Algorithms.dll",
+ "ref/net463/System.Security.Cryptography.Algorithms.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll",
+ "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll",
+ "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll",
+ "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll",
+ "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll",
+ "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll",
+ "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll",
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll"
+ ]
+ },
+ "System.Security.Cryptography.Cng/4.2.0": {
+ "sha512": "cUJ2h+ZvONDe28Szw3st5dOHdjndhJzQ2WObDEXAWRPEQBtVItVoxbXM/OEsTthl3cNn2dk2k0I3y45igCQcLw==",
+ "type": "package",
+ "path": "System.Security.Cryptography.Cng/4.2.0",
+ "files": [
+ "System.Security.Cryptography.Cng.4.2.0.nupkg.sha512",
+ "System.Security.Cryptography.Cng.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/net46/System.Security.Cryptography.Cng.dll",
+ "lib/net461/System.Security.Cryptography.Cng.dll",
+ "lib/net463/System.Security.Cryptography.Cng.dll",
+ "ref/net46/System.Security.Cryptography.Cng.dll",
+ "ref/net461/System.Security.Cryptography.Cng.dll",
+ "ref/net463/System.Security.Cryptography.Cng.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Cng.dll",
+ "ref/netstandard1.4/System.Security.Cryptography.Cng.dll",
+ "ref/netstandard1.6/System.Security.Cryptography.Cng.dll",
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll",
+ "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll",
+ "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll",
+ "runtimes/win/lib/net463/System.Security.Cryptography.Cng.dll",
+ "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll",
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll"
+ ]
+ },
+ "System.Security.Cryptography.Csp/4.0.0": {
+ "sha512": "/i1Usuo4PgAqgbPNC0NjbO3jPW//BoBlTpcWFD1EHVbidH21y4c1ap5bbEMSGAXjAShhMH4abi/K8fILrnu4BQ==",
+ "type": "package",
+ "path": "System.Security.Cryptography.Csp/4.0.0",
+ "files": [
+ "System.Security.Cryptography.Csp.4.0.0.nupkg.sha512",
+ "System.Security.Cryptography.Csp.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Security.Cryptography.Csp.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Security.Cryptography.Csp.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Csp.dll",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll",
+ "runtimes/win/lib/net46/System.Security.Cryptography.Csp.dll",
+ "runtimes/win/lib/netcore50/_._",
+ "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll"
+ ]
+ },
+ "System.Security.Cryptography.Encoding/4.0.0": {
+ "sha512": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==",
+ "type": "package",
+ "path": "System.Security.Cryptography.Encoding/4.0.0",
+ "files": [
+ "System.Security.Cryptography.Encoding.4.0.0.nupkg.sha512",
+ "System.Security.Cryptography.Encoding.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Security.Cryptography.Encoding.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Security.Cryptography.Encoding.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/de/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/es/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/fr/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/it/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/ja/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/ko/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/ru/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/zh-hans/System.Security.Cryptography.Encoding.xml",
+ "ref/netstandard1.3/zh-hant/System.Security.Cryptography.Encoding.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll",
+ "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll",
+ "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll"
+ ]
+ },
+ "System.Security.Cryptography.OpenSsl/4.0.0": {
+ "sha512": "HUG/zNUJwEiLkoURDixzkzZdB5yGA5pQhDP93ArOpDPQMteURIGERRNzzoJlmTreLBWr5lkFSjjMSk8ySEpQMw==",
+ "type": "package",
+ "path": "System.Security.Cryptography.OpenSsl/4.0.0",
+ "files": [
+ "System.Security.Cryptography.OpenSsl.4.0.0.nupkg.sha512",
+ "System.Security.Cryptography.OpenSsl.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll",
+ "ref/netstandard1.6/System.Security.Cryptography.OpenSsl.dll",
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll"
+ ]
+ },
+ "System.Security.Cryptography.Primitives/4.0.0": {
+ "sha512": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==",
+ "type": "package",
+ "path": "System.Security.Cryptography.Primitives/4.0.0",
+ "files": [
+ "System.Security.Cryptography.Primitives.4.0.0.nupkg.sha512",
+ "System.Security.Cryptography.Primitives.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Security.Cryptography.Primitives.dll",
+ "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Security.Cryptography.Primitives.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Security.Cryptography.X509Certificates/4.1.0": {
+ "sha512": "4HEfsQIKAhA1+ApNn729Gi09zh+lYWwyIuViihoMDWp1vQnEkL2ct7mAbhBlLYm+x/L4Rr/pyGge1lIY635e0w==",
+ "type": "package",
+ "path": "System.Security.Cryptography.X509Certificates/4.1.0",
+ "files": [
+ "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512",
+ "System.Security.Cryptography.X509Certificates.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Security.Cryptography.X509Certificates.dll",
+ "lib/net461/System.Security.Cryptography.X509Certificates.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Security.Cryptography.X509Certificates.dll",
+ "ref/net461/System.Security.Cryptography.X509Certificates.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll",
+ "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/es/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/fr/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/it/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/ja/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/ko/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/ru/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/zh-hans/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.3/zh-hant/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll",
+ "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/de/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/es/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/fr/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/it/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/ja/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/ko/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/ru/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/zh-hans/System.Security.Cryptography.X509Certificates.xml",
+ "ref/netstandard1.4/zh-hant/System.Security.Cryptography.X509Certificates.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll",
+ "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll",
+ "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll",
+ "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll",
+ "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll"
+ ]
+ },
+ "System.Text.Encoding/4.0.11": {
+ "sha512": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==",
+ "type": "package",
+ "path": "System.Text.Encoding/4.0.11",
+ "files": [
+ "System.Text.Encoding.4.0.11.nupkg.sha512",
+ "System.Text.Encoding.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Text.Encoding.dll",
+ "ref/netcore50/System.Text.Encoding.xml",
+ "ref/netcore50/de/System.Text.Encoding.xml",
+ "ref/netcore50/es/System.Text.Encoding.xml",
+ "ref/netcore50/fr/System.Text.Encoding.xml",
+ "ref/netcore50/it/System.Text.Encoding.xml",
+ "ref/netcore50/ja/System.Text.Encoding.xml",
+ "ref/netcore50/ko/System.Text.Encoding.xml",
+ "ref/netcore50/ru/System.Text.Encoding.xml",
+ "ref/netcore50/zh-hans/System.Text.Encoding.xml",
+ "ref/netcore50/zh-hant/System.Text.Encoding.xml",
+ "ref/netstandard1.0/System.Text.Encoding.dll",
+ "ref/netstandard1.0/System.Text.Encoding.xml",
+ "ref/netstandard1.0/de/System.Text.Encoding.xml",
+ "ref/netstandard1.0/es/System.Text.Encoding.xml",
+ "ref/netstandard1.0/fr/System.Text.Encoding.xml",
+ "ref/netstandard1.0/it/System.Text.Encoding.xml",
+ "ref/netstandard1.0/ja/System.Text.Encoding.xml",
+ "ref/netstandard1.0/ko/System.Text.Encoding.xml",
+ "ref/netstandard1.0/ru/System.Text.Encoding.xml",
+ "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml",
+ "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml",
+ "ref/netstandard1.3/System.Text.Encoding.dll",
+ "ref/netstandard1.3/System.Text.Encoding.xml",
+ "ref/netstandard1.3/de/System.Text.Encoding.xml",
+ "ref/netstandard1.3/es/System.Text.Encoding.xml",
+ "ref/netstandard1.3/fr/System.Text.Encoding.xml",
+ "ref/netstandard1.3/it/System.Text.Encoding.xml",
+ "ref/netstandard1.3/ja/System.Text.Encoding.xml",
+ "ref/netstandard1.3/ko/System.Text.Encoding.xml",
+ "ref/netstandard1.3/ru/System.Text.Encoding.xml",
+ "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml",
+ "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Text.Encoding.Extensions/4.0.11": {
+ "sha512": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==",
+ "type": "package",
+ "path": "System.Text.Encoding.Extensions/4.0.11",
+ "files": [
+ "System.Text.Encoding.Extensions.4.0.11.nupkg.sha512",
+ "System.Text.Encoding.Extensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Text.Encoding.Extensions.dll",
+ "ref/netcore50/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/de/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/es/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/fr/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/it/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/ja/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/ko/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/ru/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml",
+ "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/System.Text.Encoding.Extensions.dll",
+ "ref/netstandard1.0/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/System.Text.Encoding.Extensions.dll",
+ "ref/netstandard1.3/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml",
+ "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Text.RegularExpressions/4.1.0": {
+ "sha512": "i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==",
+ "type": "package",
+ "path": "System.Text.RegularExpressions/4.1.0",
+ "files": [
+ "System.Text.RegularExpressions.4.1.0.nupkg.sha512",
+ "System.Text.RegularExpressions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/net463/System.Text.RegularExpressions.dll",
+ "lib/netcore50/System.Text.RegularExpressions.dll",
+ "lib/netstandard1.6/System.Text.RegularExpressions.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/net463/System.Text.RegularExpressions.dll",
+ "ref/netcore50/System.Text.RegularExpressions.dll",
+ "ref/netcore50/System.Text.RegularExpressions.xml",
+ "ref/netcore50/de/System.Text.RegularExpressions.xml",
+ "ref/netcore50/es/System.Text.RegularExpressions.xml",
+ "ref/netcore50/fr/System.Text.RegularExpressions.xml",
+ "ref/netcore50/it/System.Text.RegularExpressions.xml",
+ "ref/netcore50/ja/System.Text.RegularExpressions.xml",
+ "ref/netcore50/ko/System.Text.RegularExpressions.xml",
+ "ref/netcore50/ru/System.Text.RegularExpressions.xml",
+ "ref/netcore50/zh-hans/System.Text.RegularExpressions.xml",
+ "ref/netcore50/zh-hant/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/System.Text.RegularExpressions.dll",
+ "ref/netstandard1.0/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/de/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/es/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/fr/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/it/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/ja/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/ko/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/ru/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/zh-hans/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.0/zh-hant/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/System.Text.RegularExpressions.dll",
+ "ref/netstandard1.3/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/de/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/es/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/fr/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/it/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/ja/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/ko/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/ru/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/zh-hans/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.3/zh-hant/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/System.Text.RegularExpressions.dll",
+ "ref/netstandard1.6/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/de/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/es/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/fr/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/it/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/ja/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/ko/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/ru/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/zh-hans/System.Text.RegularExpressions.xml",
+ "ref/netstandard1.6/zh-hant/System.Text.RegularExpressions.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Threading/4.0.11": {
+ "sha512": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==",
+ "type": "package",
+ "path": "System.Threading/4.0.11",
+ "files": [
+ "System.Threading.4.0.11.nupkg.sha512",
+ "System.Threading.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Threading.dll",
+ "lib/netstandard1.3/System.Threading.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Threading.dll",
+ "ref/netcore50/System.Threading.xml",
+ "ref/netcore50/de/System.Threading.xml",
+ "ref/netcore50/es/System.Threading.xml",
+ "ref/netcore50/fr/System.Threading.xml",
+ "ref/netcore50/it/System.Threading.xml",
+ "ref/netcore50/ja/System.Threading.xml",
+ "ref/netcore50/ko/System.Threading.xml",
+ "ref/netcore50/ru/System.Threading.xml",
+ "ref/netcore50/zh-hans/System.Threading.xml",
+ "ref/netcore50/zh-hant/System.Threading.xml",
+ "ref/netstandard1.0/System.Threading.dll",
+ "ref/netstandard1.0/System.Threading.xml",
+ "ref/netstandard1.0/de/System.Threading.xml",
+ "ref/netstandard1.0/es/System.Threading.xml",
+ "ref/netstandard1.0/fr/System.Threading.xml",
+ "ref/netstandard1.0/it/System.Threading.xml",
+ "ref/netstandard1.0/ja/System.Threading.xml",
+ "ref/netstandard1.0/ko/System.Threading.xml",
+ "ref/netstandard1.0/ru/System.Threading.xml",
+ "ref/netstandard1.0/zh-hans/System.Threading.xml",
+ "ref/netstandard1.0/zh-hant/System.Threading.xml",
+ "ref/netstandard1.3/System.Threading.dll",
+ "ref/netstandard1.3/System.Threading.xml",
+ "ref/netstandard1.3/de/System.Threading.xml",
+ "ref/netstandard1.3/es/System.Threading.xml",
+ "ref/netstandard1.3/fr/System.Threading.xml",
+ "ref/netstandard1.3/it/System.Threading.xml",
+ "ref/netstandard1.3/ja/System.Threading.xml",
+ "ref/netstandard1.3/ko/System.Threading.xml",
+ "ref/netstandard1.3/ru/System.Threading.xml",
+ "ref/netstandard1.3/zh-hans/System.Threading.xml",
+ "ref/netstandard1.3/zh-hant/System.Threading.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.Threading.dll"
+ ]
+ },
+ "System.Threading.Tasks/4.0.11": {
+ "sha512": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==",
+ "type": "package",
+ "path": "System.Threading.Tasks/4.0.11",
+ "files": [
+ "System.Threading.Tasks.4.0.11.nupkg.sha512",
+ "System.Threading.Tasks.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Threading.Tasks.dll",
+ "ref/netcore50/System.Threading.Tasks.xml",
+ "ref/netcore50/de/System.Threading.Tasks.xml",
+ "ref/netcore50/es/System.Threading.Tasks.xml",
+ "ref/netcore50/fr/System.Threading.Tasks.xml",
+ "ref/netcore50/it/System.Threading.Tasks.xml",
+ "ref/netcore50/ja/System.Threading.Tasks.xml",
+ "ref/netcore50/ko/System.Threading.Tasks.xml",
+ "ref/netcore50/ru/System.Threading.Tasks.xml",
+ "ref/netcore50/zh-hans/System.Threading.Tasks.xml",
+ "ref/netcore50/zh-hant/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/System.Threading.Tasks.dll",
+ "ref/netstandard1.0/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/de/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/es/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/fr/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/it/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/ja/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/ko/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/ru/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml",
+ "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/System.Threading.Tasks.dll",
+ "ref/netstandard1.3/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/de/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/es/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/fr/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/it/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/ja/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/ko/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/ru/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml",
+ "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Threading.Tasks.Extensions/4.0.0": {
+ "sha512": "pH4FZDsZQ/WmgJtN4LWYmRdJAEeVkyriSwrv2Teoe5FOU0Yxlb6II6GL8dBPOfRmutHGATduj3ooMt7dJ2+i+w==",
+ "type": "package",
+ "path": "System.Threading.Tasks.Extensions/4.0.0",
+ "files": [
+ "System.Threading.Tasks.Extensions.4.0.0.nupkg.sha512",
+ "System.Threading.Tasks.Extensions.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll",
+ "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml",
+ "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll",
+ "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml"
+ ]
+ },
+ "System.Threading.Timer/4.0.1": {
+ "sha512": "saGfUV8uqVW6LeURiqxcGhZ24PzuRNaUBtbhVeuUAvky1naH395A/1nY0P2bWvrw/BreRtIB/EzTDkGBpqCwEw==",
+ "type": "package",
+ "path": "System.Threading.Timer/4.0.1",
+ "files": [
+ "System.Threading.Timer.4.0.1.nupkg.sha512",
+ "System.Threading.Timer.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net451/_._",
+ "lib/portable-net451+win81+wpa81/_._",
+ "lib/win81/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net451/_._",
+ "ref/netcore50/System.Threading.Timer.dll",
+ "ref/netcore50/System.Threading.Timer.xml",
+ "ref/netcore50/de/System.Threading.Timer.xml",
+ "ref/netcore50/es/System.Threading.Timer.xml",
+ "ref/netcore50/fr/System.Threading.Timer.xml",
+ "ref/netcore50/it/System.Threading.Timer.xml",
+ "ref/netcore50/ja/System.Threading.Timer.xml",
+ "ref/netcore50/ko/System.Threading.Timer.xml",
+ "ref/netcore50/ru/System.Threading.Timer.xml",
+ "ref/netcore50/zh-hans/System.Threading.Timer.xml",
+ "ref/netcore50/zh-hant/System.Threading.Timer.xml",
+ "ref/netstandard1.2/System.Threading.Timer.dll",
+ "ref/netstandard1.2/System.Threading.Timer.xml",
+ "ref/netstandard1.2/de/System.Threading.Timer.xml",
+ "ref/netstandard1.2/es/System.Threading.Timer.xml",
+ "ref/netstandard1.2/fr/System.Threading.Timer.xml",
+ "ref/netstandard1.2/it/System.Threading.Timer.xml",
+ "ref/netstandard1.2/ja/System.Threading.Timer.xml",
+ "ref/netstandard1.2/ko/System.Threading.Timer.xml",
+ "ref/netstandard1.2/ru/System.Threading.Timer.xml",
+ "ref/netstandard1.2/zh-hans/System.Threading.Timer.xml",
+ "ref/netstandard1.2/zh-hant/System.Threading.Timer.xml",
+ "ref/portable-net451+win81+wpa81/_._",
+ "ref/win81/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Xml.ReaderWriter/4.0.11": {
+ "sha512": "ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==",
+ "type": "package",
+ "path": "System.Xml.ReaderWriter/4.0.11",
+ "files": [
+ "System.Xml.ReaderWriter.4.0.11.nupkg.sha512",
+ "System.Xml.ReaderWriter.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Xml.ReaderWriter.dll",
+ "lib/netstandard1.3/System.Xml.ReaderWriter.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Xml.ReaderWriter.dll",
+ "ref/netcore50/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/de/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/es/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/fr/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/it/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/ja/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/ko/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/ru/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/zh-hans/System.Xml.ReaderWriter.xml",
+ "ref/netcore50/zh-hant/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/System.Xml.ReaderWriter.dll",
+ "ref/netstandard1.0/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/de/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/es/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/fr/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/it/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/ja/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/ko/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/ru/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/zh-hans/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.0/zh-hant/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/System.Xml.ReaderWriter.dll",
+ "ref/netstandard1.3/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/de/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/es/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/fr/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/it/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/ja/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/ko/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/ru/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/zh-hans/System.Xml.ReaderWriter.xml",
+ "ref/netstandard1.3/zh-hant/System.Xml.ReaderWriter.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Xml.XDocument/4.0.11": {
+ "sha512": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==",
+ "type": "package",
+ "path": "System.Xml.XDocument/4.0.11",
+ "files": [
+ "System.Xml.XDocument.4.0.11.nupkg.sha512",
+ "System.Xml.XDocument.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Xml.XDocument.dll",
+ "lib/netstandard1.3/System.Xml.XDocument.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Xml.XDocument.dll",
+ "ref/netcore50/System.Xml.XDocument.xml",
+ "ref/netcore50/de/System.Xml.XDocument.xml",
+ "ref/netcore50/es/System.Xml.XDocument.xml",
+ "ref/netcore50/fr/System.Xml.XDocument.xml",
+ "ref/netcore50/it/System.Xml.XDocument.xml",
+ "ref/netcore50/ja/System.Xml.XDocument.xml",
+ "ref/netcore50/ko/System.Xml.XDocument.xml",
+ "ref/netcore50/ru/System.Xml.XDocument.xml",
+ "ref/netcore50/zh-hans/System.Xml.XDocument.xml",
+ "ref/netcore50/zh-hant/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/System.Xml.XDocument.dll",
+ "ref/netstandard1.0/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/de/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/es/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/fr/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/it/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/ja/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/ko/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/ru/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/zh-hans/System.Xml.XDocument.xml",
+ "ref/netstandard1.0/zh-hant/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/System.Xml.XDocument.dll",
+ "ref/netstandard1.3/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/de/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/es/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/fr/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/it/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/ja/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/ko/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/ru/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/zh-hans/System.Xml.XDocument.xml",
+ "ref/netstandard1.3/zh-hant/System.Xml.XDocument.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Xml.XmlDocument/4.0.1": {
+ "sha512": "sDTrZPX5RBEsyGtaNEM48kd2SjfcyF+Nol2SdfrtOVbbjxe3lrJ+EfuidLgzTfd6SZoBi+nI2X8McT/kTp3/RQ==",
+ "type": "package",
+ "path": "System.Xml.XmlDocument/4.0.1",
+ "files": [
+ "System.Xml.XmlDocument.4.0.1.nupkg.sha512",
+ "System.Xml.XmlDocument.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net46/System.Xml.XmlDocument.dll",
+ "lib/netstandard1.3/System.Xml.XmlDocument.dll",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net46/System.Xml.XmlDocument.dll",
+ "ref/netstandard1.3/System.Xml.XmlDocument.dll",
+ "ref/netstandard1.3/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/de/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/es/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/fr/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/it/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/ja/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/ko/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/ru/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/zh-hans/System.Xml.XmlDocument.xml",
+ "ref/netstandard1.3/zh-hant/System.Xml.XmlDocument.xml",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._"
+ ]
+ },
+ "System.Xml.XmlSerializer/4.0.11": {
+ "sha512": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==",
+ "type": "package",
+ "path": "System.Xml.XmlSerializer/4.0.11",
+ "files": [
+ "System.Xml.XmlSerializer.4.0.11.nupkg.sha512",
+ "System.Xml.XmlSerializer.nuspec",
+ "ThirdPartyNotices.txt",
+ "dotnet_library_license.txt",
+ "lib/MonoAndroid10/_._",
+ "lib/MonoTouch10/_._",
+ "lib/net45/_._",
+ "lib/netcore50/System.Xml.XmlSerializer.dll",
+ "lib/netstandard1.3/System.Xml.XmlSerializer.dll",
+ "lib/portable-net45+win8+wp8+wpa81/_._",
+ "lib/win8/_._",
+ "lib/wp80/_._",
+ "lib/wpa81/_._",
+ "lib/xamarinios10/_._",
+ "lib/xamarinmac20/_._",
+ "lib/xamarintvos10/_._",
+ "lib/xamarinwatchos10/_._",
+ "ref/MonoAndroid10/_._",
+ "ref/MonoTouch10/_._",
+ "ref/net45/_._",
+ "ref/netcore50/System.Xml.XmlSerializer.dll",
+ "ref/netcore50/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/de/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/es/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/fr/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/it/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/ja/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/ko/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/ru/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/zh-hans/System.Xml.XmlSerializer.xml",
+ "ref/netcore50/zh-hant/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/System.Xml.XmlSerializer.dll",
+ "ref/netstandard1.0/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/de/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/es/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/fr/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/it/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/ja/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/ko/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/ru/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/zh-hans/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.0/zh-hant/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/System.Xml.XmlSerializer.dll",
+ "ref/netstandard1.3/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/de/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/es/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/fr/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/it/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/ja/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/ko/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/ru/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/zh-hans/System.Xml.XmlSerializer.xml",
+ "ref/netstandard1.3/zh-hant/System.Xml.XmlSerializer.xml",
+ "ref/portable-net45+win8+wp8+wpa81/_._",
+ "ref/win8/_._",
+ "ref/wp80/_._",
+ "ref/wpa81/_._",
+ "ref/xamarinios10/_._",
+ "ref/xamarinmac20/_._",
+ "ref/xamarintvos10/_._",
+ "ref/xamarinwatchos10/_._",
+ "runtimes/aot/lib/netcore50/System.Xml.XmlSerializer.dll"
+ ]
+ },
+ "MediaBrowser.Common/1.0.0": {
+ "type": "project",
+ "path": "../MediaBrowser.Common/project.json",
+ "msbuildProject": "../MediaBrowser.Common/MediaBrowser.Common.csproj"
+ },
+ "MediaBrowser.Controller/1.0.0": {
+ "type": "project",
+ "path": "../MediaBrowser.Controller/project.json",
+ "msbuildProject": "../MediaBrowser.Controller/MediaBrowser.Controller.csproj"
+ },
+ "MediaBrowser.Model/1.0.0": {
+ "type": "project",
+ "path": "../MediaBrowser.Model/project.json",
+ "msbuildProject": "../MediaBrowser.Model/MediaBrowser.Model.csproj"
+ },
+ "RSSDP/1.0.0": {
+ "type": "project",
+ "path": "../RSSDP/project.json",
+ "msbuildProject": "../RSSDP/RSSDP.xproj"
+ }
+ },
+ "projectFileDependencyGroups": {
+ "": [],
+ ".NETFramework,Version=v4.6": [
+ "MediaBrowser.Common",
+ "MediaBrowser.Controller",
+ "MediaBrowser.Model",
+ "RSSDP",
+ "System.Collections >= 4.0.0",
+ "System.IO >= 4.0.0",
+ "System.Xml >= 4.0.0",
+ "System.Xml.Linq >= 4.0.0",
+ "System.Xml.Serialization >= 4.0.0"
+ ],
+ ".NETStandard,Version=v1.6": [
+ "MediaBrowser.Common",
+ "MediaBrowser.Controller",
+ "MediaBrowser.Model",
+ "NETStandard.Library >= 1.6.0",
+ "RSSDP",
+ "System.Reflection >= 4.1.0",
+ "System.Reflection.Primitives >= 4.0.1",
+ "System.Runtime.Loader >= 4.0.0",
+ "System.Xml.XDocument >= 4.0.11",
+ "System.Xml.XmlDocument >= 4.0.1",
+ "System.Xml.XmlSerializer >= 4.0.11"
+ ]
+ },
+ "tools": {},
+ "projectFileToolGroups": {}
+} \ No newline at end of file