diff options
Diffstat (limited to 'MediaBrowser.Dlna')
36 files changed, 279 insertions, 129 deletions
diff --git a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs index cc5cb1b1a2..78db68f63f 100644 --- a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs +++ b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs @@ -45,7 +45,7 @@ namespace MediaBrowser.Dlna.Channels _localServersLookup = localServersLookup; _deviceDiscovery = deviceDiscovery; - deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered; + //deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered; deviceDiscovery.DeviceLeft += deviceDiscovery_DeviceLeft; } @@ -196,25 +196,16 @@ namespace MediaBrowser.Dlna.Channels public class ServerChannel : IChannel, IFactoryChannel { - private readonly List<Device> _servers = new List<Device>(); private readonly IHttpClient _httpClient; private readonly ILogger _logger; - private readonly string _controlUrl; + public string ControlUrl { get; set; } + public List<Device> Servers { get; set; } - /// <summary> - /// Prevents core from throwing an exception - /// </summary> - public ServerChannel() + public ServerChannel(IHttpClient httpClient, ILogger logger) { - - } - - public ServerChannel(List<Device> servers, IHttpClient httpClient, ILogger logger, string controlUrl) - { - _servers = servers; _httpClient = httpClient; _logger = logger; - _controlUrl = controlUrl; + Servers = new List<Device>(); } public string Name @@ -272,7 +263,7 @@ namespace MediaBrowser.Dlna.Channels if (string.IsNullOrWhiteSpace(query.FolderId)) { - items = _servers.Select(i => new ChannelItemInfo + items = Servers.Select(i => new ChannelItemInfo { FolderType = ChannelFolderType.Container, Id = GetServerId(i), @@ -291,7 +282,7 @@ namespace MediaBrowser.Dlna.Channels Limit = query.Limit, StartIndex = query.StartIndex, ParentId = folderId, - ContentDirectoryUrl = _controlUrl + ContentDirectoryUrl = ControlUrl }, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs b/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs index f594b4471d..f5731b8938 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ContentDirectory.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; @@ -21,6 +22,8 @@ namespace MediaBrowser.Dlna.ContentDirectory private readonly IDlnaManager _dlna; private readonly IServerConfigurationManager _config; private readonly IUserManager _userManager; + private readonly IUserViewManager _userViewManager; + private readonly IChannelManager _channelManager; public ContentDirectory(IDlnaManager dlna, IUserDataManager userDataManager, @@ -29,7 +32,7 @@ namespace MediaBrowser.Dlna.ContentDirectory IServerConfigurationManager config, IUserManager userManager, ILogger logger, - IHttpClient httpClient) + IHttpClient httpClient, IUserViewManager userViewManager, IChannelManager channelManager) : base(logger, httpClient) { _dlna = dlna; @@ -38,6 +41,8 @@ namespace MediaBrowser.Dlna.ContentDirectory _libraryManager = libraryManager; _config = config; _userManager = userManager; + _userViewManager = userViewManager; + _channelManager = channelManager; } private int SystemUpdateId @@ -73,7 +78,9 @@ namespace MediaBrowser.Dlna.ContentDirectory _userDataManager, user, SystemUpdateId, - _config) + _config, + _userViewManager, + _channelManager) .ProcessControlRequest(request); } diff --git a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs index b4f918e68b..1553435aeb 100644 --- a/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs +++ b/MediaBrowser.Dlna/ContentDirectory/ControlHandler.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; @@ -9,8 +10,10 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Dlna.Didl; using MediaBrowser.Dlna.Server; using MediaBrowser.Dlna.Service; +using MediaBrowser.Model.Channels; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Library; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using System; @@ -19,6 +22,7 @@ using System.Globalization; using System.Linq; using System.Text; using System.Threading; +using System.Threading.Tasks; using System.Xml; namespace MediaBrowser.Dlna.ContentDirectory @@ -40,14 +44,18 @@ namespace MediaBrowser.Dlna.ContentDirectory private readonly DidlBuilder _didlBuilder; private readonly DeviceProfile _profile; + private readonly IUserViewManager _userViewManager; + private readonly IChannelManager _channelManager; - public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config) + public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, IUserViewManager userViewManager, IChannelManager channelManager) : base(config, logger) { _libraryManager = libraryManager; _userDataManager = userDataManager; _user = user; _systemUpdateId = systemUpdateId; + _userViewManager = userViewManager; + _channelManager = channelManager; _profile = profile; _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress); @@ -69,7 +77,7 @@ namespace MediaBrowser.Dlna.ContentDirectory return HandleGetSystemUpdateID(); if (string.Equals(methodName, "Browse", StringComparison.OrdinalIgnoreCase)) - return HandleBrowse(methodParams, user, deviceId); + return HandleBrowse(methodParams, user, deviceId).Result; if (string.Equals(methodName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase)) return HandleXGetFeatureList(); @@ -78,7 +86,7 @@ namespace MediaBrowser.Dlna.ContentDirectory return HandleXSetBookmark(methodParams, user); if (string.Equals(methodName, "Search", StringComparison.OrdinalIgnoreCase)) - return HandleSearch(methodParams, user, deviceId); + return HandleSearch(methodParams, user, deviceId).Result; throw new ResourceNotFoundException("Unexpected control request name: " + methodName); } @@ -141,7 +149,7 @@ namespace MediaBrowser.Dlna.ContentDirectory return builder.ToString(); } - private IEnumerable<KeyValuePair<string, string>> HandleBrowse(Headers sparams, User user, string deviceId) + private async Task<IEnumerable<KeyValuePair<string, string>>> HandleBrowse(Headers sparams, User user, string deviceId) { var id = sparams["ObjectID"]; var flag = sparams["BrowseFlag"]; @@ -149,16 +157,20 @@ namespace MediaBrowser.Dlna.ContentDirectory var sortCriteria = new SortCriteria(sparams.GetValueOrDefault("SortCriteria", "")); var provided = 0; - var requested = 0; - var start = 0; - if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0) + int? requested = 0; + int? start = 0; + + int requestedVal; + if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0) { - requested = 0; + requested = requestedVal; } - if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0) + + int startVal; + if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0) { - start = 0; + start = startVal; } //var root = GetItem(id) as IMediaFolder; @@ -173,34 +185,26 @@ namespace MediaBrowser.Dlna.ContentDirectory var folder = (Folder)GetItemFromObjectId(id, user); - var children = GetChildrenSorted(folder, user, sortCriteria).ToList(); + var childrenResult = (await GetChildrenSorted(folder, user, sortCriteria, start, requested).ConfigureAwait(false)); - var totalCount = children.Count; + var totalCount = childrenResult.TotalRecordCount; if (string.Equals(flag, "BrowseMetadata")) { - result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, children.Count, filter)); + result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, folder, totalCount, filter)); provided++; } else { - if (start > 0) - { - children = children.Skip(start).ToList(); - } - if (requested > 0) - { - children = children.Take(requested).ToList(); - } - - provided = children.Count; + provided = childrenResult.Items.Length; - foreach (var i in children) + foreach (var i in childrenResult.Items) { if (i.IsFolder) { var f = (Folder)i; - var childCount = GetChildrenSorted(f, user, sortCriteria).Count(); + var childCount = (await GetChildrenSorted(f, user, sortCriteria, null, 0).ConfigureAwait(false)) + .TotalRecordCount; result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter)); } @@ -222,7 +226,7 @@ namespace MediaBrowser.Dlna.ContentDirectory }; } - private IEnumerable<KeyValuePair<string, string>> HandleSearch(Headers sparams, User user, string deviceId) + 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", "")); @@ -230,16 +234,19 @@ namespace MediaBrowser.Dlna.ContentDirectory // sort example: dc:title, dc:date - var requested = 0; - var start = 0; + int? requested = 0; + int? start = 0; - if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0) + int requestedVal; + if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requestedVal) && requestedVal > 0) { - requested = 0; + requested = requestedVal; } - if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0) + + int startVal; + if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out startVal) && startVal > 0) { - start = 0; + start = startVal; } //var root = GetItem(id) as IMediaFolder; @@ -259,27 +266,19 @@ namespace MediaBrowser.Dlna.ContentDirectory var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user); - var children = GetChildrenSorted(folder, user, searchCriteria, sortCriteria).ToList(); + var childrenResult = (await GetChildrenSorted(folder, user, searchCriteria, sortCriteria, start, requested).ConfigureAwait(false)); - var totalCount = children.Count; + var totalCount = childrenResult.TotalRecordCount; - if (start > 0) - { - children = children.Skip(start).ToList(); - } - if (requested > 0) - { - children = children.Take(requested).ToList(); - } - - var provided = children.Count; + var provided = childrenResult.Items.Length; - foreach (var i in children) + foreach (var i in childrenResult.Items) { if (i.IsFolder) { var f = (Folder)i; - var childCount = GetChildrenSorted(f, user, searchCriteria, sortCriteria).Count(); + var childCount = (await GetChildrenSorted(f, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false)) + .TotalRecordCount; result.DocumentElement.AppendChild(_didlBuilder.GetFolderElement(result, f, childCount, filter)); } @@ -300,15 +299,16 @@ namespace MediaBrowser.Dlna.ContentDirectory }; } - private IEnumerable<BaseItem> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort) + private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit) { if (search.SearchType == SearchType.Unknown) { - return GetChildrenSorted(folder, user, sort); + return await GetChildrenSorted(folder, user, sort, startIndex, limit).ConfigureAwait(false); } - var items = folder.GetRecursiveChildren(user); - items = FilterUnsupportedContent(items); + var result = await GetChildrenSorted(folder, user, sort, null, null).ConfigureAwait(false); + + var items = FilterUnsupportedContent(result.Items); if (search.SearchType == SearchType.Audio) { @@ -324,12 +324,123 @@ namespace MediaBrowser.Dlna.ContentDirectory } else if (search.SearchType == SearchType.Playlist) { + } - return SortItems(items, user, sort); + items = SortItems(items, user, sort); + + return ToResult(items, startIndex, limit); + } + + private async Task<QueryResult<BaseItem>> GetChildrenSorted(Folder folder, User user, SortCriteria sort, int? startIndex, int? limit) + { + if (folder is UserRootFolder) + { + var result = await _userViewManager.GetUserViews(new UserViewQuery + { + UserId = user.Id.ToString("N") + + }, CancellationToken.None).ConfigureAwait(false); + + return ToResult(result, startIndex, limit); + } + + var view = folder as UserView; + + if (view != null) + { + var result = await GetUserViewChildren(view, user, sort).ConfigureAwait(false); + + return ToResult(result, startIndex, limit); + } + + var channel = folder as Channel; + + if (channel != null) + { + return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channel.Id.ToString("N"), + Limit = limit, + StartIndex = startIndex, + UserId = user.Id.ToString("N") + + }, CancellationToken.None); + } + + var channelFolderItem = folder as ChannelFolderItem; + + if (channelFolderItem != null) + { + return await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channelFolderItem.ChannelId, + FolderId = channelFolderItem.Id.ToString("N"), + Limit = limit, + StartIndex = startIndex, + UserId = user.Id.ToString("N") + + }, CancellationToken.None); + } + + return ToResult(GetPlainFolderChildrenSorted(folder, user, sort), startIndex, limit); + } + + private QueryResult<BaseItem> ToResult(IEnumerable<BaseItem> items, int? startIndex, int? limit) + { + var list = items.ToArray(); + var totalCount = list.Length; + + if (startIndex.HasValue) + { + list = list.Skip(startIndex.Value).ToArray(); + } + + if (limit.HasValue) + { + list = list.Take(limit.Value).ToArray(); + } + + return new QueryResult<BaseItem> + { + Items = list, + TotalRecordCount = totalCount + }; + } + + private async Task<IEnumerable<BaseItem>> GetUserViewChildren(UserView folder, User user, SortCriteria sort) + { + if (string.Equals(folder.ViewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) + { + return new List<BaseItem>(); + } + if (string.Equals(folder.ViewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) + { + var result = await _channelManager.GetChannelsInternal(new ChannelQuery() + { + UserId = user.Id.ToString("N") + + }, CancellationToken.None).ConfigureAwait(false); + + return result.Items; + } + if (string.Equals(folder.ViewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) + { + return SortItems(folder.GetChildren(user, true).OfType<Series>(), user, sort); + } + if (string.Equals(folder.ViewType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) + { + return GetPlainFolderChildrenSorted(folder, user, sort); + } + if (string.Equals(folder.ViewType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) + { + return SortItems(folder.GetChildren(user, true).OfType<MusicArtist>(), user, sort); + } + + return GetPlainFolderChildrenSorted(folder, user, sort); } - private IEnumerable<BaseItem> GetChildrenSorted(Folder folder, User user, SortCriteria sort) + private IEnumerable<BaseItem> GetPlainFolderChildrenSorted(Folder folder, User user, SortCriteria sort) { var items = folder.GetChildren(user, true); @@ -345,7 +456,7 @@ namespace MediaBrowser.Dlna.ContentDirectory private IEnumerable<BaseItem> SortItems(IEnumerable<BaseItem> items, User user, SortCriteria sort) { - return _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending); + return _libraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, sort.SortOrder); } private IEnumerable<BaseItem> FilterUnsupportedContent(IEnumerable<BaseItem> items) @@ -353,14 +464,12 @@ namespace MediaBrowser.Dlna.ContentDirectory return items.Where(i => { // Unplayable - // TODO: Display and prevent playback with restricted flag? if (i.LocationType == LocationType.Virtual) { return false; } // Unplayable - // TODO: Display and prevent playback with restricted flag? var supportsPlaceHolder = i as ISupportsPlaceHolders; if (supportsPlaceHolder != null && supportsPlaceHolder.IsPlaceHolder) { @@ -368,7 +477,6 @@ namespace MediaBrowser.Dlna.ContentDirectory } // Upnp renderers won't understand these - // TODO: Display and prevent playback with restricted flag? if (i is Game || i is Book) { return false; diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index 739793c032..649ba2c8ff 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; @@ -612,6 +613,13 @@ namespace MediaBrowser.Dlna.Didl { return GetImageInfo(item, ImageType.Thumb); } + if (item.HasImage(ImageType.Backdrop)) + { + if (item is Channel) + { + return GetImageInfo(item, ImageType.Backdrop); + } + } if (item is Audio || item is Episode) { @@ -633,7 +641,7 @@ namespace MediaBrowser.Dlna.Didl try { - tag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary); + tag = _imageProcessor.GetImageCacheTag(item, type); } catch { diff --git a/MediaBrowser.Dlna/Images/logo120.jpg b/MediaBrowser.Dlna/Images/logo120.jpg Binary files differindex 1de803c8fa..394c8e1376 100644 --- a/MediaBrowser.Dlna/Images/logo120.jpg +++ b/MediaBrowser.Dlna/Images/logo120.jpg diff --git a/MediaBrowser.Dlna/Images/logo120.png b/MediaBrowser.Dlna/Images/logo120.png Binary files differindex 2dd04d4681..97bdef818b 100644 --- a/MediaBrowser.Dlna/Images/logo120.png +++ b/MediaBrowser.Dlna/Images/logo120.png diff --git a/MediaBrowser.Dlna/Images/logo240.jpg b/MediaBrowser.Dlna/Images/logo240.jpg Binary files differnew file mode 100644 index 0000000000..c805523516 --- /dev/null +++ b/MediaBrowser.Dlna/Images/logo240.jpg diff --git a/MediaBrowser.Dlna/Images/logo240.png b/MediaBrowser.Dlna/Images/logo240.png Binary files differnew file mode 100644 index 0000000000..532f123178 --- /dev/null +++ b/MediaBrowser.Dlna/Images/logo240.png diff --git a/MediaBrowser.Dlna/Images/logo48.jpg b/MediaBrowser.Dlna/Images/logo48.jpg Binary files differindex f1e7302aae..52b9853541 100644 --- a/MediaBrowser.Dlna/Images/logo48.jpg +++ b/MediaBrowser.Dlna/Images/logo48.jpg diff --git a/MediaBrowser.Dlna/Images/logo48.png b/MediaBrowser.Dlna/Images/logo48.png Binary files differindex 3b13d141ce..29d4a05289 100644 --- a/MediaBrowser.Dlna/Images/logo48.png +++ b/MediaBrowser.Dlna/Images/logo48.png diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index 461470b7ac..962c2a211e 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -184,6 +184,10 @@ <EmbeddedResource Include="Profiles\Xml\Windows 8 RT.xml" /> <EmbeddedResource Include="Profiles\Xml\Windows Phone.xml" /> </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="Images\logo240.jpg" /> + <EmbeddedResource Include="Images\logo240.png" /> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/MediaBrowser.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs index 85e18150ed..f67094554f 100644 --- a/MediaBrowser.Dlna/PlayTo/Device.cs +++ b/MediaBrowser.Dlna/PlayTo/Device.cs @@ -424,7 +424,7 @@ namespace MediaBrowser.Dlna.PlayTo } catch (Exception ex) { - _logger.ErrorException("Error updating device info", ex); + _logger.ErrorException("Error updating device info for {0}", ex, Properties.Name); _successiveStopCount++; @@ -444,7 +444,7 @@ namespace MediaBrowser.Dlna.PlayTo } catch (Exception ex) { - _logger.ErrorException("Error updating device info", ex); + _logger.ErrorException("Error updating device volume info for {0}", ex, Properties.Name); } } diff --git a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs index a5b816919f..a52c38086d 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToManager.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToManager.cs @@ -77,42 +77,44 @@ namespace MediaBrowser.Dlna.PlayTo return; } - var uri = new Uri(location); - - var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false); - - if (device.RendererCommands != null) + try { - var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null) - .ConfigureAwait(false); + var uri = new Uri(location); - var controller = sessionInfo.SessionController as PlayToController; + var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false); - if (controller == null) + if (device.RendererCommands != null) { - var serverAddress = GetServerAddress(localIp); + var sessionInfo = await _sessionManager.LogSessionActivity(device.Properties.ClientType, _appHost.ApplicationVersion.ToString(), device.Properties.UUID, device.Properties.Name, uri.OriginalString, null) + .ConfigureAwait(false); - sessionInfo.SessionController = controller = new PlayToController(sessionInfo, - _sessionManager, - _itemRepository, - _libraryManager, - _logger, - _dlnaManager, - _userManager, - _imageProcessor, - serverAddress, - _deviceDiscovery); + var controller = sessionInfo.SessionController as PlayToController; - controller.Init(device); + if (controller == null) + { + var serverAddress = GetServerAddress(localIp); - var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ?? - _dlnaManager.GetDefaultProfile(); + sessionInfo.SessionController = controller = new PlayToController(sessionInfo, + _sessionManager, + _itemRepository, + _libraryManager, + _logger, + _dlnaManager, + _userManager, + _imageProcessor, + serverAddress, + _deviceDiscovery); - _sessionManager.ReportCapabilities(sessionInfo.Id, new SessionCapabilities - { - PlayableMediaTypes = profile.GetSupportedMediaTypes(), + controller.Init(device); + + var profile = _dlnaManager.GetProfile(device.Properties.ToDeviceIdentification()) ?? + _dlnaManager.GetDefaultProfile(); - SupportedCommands = new List<string> + _sessionManager.ReportCapabilities(sessionInfo.Id, new SessionCapabilities + { + PlayableMediaTypes = profile.GetSupportedMediaTypes(), + + SupportedCommands = new List<string> { GeneralCommandType.VolumeDown.ToString(), GeneralCommandType.VolumeUp.ToString(), @@ -124,12 +126,17 @@ namespace MediaBrowser.Dlna.PlayTo GeneralCommandType.SetSubtitleStreamIndex.ToString() }, - SupportsMediaControl = true - }); + SupportsMediaControl = true + }); - _logger.Info("DLNA Session created for {0} - {1}", device.Properties.Name, device.Properties.ModelName); + _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 string GetServerAddress(IPAddress localIp) diff --git a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs index 0696b2691c..badb37cfc5 100644 --- a/MediaBrowser.Dlna/Profiles/DefaultProfile.cs +++ b/MediaBrowser.Dlna/Profiles/DefaultProfile.cs @@ -30,6 +30,8 @@ namespace MediaBrowser.Dlna.Profiles MaxStreamingBitrate = 8000000; MaxStaticBitrate = 8000000; + EnableAlbumArtInDidl = true; + TranscodingProfiles = new[] { new TranscodingProfile diff --git a/MediaBrowser.Dlna/Profiles/Xml/Android.xml b/MediaBrowser.Dlna/Profiles/Xml/Android.xml index 8d7b5ea2a8..549bea59ed 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Android.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Android.xml @@ -9,7 +9,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Default.xml b/MediaBrowser.Dlna/Profiles/Xml/Default.xml index 4cc1eca5d4..2ac840f445 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Default.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Default.xml @@ -9,7 +9,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml index e25224727f..891353f321 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml @@ -14,7 +14,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml index 26183da034..2acee1306f 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml @@ -15,7 +15,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml index 0c736cbff8..e5e726cc69 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml @@ -13,7 +13,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml index 39174d85a8..fe1a987ab8 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml @@ -15,7 +15,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml index 0166160149..9b59393b4c 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml @@ -16,7 +16,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml index 749b7a1339..f3ffd438c9 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml @@ -15,7 +15,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml index aa73bc91d9..2ddb362ac5 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml @@ -17,7 +17,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml index 1b133d8906..00f94455a1 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml @@ -16,7 +16,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://www.microsoft.com/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_TN</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml index 29e2a3d712..c985b041e8 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml @@ -16,7 +16,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://www.microsoft.com/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_TN</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml index 9805485a3d..8b44b67a66 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml @@ -16,7 +16,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://www.microsoft.com/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_TN</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml index e3068f23e8..843dc7819c 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml @@ -16,7 +16,7 @@ <ModelNumber>3.0</ModelNumber> <ModelUrl>http://www.microsoft.com/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_TN</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml index 98c781915d..b9e7c62a37 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml @@ -16,7 +16,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_TN</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml index fedc1db6a3..b2b4c31d39 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml @@ -16,7 +16,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml index 384a27ca57..766bfdecd4 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml @@ -13,7 +13,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml index aec5b44cb7..3c9528dc20 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml @@ -9,7 +9,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml index 17dd473be6..339b8debd7 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml @@ -16,7 +16,7 @@ <ModelNumber>12.0</ModelNumber> <ModelUrl>http://www.microsoft.com/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml index e23ad92136..63223fea71 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml @@ -14,7 +14,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio,Photo,Video</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml index 53d43a7e47..865d343b25 100644 --- a/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml +++ b/MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml @@ -15,7 +15,7 @@ <ModelNumber>Media Browser</ModelNumber> <ModelUrl>http://mediabrowser.tv/</ModelUrl> <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests> - <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl> + <EnableAlbumArtInDidl>true</EnableAlbumArtInDidl> <SupportedMediaTypes>Audio</SupportedMediaTypes> <AlbumArtPn>JPEG_SM</AlbumArtPn> <MaxAlbumArtWidth>512</MaxAlbumArtWidth> diff --git a/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs b/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs index 9efce5bb3e..f4f724d07a 100644 --- a/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs +++ b/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs @@ -137,6 +137,24 @@ namespace MediaBrowser.Dlna.Server { MimeType = "image/png", Depth = "24", + Width = 240, + Height = 240, + Url = "/mediabrowser/dlna/icons/logo240.png" + }); + + list.Add(new DeviceIcon + { + MimeType = "image/jpeg", + Depth = "24", + Width = 240, + Height = 240, + Url = "/mediabrowser/dlna/icons/logo240.jpg" + }); + + list.Add(new DeviceIcon + { + MimeType = "image/png", + Depth = "24", Width = 120, Height = 120, Url = "/mediabrowser/dlna/icons/logo120.png" diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs index 7002e566de..4c7c0d60c8 100644 --- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs +++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs @@ -90,9 +90,14 @@ namespace MediaBrowser.Dlna.Ssdp values["HOST"] = "239.255.255.250:1900"; values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2"; - values["ST"] = "ssdp:all"; + values["MAN"] = "\"ssdp:discover\""; - values["MX"] = "10"; + + // Search target + values["ST"] = "ssdp:all"; + + // Seconds to delay response + values["MX"] = "3"; SendDatagram("M-SEARCH * HTTP/1.1", values, localIp); } |
