diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index 4f56f828b..2e61ed89c 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -356,12 +356,18 @@ Dlna\HttpHeaderInfo.cs + + Dlna\ILocalPlayer.cs + Dlna\MediaFormatProfile.cs Dlna\MediaFormatProfileResolver.cs + + Dlna\NullLocalPlayer.cs + Dlna\PlaybackErrorCode.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index b49cef740..ba4ac22e7 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -288,6 +288,9 @@ Dlna\ContentFeatureBuilder.cs + + Dlna\DefaultLocalPlayer.cs + Dlna\DeviceIdentification.cs @@ -321,12 +324,18 @@ Dlna\HttpHeaderInfo.cs + + Dlna\ILocalPlayer.cs + Dlna\MediaFormatProfile.cs Dlna\MediaFormatProfileResolver.cs + + Dlna\NullLocalPlayer.cs + Dlna\PlaybackErrorCode.cs diff --git a/MediaBrowser.Model/Dlna/AudioOptions.cs b/MediaBrowser.Model/Dlna/AudioOptions.cs index cddfd8955..6ad4fa265 100644 --- a/MediaBrowser.Model/Dlna/AudioOptions.cs +++ b/MediaBrowser.Model/Dlna/AudioOptions.cs @@ -46,17 +46,6 @@ namespace MediaBrowser.Model.Dlna /// /// The audio transcoding bitrate. public int? AudioTranscodingBitrate { get; set; } - - /// - /// Gets or sets a value indicating whether [supports direct remote content]. - /// - /// true if [supports direct remote content]; otherwise, false. - public bool SupportsDirectRemoteContent { get; set; } - /// - /// Gets or sets a value indicating whether [supports custom HTTP headers]. - /// - /// true if [supports custom HTTP headers]; otherwise, false. - public bool SupportsCustomHttpHeaders { get; set; } /// /// Gets the maximum bitrate. diff --git a/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs b/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs new file mode 100644 index 000000000..fc15a55a0 --- /dev/null +++ b/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs @@ -0,0 +1,22 @@ +using System.IO; + +namespace MediaBrowser.Model.Dlna +{ + public class DefaultLocalPlayer : ILocalPlayer + { + public bool CanAccessFile(string path) + { + return File.Exists(path); + } + + public bool CanAccessDirectory(string path) + { + return Directory.Exists(path); + } + + public virtual bool CanAccessUrl(string url, bool requiresCustomRequestHeaders) + { + return false; + } + } +} diff --git a/MediaBrowser.Model/Dlna/ILocalPlayer.cs b/MediaBrowser.Model/Dlna/ILocalPlayer.cs new file mode 100644 index 000000000..55e11ec4b --- /dev/null +++ b/MediaBrowser.Model/Dlna/ILocalPlayer.cs @@ -0,0 +1,26 @@ + +namespace MediaBrowser.Model.Dlna +{ + public interface ILocalPlayer + { + /// + /// Determines whether this instance [can access file] the specified path. + /// + /// The path. + /// true if this instance [can access file] the specified path; otherwise, false. + bool CanAccessFile(string path); + /// + /// Determines whether this instance [can access directory] the specified path. + /// + /// The path. + /// true if this instance [can access directory] the specified path; otherwise, false. + bool CanAccessDirectory(string path); + /// + /// Determines whether this instance [can access URL] the specified URL. + /// + /// The URL. + /// if set to true [requires custom request headers]. + /// true if this instance [can access URL] the specified URL; otherwise, false. + bool CanAccessUrl(string url, bool requiresCustomRequestHeaders); + } +} diff --git a/MediaBrowser.Model/Dlna/NullLocalPlayer.cs b/MediaBrowser.Model/Dlna/NullLocalPlayer.cs new file mode 100644 index 000000000..c34b63887 --- /dev/null +++ b/MediaBrowser.Model/Dlna/NullLocalPlayer.cs @@ -0,0 +1,21 @@ + +namespace MediaBrowser.Model.Dlna +{ + public class NullLocalPlayer : ILocalPlayer + { + public bool CanAccessFile(string path) + { + return false; + } + + public bool CanAccessDirectory(string path) + { + return false; + } + + public bool CanAccessUrl(string url, bool requiresCustomRequestHeaders) + { + return false; + } + } +} diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 559a543f2..126b218e8 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -10,6 +10,17 @@ namespace MediaBrowser.Model.Dlna { public class StreamBuilder { + private readonly ILocalPlayer _localPlayer; + + public StreamBuilder(ILocalPlayer localPlayer) + { + _localPlayer = localPlayer; + } + public StreamBuilder() + : this(new NullLocalPlayer()) + { + } + public StreamInfo BuildAudioItem(AudioOptions options) { ValidateAudioInput(options); @@ -73,7 +84,7 @@ namespace MediaBrowser.Model.Dlna StreamInfo streamInfo = BuildVideoItem(i, options); if (streamInfo != null) { - streams.Add(streamInfo); + streams.Add(streamInfo); } } @@ -180,7 +191,15 @@ namespace MediaBrowser.Model.Dlna if (all) { - playlistItem.PlayMethod = PlayMethod.DirectStream; + if (item.Protocol == MediaProtocol.File && _localPlayer.CanAccessFile(item.Path)) + { + playlistItem.PlayMethod = PlayMethod.DirectPlay; + } + else + { + playlistItem.PlayMethod = PlayMethod.DirectStream; + } + playlistItem.Container = item.Container; return playlistItem; @@ -530,18 +549,17 @@ namespace MediaBrowser.Model.Dlna if (mediaSource.Protocol == MediaProtocol.Http) { - if (!options.SupportsDirectRemoteContent) + if (_localPlayer.CanAccessUrl(mediaSource.Path, mediaSource.RequiredHttpHeaders.Count > 0)) { - return null; + return PlayMethod.DirectPlay; } - - if (mediaSource.RequiredHttpHeaders.Count > 0 && !options.SupportsCustomHttpHeaders) - { - return null; - } - return PlayMethod.DirectPlay; } + else if (mediaSource.Protocol == MediaProtocol.File && _localPlayer.CanAccessFile(mediaSource.Path)) + { + return PlayMethod.DirectPlay; + } + return PlayMethod.DirectStream; } @@ -574,7 +592,7 @@ namespace MediaBrowser.Model.Dlna { return profile; } - + // For sync we can handle the longer extraction times if (context == EncodingContext.Static && subtitleStream.IsTextSubtitleStream) { diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 662b76002..14ec093ec 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -124,7 +124,10 @@ + + + diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 05c2807c0..fc506e822 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.582 + 3.0.583 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 8d6ecd1a1..c45951383 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.582 + 3.0.583 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index c907f9c51..c38bf5ffb 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.582 + 3.0.583 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 31064cfe0..b78c8e3aa 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.582 + 3.0.583 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +