diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index 59420c5a1d..622ccefbc6 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -53,7 +53,7 @@ - + diff --git a/MediaBrowser.Dlna/PlayTo/Configuration/PluginConfiguration.cs b/MediaBrowser.Dlna/PlayTo/Configuration/PlayToConfiguration.cs similarity index 80% rename from MediaBrowser.Dlna/PlayTo/Configuration/PluginConfiguration.cs rename to MediaBrowser.Dlna/PlayTo/Configuration/PlayToConfiguration.cs index 1bd8781bb2..d3fcb24ada 100644 --- a/MediaBrowser.Dlna/PlayTo/Configuration/PluginConfiguration.cs +++ b/MediaBrowser.Dlna/PlayTo/Configuration/PlayToConfiguration.cs @@ -29,7 +29,12 @@ FriendlyName = "^TV$", ModelNumber = @"1\.0", ModelName = "Samsung DTV DMR", - TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings() + TranscodeSettings = new[] + { + new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"}, + new TranscodeSettings {Container = "flac", TargetContainer = "mp3"}, + new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"} + } }; var profile1 = new DlnaProfile @@ -38,7 +43,12 @@ ClientType = "DLNA", FriendlyName = @"(^\[TV\][A-Z]{2}\d{2}(E|F)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung", ModelNumber = @"(1\.0)|(AllShare1\.0)", - TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings() + TranscodeSettings = new[] + { + new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"}, + new TranscodeSettings {Container = "flac", TargetContainer = "mp3"}, + new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"} + } }; var profile2 = new DlnaProfile @@ -47,7 +57,12 @@ ClientType = "DLNA", FriendlyName = @"(^TV-\d{2}C\d{3}.*)|(^\[TV\][A-Z]{2}\d{2}(D)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung", ModelNumber = @"(1\.0)|(AllShare1\.0)", - TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings() + TranscodeSettings = new[] + { + new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"}, + new TranscodeSettings {Container = "flac", TargetContainer = "mp3"}, + new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"} + } }; var profile3 = new DlnaProfile diff --git a/MediaBrowser.Dlna/PlayTo/Configuration/TranscodeSetting.cs b/MediaBrowser.Dlna/PlayTo/Configuration/TranscodeSetting.cs index ddf6f21874..4713dc3859 100644 --- a/MediaBrowser.Dlna/PlayTo/Configuration/TranscodeSetting.cs +++ b/MediaBrowser.Dlna/PlayTo/Configuration/TranscodeSetting.cs @@ -20,7 +20,13 @@ namespace MediaBrowser.Dlna.PlayTo.Configuration /// The target container. /// public string TargetContainer { get; set; } - + + /// + /// Gets or sets the Mimetype to enforce + /// + /// + /// The MimeType. + /// public string MimeType { get; set; } /// diff --git a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs index d2d04c4a8e..6523eb9f52 100644 --- a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs +++ b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs @@ -16,6 +16,8 @@ namespace MediaBrowser.Dlna.PlayTo public string FileFormat { get; set; } + public string MimeType { get; set; } + public int PlayState { get; set; } public string StreamUrl { get; set; } @@ -51,10 +53,21 @@ namespace MediaBrowser.Dlna.PlayTo { if (string.IsNullOrWhiteSpace(transcodeSetting.Container)) continue; - if (path.EndsWith(transcodeSetting.Container)) + if (path.EndsWith(transcodeSetting.Container) && !string.IsNullOrWhiteSpace(transcodeSetting.TargetContainer)) { playlistItem.Transcode = true; playlistItem.FileFormat = transcodeSetting.TargetContainer; + + if (string.IsNullOrWhiteSpace(transcodeSetting.MimeType)) + playlistItem.MimeType = transcodeSetting.MimeType; + + return playlistItem; + } + if (path.EndsWith(transcodeSetting.Container) && !string.IsNullOrWhiteSpace(transcodeSetting.MimeType)) + { + playlistItem.Transcode = false; + playlistItem.FileFormat = transcodeSetting.Container; + playlistItem.MimeType = transcodeSetting.MimeType; return playlistItem; } } diff --git a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs index eed0bb7d77..3492ed182e 100644 --- a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs +++ b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs @@ -96,9 +96,12 @@ namespace MediaBrowser.Dlna.PlayTo /// The url to send to the device internal static string GetVideoUrl(DeviceProperties deviceProperties, PlaylistItem item, List streams, string serverAddress) { + string dlnaCommand = string.Empty; if (!item.Transcode) - return string.Format("{0}/Videos/{1}/stream.{2}?Static=True", serverAddress, item.ItemId, item.FileFormat); - + { + dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, null, null, null, null, null, null, null, null, null, null, item.MimeType); + return string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand); + } var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault(); var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault(); @@ -117,7 +120,7 @@ namespace MediaBrowser.Dlna.PlayTo audioChannels = 2; } - string dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3"); + dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3", item.MimeType); return string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand); } @@ -162,12 +165,12 @@ namespace MediaBrowser.Dlna.PlayTo /// /// Builds the dlna URL. /// - private static string BuildDlnaUrl(string deviceID, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel) + private static string BuildDlnaUrl(string deviceID, bool isStatic, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel, string mimeType) { var usCulture = new CultureInfo("en-US"); var dlnaparam = string.Format("Params={0};", deviceID); - + dlnaparam += isStatic ? "true;" : "false;"; dlnaparam += videoCodec.HasValue ? videoCodec.Value + ";" : ";"; dlnaparam += audioCodec.HasValue ? audioCodec.Value + ";" : ";"; dlnaparam += audiostreamIndex.HasValue ? audiostreamIndex.Value.ToString(usCulture) + ";" : ";"; @@ -178,6 +181,7 @@ namespace MediaBrowser.Dlna.PlayTo dlnaparam += startPositionTicks.HasValue ? startPositionTicks.Value.ToString(usCulture) + ";" : ";"; dlnaparam += profile + ";"; dlnaparam += videoLevel + ";"; + dlnaparam += mimeType + ";"; return dlnaparam; }