浏览代码

separate profiles

Luke Pulverenti 11 年之前
父节点
当前提交
85aa11e926

+ 2 - 2
MediaBrowser.Controller/Dlna/CodecProfile.cs

@@ -6,12 +6,12 @@ namespace MediaBrowser.Controller.Dlna
     public class CodecProfile
     public class CodecProfile
     {
     {
         public CodecType Type { get; set; }
         public CodecType Type { get; set; }
-        public List<ProfileCondition> Conditions { get; set; }
+        public ProfileCondition[] Conditions { get; set; }
         public string Codec { get; set; }
         public string Codec { get; set; }
 
 
         public CodecProfile()
         public CodecProfile()
         {
         {
-            Conditions = new List<ProfileCondition>();
+            Conditions = new ProfileCondition[] {};
         }
         }
 
 
         public List<string> GetCodecs()
         public List<string> GetCodecs()

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

@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MediaBrowser.Controller.Dlna
+{
+    public class ContainerProfile
+    {
+        public DlnaProfileType Type { get; set; }
+        public ProfileCondition[] Conditions { get; set; }
+        public string Container { get; set; }
+
+        public ContainerProfile()
+        {
+            Conditions = new ProfileCondition[] { };
+        }
+
+        public List<string> GetContainers()
+        {
+            return (Container ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+        }
+    }
+}

+ 5 - 5
MediaBrowser.Controller/Dlna/DeviceIdentification.cs

@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-
+
 namespace MediaBrowser.Controller.Dlna
 namespace MediaBrowser.Controller.Dlna
 {
 {
     public class DeviceIdentification
     public class DeviceIdentification
@@ -55,11 +54,11 @@ namespace MediaBrowser.Controller.Dlna
         /// Gets or sets the headers.
         /// Gets or sets the headers.
         /// </summary>
         /// </summary>
         /// <value>The headers.</value>
         /// <value>The headers.</value>
-        public List<HttpHeaderInfo> Headers { get; set; }
+        public HttpHeaderInfo[] Headers { get; set; }
 
 
         public DeviceIdentification()
         public DeviceIdentification()
         {
         {
-            Headers = new List<HttpHeaderInfo>();
+            Headers = new HttpHeaderInfo[] {};
         }
         }
     }
     }
 
 
@@ -73,6 +72,7 @@ namespace MediaBrowser.Controller.Dlna
     public enum HeaderMatchType
     public enum HeaderMatchType
     {
     {
         Equals = 0,
         Equals = 0,
-        Substring = 1
+        Regex = 1,
+        Substring = 2
     }
     }
 }
 }

+ 7 - 2
MediaBrowser.Controller/Dlna/DeviceProfile.cs

@@ -20,13 +20,15 @@ namespace MediaBrowser.Controller.Dlna
         /// </summary>
         /// </summary>
         /// <value>The transcoding profiles.</value>
         /// <value>The transcoding profiles.</value>
         public TranscodingProfile[] TranscodingProfiles { get; set; }
         public TranscodingProfile[] TranscodingProfiles { get; set; }
-        
+
         /// <summary>
         /// <summary>
         /// Gets or sets the direct play profiles.
         /// Gets or sets the direct play profiles.
         /// </summary>
         /// </summary>
         /// <value>The direct play profiles.</value>
         /// <value>The direct play profiles.</value>
         public DirectPlayProfile[] DirectPlayProfiles { get; set; }
         public DirectPlayProfile[] DirectPlayProfiles { get; set; }
 
 
+        public ContainerProfile[] ContainerProfiles { get; set; }
+
         /// <summary>
         /// <summary>
         /// Gets or sets the identification.
         /// Gets or sets the identification.
         /// </summary>
         /// </summary>
@@ -40,6 +42,8 @@ namespace MediaBrowser.Controller.Dlna
         public string ModelDescription { get; set; }
         public string ModelDescription { get; set; }
         public string ModelNumber { get; set; }
         public string ModelNumber { get; set; }
         public string ModelUrl { get; set; }
         public string ModelUrl { get; set; }
+        public bool IgnoreTranscodeByteRangeRequests { get; set; }
+
         /// <summary>
         /// <summary>
         /// Controls the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.
         /// Controls the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.
         /// </summary>
         /// </summary>
@@ -62,13 +66,14 @@ namespace MediaBrowser.Controller.Dlna
 
 
         public bool RequiresPlainVideoItems { get; set; }
         public bool RequiresPlainVideoItems { get; set; }
         public bool RequiresPlainFolders { get; set; }
         public bool RequiresPlainFolders { get; set; }
-        
+
         public DeviceProfile()
         public DeviceProfile()
         {
         {
             DirectPlayProfiles = new DirectPlayProfile[] { };
             DirectPlayProfiles = new DirectPlayProfile[] { };
             TranscodingProfiles = new TranscodingProfile[] { };
             TranscodingProfiles = new TranscodingProfile[] { };
             MediaProfiles = new MediaProfile[] { };
             MediaProfiles = new MediaProfile[] { };
             CodecProfiles = new CodecProfile[] { };
             CodecProfiles = new CodecProfile[] { };
+            ContainerProfiles = new ContainerProfile[] { };
         }
         }
     }
     }
 }
 }

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

@@ -11,13 +11,6 @@ namespace MediaBrowser.Controller.Dlna
 
 
         public DlnaProfileType Type { get; set; }
         public DlnaProfileType Type { get; set; }
 
 
-        public List<ProfileCondition> Conditions { get; set; }
-
-        public DirectPlayProfile()
-        {
-            Conditions = new List<ProfileCondition>();
-        }
-
         public List<string> GetContainers()
         public List<string> GetContainers()
         {
         {
             return (Container ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
             return (Container ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();

+ 5 - 4
MediaBrowser.Controller/Dlna/TranscodingProfile.cs

@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-
+
 namespace MediaBrowser.Controller.Dlna
 namespace MediaBrowser.Controller.Dlna
 {
 {
     public class TranscodingProfile
     public class TranscodingProfile
@@ -15,12 +14,14 @@ namespace MediaBrowser.Controller.Dlna
 
 
         public TranscodeSeekInfo TranscodeSeekInfo { get; set; }
         public TranscodeSeekInfo TranscodeSeekInfo { get; set; }
 
 
-        public List<TranscodingSetting> Settings { get; set; }
+        public TranscodingSetting[] Settings { get; set; }
 
 
         public TranscodingProfile()
         public TranscodingProfile()
         {
         {
-            Settings = new List<TranscodingSetting>();
+            Settings = new TranscodingSetting[] { };
         }
         }
+
+        public bool EnableMpegtsM2TsMode { get; set; }
     }
     }
 
 
     public class TranscodingSetting
     public class TranscodingSetting

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

@@ -79,6 +79,7 @@
     <Compile Include="Collections\CollectionCreationOptions.cs" />
     <Compile Include="Collections\CollectionCreationOptions.cs" />
     <Compile Include="Collections\ICollectionManager.cs" />
     <Compile Include="Collections\ICollectionManager.cs" />
     <Compile Include="Dlna\CodecProfile.cs" />
     <Compile Include="Dlna\CodecProfile.cs" />
+    <Compile Include="Dlna\ContainerProfile.cs" />
     <Compile Include="Dlna\DeviceIdentification.cs" />
     <Compile Include="Dlna\DeviceIdentification.cs" />
     <Compile Include="Dlna\DirectPlayProfile.cs" />
     <Compile Include="Dlna\DirectPlayProfile.cs" />
     <Compile Include="Dlna\IDlnaManager.cs" />
     <Compile Include="Dlna\IDlnaManager.cs" />

文件差异内容过多而无法显示
+ 303 - 1015
MediaBrowser.Dlna/DlnaManager.cs


+ 10 - 0
MediaBrowser.Dlna/MediaBrowser.Dlna.csproj

@@ -81,6 +81,16 @@
     <Compile Include="PlayTo\uIcon.cs" />
     <Compile Include="PlayTo\uIcon.cs" />
     <Compile Include="PlayTo\uParser.cs" />
     <Compile Include="PlayTo\uParser.cs" />
     <Compile Include="PlayTo\uPnpNamespaces.cs" />
     <Compile Include="PlayTo\uPnpNamespaces.cs" />
+    <Compile Include="Profiles\DefaultProfile.cs" />
+    <Compile Include="Profiles\DenonAvrProfile.cs" />
+    <Compile Include="Profiles\PanasonicVieraProfile.cs" />
+    <Compile Include="Profiles\SonyBravia2010Profile.cs" />
+    <Compile Include="Profiles\SonyBravia2011Profile.cs" />
+    <Compile Include="Profiles\SonyBravia2012Profile.cs" />
+    <Compile Include="Profiles\SonyBravia2013Profile.cs" />
+    <Compile Include="Profiles\WdtvLiveProfile.cs" />
+    <Compile Include="Profiles\Xbox360Profile.cs" />
+    <Compile Include="Profiles\XboxOneProfile.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>

+ 4 - 1
MediaBrowser.Dlna/PlayTo/DlnaController.cs

@@ -399,8 +399,11 @@ namespace MediaBrowser.Dlna.PlayTo
 
 
             var deviceInfo = _device.Properties;
             var deviceInfo = _device.Properties;
 
 
-            var playlistItem = GetPlaylistItem(item, streams, _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification()));
+            var profile = _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification());
+
+            var playlistItem = GetPlaylistItem(item, streams, profile);
             playlistItem.StartPositionTicks = startPostionTicks;
             playlistItem.StartPositionTicks = startPostionTicks;
+            playlistItem.DeviceProfileName = profile.Name;
 
 
             if (playlistItem.MediaType == DlnaProfileType.Audio)
             if (playlistItem.MediaType == DlnaProfileType.Audio)
             {
             {

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

@@ -32,6 +32,8 @@ namespace MediaBrowser.Dlna.PlayTo
         public int? AudioStreamIndex { get; set; }
         public int? AudioStreamIndex { get; set; }
 
 
         public int? SubtitleStreamIndex { get; set; }
         public int? SubtitleStreamIndex { get; set; }
+
+        public string DeviceProfileName { get; set; }
         
         
         public PlaylistItem()
         public PlaylistItem()
         {
         {

+ 3 - 18
MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs

@@ -47,6 +47,7 @@ namespace MediaBrowser.Dlna.PlayTo
                 playlistItem.Transcode = true;
                 playlistItem.Transcode = true;
                 playlistItem.TranscodingSettings = transcodingProfile.Settings.ToList();
                 playlistItem.TranscodingSettings = transcodingProfile.Settings.ToList();
                 playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
                 playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
+                playlistItem.AudioCodec = transcodingProfile.AudioCodec;
             }
             }
             
             
             return playlistItem;
             return playlistItem;
@@ -118,6 +119,8 @@ namespace MediaBrowser.Dlna.PlayTo
                 playlistItem.Transcode = true;
                 playlistItem.Transcode = true;
                 playlistItem.TranscodingSettings = transcodingProfile.Settings.ToList();
                 playlistItem.TranscodingSettings = transcodingProfile.Settings.ToList();
                 playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
                 playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
+                playlistItem.AudioCodec = transcodingProfile.AudioCodec.Split(',').FirstOrDefault();
+                playlistItem.VideoCodec = transcodingProfile.VideoCodec;
             }
             }
 
 
             return playlistItem;
             return playlistItem;
@@ -137,12 +140,6 @@ namespace MediaBrowser.Dlna.PlayTo
                 }
                 }
             }
             }
 
 
-            // Check additional conditions
-            if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, null)))
-            {
-                return false;
-            }
-
             return true;
             return true;
         }
         }
         
         
@@ -160,12 +157,6 @@ namespace MediaBrowser.Dlna.PlayTo
                 }
                 }
             }
             }
 
 
-            // Check additional conditions
-            if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, audioStream)))
-            {
-                return false;
-            }
-
             return true;
             return true;
         }
         }
 
 
@@ -210,12 +201,6 @@ namespace MediaBrowser.Dlna.PlayTo
                 }
                 }
             }
             }
 
 
-            // Check additional conditions
-            if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, videoStream, audioStream)))
-            {
-                return false;
-            }
-
             return true;
             return true;
         }
         }
 
 

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

@@ -18,7 +18,7 @@ namespace MediaBrowser.Dlna.PlayTo
         /// <returns>System.String.</returns>
         /// <returns>System.String.</returns>
         internal static string GetAudioUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
         internal static string GetAudioUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
         {
         {
-            var dlnaCommand = BuildDlnaUrl(item.MediaSourceId, deviceProperties.UUID, !item.Transcode, null, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, null, 128000, item.StartPositionTicks, item.TranscodingSettings);
+            var dlnaCommand = BuildDlnaUrl(item.DeviceProfileName, item.MediaSourceId, deviceProperties.UUID, !item.Transcode, null, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, null, 128000, item.StartPositionTicks, item.TranscodingSettings);
 
 
             return string.Format("{0}/audio/{1}/stream{2}?{3}", serverAddress, item.ItemId, "." + item.Container.TrimStart('.'), dlnaCommand);
             return string.Format("{0}/audio/{1}/stream{2}?{3}", serverAddress, item.ItemId, "." + item.Container.TrimStart('.'), dlnaCommand);
         }
         }
@@ -33,7 +33,7 @@ namespace MediaBrowser.Dlna.PlayTo
         /// <returns>The url to send to the device</returns>
         /// <returns>The url to send to the device</returns>
         internal static string GetVideoUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
         internal static string GetVideoUrl(DeviceInfo deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
         {
         {
-            var dlnaCommand = BuildDlnaUrl(item.MediaSourceId, deviceProperties.UUID, !item.Transcode, item.VideoCodec, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, 1500000, 128000, item.StartPositionTicks, item.TranscodingSettings);
+            var dlnaCommand = BuildDlnaUrl(item.DeviceProfileName, item.MediaSourceId, deviceProperties.UUID, !item.Transcode, item.VideoCodec, item.AudioCodec, item.AudioStreamIndex, item.SubtitleStreamIndex, 1500000, 128000, item.StartPositionTicks, item.TranscodingSettings);
 
 
             return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
             return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
         }
         }
@@ -41,7 +41,7 @@ namespace MediaBrowser.Dlna.PlayTo
         /// <summary>
         /// <summary>
         /// Builds the dlna URL.
         /// Builds the dlna URL.
         /// </summary>
         /// </summary>
-        private static string BuildDlnaUrl(string mediaSourceId, string deviceID, bool isStatic, string videoCodec, string audioCodec, int? audiostreamIndex, int? subtitleIndex, int? videoBitrate, int? audioBitrate, long? startPositionTicks, List<TranscodingSetting> settings)
+        private static string BuildDlnaUrl(string deviceProfileName, string mediaSourceId, string deviceID, bool isStatic, string videoCodec, string audioCodec, int? audiostreamIndex, int? subtitleIndex, int? videoBitrate, int? audioBitrate, long? startPositionTicks, List<TranscodingSetting> settings)
         {
         {
             var profile = settings.Where(i => i.Name == TranscodingSettingType.VideoProfile).Select(i => i.Value).FirstOrDefault();
             var profile = settings.Where(i => i.Name == TranscodingSettingType.VideoProfile).Select(i => i.Value).FirstOrDefault();
             var videoLevel = settings.Where(i => i.Name == TranscodingSettingType.VideoLevel).Select(i => i.Value).FirstOrDefault();
             var videoLevel = settings.Where(i => i.Name == TranscodingSettingType.VideoLevel).Select(i => i.Value).FirstOrDefault();
@@ -51,6 +51,7 @@ namespace MediaBrowser.Dlna.PlayTo
 
 
             var list = new List<string>
             var list = new List<string>
             {
             {
+                deviceProfileName ?? string.Empty,
                 deviceID ?? string.Empty,
                 deviceID ?? string.Empty,
                 mediaSourceId ?? string.Empty,
                 mediaSourceId ?? string.Empty,
                 isStatic.ToString().ToLower(),
                 isStatic.ToString().ToLower(),

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

@@ -0,0 +1,49 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class DefaultProfile : DeviceProfile
+    {
+        public DefaultProfile()
+        {
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    Type = DlnaProfileType.Video,
+                    AudioCodec = "aac",
+                    VideoCodec = "h264",
+
+                    Settings = new []
+                    {
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoLevel, Value = "3"},
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoProfile, Value = "baseline"}
+                    }
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "mp3,wma",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "avi,mp4",
+                    Type = DlnaProfileType.Video
+                }
+            };
+        }
+    }
+}

+ 28 - 0
MediaBrowser.Dlna/Profiles/DenonAvrProfile.cs

@@ -0,0 +1,28 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class DenonAvrProfile : DefaultProfile
+    {
+        public DenonAvrProfile()
+        {
+            Name = "Denon AVR";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"Denon:\[AVR:.*",
+                Manufacturer = "Denon"
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "mp3,flac,m4a,wma",
+                    Type = DlnaProfileType.Audio
+                },
+            };
+        }
+    }
+}

+ 187 - 0
MediaBrowser.Dlna/Profiles/PanasonicVieraProfile.cs

@@ -0,0 +1,187 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+   public class PanasonicVieraProfile : DefaultProfile
+    {
+       public PanasonicVieraProfile()
+       {
+           Name = "Panasonic Viera";
+           ClientType = "DLNA";
+
+           Identification = new DeviceIdentification
+           {
+               FriendlyName = @"VIERA",
+               Manufacturer = "Panasonic",
+
+               Headers = new[]
+               {
+                   new HttpHeaderInfo
+                   {
+                       Name = "User-Agent",
+                       Value = "Panasonic MIL DLNA",
+                       Match = HeaderMatchType.Substring
+                   }
+               }
+           };
+
+           TimelineOffsetSeconds = 10;
+
+           TranscodingProfiles = new[]
+           {
+               new TranscodingProfile
+               {
+                   Container = "mp3",
+                   AudioCodec = "mp3",
+                   Type = DlnaProfileType.Audio
+               },
+               new TranscodingProfile
+               {
+                   Container = "ts",
+                   AudioCodec = "ac3",
+                   VideoCodec = "h264",
+                   Type = DlnaProfileType.Video
+               },
+               new TranscodingProfile
+               {
+                   Container = "jpeg",
+                   Type = DlnaProfileType.Photo
+               }
+           };
+
+           DirectPlayProfiles = new[]
+           {
+               new DirectPlayProfile
+               {
+                   Container = "mpeg",
+                   VideoCodec = "mpeg2video,mpeg4",
+                   AudioCodec = "ac3,mp3",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "mkv",
+                   VideoCodec = "h264",
+                   AudioCodec = "aac,ac3,mp3,pcm",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "ts",
+                   VideoCodec = "h264",
+                   AudioCodec = "aac,mp3",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "mp4",
+                   VideoCodec = "h264",
+                   AudioCodec = "aac,ac3,mp3,pcm",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "mov",
+                   VideoCodec = "h264",
+                   AudioCodec = "aac,pcm",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "avi",
+                   VideoCodec = "mpeg4",
+                   AudioCodec = "pcm",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "flv",
+                   VideoCodec = "h264",
+                   AudioCodec = "aac",
+                   Type = DlnaProfileType.Video
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "mp3",
+                   AudioCodec = "mp3",
+                   Type = DlnaProfileType.Audio
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "mp4",
+                   AudioCodec = "aac",
+                   Type = DlnaProfileType.Audio
+               },
+
+               new DirectPlayProfile
+               {
+                   Container = "jpeg",
+                   Type = DlnaProfileType.Photo
+               }
+           };
+
+           ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+           CodecProfiles = new[]
+           {
+               new CodecProfile
+               {
+                   Type = CodecType.VideoCodec,
+
+                   Conditions = new[]
+                   {
+                       new ProfileCondition
+                       {
+                           Condition = ProfileConditionType.LessThanEqual,
+                           Property = ProfileConditionValue.Width,
+                           Value = "1920"
+                       },
+                       new ProfileCondition
+                       {
+                           Condition = ProfileConditionType.LessThanEqual,
+                           Property = ProfileConditionValue.Height,
+                           Value = "1080"
+                       },
+                       new ProfileCondition
+                       {
+                           Condition = ProfileConditionType.LessThanEqual,
+                           Property = ProfileConditionValue.VideoBitDepth,
+                           Value = "8",
+                           IsRequired = false
+                       }
+                   }
+               }
+           };
+       }
+    }
+}

+ 242 - 0
MediaBrowser.Dlna/Profiles/SonyBravia2010Profile.cs

@@ -0,0 +1,242 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class SonyBravia2010Profile : DefaultProfile
+    {
+        public SonyBravia2010Profile()
+        {
+            Name = "Sony Bravia (2010)";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"KDL-\d{2}[EHLNPB]X\d[01]\d.*",
+                Manufacturer = "Sony",
+
+                Headers = new []
+                {
+                    new HttpHeaderInfo
+                    {
+                        Name = "X-AV-Client-Info",
+                        Value = @".*KDL-\d{2}[EHLNPB]X\d[01]\d.*",
+                        Match = HeaderMatchType.Regex
+                    }
+                }
+            };
+
+            ModelName = "Windows Media Player Sharing";
+            ModelNumber = "3.0";
+            ModelUrl = "http://www.microsoft.com/";
+            Manufacturer = "Microsoft Corporation";
+            ManufacturerUrl = "http://www.microsoft.com/";
+            SonyAggregationFlags = "10";
+            ProtocolInfo =
+                "http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000";
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac",
+                    Type = DlnaProfileType.Video,
+                    EnableMpegtsM2TsMode = true
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "mpeg1video,mpeg2video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mpeg",
+                    VideoCodec = "mpeg2video,mpeg1video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/avi",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "asf",
+                    MimeType = "video/x-ms-wmv",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "h264",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "20000000"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoLevel,
+                            Value = "41"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "mpeg2video",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "20000000"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "ac3",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "aac",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "2"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.NotEquals,
+                            Property = ProfileConditionValue.AudioProfile,
+                            Value = "he-aac"
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 260 - 0
MediaBrowser.Dlna/Profiles/SonyBravia2011Profile.cs

@@ -0,0 +1,260 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class SonyBravia2011Profile : DefaultProfile
+    {
+        public SonyBravia2011Profile()
+        {
+            Name = "Sony Bravia (2011)";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"KDL-\d{2}([A-Z]X\d2\d|CX400).*",
+                Manufacturer = "Sony",
+
+                Headers = new[]
+                {
+                    new HttpHeaderInfo
+                    {
+                        Name = "X-AV-Client-Info",
+                        Value = @".*KDL-\d{2}([A-Z]X\d2\d|CX400).*",
+                        Match = HeaderMatchType.Regex
+                    }
+                }
+            };
+
+            ModelName = "Windows Media Player Sharing";
+            ModelNumber = "3.0";
+            ModelUrl = "http://www.microsoft.com/";
+            Manufacturer = "Microsoft Corporation";
+            ManufacturerUrl = "http://www.microsoft.com/";
+            SonyAggregationFlags = "10";
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac",
+                    Type = DlnaProfileType.Video,
+                    EnableMpegtsM2TsMode = true
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "mpeg2video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4",
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "ac3,aac,mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mpeg",
+                    VideoCodec = "mpeg2video,mpeg1video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2,wmv3,vc1",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/avi",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "asf",
+                    MimeType = "video/x-ms-wmv",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "h264",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "20000000"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoLevel,
+                            Value = "41"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "mpeg2video",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "20000000"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "ac3",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "aac",
+
+                    Conditions = new[]
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "2"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.NotEquals,
+                            Property = ProfileConditionValue.AudioProfile,
+                            Value = "he-aac"
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 202 - 0
MediaBrowser.Dlna/Profiles/SonyBravia2012Profile.cs

@@ -0,0 +1,202 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class SonyBravia2012Profile : DefaultProfile
+    {
+        public SonyBravia2012Profile()
+        {
+            Name = "Sony Bravia (2012)";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"KDL-\d{2}[A-Z]X\d5(\d|G).*",
+                Manufacturer = "Sony",
+
+                Headers = new[]
+                {
+                    new HttpHeaderInfo
+                    {
+                        Name = "X-AV-Client-Info",
+                        Value = @".*KDL-\d{2}[A-Z]X\d5(\d|G).*",
+                        Match = HeaderMatchType.Regex
+                    }
+                }
+            };
+
+            ModelName = "Windows Media Player Sharing";
+            ModelNumber = "3.0";
+            ModelUrl = "http://www.microsoft.com/";
+            Manufacturer = "Microsoft Corporation";
+            ManufacturerUrl = "http://www.microsoft.com/";
+            SonyAggregationFlags = "10";
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac",
+                    Type = DlnaProfileType.Video,
+                    EnableMpegtsM2TsMode = true
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "mpeg2video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4",
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "ac3,aac,mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "mpeg4",
+                    AudioCodec = "ac3,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mpeg",
+                    VideoCodec = "mpeg2video,mpeg1video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2,wmv3,vc1",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/avi",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "asf",
+                    MimeType = "video/x-ms-wmv",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Conditions = new[]
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "ac3",
+
+                    Conditions = new[]
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6"
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 233 - 0
MediaBrowser.Dlna/Profiles/SonyBravia2013Profile.cs

@@ -0,0 +1,233 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class SonyBravia2013Profile : DefaultProfile
+    {
+        public SonyBravia2013Profile()
+        {
+            Name = "Sony Bravia (2013)";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                FriendlyName = @"KDL-\d{2}[WR][5689]\d{2}A.*",
+                Manufacturer = "Sony",
+
+                Headers = new[]
+                {
+                    new HttpHeaderInfo
+                    {
+                        Name = "X-AV-Client-Info",
+                        Value = @".*KDL-\d{2}[WR][5689]\d{2}A.*",
+                        Match = HeaderMatchType.Regex
+                    }
+                }
+            };
+
+            ModelName = "Windows Media Player Sharing";
+            ModelNumber = "3.0";
+            ModelUrl = "http://www.microsoft.com/";
+            Manufacturer = "Microsoft Corporation";
+            ManufacturerUrl = "http://www.microsoft.com/";
+            SonyAggregationFlags = "10";
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,aac",
+                    Type = DlnaProfileType.Video,
+                    EnableMpegtsM2TsMode = true
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "ac3,eac3,aac,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "mpeg2video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4",
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "ac3,eac3,aac,mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mov",
+                    VideoCodec = "h264,mpeg4,mjpeg",
+                    AudioCodec = "ac3,eac3,aac,mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mkv",
+                    VideoCodec = "h264,mpeg4,vp8",
+                    AudioCodec = "ac3,eac3,aac,mp3,mp2,pcm,vorbis",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "mpeg4",
+                    AudioCodec = "ac3,eac3,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "mjpeg",
+                    AudioCodec = "pcm",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mpeg",
+                    VideoCodec = "mpeg2video,mpeg1video",
+                    AudioCodec = "mp3,mp2",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2,wmv3,vc1",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4",
+                    AudioCodec = "aac",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "wav",
+                    AudioCodec = "pcm",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/avi",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "mp4",
+                    MimeType = "video/mp4",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "ts",
+                    MimeType = "video/mpeg",
+                    Type = DlnaProfileType.Video
+                },
+
+                new MediaProfile
+                {
+                    Container = "wma",
+                    MimeType = "video/x-ms-wma",
+                    Type = DlnaProfileType.Audio
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 242 - 0
MediaBrowser.Dlna/Profiles/WdtvLiveProfile.cs

@@ -0,0 +1,242 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class WdtvLiveProfile : DefaultProfile
+    {
+        public WdtvLiveProfile()
+        {
+            Name = "WDTV Live";
+            ClientType = "DLNA";
+
+            TimelineOffsetSeconds = 5;
+            IgnoreTranscodeByteRangeRequests = true;
+
+            Identification = new DeviceIdentification
+            {
+                ModelName = "WD TV HD Live",
+
+                Headers = new []
+                {
+                    new HttpHeaderInfo {Name = "User-Agent", Value = "alphanetworks", Match = HeaderMatchType.Substring},
+                    new HttpHeaderInfo
+                    {
+                        Name = "User-Agent",
+                        Value = "ALPHA Networks",
+                        Match = HeaderMatchType.Substring
+                    }
+                }
+            };
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    Type = DlnaProfileType.Audio,
+                    AudioCodec = "mp3"
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "h264",
+                    AudioCodec = "aac",
+
+                    Settings = new []
+                    {
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoLevel, Value = "3"},
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoProfile, Value = "baseline"}
+                    }
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "mpeg1video,mpeg2video,mpeg4,h264,vc1",
+                    AudioCodec = "ac3,dca,mp2,mp3,pcm"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "mpeg",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "mpeg1video,mpeg2video",
+                    AudioCodec = "ac3,dca,mp2,mp3,pcm"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "mkv",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "mpeg1video,mpeg2video,mpeg4,h264,vc1",
+                    AudioCodec = "ac3,dca,aac,mp2,mp3,pcm"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "ts",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "mpeg1video,mpeg2video,h264,vc1",
+                    AudioCodec = "ac3,dca,mp2,mp3"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "mp4,mov",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "ac3,aac,mp2,mp3"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "vc1",
+                    AudioCodec = "wmav2,wmapro"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    Type = DlnaProfileType.Video,
+                    VideoCodec = "mpeg2video",
+                    AudioCodec = "mp2,ac3"
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp2,mp3",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "mp4",
+                    AudioCodec = "mp4",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "flac",
+                    AudioCodec = "flac",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Container = "ogg",
+                    AudioCodec = "vorbis",
+                    Type = DlnaProfileType.Audio
+                },
+
+                new DirectPlayProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Container = "jpeg,png,gif,bmp,tiff"
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "ts",
+                    OrgPn = "MPEG_TS_SD_NA",
+                    Type = DlnaProfileType.Video
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "h264",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoLevel,
+                            Value = "41"
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "aac",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "2"
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 314 - 0
MediaBrowser.Dlna/Profiles/Xbox360Profile.cs

@@ -0,0 +1,314 @@
+using MediaBrowser.Controller.Dlna;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class Xbox360Profile : DefaultProfile
+    {
+        public Xbox360Profile()
+        {
+            Name = "Xbox 360";
+            ClientType = "DLNA";
+
+            ModelName = "Windows Media Player Sharing";
+            ModelNumber = "12.0";
+            ModelUrl = "http://www.microsoft.com/";
+            Manufacturer = "Microsoft Corporation";
+            ManufacturerUrl = "http://www.microsoft.com/";
+            XDlnaDoc = "DMS-1.50";
+
+            TimelineOffsetSeconds = 40;
+            RequiresPlainFolders = true;
+            RequiresPlainVideoItems = true;
+
+            Identification = new DeviceIdentification
+            {
+                ModelName = "Xbox 360",
+
+                Headers = new []
+                {
+                    new HttpHeaderInfo {Name = "User-Agent", Value = "Xbox", Match = HeaderMatchType.Substring},
+                    new HttpHeaderInfo {Name = "User-Agent", Value = "Xenon", Match = HeaderMatchType.Substring}
+                }
+            };
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2",
+                    AudioCodec = "wmav2",
+                    Type = DlnaProfileType.Video,
+                    TranscodeSeekInfo = TranscodeSeekInfo.Bytes,
+                    EstimateContentLength = true,
+
+                    Settings = new []
+                    {
+                        new TranscodingSetting {Name = TranscodingSettingType.MaxAudioChannels, Value = "6"},
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoLevel, Value = "3"},
+                        new TranscodingSetting {Name = TranscodingSettingType.VideoProfile, Value = "baseline"}
+                    }
+                },
+                new TranscodingProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "mpeg4",
+                    AudioCodec = "ac3,mp3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    VideoCodec = "h264",
+                    AudioCodec = "aac",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp4,mov",
+                    VideoCodec = "h264,mpeg4",
+                    AudioCodec = "aac,ac3",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    VideoCodec = "wmv2,wmv3,vc1",
+                    AudioCodec = "wmav2,wmapro",
+                    Type = DlnaProfileType.Video
+                },
+                new DirectPlayProfile
+                {
+                    Container = "asf",
+                    AudioCodec = "wmav2,wmapro,wmavoice",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "jpeg",
+                    Type = DlnaProfileType.Photo
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/avi",
+                    Type = DlnaProfileType.Video
+                }
+            };
+
+            ContainerProfiles = new[]
+            {
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Video,
+                    Container = "mp4,mov",
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Has64BitOffsets,
+                            Value = "false",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new ContainerProfile
+                {
+                    Type = DlnaProfileType.Photo,
+
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        }
+                    }
+                }
+            };
+
+            CodecProfiles = new[]
+            {
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "mpeg4",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1280"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "720"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "5120000",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "h264",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoLevel,
+                            Value = "41",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "10240000",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoCodec,
+                    Codec = "wmv2,wmv3,vc1",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Width,
+                            Value = "1920"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.Height,
+                            Value = "1080"
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoFramerate,
+                            Value = "30",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.VideoBitrate,
+                            Value = "15360000",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "ac3,wmav2,wmapro",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6",
+                            IsRequired = false
+                        }
+                    }
+                },
+
+                new CodecProfile
+                {
+                    Type = CodecType.VideoAudioCodec,
+                    Codec = "aac",
+                    Conditions = new []
+                    {
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.LessThanEqual,
+                            Property = ProfileConditionValue.AudioChannels,
+                            Value = "6",
+                            IsRequired = false
+                        },
+                        new ProfileCondition
+                        {
+                            Condition = ProfileConditionType.Equals,
+                            Property = ProfileConditionValue.AudioProfile,
+                            Value = "lc",
+                            IsRequired = false
+                        }
+                    }
+                }
+            };
+        }
+    }
+}

+ 60 - 0
MediaBrowser.Dlna/Profiles/XboxOneProfile.cs

@@ -0,0 +1,60 @@
+using MediaBrowser.Controller.Dlna;
+
+namespace MediaBrowser.Dlna.Profiles
+{
+    public class XboxOneProfile : DefaultProfile
+    {
+        public XboxOneProfile()
+        {
+            Name = "Xbox One";
+            ClientType = "DLNA";
+
+            Identification = new DeviceIdentification
+            {
+                ModelName = "Xbox One",
+                FriendlyName = "Xbox-SystemOS"
+            };
+
+            TranscodingProfiles = new[]
+            {
+                new TranscodingProfile
+                {
+                    Container = "mp3",
+                    AudioCodec = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new TranscodingProfile
+                {
+                    Container = "ts",
+                    VideoCodec = "h264",
+                    AudioCodec = "aac",
+                    Type = DlnaProfileType.Video
+                }
+            };
+
+            DirectPlayProfiles = new[]
+            {
+                new DirectPlayProfile
+                {
+                    Container = "mp3",
+                    Type = DlnaProfileType.Audio
+                },
+                new DirectPlayProfile
+                {
+                    Container = "avi",
+                    Type = DlnaProfileType.Video
+                }
+            };
+
+            MediaProfiles = new[]
+            {
+                new MediaProfile
+                {
+                    Container = "avi",
+                    MimeType = "video/x-msvideo",
+                    Type = DlnaProfileType.Video
+                }
+            };
+        }
+    }
+}

+ 1 - 1
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -498,7 +498,7 @@ namespace MediaBrowser.ServerApplication
             var appThemeManager = new AppThemeManager(ApplicationPaths, FileSystemManager, JsonSerializer, Logger);
             var appThemeManager = new AppThemeManager(ApplicationPaths, FileSystemManager, JsonSerializer, Logger);
             RegisterSingleInstance<IAppThemeManager>(appThemeManager);
             RegisterSingleInstance<IAppThemeManager>(appThemeManager);
 
 
-            var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager);
+            var dlnaManager = new DlnaManager(XmlSerializer, FileSystemManager, JsonSerializer);
             RegisterSingleInstance<IDlnaManager>(dlnaManager);
             RegisterSingleInstance<IDlnaManager>(dlnaManager);
 
 
             var collectionManager = new CollectionManager(LibraryManager, FileSystemManager, LibraryMonitor);
             var collectionManager = new CollectionManager(LibraryManager, FileSystemManager, LibraryMonitor);

部分文件因为文件数量过多而无法显示