support file playback with StreamBuilder

This commit is contained in:
Luke Pulverenti 2015-03-12 02:06:57 -04:00
parent d0d225e0d1
commit ceb88b1359
12 changed files with 122 additions and 28 deletions

View File

@ -356,12 +356,18 @@
<Compile Include="..\MediaBrowser.Model\Dlna\HttpHeaderInfo.cs">
<Link>Dlna\HttpHeaderInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\ILocalPlayer.cs">
<Link>Dlna\ILocalPlayer.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\MediaFormatProfile.cs">
<Link>Dlna\MediaFormatProfile.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\MediaFormatProfileResolver.cs">
<Link>Dlna\MediaFormatProfileResolver.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\NullLocalPlayer.cs">
<Link>Dlna\NullLocalPlayer.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\PlaybackErrorCode.cs">
<Link>Dlna\PlaybackErrorCode.cs</Link>
</Compile>

View File

@ -288,6 +288,9 @@
<Compile Include="..\MediaBrowser.Model\Dlna\ContentFeatureBuilder.cs">
<Link>Dlna\ContentFeatureBuilder.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\DefaultLocalPlayer.cs">
<Link>Dlna\DefaultLocalPlayer.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\DeviceIdentification.cs">
<Link>Dlna\DeviceIdentification.cs</Link>
</Compile>
@ -321,12 +324,18 @@
<Compile Include="..\MediaBrowser.Model\Dlna\HttpHeaderInfo.cs">
<Link>Dlna\HttpHeaderInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\ILocalPlayer.cs">
<Link>Dlna\ILocalPlayer.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\MediaFormatProfile.cs">
<Link>Dlna\MediaFormatProfile.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\MediaFormatProfileResolver.cs">
<Link>Dlna\MediaFormatProfileResolver.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\NullLocalPlayer.cs">
<Link>Dlna\NullLocalPlayer.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Dlna\PlaybackErrorCode.cs">
<Link>Dlna\PlaybackErrorCode.cs</Link>
</Compile>

View File

@ -46,17 +46,6 @@ namespace MediaBrowser.Model.Dlna
/// </summary>
/// <value>The audio transcoding bitrate.</value>
public int? AudioTranscodingBitrate { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [supports direct remote content].
/// </summary>
/// <value><c>true</c> if [supports direct remote content]; otherwise, <c>false</c>.</value>
public bool SupportsDirectRemoteContent { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [supports custom HTTP headers].
/// </summary>
/// <value><c>true</c> if [supports custom HTTP headers]; otherwise, <c>false</c>.</value>
public bool SupportsCustomHttpHeaders { get; set; }
/// <summary>
/// Gets the maximum bitrate.

View File

@ -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;
}
}
}

View File

@ -0,0 +1,26 @@

namespace MediaBrowser.Model.Dlna
{
public interface ILocalPlayer
{
/// <summary>
/// Determines whether this instance [can access file] the specified path.
/// </summary>
/// <param name="path">The path.</param>
/// <returns><c>true</c> if this instance [can access file] the specified path; otherwise, <c>false</c>.</returns>
bool CanAccessFile(string path);
/// <summary>
/// Determines whether this instance [can access directory] the specified path.
/// </summary>
/// <param name="path">The path.</param>
/// <returns><c>true</c> if this instance [can access directory] the specified path; otherwise, <c>false</c>.</returns>
bool CanAccessDirectory(string path);
/// <summary>
/// Determines whether this instance [can access URL] the specified URL.
/// </summary>
/// <param name="url">The URL.</param>
/// <param name="requiresCustomRequestHeaders">if set to <c>true</c> [requires custom request headers].</param>
/// <returns><c>true</c> if this instance [can access URL] the specified URL; otherwise, <c>false</c>.</returns>
bool CanAccessUrl(string url, bool requiresCustomRequestHeaders);
}
}

View File

@ -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;
}
}
}

View File

@ -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)
{

View File

@ -124,7 +124,10 @@
<Compile Include="Devices\LocalFileInfo.cs" />
<Compile Include="Devices\DeviceInfo.cs" />
<Compile Include="Devices\DevicesOptions.cs" />
<Compile Include="Dlna\DefaultLocalPlayer.cs" />
<Compile Include="Dlna\EncodingContext.cs" />
<Compile Include="Dlna\ILocalPlayer.cs" />
<Compile Include="Dlna\NullLocalPlayer.cs" />
<Compile Include="Dlna\PlaybackErrorCode.cs" />
<Compile Include="Dlna\PlaybackException.cs" />
<Compile Include="Dlna\Profiles\DefaultProfile.cs" />

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
<version>3.0.582</version>
<version>3.0.583</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.582" />
<dependency id="MediaBrowser.Common" version="3.0.583" />
<dependency id="NLog" version="3.2.0.0" />
<dependency id="SimpleInjector" version="2.7.0" />
</dependencies>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
<version>3.0.582</version>
<version>3.0.583</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Model.Signed</id>
<version>3.0.582</version>
<version>3.0.583</version>
<title>MediaBrowser.Model - Signed Edition</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
<version>3.0.582</version>
<version>3.0.583</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.582" />
<dependency id="MediaBrowser.Common" version="3.0.583" />
</dependencies>
</metadata>
<files>