2
0
Эх сурвалжийг харах

Merge pull request #1100 from MediaBrowser/dev

3.0.5607.2
Luke 10 жил өмнө
parent
commit
033919685a
51 өөрчлөгдсөн 325 нэмэгдсэн , 256 устгасан
  1. 1 0
      Emby.Drawing/Emby.Drawing.csproj
  2. 6 8
      Emby.Drawing/GDI/DynamicImageHelpers.cs
  3. 2 0
      Emby.Drawing/GDI/GDIImageEncoder.cs
  4. 43 0
      Emby.Drawing/ImageHelpers.cs
  5. 5 4
      Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
  6. 21 43
      Emby.Drawing/ImageMagick/StripCollageBuilder.cs
  7. 4 0
      Emby.Drawing/ImageProcessor.cs
  8. 1 1
      MediaBrowser.Api/ApiEntryPoint.cs
  9. 10 7
      MediaBrowser.Api/Dlna/DlnaServerService.cs
  10. 1 1
      MediaBrowser.Controller/Dlna/SsdpMessageEventArgs.cs
  11. 1 3
      MediaBrowser.Dlna/PlayTo/PlayToManager.cs
  12. 1 3
      MediaBrowser.Dlna/Profiles/DefaultProfile.cs
  13. 5 6
      MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
  14. 4 4
      MediaBrowser.Dlna/Profiles/Xml/BubbleUPnp.xml
  15. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Default.xml
  16. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
  17. 4 4
      MediaBrowser.Dlna/Profiles/Xml/DirecTV HD-DVR.xml
  18. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml
  19. 4 4
      MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
  20. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
  21. 4 4
      MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
  22. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
  23. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Popcorn Hour.xml
  24. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
  25. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
  26. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
  27. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
  28. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
  29. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
  30. 3 2
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
  31. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
  32. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Vlc.xml
  33. 4 4
      MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
  34. 8 6
      MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
  35. 4 4
      MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
  36. 4 4
      MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
  37. 31 13
      MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs
  38. 9 2
      MediaBrowser.Dlna/Ssdp/Datagram.cs
  39. 7 4
      MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
  40. 3 29
      MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
  41. 1 1
      MediaBrowser.Model/Configuration/EncodingOptions.cs
  42. 1 0
      MediaBrowser.Model/Dlna/DeviceProfile.cs
  43. 1 1
      MediaBrowser.Providers/TV/SeriesMetadataService.cs
  44. 2 2
      MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
  45. 3 0
      MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs
  46. 16 13
      MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
  47. 28 28
      MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
  48. 1 2
      MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs
  49. 16 5
      MediaBrowser.WebDashboard/Api/PackageCreator.cs
  50. 16 1
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
  51. 1 1
      SharedVersion.cs

+ 1 - 0
Emby.Drawing/Emby.Drawing.csproj

@@ -57,6 +57,7 @@
     <Compile Include="GDI\UnplayedCountIndicator.cs" />
     <Compile Include="IImageEncoder.cs" />
     <Compile Include="Common\ImageHeader.cs" />
+    <Compile Include="ImageHelpers.cs" />
     <Compile Include="ImageMagick\ImageMagickEncoder.cs" />
     <Compile Include="ImageMagick\StripCollageBuilder.cs" />
     <Compile Include="ImageProcessor.cs" />

+ 6 - 8
Emby.Drawing/GDI/DynamicImageHelpers.cs

@@ -1,11 +1,9 @@
-using Emby.Drawing.ImageMagick;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Common.IO;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
 using System.IO;
-using System.Linq;
 
 namespace Emby.Drawing.GDI
 {
@@ -18,10 +16,10 @@ namespace Emby.Drawing.GDI
             int height)
         {
             const int numStrips = 4;
-            files = StripCollageBuilder.ProjectPaths(files, numStrips).ToList();
-            
+            files = ImageHelpers.ProjectPaths(files, numStrips);
+
             const int rows = 1;
-             int cols = numStrips;
+            int cols = numStrips;
 
             int cellWidth = 2 * (width / 3);
             int cellHeight = height;
@@ -76,8 +74,8 @@ namespace Emby.Drawing.GDI
             int width,
             int height)
         {
-            files = StripCollageBuilder.ProjectPaths(files, 4).ToList();
-            
+            files = ImageHelpers.ProjectPaths(files, 4);
+
             const int rows = 2;
             const int cols = 2;
 

+ 2 - 0
Emby.Drawing/GDI/GDIImageEncoder.cs

@@ -21,6 +21,8 @@ namespace Emby.Drawing.GDI
         {
             _fileSystem = fileSystem;
             _logger = logger;
+
+            _logger.Info("GDI image processor initialized");
         }
 
         public string[] SupportedInputFormats

+ 43 - 0
Emby.Drawing/ImageHelpers.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Emby.Drawing
+{
+    internal static class ImageHelpers
+    {
+        internal static List<string> ProjectPaths(List<string> paths, int count)
+        {
+            if (count <= 0)
+            {
+                throw new ArgumentOutOfRangeException("count");
+            }
+            if (paths.Count == 0)
+            {
+                throw new ArgumentOutOfRangeException("paths");
+            }
+
+            var list = new List<string>();
+
+            AddToList(list, paths, count);
+
+            return list.Take(count).ToList();
+        }
+
+        private static void AddToList(List<string> list, List<string> paths, int count)
+        {
+            while (list.Count < count)
+            {
+                foreach (var path in paths)
+                {
+                    list.Add(path);
+
+                    if (list.Count >= count)
+                    {
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 5 - 4
Emby.Drawing/ImageMagick/ImageMagickEncoder.cs

@@ -1,4 +1,5 @@
-using ImageMagickSharp;
+using System.Linq;
+using ImageMagickSharp;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Model.Drawing;
@@ -195,15 +196,15 @@ namespace Emby.Drawing.ImageMagick
 
             if (ratio >= 1.4)
             {
-                new StripCollageBuilder(_appPaths).BuildThumbCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text);
+                new StripCollageBuilder(_appPaths).BuildThumbCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
             }
             else if (ratio >= .9)
             {
-                new StripCollageBuilder(_appPaths).BuildSquareCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text);
+                new StripCollageBuilder(_appPaths).BuildSquareCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
             }
             else
             {
-                new StripCollageBuilder(_appPaths).BuildPosterCollage(options.InputPaths, options.OutputPath, options.Width, options.Height, options.Text);
+                new StripCollageBuilder(_appPaths).BuildPosterCollage(options.InputPaths.ToList(), options.OutputPath, options.Width, options.Height, options.Text);
             }
         }
 

+ 21 - 43
Emby.Drawing/ImageMagick/StripCollageBuilder.cs

@@ -2,7 +2,6 @@
 using MediaBrowser.Common.Configuration;
 using System;
 using System.Collections.Generic;
-using System.Linq;
 
 namespace Emby.Drawing.ImageMagick
 {
@@ -15,7 +14,7 @@ namespace Emby.Drawing.ImageMagick
             _appPaths = appPaths;
         }
 
-        public void BuildPosterCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text)
+        public void BuildPosterCollage(List<string> paths, string outputPath, int width, int height, string text)
         {
             if (!string.IsNullOrWhiteSpace(text))
             {
@@ -33,7 +32,7 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        public void BuildSquareCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text)
+        public void BuildSquareCollage(List<string> paths, string outputPath, int width, int height, string text)
         {
             if (!string.IsNullOrWhiteSpace(text))
             {
@@ -51,7 +50,7 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        public void BuildThumbCollage(IEnumerable<string> paths, string outputPath, int width, int height, string text)
+        public void BuildThumbCollage(List<string> paths, string outputPath, int width, int height, string text)
         {
             if (!string.IsNullOrWhiteSpace(text))
             {
@@ -69,31 +68,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        internal static string[] ProjectPaths(IEnumerable<string> paths, int count)
+        private MagickWand BuildThumbCollageWandWithText(List<string> paths, string text, int width, int height)
         {
-            var clone = paths.ToList();
-            var list = new List<string>();
-
-            while (list.Count < count)
-            {
-                foreach (var path in clone)
-                {
-                    list.Add(path);
-
-                    if (list.Count >= count)
-                    {
-                        break;
-                    }
-                }
-            }
-
-            return list.Take(count).ToArray();
-        }
-
-        private MagickWand BuildThumbCollageWandWithText(IEnumerable<string> paths, string text, int width, int height)
-        {
-            var inputPaths = ProjectPaths(paths, 8);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 8);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");
@@ -165,10 +143,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        private MagickWand BuildPosterCollageWand(IEnumerable<string> paths, int width, int height)
+        private MagickWand BuildPosterCollageWand(List<string> paths, int width, int height)
         {
-            var inputPaths = ProjectPaths(paths, 4);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");
@@ -230,10 +208,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        private MagickWand BuildPosterCollageWandWithText(IEnumerable<string> paths, string label, int width, int height)
+        private MagickWand BuildPosterCollageWandWithText(List<string> paths, string label, int width, int height)
         {
-            var inputPaths = ProjectPaths(paths, 4);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");
@@ -305,10 +283,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        private MagickWand BuildThumbCollageWand(IEnumerable<string> paths, int width, int height)
+        private MagickWand BuildThumbCollageWand(List<string> paths, int width, int height)
         {
-            var inputPaths = ProjectPaths(paths, 8);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 8);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");
@@ -370,10 +348,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        private MagickWand BuildSquareCollageWand(IEnumerable<string> paths, int width, int height)
+        private MagickWand BuildSquareCollageWand(List<string> paths, int width, int height)
         {
-            var inputPaths = ProjectPaths(paths, 4);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");
@@ -435,10 +413,10 @@ namespace Emby.Drawing.ImageMagick
             }
         }
 
-        private MagickWand BuildSquareCollageWandWithText(IEnumerable<string> paths, string label, int width, int height)
+        private MagickWand BuildSquareCollageWandWithText(List<string> paths, string label, int width, int height)
         {
-            var inputPaths = ProjectPaths(paths, 4);
-            using (var wandImages = new MagickWand(inputPaths))
+            var inputPaths = ImageHelpers.ProjectPaths(paths, 4);
+            using (var wandImages = new MagickWand(inputPaths.ToArray()))
             {
                 var wand = new MagickWand(width, height);
                 wand.OpenImage("gradient:#111111-#111111");

+ 4 - 0
Emby.Drawing/ImageProcessor.cs

@@ -764,7 +764,11 @@ namespace Emby.Drawing
 
             try
             {
+                _logger.Debug("Creating image collage and saving to {0}", options.OutputPath);
+
                 _imageEncoder.CreateImageCollage(options);
+
+                _logger.Debug("Completed creation of image collage and saved to {0}", options.OutputPath);
             }
             finally
             {

+ 1 - 1
MediaBrowser.Api/ApiEntryPoint.cs

@@ -346,7 +346,7 @@ namespace MediaBrowser.Api
             // We can really reduce the timeout for apps that are using the newer api
             if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive)
             {
-                timerDuration = 60000;
+                timerDuration = 50000;
             }
 
             job.PingTimeout = timerDuration;

+ 10 - 7
MediaBrowser.Api/Dlna/DlnaServerService.cs

@@ -108,6 +108,9 @@ namespace MediaBrowser.Api.Dlna
         private readonly IConnectionManager _connectionManager;
         private readonly IMediaReceiverRegistrar _mediaReceiverRegistrar;
 
+        // TODO: Add utf-8
+        private const string XMLContentType = "text/xml";
+
         public DlnaServerService(IDlnaManager dlnaManager, IContentDirectory contentDirectory, IConnectionManager connectionManager, IMediaReceiverRegistrar mediaReceiverRegistrar)
         {
             _dlnaManager = dlnaManager;
@@ -122,49 +125,49 @@ namespace MediaBrowser.Api.Dlna
             var serverAddress = url.Substring(0, url.IndexOf("/dlna/", StringComparison.OrdinalIgnoreCase));
             var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId, serverAddress);
 
-            return ResultFactory.GetResult(xml, "text/xml");
+            return ResultFactory.GetResult(xml, XMLContentType);
         }
 
         public object Get(GetContentDirectory request)
         {
             var xml = _contentDirectory.GetServiceXml(GetRequestHeaders());
 
-            return ResultFactory.GetResult(xml, "text/xml");
+            return ResultFactory.GetResult(xml, XMLContentType);
         }
 
         public object Get(GetMediaReceiverRegistrar request)
         {
             var xml = _mediaReceiverRegistrar.GetServiceXml(GetRequestHeaders());
 
-            return ResultFactory.GetResult(xml, "text/xml");
+            return ResultFactory.GetResult(xml, XMLContentType);
         }
 
         public object Get(GetConnnectionManager request)
         {
             var xml = _connectionManager.GetServiceXml(GetRequestHeaders());
 
-            return ResultFactory.GetResult(xml, "text/xml");
+            return ResultFactory.GetResult(xml, XMLContentType);
         }
 
         public async Task<object> Post(ProcessMediaReceiverRegistrarControlRequest request)
         {
             var response = await PostAsync(request.RequestStream, _mediaReceiverRegistrar).ConfigureAwait(false);
 
-            return ResultFactory.GetResult(response.Xml, "text/xml");
+            return ResultFactory.GetResult(response.Xml, XMLContentType);
         }
 
         public async Task<object> Post(ProcessContentDirectoryControlRequest request)
         {
             var response = await PostAsync(request.RequestStream, _contentDirectory).ConfigureAwait(false);
 
-            return ResultFactory.GetResult(response.Xml, "text/xml");
+            return ResultFactory.GetResult(response.Xml, XMLContentType);
         }
 
         public async Task<object> Post(ProcessConnectionManagerControlRequest request)
         {
             var response = await PostAsync(request.RequestStream, _connectionManager).ConfigureAwait(false);
 
-            return ResultFactory.GetResult(response.Xml, "text/xml");
+            return ResultFactory.GetResult(response.Xml, XMLContentType);
         }
 
         private async Task<ControlResponse> PostAsync(Stream requestStream, IUpnpService service)

+ 1 - 1
MediaBrowser.Controller/Dlna/SsdpMessageEventArgs.cs

@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Dlna
 
         public Dictionary<string, string> Headers { get; set; }
 
-        public IPAddress LocalIp { get; set; }
+        public IPEndPoint LocalEndPoint { get; set; }
         public byte[] Message { get; set; }
 
         public SsdpMessageEventArgs()

+ 1 - 3
MediaBrowser.Dlna/PlayTo/PlayToManager.cs

@@ -72,8 +72,6 @@ namespace MediaBrowser.Dlna.PlayTo
 
         async void _deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
         {
-            var localIp = e.LocalIp;
-
             string usn;
             if (!e.Headers.TryGetValue("USN", out usn)) usn = string.Empty;
 
@@ -125,7 +123,7 @@ namespace MediaBrowser.Dlna.PlayTo
 
                 if (controller == null)
                 {
-                    var serverAddress = GetServerAddress(localIp);
+                    var serverAddress = GetServerAddress(e.LocalEndPoint.Address);
                     string accessToken = null;
 
                     sessionInfo.SessionController = controller = new PlayToController(sessionInfo,

+ 1 - 3
MediaBrowser.Dlna/Profiles/DefaultProfile.cs

@@ -37,6 +37,7 @@ namespace MediaBrowser.Dlna.Profiles
             MusicSyncBitrate = 128000;
 
             EnableAlbumArtInDidl = false;
+            EnableDlnaProtocol = true;
 
             TranscodingProfiles = new[]
             {
@@ -76,9 +77,6 @@ namespace MediaBrowser.Dlna.Profiles
                     Type = DlnaProfileType.Video
                 }
             };
-
-            AddXmlRootAttribute("xmlns", "urn:schemas-upnp-org:device-1-0");
-            AddXmlRootAttribute("xmlns:dlna", "urn:schemas-dlna-org:device-1-0");
         }
 
         public void AddXmlRootAttribute(string name, string value)

+ 5 - 6
MediaBrowser.Dlna/Profiles/Xbox360Profile.cs

@@ -14,22 +14,24 @@ namespace MediaBrowser.Dlna.Profiles
             Name = "Xbox 360";
 
             // Required according to above
-            ModelName = "Windows Media Player Sharing";
+            ModelName = "Windows Media Connect";
 
             ModelNumber = "12.0";
 
-            FriendlyName = "${HostName}: Emby:";
+            FriendlyName = "${HostName}: 1";
 
             ModelUrl = "http://go.microsoft.com/fwlink/?LinkId=105926";
             Manufacturer = "Microsoft Corporation";
             ManufacturerUrl = "http://www.microsoft.com";
             XDlnaDoc = "DMS-1.50";
-            ModelDescription = null;
+            ModelDescription = "Emby : UPnP Media Server";
+            ModelNumber = "001";
 
             TimelineOffsetSeconds = 40;
             RequiresPlainFolders = true;
             RequiresPlainVideoItems = true;
             EnableMSMediaReceiverRegistrar = true;
+            EnableDlnaProtocol = false;
 
             Identification = new DeviceIdentification
             {
@@ -312,9 +314,6 @@ namespace MediaBrowser.Dlna.Profiles
                     }
                 }
             };
-
-            XmlRootAttributes = new XmlAttribute[] { };
-            AddXmlRootAttribute("xmlns", "urn:schemas-upnp-org:device-1-0");
         }
     }
 }

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/BubbleUPnp.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />
     <DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Default.xml

@@ -26,10 +26,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,wma" type="Audio" />
     <DirectPlayProfile container="avi,mp4" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml

@@ -31,10 +31,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
   </DirectPlayProfiles>

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/DirecTV HD-DVR.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>true</RequiresPlainVideoItems>
   <RequiresPlainFolders>true</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg2video" type="Video" />
     <DirectPlayProfile container="jpeg,jpg" type="Photo" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Dish Hopper-Joey.xml

@@ -33,10 +33,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp4,mkv,mpeg,ts" audioCodec="mp3,ac3,aac,he-aac,pcm" videoCodec="h264,mpeg2video" type="Video" />
     <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />
     <DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml

@@ -30,10 +30,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
     <DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
     <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml

@@ -33,9 +33,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:pv" value="http://www.pv.com/pvns/" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Popcorn Hour.xml

@@ -26,10 +26,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp4,mov" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />
     <DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" />

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml

@@ -32,9 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:sec" value="http://www.sec.co.kr/" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml

@@ -32,9 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml

@@ -34,9 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml

@@ -34,9 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml

@@ -34,9 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml

@@ -34,9 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 3 - 2
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml

@@ -34,9 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
   <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
     <XmlAttribute name="xmlns:av" value="urn:schemas-sony-com:av" />
   </XmlRootAttributes>
   <DirectPlayProfiles>

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml

@@ -34,10 +34,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" />
     <DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Vlc.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi,mpeg,mkv,ts,mp4,mov,m4v,asf,webm,ogg,ogv,iso" type="Video" />
     <DirectPlayProfile container="mp3,flac,asf,off,oga,aac" type="Audio" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml

@@ -33,10 +33,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />
     <DirectPlayProfile container="mpeg" audioCodec="ac3,dca,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video" type="Video" />

+ 8 - 6
MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml

@@ -8,11 +8,12 @@
       <HttpHeaderInfo name="User-Agent" value="Xenon" match="Substring" />
     </Headers>
   </Identification>
-  <FriendlyName>${HostName}: Emby:</FriendlyName>
+  <FriendlyName>${HostName}: 1</FriendlyName>
   <Manufacturer>Microsoft Corporation</Manufacturer>
   <ManufacturerUrl>http://www.microsoft.com</ManufacturerUrl>
-  <ModelName>Windows Media Player Sharing</ModelName>
-  <ModelNumber>12.0</ModelNumber>
+  <ModelName>Windows Media Connect</ModelName>
+  <ModelDescription>Emby : UPnP Media Server</ModelDescription>
+  <ModelNumber>001</ModelNumber>
   <ModelUrl>http://go.microsoft.com/fwlink/?LinkId=105926</ModelUrl>
   <EnableAlbumArtInDidl>false</EnableAlbumArtInDidl>
   <EnableSingleAlbumArtLimit>false</EnableSingleAlbumArtLimit>
@@ -32,9 +33,10 @@
   <RequiresPlainVideoItems>true</RequiresPlainVideoItems>
   <RequiresPlainFolders>true</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>true</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>false</EnableDlnaProtocol>
+  <EnableUrlBase>true</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
     <DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml

@@ -33,10 +33,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="ts" audioCodec="ac3" videoCodec="h264" type="Video" />
     <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />

+ 4 - 4
MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml

@@ -32,10 +32,10 @@
   <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
   <RequiresPlainFolders>false</RequiresPlainFolders>
   <EnableMSMediaReceiverRegistrar>false</EnableMSMediaReceiverRegistrar>
-  <XmlRootAttributes>
-    <XmlAttribute name="xmlns" value="urn:schemas-upnp-org:device-1-0" />
-    <XmlAttribute name="xmlns:dlna" value="urn:schemas-dlna-org:device-1-0" />
-  </XmlRootAttributes>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <EnableDlnaProtocol>true</EnableDlnaProtocol>
+  <EnableUrlBase>false</EnableUrlBase>
+  <XmlRootAttributes />
   <DirectPlayProfiles>
     <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
     <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />

+ 31 - 13
MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs

@@ -51,10 +51,28 @@ namespace MediaBrowser.Dlna.Server
             builder.Append("<?xml version=\"1.0\"?>");
 
             builder.Append("<root");
-            foreach (var att in _profile.XmlRootAttributes)
+
+            var attributes = _profile.XmlRootAttributes.ToList();
+
+            if (_profile.EnableDlnaProtocol)
+            {
+                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>");
@@ -74,34 +92,33 @@ namespace MediaBrowser.Dlna.Server
             builder.Append("<device>");
             AppendDeviceProperties(builder);
 
-            //AppendIconList(builder);
+            if (_profile.EnableDlnaProtocol)
+            {
+                AppendIconList(builder);
+            }
             AppendServiceList(builder);
             builder.Append("</device>");
         }
 
         private void AppendDeviceProperties(StringBuilder builder)
         {
-            builder.Append("<UDN>uuid:" + SecurityElement.Escape(_serverUdn) + "</UDN>");
+            builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
 
-            if (!string.IsNullOrWhiteSpace(_profile.XDlnaCap))
+            if (_profile.EnableDlnaProtocol)
             {
                 builder.Append("<dlna:X_DLNACAP>" + SecurityElement.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\">" + SecurityElement.Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>");
             }
 
-            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\">" + SecurityElement.Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>");
-            
             builder.Append("<friendlyName>" + SecurityElement.Escape(GetFriendlyName()) + "</friendlyName>");
-            builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
             builder.Append("<manufacturer>" + SecurityElement.Escape(_profile.Manufacturer ?? string.Empty) + "</manufacturer>");
             builder.Append("<manufacturerURL>" + SecurityElement.Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>");
+
+            builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
             builder.Append("<modelName>" + SecurityElement.Escape(_profile.ModelName ?? string.Empty) + "</modelName>");
 
-            if (!string.IsNullOrWhiteSpace(_profile.ModelDescription))
-            {
-                builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
-            }
-            
             builder.Append("<modelNumber>" + SecurityElement.Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>");
             builder.Append("<modelURL>" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>");
 
@@ -114,6 +131,7 @@ namespace MediaBrowser.Dlna.Server
                 builder.Append("<serialNumber>" + SecurityElement.Escape(_profile.SerialNumber) + "</serialNumber>");
             }
 
+            builder.Append("<UDN>uuid:" + SecurityElement.Escape(_serverUdn) + "</UDN>");
             builder.Append("<presentationURL>" + SecurityElement.Escape(_serverAddress) + "</presentationURL>");
 
             if (!EnableAbsoluteUrls)

+ 9 - 2
MediaBrowser.Dlna/Ssdp/Datagram.cs

@@ -30,7 +30,7 @@ namespace MediaBrowser.Dlna.Ssdp
         {
             var msg = Encoding.ASCII.GetBytes(Message);
 
-            var socket = CreateSocket();
+            var socket = CreateSocket(!IgnoreBindFailure);
 
             if (socket == null)
             {
@@ -102,13 +102,20 @@ namespace MediaBrowser.Dlna.Ssdp
             }
         }
 
-        private Socket CreateSocket()
+        private Socket CreateSocket(bool isBroadcast)
         {
             try
             {
                 var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
 
                 socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
+
+                if (isBroadcast)
+                {
+                    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
+                    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 4);
+                }
+
                 return socket;
             }
             catch (Exception ex)

+ 7 - 4
MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs

@@ -87,11 +87,14 @@ namespace MediaBrowser.Dlna.Ssdp
 
             try
             {
-                var ip = _appHost.LocalIpAddress;
+                if (e.LocalEndPoint == null)
+                {
+                    var ip = _appHost.LocalIpAddress;
+                    e.LocalEndPoint = new IPEndPoint(IPAddress.Parse(ip), 0);
+                }
 
-                if (!string.IsNullOrWhiteSpace(ip))
+                if (e.LocalEndPoint != null)
                 {
-                    e.LocalIp = IPAddress.Parse(ip);
                     TryCreateDevice(e);
                 }
             }
@@ -140,7 +143,7 @@ namespace MediaBrowser.Dlna.Ssdp
                         {
                             var args = SsdpHelper.ParseSsdpResponse(receiveBuffer);
                             args.EndPoint = endPoint;
-                            args.LocalIp = localIp;
+                            args.LocalEndPoint = new IPEndPoint(localIp, 0);
 
                             if (!_ssdpHandler.IsSelfNotification(args))
                             {

+ 3 - 29
MediaBrowser.Dlna/Ssdp/SsdpHandler.cs

@@ -139,15 +139,7 @@ namespace MediaBrowser.Dlna.Ssdp
             values["MX"] = "3";
 
             // 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)
-        {
-            SendDatagram(header, values, _ssdpEndp, localAddress, false, sendCount);
+            SendDatagram("M-SEARCH * HTTP/1.1", values, _ssdpEndp, localIp, false, 2);
         }
 
         public void SendDatagram(string header,
@@ -433,27 +425,9 @@ namespace MediaBrowser.Dlna.Ssdp
 
             if (string.Equals(server, _serverSignature, StringComparison.OrdinalIgnoreCase))
             {
-                return true;
+                //return true;
             }
             return false;
-            //string usn;
-            //args.Headers.TryGetValue("USN", out usn);
-
-            //if (string.IsNullOrWhiteSpace(usn))
-            //{
-            //    return false;
-            //}
-
-            //_logger.Debug("IsSelfNotification test: " + usn);
-
-            //return RegisteredDevices.Any(i =>
-            //{
-            //    var isSameDevice = string.Equals(usn, i.USN, StringComparison.OrdinalIgnoreCase) ||
-            //           i.USN.IndexOf(usn, StringComparison.OrdinalIgnoreCase) != 1 ||
-            //           usn.IndexOf(i.USN, StringComparison.OrdinalIgnoreCase) != 1;
-
-            //    return isSameDevice;
-            //});
         }
 
         public void Dispose()
@@ -542,7 +516,7 @@ namespace MediaBrowser.Dlna.Ssdp
                 _logger.Debug("{0} said {1}", dev.USN, type);
             }
 
-            SendDatagram(header, values, new IPEndPoint(dev.Address, 0), sendCount);
+            SendDatagram(header, values, _ssdpEndp, new IPEndPoint(dev.Address, 0), false, sendCount);
         }
 
         public void RegisterNotification(Guid uuid, Uri descriptionUri, IPAddress address, IEnumerable<string> services)

+ 1 - 1
MediaBrowser.Model/Configuration/EncodingOptions.cs

@@ -17,7 +17,7 @@ namespace MediaBrowser.Model.Configuration
             DownMixAudioBoost = 2;
             EncodingQuality = EncodingQuality.Auto;
             EnableThrottling = true;
-            ThrottleThresholdSeconds = 120;
+            ThrottleThresholdSeconds = 110;
         }
     }
 }

+ 1 - 0
MediaBrowser.Model/Dlna/DeviceProfile.cs

@@ -77,6 +77,7 @@ namespace MediaBrowser.Model.Dlna
 
         public bool EnableMSMediaReceiverRegistrar { get; set; }
         public bool IgnoreTranscodeByteRangeRequests { get; set; }
+        public bool EnableDlnaProtocol { get; set; }
 
         public XmlAttribute[] XmlRootAttributes { get; set; }
 

+ 1 - 1
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -52,7 +52,7 @@ namespace MediaBrowser.Providers.TV
                 target.Status = source.Status;
             }
 
-            if (replaceData || target.AirDays.Count == 0)
+            if (replaceData || target.AirDays == null || target.AirDays.Count == 0)
             {
                 target.AirDays = source.AirDays;
             }

+ 2 - 2
MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs

@@ -108,9 +108,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         {
             var endpoint = e.EndPoint as IPEndPoint;
 
-            if (endpoint != null && e.LocalIp != null)
+            if (endpoint != null && e.LocalEndPoint != null)
             {
-                NatUtility.Handle(e.LocalIp, e.Message, endpoint, NatProtocol.Upnp);
+                NatUtility.Handle(e.LocalEndPoint.Address, e.Message, endpoint, NatProtocol.Upnp);
             }
         }
 

+ 3 - 0
MediaBrowser.Server.Implementations/Localization/LocalizationManager.cs

@@ -252,6 +252,9 @@ namespace MediaBrowser.Server.Implementations.Localization
                 throw new ArgumentNullException("rating");
             }
 
+            // Fairly common for some users to have "Rated R" in their rating field
+            rating = rating.Replace("Rated ", string.Empty, StringComparison.OrdinalIgnoreCase);
+
             var ratingsDictionary = GetParentalRatingsDictionary();
 
             ParentalRating value;

+ 16 - 13
MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs

@@ -103,7 +103,7 @@ namespace MediaBrowser.Server.Implementations.Photos
             return parts.GetMD5().ToString("N");
         }
 
-        protected Task CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
+        protected Task<bool> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
         {
             return CreateCollage(primaryItem, items, outputPath, 960, 540, drawText, primaryItem.Name);
         }
@@ -115,22 +115,22 @@ namespace MediaBrowser.Server.Implementations.Photos
                 .Where(i => !string.IsNullOrWhiteSpace(i));
         }
 
-        protected Task CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
+        protected Task<bool> CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
         {
             return CreateCollage(primaryItem, items, outputPath, 600, 900, true, primaryItem.Name);
         }
 
-        protected Task CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
+        protected Task<bool> CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, bool drawText)
         {
             return CreateCollage(primaryItem, items, outputPath, 800, 800, drawText, primaryItem.Name);
         }
 
-        protected Task CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
+        protected Task<bool> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
         {
             return CreateCollage(primaryItem, items, outputPath, width, height, drawText, text);
         }
 
-        private Task CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
+        private Task<bool> CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height, bool drawText, string text)
         {
             Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
 
@@ -143,7 +143,13 @@ namespace MediaBrowser.Server.Implementations.Photos
                 InputPaths = GetStripCollageImagePaths(primaryItem, items).ToArray()
             };
 
-            return ImageProcessor.CreateImageCollage(options);
+            if (options.InputPaths.Length == 0)
+            {
+                return Task.FromResult(false);
+            }
+
+            ImageProcessor.CreateImageCollage(options);
+            return Task.FromResult(true);
         }
 
         public string Name
@@ -166,26 +172,23 @@ namespace MediaBrowser.Server.Implementations.Photos
 
             if (imageType == ImageType.Thumb)
             {
-                await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
-                return true;
+                return await CreateThumbCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
             }
 
             if (imageType == ImageType.Primary)
             {
                 if (item is UserView)
                 {
-                    await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
+                    return await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
                 }
                 else if (item is PhotoAlbum || item is Playlist)
                 {
-                    await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
+                    return await CreateSquareCollage(item, itemsWithImages, outputPath, drawText).ConfigureAwait(false);
                 }
                 else
                 {
-                    await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
+                    return await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
                 }
-
-                return true;
             }
 
             throw new ArgumentException("Unexpected image type");

+ 28 - 28
MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs

@@ -8,37 +8,37 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Server.Implementations.Photos
 {
-    //public class PhotoAlbumImageProvider : IDynamicImageProvider
-    //{
-    //    public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
-    //    {
-    //        return new List<ImageType> { ImageType.Primary };
-    //    }
+    public class PhotoAlbumImageProvider : IDynamicImageProvider
+    {
+        public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
+        {
+            return new List<ImageType> { ImageType.Primary };
+        }
 
-    //    public Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
-    //    {
-    //        var album = (PhotoAlbum)item;
+        public Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
+        {
+            var album = (PhotoAlbum)item;
 
-    //        var image = album.Children
-    //            .OfType<Photo>()
-    //            .Select(i => i.GetImagePath(type))
-    //            .FirstOrDefault(i => !string.IsNullOrEmpty(i));
+            var image = album.Children
+                .OfType<Photo>()
+                .Select(i => i.GetImagePath(type))
+                .FirstOrDefault(i => !string.IsNullOrEmpty(i));
 
-    //        return Task.FromResult(new DynamicImageResponse
-    //        {
-    //            Path = image,
-    //            HasImage = !string.IsNullOrEmpty(image)
-    //        });
-    //    }
+            return Task.FromResult(new DynamicImageResponse
+            {
+                Path = image,
+                HasImage = !string.IsNullOrEmpty(image)
+            });
+        }
 
-    //    public string Name
-    //    {
-    //        get { return "Image Extractor"; }
-    //    }
+        public string Name
+        {
+            get { return "Image Extractor"; }
+        }
 
-    //    public bool Supports(IHasImages item)
-    //    {
-    //        return item is PhotoAlbum;
-    //    }
-    //}
+        public bool Supports(IHasImages item)
+        {
+            return item is PhotoAlbum;
+        }
+    }
 }

+ 1 - 2
MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs

@@ -224,8 +224,7 @@ namespace MediaBrowser.Server.Implementations.UserViews
                     return false;
                 }
 
-                await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540, false, item.Name).ConfigureAwait(false);
-                return true;
+                return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540, false, item.Name).ConfigureAwait(false);
             }
 
             return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false);

+ 16 - 5
MediaBrowser.WebDashboard/Api/PackageCreator.cs

@@ -9,6 +9,7 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WebMarkupMin.Core;
 using WebMarkupMin.Core.Minifiers;
 using WebMarkupMin.Core.Settings;
 
@@ -32,9 +33,9 @@ namespace MediaBrowser.WebDashboard.Api
         }
 
         public async Task<Stream> GetResource(string path,
-            string mode, 
+            string mode,
             string localizationCulture,
-            string appVersion, 
+            string appVersion,
             bool enableMinification)
         {
             var isHtml = IsHtml(path);
@@ -58,7 +59,7 @@ namespace MediaBrowser.WebDashboard.Api
             {
                 // Don't apply any caching for html pages
                 // jQuery ajax doesn't seem to handle if-modified-since correctly
-                if (isHtml)
+                if (isHtml && path.IndexOf("cordovaindex.html", StringComparison.OrdinalIgnoreCase) == -1)
                 {
                     resourceStream = await ModifyHtml(resourceStream, mode, localizationCulture, enableMinification).ConfigureAwait(false);
                 }
@@ -137,7 +138,12 @@ namespace MediaBrowser.WebDashboard.Api
                     {
                         try
                         {
-                            var minifier = new HtmlMinifier(new HtmlMinificationSettings());
+                            var minifier = new HtmlMinifier(new HtmlMinificationSettings
+                            {
+                                AttributeQuotesRemovalMode = HtmlAttributeQuotesRemovalMode.KeepQuotes,
+                                RemoveOptionalEndTags = false,
+                                RemoveTagsWithoutContent = false
+                            });
                             var result = minifier.Minify(html, false);
 
                             if (result.Errors.Count > 0)
@@ -313,7 +319,7 @@ namespace MediaBrowser.WebDashboard.Api
 
             if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
             {
-                apiClientFiles.Add("thirdparty/apiclient/cordova/serverdiscovery.js");
+                apiClientFiles.Add("thirdparty/cordova/serverdiscovery.js");
             }
             else
             {
@@ -321,6 +327,11 @@ namespace MediaBrowser.WebDashboard.Api
             }
             apiClientFiles.Add("thirdparty/apiclient/connectionmanager.js");
 
+            if (string.Equals(mode, "cordova", StringComparison.OrdinalIgnoreCase))
+            {
+                apiClientFiles.Add("thirdparty/cordova/remotecontrols.js");
+            }
+
             foreach (var file in apiClientFiles)
             {
                 using (var fs = _fileSystem.GetFileStream(GetDashboardResourcePath(file), FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true))

+ 16 - 1
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -213,7 +213,13 @@
     <Content Include="dashboard-ui\thirdparty\apiclient\connectservice.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\apiclient\cordova\serverdiscovery.js">
+    <Content Include="dashboard-ui\cordovaindex.html">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="dashboard-ui\thirdparty\cordova\remotecontrols.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="dashboard-ui\thirdparty\cordova\serverdiscovery.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     <Content Include="dashboard-ui\thirdparty\apiclient\deferred.js">
@@ -1665,6 +1671,9 @@
     <Content Include="dashboard-ui\thirdparty\jstree3.0.8\themes\default\throbber.gif">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\thirdparty\masonry.pkgd.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\thirdparty\require.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -2288,6 +2297,9 @@
     <None Include="dashboard-ui\css\fonts\RobotoThin.woff">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="dashboard-ui\thirdparty\fontawesome\css\font-awesome.css.map">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.eot">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
@@ -2297,6 +2309,9 @@
     <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="dashboard-ui\thirdparty\fontawesome\fonts\fontawesome-webfont.woff2">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="dashboard-ui\thirdparty\fontawesome\fonts\FontAwesome.otf">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>

+ 1 - 1
SharedVersion.cs

@@ -1,4 +1,4 @@
 using System.Reflection;
 
 //[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5607.1")]
+[assembly: AssemblyVersion("3.0.5607.2")]