Browse Source

Create profile xml structure

Luke Pulverenti 11 năm trước cách đây
mục cha
commit
4e2764e516
58 tập tin đã thay đổi với 1601 bổ sung122 xóa
  1. 18 14
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  2. 3 0
      MediaBrowser.Api/Playback/StreamRequest.cs
  3. 12 0
      MediaBrowser.Controller/Dlna/CodecProfile.cs
  4. 4 0
      MediaBrowser.Controller/Dlna/ContainerProfile.cs
  5. 7 0
      MediaBrowser.Controller/Dlna/DeviceIdentification.cs
  6. 23 17
      MediaBrowser.Controller/Dlna/DeviceProfile.cs
  7. 7 0
      MediaBrowser.Controller/Dlna/DirectPlayProfile.cs
  8. 12 10
      MediaBrowser.Controller/Dlna/IDlnaManager.cs
  9. 11 0
      MediaBrowser.Controller/Dlna/MediaProfile.cs
  10. 14 0
      MediaBrowser.Controller/Dlna/TranscodingProfile.cs
  11. 197 10
      MediaBrowser.Dlna/DlnaManager.cs
  12. 21 1
      MediaBrowser.Dlna/MediaBrowser.Dlna.csproj
  13. 1 13
      MediaBrowser.Dlna/PlayTo/CurrentIdEventArgs.cs
  14. 4 3
      MediaBrowser.Dlna/PlayTo/Device.cs
  15. 19 13
      MediaBrowser.Dlna/PlayTo/DlnaController.cs
  16. 2 0
      MediaBrowser.Dlna/PlayTo/PlaylistItem.cs
  17. 1 0
      MediaBrowser.Dlna/PlayTo/StreamHelper.cs
  18. 2 0
      MediaBrowser.Dlna/Profiles/DefaultProfile.cs
  19. 3 1
      MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs
  20. 3 1
      MediaBrowser.Dlna/Profiles/Foobar2000Profile.cs
  21. 3 1
      MediaBrowser.Dlna/Profiles/LgTvProfile.cs
  22. 3 1
      MediaBrowser.Dlna/Profiles/LinksysDMA2100Profile.cs
  23. 19 17
      MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs
  24. 3 1
      MediaBrowser.Dlna/Profiles/SamsungSmartTvProfile.cs
  25. 3 1
      MediaBrowser.Dlna/Profiles/SonyBlurayPlayer2013Profile.cs
  26. 3 1
      MediaBrowser.Dlna/Profiles/SonyBlurayPlayerProfile.cs
  27. 3 1
      MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs
  28. 3 1
      MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs
  29. 3 1
      MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs
  30. 3 1
      MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs
  31. 3 1
      MediaBrowser.Dlna/Profiles/SonyPs3Profile.cs
  32. 3 1
      MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs
  33. 3 1
      MediaBrowser.Dlna/Profiles/Xbox360Profile.cs
  34. 3 1
      MediaBrowser.Dlna/Profiles/XboxOneProfile.cs
  35. 39 0
      MediaBrowser.Dlna/Profiles/Xml/Default.xml
  36. 43 0
      MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
  37. 71 0
      MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
  38. 43 0
      MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
  39. 64 0
      MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
  40. 100 0
      MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
  41. 17 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
  42. 19 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
  43. 98 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
  44. 101 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
  45. 84 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
  46. 84 0
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
  47. 92 0
      MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
  48. 78 0
      MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
  49. 103 0
      MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
  50. 45 0
      MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
  51. 45 0
      MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
  52. 3 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  53. 3 0
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  54. 30 0
      MediaBrowser.Model/Dlna/DeviceProfileInfo.cs
  55. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  56. 5 2
      MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
  57. 5 5
      MediaBrowser.ServerApplication/ApplicationHost.cs
  58. 6 2
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

+ 18 - 14
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -1210,85 +1210,89 @@ namespace MediaBrowser.Api.Playback
 
                 if (i == 0)
                 {
-                    request.DeviceId = val;
+                    request.DeviceProfileId = val;
                 }
                 else if (i == 1)
                 {
-                    request.MediaSourceId = val;
+                    request.DeviceId = val;
                 }
                 else if (i == 2)
                 {
-                    request.Static = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
+                    request.MediaSourceId = val;
                 }
                 else if (i == 3)
+                {
+                    request.Static = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
+                }
+                else if (i == 4)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.VideoCodec = val;
                     }
                 }
-                else if (i == 4)
+                else if (i == 5)
                 {
                     request.AudioCodec = val;
                 }
-                else if (i == 5)
+                else if (i == 6)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.AudioStreamIndex = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 6)
+                else if (i == 7)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.SubtitleStreamIndex = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 7)
+                else if (i == 8)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.VideoBitRate = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 8)
+                else if (i == 9)
                 {
                     request.AudioBitRate = int.Parse(val, UsCulture);
                 }
-                else if (i == 9)
+                else if (i == 10)
                 {
                     request.MaxAudioChannels = int.Parse(val, UsCulture);
                 }
-                else if (i == 10)
+                else if (i == 11)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.MaxWidth = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 11)
+                else if (i == 12)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.MaxHeight = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 12)
+                else if (i == 13)
                 {
                     if (videoRequest != null)
                     {
                         videoRequest.Framerate = int.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 13)
+                else if (i == 14)
                 {
                     if (videoRequest != null)
                     {
                         request.StartTimeTicks = long.Parse(val, UsCulture);
                     }
                 }
-                else if (i == 14)
+                else if (i == 15)
                 {
                     if (videoRequest != null)
                     {

+ 3 - 0
MediaBrowser.Api/Playback/StreamRequest.cs

@@ -65,6 +65,9 @@ namespace MediaBrowser.Api.Playback
         [ApiMember(Name = "Static", Description = "Optional. If true, the original file will be streamed statically without any encoding. Use either no url extension or the original file extension. true/false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
         public bool Static { get; set; }
 
+        [ApiMember(Name = "DeviceProfileId", Description = "Optional. The dlna device profile id to utilize.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string DeviceProfileId { get; set; }
+        
         /// <summary>
         /// For testing purposes
         /// </summary>

+ 12 - 0
MediaBrowser.Controller/Dlna/CodecProfile.cs

@@ -1,13 +1,18 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public class CodecProfile
     {
+        [XmlAttribute("type")]
         public CodecType Type { get; set; }
+       
         public ProfileCondition[] Conditions { get; set; }
+
+        [XmlAttribute("codec")]
         public string Codec { get; set; }
 
         public CodecProfile()
@@ -37,9 +42,16 @@ namespace MediaBrowser.Controller.Dlna
 
     public class ProfileCondition
     {
+        [XmlAttribute("condition")]
         public ProfileConditionType Condition { get; set; }
+
+        [XmlAttribute("property")]
         public ProfileConditionValue Property { get; set; }
+
+        [XmlAttribute("value")]
         public string Value { get; set; }
+
+        [XmlAttribute("isRequired")]
         public bool IsRequired { get; set; }
 
         public ProfileCondition()

+ 4 - 0
MediaBrowser.Controller/Dlna/ContainerProfile.cs

@@ -1,12 +1,16 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public class ContainerProfile
     {
+        [XmlAttribute("type")]
         public DlnaProfileType Type { get; set; }
         public ProfileCondition[] Conditions { get; set; }
+
+        [XmlAttribute("container")]
         public string Container { get; set; }
 
         public ContainerProfile()

+ 7 - 0
MediaBrowser.Controller/Dlna/DeviceIdentification.cs

@@ -1,4 +1,6 @@
 
+using System.Xml.Serialization;
+
 namespace MediaBrowser.Controller.Dlna
 {
     public class DeviceIdentification
@@ -62,8 +64,13 @@ namespace MediaBrowser.Controller.Dlna
 
     public class HttpHeaderInfo
     {
+        [XmlAttribute("name")]
         public string Name { get; set; }
+
+        [XmlAttribute("value")]
         public string Value { get; set; }
+
+        [XmlAttribute("match")]
         public HeaderMatchType Match { get; set; }
     }
 

+ 23 - 17
MediaBrowser.Controller/Dlna/DeviceProfile.cs

@@ -1,9 +1,12 @@
 using MediaBrowser.Model.Entities;
 using System;
 using System.Linq;
+using System.Runtime.Serialization;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
+    [XmlRoot("Profile")]
     public class DeviceProfile
     {
         /// <summary>
@@ -12,19 +15,9 @@ namespace MediaBrowser.Controller.Dlna
         /// <value>The name.</value>
         public string Name { get; set; }
 
-        /// <summary>
-        /// Gets or sets the transcoding profiles.
-        /// </summary>
-        /// <value>The transcoding profiles.</value>
-        public TranscodingProfile[] TranscodingProfiles { get; set; }
-
-        /// <summary>
-        /// Gets or sets the direct play profiles.
-        /// </summary>
-        /// <value>The direct play profiles.</value>
-        public DirectPlayProfile[] DirectPlayProfiles { get; set; }
-
-        public ContainerProfile[] ContainerProfiles { get; set; }
+        [XmlIgnore]
+        [IgnoreDataMember]
+        public string Id { get; set; }
 
         /// <summary>
         /// Gets or sets the identification.
@@ -57,14 +50,27 @@ namespace MediaBrowser.Controller.Dlna
 
         public string ProtocolInfo { get; set; }
 
-        public MediaProfile[] MediaProfiles { get; set; }
-        public CodecProfile[] CodecProfiles { get; set; }
-
         public int TimelineOffsetSeconds { get; set; }
-
         public bool RequiresPlainVideoItems { get; set; }
         public bool RequiresPlainFolders { get; set; }
 
+        /// <summary>
+        /// Gets or sets the direct play profiles.
+        /// </summary>
+        /// <value>The direct play profiles.</value>
+        public DirectPlayProfile[] DirectPlayProfiles { get; set; }
+
+        /// <summary>
+        /// Gets or sets the transcoding profiles.
+        /// </summary>
+        /// <value>The transcoding profiles.</value>
+        public TranscodingProfile[] TranscodingProfiles { get; set; }
+
+        public ContainerProfile[] ContainerProfiles { get; set; }
+
+        public CodecProfile[] CodecProfiles { get; set; }
+        public MediaProfile[] MediaProfiles { get; set; }
+
         public DeviceProfile()
         {
             DirectPlayProfiles = new DirectPlayProfile[] { };

+ 7 - 0
MediaBrowser.Controller/Dlna/DirectPlayProfile.cs

@@ -1,14 +1,21 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public class DirectPlayProfile
     {
+        [XmlAttribute("container")]
         public string Container { get; set; }
+
+        [XmlAttribute("audioCodec")]
         public string AudioCodec { get; set; }
+
+        [XmlAttribute("videoCodec")]
         public string VideoCodec { get; set; }
 
+        [XmlAttribute("type")]
         public DlnaProfileType Type { get; set; }
 
         public List<string> GetContainers()

+ 12 - 10
MediaBrowser.Controller/Dlna/IDlnaManager.cs

@@ -1,20 +1,15 @@
-using System.Collections.Generic;
+using MediaBrowser.Model.Dlna;
+using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public interface IDlnaManager
     {
         /// <summary>
-        /// Gets the dlna profiles.
+        /// Gets the profile infos.
         /// </summary>
-        /// <returns>IEnumerable{DlnaProfile}.</returns>
-        IEnumerable<DeviceProfile> GetProfiles();
-
-        /// <summary>
-        /// Gets the default profile.
-        /// </summary>
-        /// <returns>DlnaProfile.</returns>
-        DeviceProfile GetDefaultProfile();
+        /// <returns>IEnumerable{DeviceProfileInfo}.</returns>
+        IEnumerable<DeviceProfileInfo> GetProfileInfos();
 
         /// <summary>
         /// Gets the profile.
@@ -23,6 +18,13 @@ namespace MediaBrowser.Controller.Dlna
         /// <returns>DeviceProfile.</returns>
         DeviceProfile GetProfile(IDictionary<string,string> headers);
 
+        /// <summary>
+        /// Gets the profile.
+        /// </summary>
+        /// <param name="id">The identifier.</param>
+        /// <returns>DeviceProfile.</returns>
+        DeviceProfile GetProfile(string id);
+        
         /// <summary>
         /// Gets the profile.
         /// </summary>

+ 11 - 0
MediaBrowser.Controller/Dlna/MediaProfile.cs

@@ -1,16 +1,27 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public class MediaProfile
     {
+        [XmlAttribute("container")]
         public string Container { get; set; }
+
+        [XmlAttribute("audioCodec")]
         public string AudioCodec { get; set; }
+
+        [XmlAttribute("videoCodec")]
         public string VideoCodec { get; set; }
 
+        [XmlAttribute("type")]
         public DlnaProfileType Type { get; set; }
+
+        [XmlAttribute("orgPn")]
         public string OrgPn { get; set; }
+
+        [XmlAttribute("mimeType")]
         public string MimeType { get; set; }
 
         public ProfileCondition[] Conditions { get; set; }

+ 14 - 0
MediaBrowser.Controller/Dlna/TranscodingProfile.cs

@@ -1,19 +1,30 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Controller.Dlna
 {
     public class TranscodingProfile
     {
+        [XmlAttribute("container")]
         public string Container { get; set; }
 
+        [XmlAttribute("type")]
         public DlnaProfileType Type { get; set; }
 
+        [XmlAttribute("videoCodec")]
         public string VideoCodec { get; set; }
+
+        [XmlAttribute("audioCodec")]
         public string AudioCodec { get; set; }
 
+        [XmlAttribute("estimateContentLength")]
         public bool EstimateContentLength { get; set; }
+
+        [XmlAttribute("enableMpegtsM2TsMode")]
         public bool EnableMpegtsM2TsMode { get; set; }
+
+        [XmlAttribute("transcodeSeekInfo")]
         public TranscodeSeekInfo TranscodeSeekInfo { get; set; }
 
         public TranscodingSetting[] Settings { get; set; }
@@ -32,7 +43,10 @@ namespace MediaBrowser.Controller.Dlna
 
     public class TranscodingSetting
     {
+        [XmlAttribute("name")]
         public TranscodingSettingType Name { get; set; }
+
+        [XmlAttribute("value")]
         public string Value { get; set; }
     }
 

+ 197 - 10
MediaBrowser.Dlna/DlnaManager.cs

@@ -1,10 +1,14 @@
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Dlna.Profiles;
+using MediaBrowser.Model.Dlna;
+using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 
@@ -12,21 +16,36 @@ namespace MediaBrowser.Dlna
 {
     public class DlnaManager : IDlnaManager
     {
-        private IApplicationPaths _appPaths;
+        private readonly IApplicationPaths _appPaths;
         private readonly IXmlSerializer _xmlSerializer;
         private readonly IFileSystem _fileSystem;
-        private readonly IJsonSerializer _jsonSerializer;
+        private readonly ILogger _logger;
 
-        public DlnaManager(IXmlSerializer xmlSerializer, IFileSystem fileSystem, IJsonSerializer jsonSerializer)
+        public DlnaManager(IXmlSerializer xmlSerializer, IFileSystem fileSystem, IApplicationPaths appPaths, ILogger logger)
         {
             _xmlSerializer = xmlSerializer;
             _fileSystem = fileSystem;
-            _jsonSerializer = jsonSerializer;
+            _appPaths = appPaths;
+            _logger = logger;
 
-            GetProfiles();
+            //DumpProfiles();
         }
 
         public IEnumerable<DeviceProfile> GetProfiles()
+        {
+            ExtractProfilesIfNeeded();
+
+            var list = GetProfiles(UserProfilesPath)
+                .OrderBy(i => i.Name)
+                .ToList();
+
+            list.AddRange(GetProfiles(SystemProfilesPath)
+                .OrderBy(i => i.Name));
+
+            return list;
+        }
+
+        private void DumpProfiles()
         {
             var list = new List<DeviceProfile>
             {
@@ -45,16 +64,40 @@ namespace MediaBrowser.Dlna
                 new DenonAvrProfile(),
                 new LinksysDMA2100Profile(),
                 new LgTvProfile(),
-                new Foobar2000Profile()
+                new Foobar2000Profile(),
+                new DefaultProfile()
             };
 
             foreach (var item in list)
             {
-                //_xmlSerializer.SerializeToFile(item, "d:\\" + _fileSystem.GetValidFilename(item.Name) + ".xml");
-                //_jsonSerializer.SerializeToFile(item, "d:\\" + _fileSystem.GetValidFilename(item.Name) + ".json");
+                _xmlSerializer.SerializeToFile(item, "d:\\" + _fileSystem.GetValidFilename(item.Name) + ".xml");
             }
+        }
 
-            return list;
+        private bool _extracted;
+        private readonly object _syncLock = new object();
+        private void ExtractProfilesIfNeeded()
+        {
+            if (!_extracted)
+            {
+                lock (_syncLock)
+                {
+                    if (!_extracted)
+                    {
+                        try
+                        {
+                            ExtractSystemProfiles();
+                        }
+                        catch (Exception ex)
+                        {
+                            _logger.ErrorException("Error extracting DLNA profiles.", ex);
+                        }
+
+                        _extracted = true;
+                    }
+
+                }
+            }
         }
 
         public DeviceProfile GetDefaultProfile()
@@ -64,8 +107,12 @@ namespace MediaBrowser.Dlna
 
         public DeviceProfile GetProfile(DeviceIdentification deviceInfo)
         {
-            return GetProfiles().FirstOrDefault(i => IsMatch(deviceInfo, i.Identification)) ??
+            var profile = GetProfiles().FirstOrDefault(i => IsMatch(deviceInfo, i.Identification)) ??
                 GetDefaultProfile();
+
+            _logger.Debug("Found matching device profile: {0}", profile.Name);
+
+            return profile;
         }
 
         private bool IsMatch(DeviceIdentification deviceInfo, DeviceIdentification profileInfo)
@@ -159,5 +206,145 @@ namespace MediaBrowser.Dlna
 
             return false;
         }
+
+        private string UserProfilesPath
+        {
+            get
+            {
+                return Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "user");
+            }
+        }
+
+        private string SystemProfilesPath
+        {
+            get
+            {
+                return Path.Combine(_appPaths.ConfigurationDirectoryPath, "dlna", "system");
+            }
+        }
+
+        private IEnumerable<DeviceProfile> GetProfiles(string path)
+        {
+            try
+            {
+                return new DirectoryInfo(path)
+                    .EnumerateFiles("*", SearchOption.TopDirectoryOnly)
+                    .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase))
+                    .Select(i => ParseProfileXmlFile(i.FullName))
+                    .Where(i => i != null)
+                    .ToList();
+            }
+            catch (DirectoryNotFoundException)
+            {
+                return new List<DeviceProfile>();
+            }
+        }
+
+        private DeviceProfile ParseProfileXmlFile(string path)
+        {
+            try
+            {
+                var profile = (DeviceProfile)_xmlSerializer.DeserializeFromFile(typeof(DeviceProfile), path);
+
+                profile.Id = path.ToLower().GetMD5().ToString("N");
+
+                return profile;
+            }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Error parsing profile xml: {0}", ex, path);
+
+                return null;
+            }
+        }
+
+        public DeviceProfile GetProfile(string id)
+        {
+            var info = GetProfileInfosInternal().First(i => string.Equals(i.Info.Id, id));
+
+            return ParseProfileXmlFile(info.Path);
+        }
+
+        private IEnumerable<InternalProfileInfo> GetProfileInfosInternal()
+        {
+            ExtractProfilesIfNeeded();
+
+            return GetProfileInfos(UserProfilesPath, DeviceProfileType.User)
+                .Concat(GetProfileInfos(SystemProfilesPath, DeviceProfileType.System))
+                .OrderBy(i => i.Info.Type == DeviceProfileType.User ? 0 : 1)
+                .ThenBy(i => i.Info.Name);
+        }
+
+        public IEnumerable<DeviceProfileInfo> GetProfileInfos()
+        {
+            return GetProfileInfosInternal().Select(i => i.Info);
+        }
+
+        private IEnumerable<InternalProfileInfo> GetProfileInfos(string path, DeviceProfileType type)
+        {
+            try
+            {
+                return new DirectoryInfo(path)
+                    .EnumerateFiles("*", SearchOption.TopDirectoryOnly)
+                    .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase))
+                    .Select(i => new InternalProfileInfo
+                    {
+                        Path = i.FullName,
+
+                        Info = new DeviceProfileInfo
+                        {
+                            Id = i.FullName.ToLower().GetMD5().ToString("N"),
+                            Name = Path.GetFileNameWithoutExtension(i.FullName),
+                            Type = type
+                        }
+                    })
+                    .ToList();
+            }
+            catch (DirectoryNotFoundException)
+            {
+                return new List<InternalProfileInfo>();
+            }
+        }
+
+        private void ExtractSystemProfiles()
+        {
+            var assembly = GetType().Assembly;
+            var namespaceName = GetType().Namespace + ".Profiles.Xml.";
+
+            var systemProfilesPath = SystemProfilesPath;
+
+            foreach (var name in assembly.GetManifestResourceNames()
+                .Where(i => i.StartsWith(namespaceName))
+                .ToList())
+            {
+                var filename = Path.GetFileName(name).Substring(namespaceName.Length);
+
+                var path = Path.Combine(systemProfilesPath, filename);
+
+                using (var stream = assembly.GetManifestResourceStream(name))
+                {
+                    var fileInfo = new FileInfo(path);
+
+                    if (!fileInfo.Exists || fileInfo.Length != stream.Length)
+                    {
+                        Directory.CreateDirectory(systemProfilesPath);
+
+                        using (var fileStream = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
+                        {
+                            stream.CopyTo(fileStream);
+                        }
+                    }
+                }
+            }
+
+            // Not necessary, but just to make it easy to find
+            Directory.CreateDirectory(UserProfilesPath);
+        }
+
+        class InternalProfileInfo
+        {
+            internal DeviceProfileInfo Info { get; set; }
+            internal string Path { get; set; }
+        }
     }
 }

+ 21 - 1
MediaBrowser.Dlna/MediaBrowser.Dlna.csproj

@@ -117,7 +117,27 @@
       <Name>MediaBrowser.Model</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <EmbeddedResource Include="Profiles\Xml\Denon AVR.xml" />
+    <EmbeddedResource Include="Profiles\Xml\foobar2000.xml" />
+    <EmbeddedResource Include="Profiles\Xml\LG Smart TV.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Linksys DMA2100.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Panasonic Viera.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Samsung Smart TV.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Blu-ray Player 2013.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Blu-ray Player.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Bravia %282010%29.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Bravia %282011%29.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Bravia %282012%29.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony Bravia %282013%29.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Sony PlayStation 3.xml" />
+    <EmbeddedResource Include="Profiles\Xml\WDTV Live.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Xbox 360.xml" />
+    <EmbeddedResource Include="Profiles\Xml\Xbox One.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Profiles\Xml\Default.xml" />
+  </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.

+ 1 - 13
MediaBrowser.Dlna/PlayTo/CurrentIdEventArgs.cs

@@ -4,18 +4,6 @@ namespace MediaBrowser.Dlna.PlayTo
 {
     public class CurrentIdEventArgs : EventArgs
     {
-        public Guid Id { get;  set; }
-
-        public CurrentIdEventArgs(string id)
-        {
-            if (string.IsNullOrWhiteSpace(id) || id == "0")
-            {
-                Id = Guid.Empty;
-            }
-            else
-            {
-                Id = new Guid(id);
-            }
-        }
+        public string Id { get;  set; }
     }
 }

+ 4 - 3
MediaBrowser.Dlna/PlayTo/Device.cs

@@ -42,6 +42,7 @@ namespace MediaBrowser.Dlna.PlayTo
                 if (_currentId == value)
                     return;
                 _currentId = value;
+
                 NotifyCurrentIdChanged(value);
             }
         }
@@ -250,7 +251,7 @@ namespace MediaBrowser.Dlna.PlayTo
             StopTimer();
 
             await SetStop().ConfigureAwait(false);
-            CurrentId = "0";
+            CurrentId = null;
 
             var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI");
             if (command == null)
@@ -514,7 +515,7 @@ namespace MediaBrowser.Dlna.PlayTo
 
             if (String.IsNullOrEmpty(track))
             {
-                CurrentId = "0";
+                CurrentId = null;
                 return;
             }
 
@@ -775,7 +776,7 @@ namespace MediaBrowser.Dlna.PlayTo
         private void NotifyCurrentIdChanged(string value)
         {
             if (CurrentIdChanged != null)
-                CurrentIdChanged.Invoke(this, new CurrentIdEventArgs(value));
+                CurrentIdChanged.Invoke(this, new CurrentIdEventArgs { Id = value });
         }
 
         #endregion

+ 19 - 13
MediaBrowser.Dlna/PlayTo/DlnaController.cs

@@ -20,7 +20,7 @@ namespace MediaBrowser.Dlna.PlayTo
     public class PlayToController : ISessionController, IDisposable
     {
         private Device _device;
-        private BaseItem _currentItem = null;
+        private BaseItem _currentItem;
         private readonly SessionInfo _session;
         private readonly ISessionManager _sessionManager;
         private readonly IItemRepository _itemRepository;
@@ -30,7 +30,7 @@ namespace MediaBrowser.Dlna.PlayTo
         private readonly IDlnaManager _dlnaManager;
         private readonly IUserManager _userManager;
         private readonly IServerApplicationHost _appHost;
-        private bool _playbackStarted = false;
+        private bool _playbackStarted;
 
         private const int UpdateTimerIntervalMs = 1000;
 
@@ -103,22 +103,27 @@ namespace MediaBrowser.Dlna.PlayTo
 
         async void Device_CurrentIdChanged(object sender, CurrentIdEventArgs e)
         {
-            if (e.Id != Guid.Empty)
+            if (!string.IsNullOrWhiteSpace(e.Id))
             {
-                if (_currentItem != null && _currentItem.Id == e.Id)
+                Guid guid;
+
+                if (Guid.TryParse(e.Id, out guid))
                 {
-                    return;
-                }
+                    if (_currentItem != null && _currentItem.Id == guid)
+                    {
+                        return;
+                    }
 
-                var item = _libraryManager.GetItemById(e.Id);
+                    var item = _libraryManager.GetItemById(guid);
 
-                if (item != null)
-                {
-                    _logger.Debug("{0} - CurrentId {1}", _session.DeviceName, item.Id);
-                    _currentItem = item;
-                    _playbackStarted = false;
+                    if (item != null)
+                    {
+                        _logger.Debug("{0} - CurrentId {1}", _session.DeviceName, item.Id);
+                        _currentItem = item;
+                        _playbackStarted = false;
 
-                    await ReportProgress().ConfigureAwait(false);
+                        await ReportProgress().ConfigureAwait(false);
+                    }
                 }
             }
         }
@@ -418,6 +423,7 @@ namespace MediaBrowser.Dlna.PlayTo
 
             var playlistItem = GetPlaylistItem(item, streams, profile);
             playlistItem.StartPositionTicks = startPostionTicks;
+            playlistItem.DeviceProfileId = profile.Id;
 
             if (playlistItem.MediaType == DlnaProfileType.Audio)
             {

+ 2 - 0
MediaBrowser.Dlna/PlayTo/PlaylistItem.cs

@@ -46,6 +46,8 @@ namespace MediaBrowser.Dlna.PlayTo
 
         public int? MaxFramerate { get; set; }
 
+        public string DeviceProfileId { get; set; }
+
         public PlaylistItem()
         {
             TranscodingSettings = new List<TranscodingSetting>();

+ 1 - 0
MediaBrowser.Dlna/PlayTo/StreamHelper.cs

@@ -45,6 +45,7 @@ namespace MediaBrowser.Dlna.PlayTo
             
             var list = new List<string>
             {
+                item.DeviceProfileId ?? string.Empty,
                 deviceProperties.UUID ?? string.Empty,
                 item.MediaSourceId ?? string.Empty,
                 (!item.Transcode).ToString().ToLower(),

+ 2 - 0
MediaBrowser.Dlna/Profiles/DefaultProfile.cs

@@ -1,7 +1,9 @@
 using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class DefaultProfile : DeviceProfile
     {
         public DefaultProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class DenonAvrProfile : DefaultProfile
     {
         public DenonAvrProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class Foobar2000Profile : DefaultProfile
     {
         public Foobar2000Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class LgTvProfile : DefaultProfile
     {
         public LgTvProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class LinksysDMA2100Profile : DefaultProfile
     {
         public LinksysDMA2100Profile()

+ 19 - 17
MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs

@@ -1,19 +1,21 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
-   public class PanasonicVieraProfile : DefaultProfile
+    [XmlRoot("Profile")]
+    public class PanasonicVieraProfile : DefaultProfile
     {
-       public PanasonicVieraProfile()
-       {
-           Name = "Panasonic Viera";
+        public PanasonicVieraProfile()
+        {
+            Name = "Panasonic Viera";
 
-           Identification = new DeviceIdentification
-           {
-               FriendlyName = @"VIERA",
-               Manufacturer = "Panasonic",
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"VIERA",
+                Manufacturer = "Panasonic",
 
-               Headers = new[]
+                Headers = new[]
                {
                    new HttpHeaderInfo
                    {
@@ -22,11 +24,11 @@ namespace MediaBrowser.Dlna.Profiles
                        Match = HeaderMatchType.Substring
                    }
                }
-           };
+            };
 
-           TimelineOffsetSeconds = 10;
+            TimelineOffsetSeconds = 10;
 
-           TranscodingProfiles = new[]
+            TranscodingProfiles = new[]
            {
                new TranscodingProfile
                {
@@ -48,7 +50,7 @@ namespace MediaBrowser.Dlna.Profiles
                }
            };
 
-           DirectPlayProfiles = new[]
+            DirectPlayProfiles = new[]
            {
                new DirectPlayProfile
                {
@@ -127,7 +129,7 @@ namespace MediaBrowser.Dlna.Profiles
                }
            };
 
-           ContainerProfiles = new[]
+            ContainerProfiles = new[]
             {
                 new ContainerProfile
                 {
@@ -151,7 +153,7 @@ namespace MediaBrowser.Dlna.Profiles
                 }
             };
 
-           CodecProfiles = new[]
+            CodecProfiles = new[]
            {
                new CodecProfile
                {
@@ -181,6 +183,6 @@ namespace MediaBrowser.Dlna.Profiles
                    }
                }
            };
-       }
+        }
     }
 }

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SamsungSmartTvProfile : DefaultProfile
     {
         public SamsungSmartTvProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBlurayPlayer2013Profile : DefaultProfile
     {
         public SonyBlurayPlayer2013Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBlurayPlayerProfile : DefaultProfile
     {
         public SonyBlurayPlayerProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBravia2010Profile : DefaultProfile
     {
         public SonyBravia2010Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBravia2011Profile : DefaultProfile
     {
         public SonyBravia2011Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBravia2012Profile : DefaultProfile
     {
         public SonyBravia2012Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyBravia2013Profile : DefaultProfile
     {
         public SonyBravia2013Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class SonyPs3Profile : DefaultProfile
     {
         public SonyPs3Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class WdtvLiveProfile : DefaultProfile
     {
         public WdtvLiveProfile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class Xbox360Profile : DefaultProfile
     {
         public Xbox360Profile()

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

@@ -1,7 +1,9 @@
-using MediaBrowser.Controller.Dlna;
+using System.Xml.Serialization;
+using MediaBrowser.Controller.Dlna;
 
 namespace MediaBrowser.Dlna.Profiles
 {
+    [XmlRoot("Profile")]
     public class XboxOneProfile : DefaultProfile
     {
         public XboxOneProfile()

+ 39 - 0
MediaBrowser.Dlna/Profiles/Xml/Default.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Media Browser</Name>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,wma" type="Audio" />
+    <DirectPlayProfile container="avi,mp4" type="Video" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles />
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

+ 43 - 0
MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Denon AVR</Name>
+  <Identification>
+    <FriendlyName>Denon:\[AVR:.*</FriendlyName>
+    <Manufacturer>Denon</Manufacturer>
+    <Headers />
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles />
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

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

@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>LG Smart TV</Name>
+  <Identification>
+    <FriendlyName>LG.*</FriendlyName>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="LG" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>10</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="aac,ac3,mp3" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec" codec="mpeg4">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3,aac,mp3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

+ 43 - 0
MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Linksys DMA2100</Name>
+  <Identification>
+    <ModelName>DMA2100us</ModelName>
+    <Headers />
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
+    <DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles />
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

+ 64 - 0
MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Panasonic Viera</Name>
+  <Identification>
+    <FriendlyName>VIERA</FriendlyName>
+    <Manufacturer>Panasonic</Manufacturer>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="Panasonic MIL DLNA" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>10</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mpeg" audioCodec="ac3,mp3" videoCodec="mpeg2video,mpeg4" type="Video" />
+    <DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3,pcm" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="aac,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="aac,ac3,mp3,pcm" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mov" audioCodec="aac,pcm" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="pcm" videoCodec="mpeg4" type="Video" />
+    <DirectPlayProfile container="flv" audioCodec="aac" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="mp4" audioCodec="aac" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitDepth" value="8" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

+ 100 - 0
MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Samsung Smart TV</Name>
+  <Identification>
+    <ModelUrl>samsung.com</ModelUrl>
+    <Headers />
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>true</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="asf" audioCodec="mp3,ac3,wmav2,wmapro,wmavoice" videoCodec="h264,mpeg4,mjpeg" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="mp3,ac3,dca" videoCodec="h264,mpeg4,mjpeg" type="Video" />
+    <DirectPlayProfile container="mkv" audioCodec="mp3,ac3,dca,aac" videoCodec="h264,mpeg4,mjpeg4" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="mp3,aac" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="3gpp" audioCodec="aac,he-aac" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="mpg,mpeg" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
+    <DirectPlayProfile container="vro,vob" audioCodec="ac3,mp2,mp3" videoCodec="mpeg1video,mpeg2video" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3,eac3" videoCodec="mpeg2video,h264,vc1" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmavoice" videoCodec="wmv2,wmv3" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec" codec="mpeg2video">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="30720000" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="mpeg4">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="8192000" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="37500000" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="wmv2,wmv3,vc1">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="25600000" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3,wmav2,dca,aac,mp3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="avi" type="Video" mimeType="video/x-msvideo">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="mkv" type="Video" mimeType="video/x-mkv">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 17 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 19 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml


+ 98 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml

@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Sony Bravia (2010)</Name>
+  <Identification>
+    <FriendlyName>KDL-\d{2}[EHLNPB]X\d[01]\d.*</FriendlyName>
+    <Manufacturer>Sony</Manufacturer>
+    <Headers>
+      <HttpHeaderInfo name="X-AV-Client-Info" value=".*KDL-\d{2}[EHLNPB]X\d[01]\d.*" match="Regex" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Microsoft Corporation</Manufacturer>
+  <ManufacturerUrl>http://www.microsoft.com/</ManufacturerUrl>
+  <ModelName>Windows Media Player Sharing</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>3.0</ModelNumber>
+  <ModelUrl>http://www.microsoft.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <SonyAggregationFlags>10</SonyAggregationFlags>
+  <ProtocolInfo>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg1video,mpeg2video" type="Video" />
+    <DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="mpeg2video">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+        <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" videoCodec="mpeg2video" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 101 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml

@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Sony Bravia (2011)</Name>
+  <Identification>
+    <FriendlyName>KDL-\d{2}([A-Z]X\d2\d|CX400).*</FriendlyName>
+    <Manufacturer>Sony</Manufacturer>
+    <Headers>
+      <HttpHeaderInfo name="X-AV-Client-Info" value=".*KDL-\d{2}([A-Z]X\d2\d|CX400).*" match="Regex" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Microsoft Corporation</Manufacturer>
+  <ManufacturerUrl>http://www.microsoft.com/</ManufacturerUrl>
+  <ModelName>Windows Media Player Sharing</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>3.0</ModelNumber>
+  <ModelUrl>http://www.microsoft.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <SonyAggregationFlags>10</SonyAggregationFlags>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="mpeg2video">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="20000000" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+        <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" videoCodec="mpeg2video" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 84 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml

@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Sony Bravia (2012)</Name>
+  <Identification>
+    <FriendlyName>KDL-\d{2}[A-Z]X\d5(\d|G).*</FriendlyName>
+    <Manufacturer>Sony</Manufacturer>
+    <Headers>
+      <HttpHeaderInfo name="X-AV-Client-Info" value=".*KDL-\d{2}[A-Z]X\d5(\d|G).*" match="Regex" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Microsoft Corporation</Manufacturer>
+  <ManufacturerUrl>http://www.microsoft.com/</ManufacturerUrl>
+  <ModelName>Windows Media Player Sharing</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>3.0</ModelNumber>
+  <ModelUrl>http://www.microsoft.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <SonyAggregationFlags>10</SonyAggregationFlags>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
+    <DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" videoCodec="mpeg2video" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 84 - 0
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml

@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Sony Bravia (2013)</Name>
+  <Identification>
+    <FriendlyName>KDL-\d{2}[WR][5689]\d{2}A.*</FriendlyName>
+    <Manufacturer>Sony</Manufacturer>
+    <Headers>
+      <HttpHeaderInfo name="X-AV-Client-Info" value=".*KDL-\d{2}[WR][5689]\d{2}A.*" match="Regex" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Microsoft Corporation</Manufacturer>
+  <ManufacturerUrl>http://www.microsoft.com/</ManufacturerUrl>
+  <ModelName>Windows Media Player Sharing</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>3.0</ModelNumber>
+  <ModelUrl>http://www.microsoft.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <SonyAggregationFlags>10</SonyAggregationFlags>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="ts" audioCodec="ac3,eac3,aac,mp3" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
+    <DirectPlayProfile container="mp4" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="mov" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4,mjpeg" type="Video" />
+    <DirectPlayProfile container="mkv" audioCodec="ac3,eac3,aac,mp3,mp2,pcm,vorbis" videoCodec="h264,mpeg4,vp8" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="ac3,eac3,mp3" videoCodec="mpeg4" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="pcm" videoCodec="mjpeg" type="Video" />
+    <DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="mp4" audioCodec="aac" type="Audio" />
+    <DirectPlayProfile container="wav" audioCodec="pcm" type="Audio" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="ac3,aac" estimateContentLength="false" enableMpegtsM2TsMode="true" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_T,AVC_TS_HD_50_AC3_T,AVC_TS_HD_60_AC3_T,AVC_TS_HD_EU_T" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3_ISO,AVC_TS_HD_50_AC3_ISO,AVC_TS_HD_60_AC3_ISO,AVC_TS_HD_EU_ISO" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" orgPn="AVC_TS_HD_24_AC3,AVC_TS_HD_50_AC3,AVC_TS_HD_60_AC3,AVC_TS_HD_EU" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="ts" videoCodec="mpeg2video" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

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

@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Sony PlayStation 3</Name>
+  <Identification>
+    <FriendlyName>PLAYSTATION 3</FriendlyName>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="PLAYSTATION 3" match="Substring" />
+      <HttpHeaderInfo name="X-AV-Client-Info" value="PLAYSTATION 3" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <XDlnaDoc>DMS-1.50</XDlnaDoc>
+  <SonyAggregationFlags>10</SonyAggregationFlags>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,wma" type="Audio" />
+    <DirectPlayProfile container="avi,mp4" type="Video" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="15360000" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="AudioBitrate" value="640000" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="wmapro">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+        <ProfileCondition condition="NotEquals" property="AudioProfile" value="he-aac" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="mp4,mov" audioCodec="aac" type="Video" mimeType="video/mp4">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="avi" type="Video" orgPn="AVI" mimeType="video/divx">
+      <Conditions />
+    </MediaProfile>
+    <MediaProfile container="wav" type="Audio" mimeType="audio/wav">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 78 - 0
MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>WDTV Live</Name>
+  <Identification>
+    <ModelName>WD TV HD Live</ModelName>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="alphanetworks" match="Substring" />
+      <HttpHeaderInfo name="User-Agent" value="ALPHA Networks" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>true</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>5</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <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" />
+    <DirectPlayProfile container="mkv" audioCodec="ac3,dca,aac,mp2,mp3,pcm" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />
+    <DirectPlayProfile container="ts" audioCodec="ac3,dca,mp2,mp3" videoCodec="mpeg1video,mpeg2video,h264,vc1" type="Video" />
+    <DirectPlayProfile container="mp4,mov" audioCodec="ac3,aac,mp2,mp3" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="vc1" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="mp2,ac3" videoCodec="mpeg2video" type="Video" />
+    <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
+    <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />
+    <DirectPlayProfile container="flac" audioCodec="flac" type="Audio" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+    <DirectPlayProfile container="ogg" audioCodec="vorbis" type="Audio" />
+    <DirectPlayProfile container="jpeg,png,gif,bmp,tiff" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="true" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="ts" type="Video" orgPn="MPEG_TS_SD_NA">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 103 - 0
MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Xbox 360</Name>
+  <Identification>
+    <ModelName>Xbox 360</ModelName>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="Xbox" match="Substring" />
+      <HttpHeaderInfo name="User-Agent" value="Xenon" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Microsoft Corporation</Manufacturer>
+  <ManufacturerUrl>http://www.microsoft.com/</ManufacturerUrl>
+  <ModelName>Windows Media Player Sharing</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>12.0</ModelNumber>
+  <ModelUrl>http://www.microsoft.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <XDlnaDoc>DMS-1.50</XDlnaDoc>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>40</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>true</RequiresPlainVideoItems>
+  <RequiresPlainFolders>true</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
+    <DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />
+    <DirectPlayProfile container="mp4,mov" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="wmv2,wmv3,vc1" type="Video" />
+    <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
+    <DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
+    <DirectPlayProfile container="jpeg" type="Photo" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="asf" type="Video" videoCodec="wmv2" audioCodec="wmav2" estimateContentLength="true" enableMpegtsM2TsMode="false" transcodeSeekInfo="Bytes">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+    <TranscodingProfile container="jpeg" type="Photo" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles>
+    <ContainerProfile type="Video" container="mp4,mov">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Has64BitOffsets" value="false" isRequired="false" />
+      </Conditions>
+    </ContainerProfile>
+    <ContainerProfile type="Photo">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+      </Conditions>
+    </ContainerProfile>
+  </ContainerProfiles>
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec" codec="mpeg4">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1280" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="720" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="5120000" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="h264">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="41" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="10240000" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoCodec" codec="wmv2,wmv3,vc1">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="Width" value="1920" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="Height" value="1080" isRequired="true" />
+        <ProfileCondition condition="LessThanEqual" property="VideoFramerate" value="30" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoBitrate" value="15360000" isRequired="false" />
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="ac3,wmav2,wmapro">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="6" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+    <CodecProfile type="VideoAudioCodec" codec="aac">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="AudioChannels" value="2" isRequired="false" />
+        <ProfileCondition condition="Equals" property="AudioProfile" value="lc" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="avi" type="Video" mimeType="video/avi">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 45 - 0
MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>Xbox One</Name>
+  <Identification>
+    <FriendlyName>Xbox-SystemOS</FriendlyName>
+    <ModelName>Xbox One</ModelName>
+    <Headers />
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,wma" type="Audio" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles />
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles>
+    <MediaProfile container="avi" type="Video" mimeType="video/x-msvideo">
+      <Conditions />
+    </MediaProfile>
+  </MediaProfiles>
+</Profile>

+ 45 - 0
MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <Name>foobar2000</Name>
+  <Identification>
+    <FriendlyName>foobar</FriendlyName>
+    <Headers>
+      <HttpHeaderInfo name="User-Agent" value="foobar" match="Substring" />
+    </Headers>
+  </Identification>
+  <Manufacturer>Media Browser</Manufacturer>
+  <ManufacturerUrl>http://mediabrowser3.com/</ManufacturerUrl>
+  <ModelName>Media Browser</ModelName>
+  <ModelDescription>Media Browser</ModelDescription>
+  <ModelNumber>Media Browser</ModelNumber>
+  <ModelUrl>http://mediabrowser3.com/</ModelUrl>
+  <IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
+  <SupportsAlbumArtInDidl>false</SupportsAlbumArtInDidl>
+  <ProtocolInfo>DLNA</ProtocolInfo>
+  <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
+  <RequiresPlainVideoItems>false</RequiresPlainVideoItems>
+  <RequiresPlainFolders>false</RequiresPlainFolders>
+  <DirectPlayProfiles>
+    <DirectPlayProfile container="mp3,wma" type="Audio" />
+    <DirectPlayProfile container="avi,mp4" type="Video" />
+  </DirectPlayProfiles>
+  <TranscodingProfiles>
+    <TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings />
+    </TranscodingProfile>
+    <TranscodingProfile container="ts" type="Video" videoCodec="h264" audioCodec="aac" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto">
+      <Settings>
+        <TranscodingSetting name="VideoProfile" value="baseline" />
+      </Settings>
+    </TranscodingProfile>
+  </TranscodingProfiles>
+  <ContainerProfiles />
+  <CodecProfiles>
+    <CodecProfile type="VideoCodec">
+      <Conditions>
+        <ProfileCondition condition="LessThanEqual" property="VideoLevel" value="3" isRequired="false" />
+      </Conditions>
+    </CodecProfile>
+  </CodecProfiles>
+  <MediaProfiles />
+</Profile>

+ 3 - 0
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -101,6 +101,9 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\UserConfiguration.cs">
       <Link>Configuration\UserConfiguration.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Dlna\DeviceProfileInfo.cs">
+      <Link>Dlna\DeviceProfileInfo.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\DrawingUtils.cs">
       <Link>Drawing\DrawingUtils.cs</Link>
     </Compile>

+ 3 - 0
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -88,6 +88,9 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\UserConfiguration.cs">
       <Link>Configuration\UserConfiguration.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Dlna\DeviceProfileInfo.cs">
+      <Link>Dlna\DeviceProfileInfo.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Drawing\DrawingUtils.cs">
       <Link>Drawing\DrawingUtils.cs</Link>
     </Compile>

+ 30 - 0
MediaBrowser.Model/Dlna/DeviceProfileInfo.cs

@@ -0,0 +1,30 @@
+
+namespace MediaBrowser.Model.Dlna
+{
+    public class DeviceProfileInfo
+    {
+        /// <summary>
+        /// Gets or sets the identifier.
+        /// </summary>
+        /// <value>The identifier.</value>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// Gets or sets the name.
+        /// </summary>
+        /// <value>The name.</value>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Gets or sets the type.
+        /// </summary>
+        /// <value>The type.</value>
+        public DeviceProfileType Type { get; set; }
+    }
+
+    public enum DeviceProfileType
+    {
+        System = 0,
+        User = 1
+    }
+}

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -66,6 +66,7 @@
     <Compile Include="Configuration\MetadataPlugin.cs" />
     <Compile Include="Configuration\MetadataOptions.cs" />
     <Compile Include="Configuration\ServerConfiguration.cs" />
+    <Compile Include="Dlna\DeviceProfileInfo.cs" />
     <Compile Include="Drawing\ImageOutputFormat.cs" />
     <Compile Include="Dto\BaseItemPerson.cs" />
     <Compile Include="Dto\ChapterInfoDto.cs" />

+ 5 - 2
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1498,8 +1498,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
         {
             var programs = _programs.ToList();
 
-            var startDate = programs.Select(i => i.Value.StartDate).Min();
-            var endDate = programs.Select(i => i.Value.StartDate).Max();
+            var startDate = _programs.Count == 0 ? DateTime.MinValue :
+                programs.Select(i => i.Value.StartDate).Min();
+
+            var endDate = programs.Count == 0 ? DateTime.MinValue : 
+                programs.Select(i => i.Value.StartDate).Max();
 
             return new GuideInfo
             {

+ 5 - 5
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -441,7 +441,7 @@ namespace MediaBrowser.ServerApplication
             FileOrganizationRepository = await GetFileOrganizationRepository().ConfigureAwait(false);
             RegisterSingleInstance(FileOrganizationRepository);
 
-            UserManager = new UserManager(Logger, ServerConfigurationManager, UserRepository);
+            UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository);
             RegisterSingleInstance(UserManager);
 
             LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager, UserDataManager, () => LibraryMonitor, FileSystemManager, () => ProviderManager);
@@ -462,13 +462,13 @@ namespace MediaBrowser.ServerApplication
             RegisterSingleInstance(HttpServer, false);
             progress.Report(10);
 
-            ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager);
+            ServerManager = new ServerManager(this, JsonSerializer, LogManager.GetLogger("ServerManager"), ServerConfigurationManager);
             RegisterSingleInstance(ServerManager);
 
             LocalizationManager = new LocalizationManager(ServerConfigurationManager, FileSystemManager);
             RegisterSingleInstance(LocalizationManager);
 
-            ImageProcessor = new ImageProcessor(Logger, ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer);
+            ImageProcessor = new ImageProcessor(LogManager.GetLogger("ImageProcessor"), ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer);
             RegisterSingleInstance(ImageProcessor);
 
             DtoService = new DtoService(Logger, LibraryManager, UserManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager);
@@ -477,7 +477,7 @@ namespace MediaBrowser.ServerApplication
             var newsService = new Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);
             RegisterSingleInstance<INewsService>(newsService);
 
-            var fileOrganizationService = new FileOrganizationService(TaskManager, FileOrganizationRepository, Logger, LibraryMonitor, LibraryManager, ServerConfigurationManager, FileSystemManager, ProviderManager);
+            var fileOrganizationService = new FileOrganizationService(TaskManager, FileOrganizationRepository, LogManager.GetLogger("FileOrganizationService"), LibraryMonitor, LibraryManager, ServerConfigurationManager, FileSystemManager, ProviderManager);
             RegisterSingleInstance<IFileOrganizationService>(fileOrganizationService);
 
             progress.Report(15);
@@ -498,7 +498,7 @@ namespace MediaBrowser.ServerApplication
             var appThemeManager = new AppThemeManager(ApplicationPaths, FileSystemManager, JsonSerializer, Logger);
             RegisterSingleInstance<IAppThemeManager>(appThemeManager);
 
-            var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager, JsonSerializer);
+            var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager, ApplicationPaths, LogManager.GetLogger("DLNA"));
             RegisterSingleInstance<IDlnaManager>(dlnaManager);
 
             var collectionManager = new CollectionManager(LibraryManager, FileSystemManager, LibraryMonitor);

+ 6 - 2
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -203,8 +203,12 @@
     <Content Include="dashboard-ui\css\images\items\list\remotesearch.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="dashboard-ui\css\images\media\pause.png" />
-    <Content Include="dashboard-ui\css\images\media\play.png" />
+    <Content Include="dashboard-ui\css\images\media\pause.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="dashboard-ui\css\images\media\play.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\css\images\media\tvflyout.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác