aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna
diff options
context:
space:
mode:
authorTavares André <tavares_and@hotmail.com>2015-04-30 18:20:10 +0200
committerTavares André <tavares_and@hotmail.com>2015-04-30 18:20:10 +0200
commitfcb2bc2c8e37e75ffbd324bf242eed5eb4372fb5 (patch)
treeb79635656f847f4920acdfa3c0910c2ce2c2c36c /MediaBrowser.Dlna
parentadc52db15a497a003cbea77cf11d907390390e96 (diff)
parenta4e28a60a4de902ef58ecfef54cb56250c23e5e7 (diff)
Merge branch 'dev' of https://github.com/MediaBrowser/MediaBrowser into dev
Diffstat (limited to 'MediaBrowser.Dlna')
-rw-r--r--MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs1
-rw-r--r--MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs11
-rw-r--r--MediaBrowser.Dlna/Didl/DidlBuilder.cs4
-rw-r--r--MediaBrowser.Dlna/DlnaManager.cs1
-rw-r--r--MediaBrowser.Dlna/Main/DlnaEntryPoint.cs56
-rw-r--r--MediaBrowser.Dlna/MediaBrowser.Dlna.csproj2
-rw-r--r--MediaBrowser.Dlna/PlayTo/PlayToController.cs11
-rw-r--r--MediaBrowser.Dlna/PlayTo/PlayToManager.cs130
-rw-r--r--MediaBrowser.Dlna/PlayTo/PlaylistItem.cs2
-rw-r--r--MediaBrowser.Dlna/Profiles/DefaultProfile.cs80
-rw-r--r--MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/DirectTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/LgTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/PopcornHourProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/Xbox360Profile.cs1
-rw-r--r--MediaBrowser.Dlna/Profiles/XboxOneProfile.cs1
-rw-r--r--MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs9
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpHandler.cs47
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpHelper.cs6
-rw-r--r--MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs22
34 files changed, 242 insertions, 160 deletions
diff --git a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
index 78db68f63..7e896492d 100644
--- a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
+++ b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Dlna.ContentDirectory;
using MediaBrowser.Dlna.PlayTo;
diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
index 3d7ae8cc4..246c23462 100644
--- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
+++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs
@@ -638,6 +638,17 @@ namespace MediaBrowser.Dlna.ContentDirectory
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[24];
+ }
+
if (id.StartsWith("folder_", StringComparison.OrdinalIgnoreCase))
{
stubType = StubType.Folder;
diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
index 52791822b..08f770735 100644
--- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs
+++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
@@ -149,8 +149,6 @@ namespace MediaBrowser.Dlna.Didl
targetHeight,
streamInfo.TargetVideoBitDepth,
streamInfo.TargetVideoBitrate,
- streamInfo.TargetAudioChannels,
- streamInfo.TargetAudioBitrate,
streamInfo.TargetTimestamp,
streamInfo.IsDirectStream,
streamInfo.RunTimeTicks,
@@ -276,11 +274,9 @@ namespace MediaBrowser.Dlna.Didl
streamInfo.AudioCodec,
streamInfo.VideoCodec,
streamInfo.TargetAudioBitrate,
- targetChannels,
targetWidth,
targetHeight,
streamInfo.TargetVideoBitDepth,
- streamInfo.TargetVideoBitrate,
streamInfo.TargetVideoProfile,
streamInfo.TargetVideoLevel,
streamInfo.TargetFramerate,
diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs
index f0f295c83..bdc8beb98 100644
--- a/MediaBrowser.Dlna/DlnaManager.cs
+++ b/MediaBrowser.Dlna/DlnaManager.cs
@@ -8,7 +8,6 @@ using MediaBrowser.Controller.Plugins;
using MediaBrowser.Dlna.Profiles;
using MediaBrowser.Dlna.Server;
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
index 4a8baf0fe..f9f9c3f18 100644
--- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
+++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
@@ -37,13 +37,26 @@ namespace MediaBrowser.Dlna.Main
private readonly ILocalizationManager _localization;
private readonly IMediaSourceManager _mediaSourceManager;
- private SsdpHandler _ssdpHandler;
+ private readonly SsdpHandler _ssdpHandler;
private DeviceDiscovery _deviceDiscovery;
private readonly List<string> _registeredServerIds = new List<string>();
private bool _dlnaServerStarted;
- 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)
+ 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,
+ ISsdpHandler ssdpHandler)
{
_config = config;
_appHost = appHost;
@@ -57,6 +70,7 @@ namespace MediaBrowser.Dlna.Main
_userDataManager = userDataManager;
_localization = localization;
_mediaSourceManager = mediaSourceManager;
+ _ssdpHandler = (SsdpHandler)ssdpHandler;
_logger = logManager.GetLogger("Dlna");
}
@@ -109,8 +123,6 @@ namespace MediaBrowser.Dlna.Main
{
try
{
- _ssdpHandler = new SsdpHandler(_logger, _config, GenerateServerSignature());
-
_ssdpHandler.Start();
_deviceDiscovery = new DeviceDiscovery(_logger, _config, _ssdpHandler, _appHost);
@@ -123,7 +135,7 @@ namespace MediaBrowser.Dlna.Main
}
}
- private void DisposeSsdpHandler()
+ private void DisposeDeviceDiscovery()
{
try
{
@@ -133,15 +145,6 @@ namespace MediaBrowser.Dlna.Main
{
_logger.ErrorException("Error disposing device discovery", ex);
}
-
- try
- {
- _ssdpHandler.Dispose();
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error disposing ssdp handler", ex);
- }
}
public void StartDlnaServer()
@@ -184,29 +187,6 @@ namespace MediaBrowser.Dlna.Main
}
}
- private string GenerateServerSignature()
- {
- var os = Environment.OSVersion;
- var pstring = os.Platform.ToString();
- switch (os.Platform)
- {
- case PlatformID.Win32NT:
- case PlatformID.Win32S:
- case PlatformID.Win32Windows:
- pstring = "WIN";
- break;
- }
-
- return String.Format(
- "{0}{1}/{2}.{3} UPnP/1.0 DLNADOC/1.5 MediaBrowser/{4}",
- pstring,
- IntPtr.Size * 8,
- os.Version.Major,
- os.Version.Minor,
- _appHost.ApplicationVersion
- );
- }
-
private readonly object _syncLock = new object();
private void StartPlayToManager()
{
@@ -260,7 +240,7 @@ namespace MediaBrowser.Dlna.Main
{
DisposeDlnaServer();
DisposePlayToManager();
- DisposeSsdpHandler();
+ DisposeDeviceDiscovery();
}
public void DisposeDlnaServer()
diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
index 0cbe36398..b4e93ed68 100644
--- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
+++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
@@ -77,6 +77,7 @@
<Compile Include="Common\DeviceService.cs" />
<Compile Include="Didl\DidlBuilder.cs" />
<Compile Include="PlayTo\PlayToController.cs" />
+ <Compile Include="Profiles\DefaultProfile.cs" />
<Compile Include="Profiles\DirectTvProfile.cs" />
<Compile Include="Profiles\DishHopperJoeyProfile.cs" />
<Compile Include="Profiles\PopcornHourProfile.cs" />
@@ -134,7 +135,6 @@
<Compile Include="Server\Headers.cs" />
<Compile Include="Server\UpnpDevice.cs" />
<Compile Include="Ssdp\SsdpMessageBuilder.cs" />
- <Compile Include="Ssdp\SsdpMessageEventArgs.cs" />
<Compile Include="Ssdp\SsdpHandler.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs
index 66cdc51af..5aa8c1f9c 100644
--- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs
+++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs
@@ -310,12 +310,12 @@ namespace MediaBrowser.Dlna.PlayTo
{
if (isFirst && command.StartPositionTicks.HasValue)
{
- playlist.Add(CreatePlaylistItem(item, user, command.StartPositionTicks.Value));
+ playlist.Add(CreatePlaylistItem(item, user, command.StartPositionTicks.Value, null, null, null));
isFirst = false;
}
else
{
- playlist.Add(CreatePlaylistItem(item, user, 0));
+ playlist.Add(CreatePlaylistItem(item, user, 0, null, null, null));
}
}
@@ -456,11 +456,6 @@ namespace MediaBrowser.Dlna.PlayTo
}
}
- private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks)
- {
- return CreatePlaylistItem(item, user, startPostionTicks, null, null, null);
- }
-
private PlaylistItem CreatePlaylistItem(BaseItem item, User user, long startPostionTicks, string mediaSourceId, int? audioStreamIndex, int? subtitleStreamIndex)
{
var deviceInfo = _device.Properties;
@@ -514,8 +509,6 @@ namespace MediaBrowser.Dlna.PlayTo
streamInfo.TargetHeight,
streamInfo.TargetVideoBitDepth,
streamInfo.TargetVideoBitrate,
- streamInfo.TargetAudioChannels,
- streamInfo.TargetAudioBitrate,
streamInfo.TargetTimestamp,
streamInfo.IsDirectStream,
streamInfo.RunTimeTicks,
diff --git a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
index 77c98f9b9..3c68af550 100644
--- a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
+++ b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs
@@ -13,6 +13,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
+using System.Threading;
namespace MediaBrowser.Dlna.PlayTo
{
@@ -34,6 +35,9 @@ namespace MediaBrowser.Dlna.PlayTo
private readonly DeviceDiscovery _deviceDiscovery;
private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly List<string> _nonRendererUrls = new List<string>();
+ private Timer _clearNonRenderersTimer;
+
public PlayToManager(ILogger logger, ISessionManager sessionManager, ILibraryManager libraryManager, IUserManager userManager, IDlnaManager dlnaManager, IServerApplicationHost appHost, IImageProcessor imageProcessor, DeviceDiscovery deviceDiscovery, IHttpClient httpClient, IServerConfigurationManager config, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager)
{
_logger = logger;
@@ -53,9 +57,19 @@ namespace MediaBrowser.Dlna.PlayTo
public void Start()
{
+ _clearNonRenderersTimer = new Timer(OnClearUrlTimerCallback, null, TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
+
_deviceDiscovery.DeviceDiscovered += _deviceDiscovery_DeviceDiscovered;
}
+ private void OnClearUrlTimerCallback(object state)
+ {
+ lock (_nonRendererUrls)
+ {
+ _nonRendererUrls.Clear();
+ }
+ }
+
async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
{
var localIp = e.LocalIp;
@@ -68,7 +82,7 @@ namespace MediaBrowser.Dlna.PlayTo
string location;
if (!e.Headers.TryGetValue("Location", out location)) location = string.Empty;
-
+
// It has to report that it's a media renderer
if (usn.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1 &&
nt.IndexOf("MediaRenderer:", StringComparison.OrdinalIgnoreCase) == -1)
@@ -85,60 +99,74 @@ namespace MediaBrowser.Dlna.PlayTo
{
var uri = new Uri(location);
+ lock (_nonRendererUrls)
+ {
+ if (_nonRendererUrls.Contains(location, StringComparer.OrdinalIgnoreCase))
+ {
+ return;
+ }
+ }
+
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
- if (device.RendererCommands != null)
+ if (device.RendererCommands == null)
{
- var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null)
- .ConfigureAwait(false);
+ lock (_nonRendererUrls)
+ {
+ _nonRendererUrls.Add(location);
+ return;
+ }
+ }
+
+ 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;
+ var controller = sessionInfo.SessionController as PlayToController;
- if (controller == null)
+ if (controller == null)
+ {
+ var serverAddress = GetServerAddress(localIp);
+ string accessToken = null;
+
+ sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
+ _sessionManager,
+ _libraryManager,
+ _logger,
+ _dlnaManager,
+ _userManager,
+ _imageProcessor,
+ serverAddress,
+ accessToken,
+ _deviceDiscovery,
+ _userDataManager,
+ _localization,
+ _mediaSourceManager);
+
+ controller.Init(device);
+
+ var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ??
+ _dlnaManager.GetDefaultProfile();
+
+ _sessionManager.ReportCapabilities(sessionInfo.Id, new ClientCapabilities
{
- var serverAddress = GetServerAddress(localIp);
- string accessToken = null;
-
- sessionInfo.SessionController = controller = new PlayToController(sessionInfo,
- _sessionManager,
- _libraryManager,
- _logger,
- _dlnaManager,
- _userManager,
- _imageProcessor,
- serverAddress,
- accessToken,
- _deviceDiscovery,
- _userDataManager,
- _localization,
- _mediaSourceManager);
-
- 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>
{
- 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);
- }
+ 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)
@@ -155,6 +183,12 @@ namespace MediaBrowser.Dlna.PlayTo
public void Dispose()
{
_deviceDiscovery.DeviceDiscovered -= _deviceDiscovery_DeviceDiscovered;
+
+ if (_clearNonRenderersTimer != null)
+ {
+ _clearNonRenderersTimer.Dispose();
+ _clearNonRenderersTimer = null;
+ }
}
}
}
diff --git a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs
index 2af9f8da9..e1f14bfa2 100644
--- a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs
+++ b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs
@@ -4,8 +4,6 @@ namespace MediaBrowser.Dlna.PlayTo
{
public class PlaylistItem
{
- public int PlayState { get; set; }
-
public string StreamUrl { get; set; }
public string Didl { get; set; }
diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
new file mode 100644
index 000000000..a243fd011
--- /dev/null
+++ b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs
@@ -0,0 +1,80 @@
+using MediaBrowser.Model.Dlna;
+using System.Xml.Serialization;
+
+namespace MediaBrowser.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";
+
+ FriendlyName = "Emby";
+ Manufacturer = "Emby";
+ ModelDescription = "Emby";
+ ModelName = "Emby";
+ ModelNumber = "Emby";
+ ModelUrl = "http://emby.media/";
+ ManufacturerUrl = "http://emby.media/";
+
+ AlbumArtPn = "JPEG_SM";
+
+ MaxAlbumArtHeight = 480;
+ MaxAlbumArtWidth = 480;
+
+ MaxIconWidth = 48;
+ MaxIconHeight = 48;
+
+ MaxStreamingBitrate = 8000000;
+ MaxStaticBitrate = 8000000;
+ MusicStreamingTranscodingBitrate = 128000;
+ MusicSyncBitrate = 128000;
+
+ 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 = "mp3,wma",
+ Type = DlnaProfileType.Audio
+ },
+
+ new DirectPlayProfile
+ {
+ Container = "avi,mp4",
+ Type = DlnaProfileType.Video
+ }
+ };
+ }
+ }
+}
diff --git a/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs b/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
index 224ae7715..f8451bdfd 100644
--- a/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs b/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
index 4c07c2827..585f8652e 100644
--- a/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DirectTvProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
index ab887a3bf..bd7b42d5d 100644
--- a/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/DishHopperJoeyProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs b/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
index 1d011a243..45cbbef6c 100644
--- a/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/LgTvProfile.cs b/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
index 8b887500e..4ecfd3c5b 100644
--- a/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/LgTvProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs b/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
index 0565f6c93..e7542ea9e 100644
--- a/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
@@ -1,7 +1,6 @@
using System.Xml.Serialization;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs b/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
index a73c6ccf4..7163252db 100644
--- a/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/MediaMonkeyProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
index 99dec2bc6..9e51c2895 100644
--- a/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/PopcornHourProfile.cs b/MediaBrowser.Dlna/Profiles/PopcornHourProfile.cs
index 883af57d2..c98609393 100644
--- a/MediaBrowser.Dlna/Profiles/PopcornHourProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/PopcornHourProfile.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using System.Xml.Serialization;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs b/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
index 970995b7d..396dd6489 100644
--- a/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using System.Xml.Serialization;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
index ed325e301..baaccba5a 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using System.Xml.Serialization;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
index 6802bf631..d2e6d7c15 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
index 46549040f..71f877232 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
index d9891e87b..0b157ae33 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
index 85643bace..0d974cbc0 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
index 0f7151a84..ac4cb2131 100644
--- a/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs b/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
index e92b0acfe..a99d7775a 100644
--- a/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
index 553d77c7f..a26c43911 100644
--- a/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using System.Xml.Serialization;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs b/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
index e3dd83224..62c06f8f5 100644
--- a/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
+++ b/MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Model.Dlna;
using System.Xml.Serialization;
-using MediaBrowser.Model.Dlna.Profiles;
namespace MediaBrowser.Dlna.Profiles
{
diff --git a/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs b/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
index 3427d75f7..4c3b049bd 100644
--- a/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
+++ b/MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dlna.Profiles;
using System.Xml.Serialization;
namespace MediaBrowser.Dlna.Profiles
diff --git a/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
index a90c6dc01..3dd482e64 100644
--- a/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
+++ b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
@@ -47,12 +48,13 @@ namespace MediaBrowser.Dlna.Ssdp
if (!network.SupportsMulticast || OperationalStatus.Up != network.OperationalStatus || !network.GetIPProperties().MulticastAddresses.Any())
continue;
-
- var ipV4 = network.GetIPProperties().GetIPv4Properties();
+
+ var properties = network.GetIPProperties();
+ var ipV4 = properties.GetIPv4Properties();
if (null == ipV4)
continue;
- var localIps = network.GetIPProperties().UnicastAddresses
+ var localIps = properties.UnicastAddresses
.Where(i => i.Address.AddressFamily == AddressFamily.InterNetwork)
.Select(i => i.Address)
.ToList();
@@ -182,7 +184,6 @@ namespace MediaBrowser.Dlna.Ssdp
}
}, _tokenSource.Token, TaskCreationOptions.LongRunning);
-
}
private Socket GetMulticastSocket(IPAddress localIpAddress, EndPoint localEndpoint)
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
index 73bc4984c..5b3746aeb 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
@@ -1,6 +1,8 @@
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
using MediaBrowser.Dlna.Server;
using MediaBrowser.Model.Logging;
using System;
@@ -16,7 +18,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Dlna.Ssdp
{
- public class SsdpHandler : IDisposable
+ public class SsdpHandler : IDisposable, ISsdpHandler
{
private Socket _socket;
@@ -39,13 +41,39 @@ namespace MediaBrowser.Dlna.Ssdp
private bool _isDisposed;
private readonly ConcurrentDictionary<Guid, List<UpnpDevice>> _devices = new ConcurrentDictionary<Guid, List<UpnpDevice>>();
- public SsdpHandler(ILogger logger, IServerConfigurationManager config, string serverSignature)
+ private readonly IApplicationHost _appHost;
+
+ public SsdpHandler(ILogger logger, IServerConfigurationManager config, IApplicationHost appHost)
{
_logger = logger;
_config = config;
- _serverSignature = serverSignature;
+ _appHost = appHost;
_config.NamedConfigurationUpdated += _config_ConfigurationUpdated;
+ _serverSignature = GenerateServerSignature();
+ }
+
+ private string GenerateServerSignature()
+ {
+ var os = Environment.OSVersion;
+ var pstring = os.Platform.ToString();
+ switch (os.Platform)
+ {
+ case PlatformID.Win32NT:
+ case PlatformID.Win32S:
+ case PlatformID.Win32Windows:
+ pstring = "WIN";
+ break;
+ }
+
+ return String.Format(
+ "{0}{1}/{2}.{3} UPnP/1.0 DLNADOC/1.5 MediaBrowser/{4}",
+ pstring,
+ IntPtr.Size * 8,
+ os.Version.Major,
+ os.Version.Minor,
+ _appHost.ApplicationVersion
+ );
}
void _config_ConfigurationUpdated(object sender, ConfigurationUpdateEventArgs e)
@@ -116,13 +144,14 @@ namespace MediaBrowser.Dlna.Ssdp
// Seconds to delay response
values["MX"] = "3";
- SendDatagram("M-SEARCH * HTTP/1.1", values, localIp);
+ // UDP is unreliable, so send 3 requests at a time (per Upnp spec, sec 1.1.2)
+ SendDatagram("M-SEARCH * HTTP/1.1", values, localIp, 2);
}
public void SendDatagram(string header,
Dictionary<string, string> values,
EndPoint localAddress,
- int sendCount = 1)
+ int sendCount)
{
SendDatagram(header, values, _ssdpEndp, localAddress, false, sendCount);
}
@@ -132,7 +161,7 @@ namespace MediaBrowser.Dlna.Ssdp
EndPoint endpoint,
EndPoint localAddress,
bool ignoreBindFailure,
- int sendCount = 1)
+ int sendCount)
{
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
var queued = false;
@@ -376,11 +405,11 @@ namespace MediaBrowser.Dlna.Ssdp
}
foreach (var d in RegisteredDevices)
{
- NotifyDevice(d, "alive");
+ NotifyDevice(d, "alive", 1);
}
}
- private void NotifyDevice(UpnpDevice dev, string type, int sendCount = 1)
+ private void NotifyDevice(UpnpDevice dev, string type, int sendCount)
{
const string header = "NOTIFY * HTTP/1.1";
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHelper.cs b/MediaBrowser.Dlna/Ssdp/SsdpHelper.cs
index 707f0b877..d196e9851 100644
--- a/MediaBrowser.Dlna/Ssdp/SsdpHelper.cs
+++ b/MediaBrowser.Dlna/Ssdp/SsdpHelper.cs
@@ -1,4 +1,5 @@
-using System;
+using MediaBrowser.Controller.Dlna;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
@@ -34,7 +35,8 @@ namespace MediaBrowser.Dlna.Ssdp
return new SsdpMessageEventArgs
{
Method = method,
- Headers = headers
+ Headers = headers,
+ Message = data
};
}
}
diff --git a/MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs b/MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs
deleted file mode 100644
index 602a5bfc1..000000000
--- a/MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Net;
-
-namespace MediaBrowser.Dlna.Ssdp
-{
- public class SsdpMessageEventArgs
- {
- public string Method { get; set; }
-
- public EndPoint EndPoint { get; set; }
-
- public Dictionary<string, string> Headers { get; set; }
-
- public IPAddress LocalIp { get; set; }
-
- public SsdpMessageEventArgs()
- {
- Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
- }
- }
-}