|
@@ -15,6 +15,7 @@ using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
|
|
+using MediaBrowser.Controller.Entities.Audio;
|
|
using MediaBrowser.Controller.MediaEncoding;
|
|
using MediaBrowser.Controller.MediaEncoding;
|
|
|
|
|
|
namespace MediaBrowser.Api.Playback
|
|
namespace MediaBrowser.Api.Playback
|
|
@@ -68,8 +69,9 @@ namespace MediaBrowser.Api.Playback
|
|
private readonly IServerConfigurationManager _config;
|
|
private readonly IServerConfigurationManager _config;
|
|
private readonly INetworkManager _networkManager;
|
|
private readonly INetworkManager _networkManager;
|
|
private readonly IMediaEncoder _mediaEncoder;
|
|
private readonly IMediaEncoder _mediaEncoder;
|
|
|
|
+ private readonly IUserManager _userManager;
|
|
|
|
|
|
- public MediaInfoService(IMediaSourceManager mediaSourceManager, IDeviceManager deviceManager, ILibraryManager libraryManager, IServerConfigurationManager config, INetworkManager networkManager, IMediaEncoder mediaEncoder)
|
|
|
|
|
|
+ public MediaInfoService(IMediaSourceManager mediaSourceManager, IDeviceManager deviceManager, ILibraryManager libraryManager, IServerConfigurationManager config, INetworkManager networkManager, IMediaEncoder mediaEncoder, IUserManager userManager)
|
|
{
|
|
{
|
|
_mediaSourceManager = mediaSourceManager;
|
|
_mediaSourceManager = mediaSourceManager;
|
|
_deviceManager = deviceManager;
|
|
_deviceManager = deviceManager;
|
|
@@ -77,6 +79,7 @@ namespace MediaBrowser.Api.Playback
|
|
_config = config;
|
|
_config = config;
|
|
_networkManager = networkManager;
|
|
_networkManager = networkManager;
|
|
_mediaEncoder = mediaEncoder;
|
|
_mediaEncoder = mediaEncoder;
|
|
|
|
+ _userManager = userManager;
|
|
}
|
|
}
|
|
|
|
|
|
public object Get(GetBitrateTestBytes request)
|
|
public object Get(GetBitrateTestBytes request)
|
|
@@ -119,7 +122,7 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
|
SetDeviceSpecificData(item, result.MediaSource, profile, authInfo, request.MaxStreamingBitrate,
|
|
SetDeviceSpecificData(item, result.MediaSource, profile, authInfo, request.MaxStreamingBitrate,
|
|
request.StartTimeTicks ?? 0, result.MediaSource.Id, request.AudioStreamIndex,
|
|
request.StartTimeTicks ?? 0, result.MediaSource.Id, request.AudioStreamIndex,
|
|
- request.SubtitleStreamIndex, request.PlaySessionId);
|
|
|
|
|
|
+ request.SubtitleStreamIndex, request.PlaySessionId, request.UserId);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -159,7 +162,7 @@ namespace MediaBrowser.Api.Playback
|
|
{
|
|
{
|
|
var mediaSourceId = request.MediaSourceId;
|
|
var mediaSourceId = request.MediaSourceId;
|
|
|
|
|
|
- SetDeviceSpecificData(request.Id, info, profile, authInfo, request.MaxStreamingBitrate ?? profile.MaxStreamingBitrate, request.StartTimeTicks ?? 0, mediaSourceId, request.AudioStreamIndex, request.SubtitleStreamIndex);
|
|
|
|
|
|
+ SetDeviceSpecificData(request.Id, info, profile, authInfo, request.MaxStreamingBitrate ?? profile.MaxStreamingBitrate, request.StartTimeTicks ?? 0, mediaSourceId, request.AudioStreamIndex, request.SubtitleStreamIndex, request.UserId);
|
|
}
|
|
}
|
|
|
|
|
|
return ToOptimizedResult(info);
|
|
return ToOptimizedResult(info);
|
|
@@ -221,13 +224,14 @@ namespace MediaBrowser.Api.Playback
|
|
long startTimeTicks,
|
|
long startTimeTicks,
|
|
string mediaSourceId,
|
|
string mediaSourceId,
|
|
int? audioStreamIndex,
|
|
int? audioStreamIndex,
|
|
- int? subtitleStreamIndex)
|
|
|
|
|
|
+ int? subtitleStreamIndex,
|
|
|
|
+ string userId)
|
|
{
|
|
{
|
|
var item = _libraryManager.GetItemById(itemId);
|
|
var item = _libraryManager.GetItemById(itemId);
|
|
|
|
|
|
foreach (var mediaSource in result.MediaSources)
|
|
foreach (var mediaSource in result.MediaSources)
|
|
{
|
|
{
|
|
- SetDeviceSpecificData(item, mediaSource, profile, auth, maxBitrate, startTimeTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, result.PlaySessionId);
|
|
|
|
|
|
+ SetDeviceSpecificData(item, mediaSource, profile, auth, maxBitrate, startTimeTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex, result.PlaySessionId, userId);
|
|
}
|
|
}
|
|
|
|
|
|
SortMediaSources(result, maxBitrate);
|
|
SortMediaSources(result, maxBitrate);
|
|
@@ -242,7 +246,8 @@ namespace MediaBrowser.Api.Playback
|
|
string mediaSourceId,
|
|
string mediaSourceId,
|
|
int? audioStreamIndex,
|
|
int? audioStreamIndex,
|
|
int? subtitleStreamIndex,
|
|
int? subtitleStreamIndex,
|
|
- string playSessionId)
|
|
|
|
|
|
+ string playSessionId,
|
|
|
|
+ string userId)
|
|
{
|
|
{
|
|
var streamBuilder = new StreamBuilder(_mediaEncoder, Logger);
|
|
var streamBuilder = new StreamBuilder(_mediaEncoder, Logger);
|
|
|
|
|
|
@@ -262,6 +267,8 @@ namespace MediaBrowser.Api.Playback
|
|
options.SubtitleStreamIndex = subtitleStreamIndex;
|
|
options.SubtitleStreamIndex = subtitleStreamIndex;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var user = _userManager.GetUserById(userId);
|
|
|
|
+
|
|
if (mediaSource.SupportsDirectPlay)
|
|
if (mediaSource.SupportsDirectPlay)
|
|
{
|
|
{
|
|
var supportsDirectStream = mediaSource.SupportsDirectStream;
|
|
var supportsDirectStream = mediaSource.SupportsDirectStream;
|
|
@@ -270,6 +277,14 @@ namespace MediaBrowser.Api.Playback
|
|
mediaSource.SupportsDirectStream = true;
|
|
mediaSource.SupportsDirectStream = true;
|
|
options.MaxBitrate = maxBitrate;
|
|
options.MaxBitrate = maxBitrate;
|
|
|
|
|
|
|
|
+ if (item is Audio)
|
|
|
|
+ {
|
|
|
|
+ if (!user.Policy.EnableAudioPlaybackTranscoding)
|
|
|
|
+ {
|
|
|
|
+ options.ForceDirectPlay = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// The MediaSource supports direct stream, now test to see if the client supports it
|
|
// The MediaSource supports direct stream, now test to see if the client supports it
|
|
var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ?
|
|
var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ?
|
|
streamBuilder.BuildAudioItem(options) :
|
|
streamBuilder.BuildAudioItem(options) :
|
|
@@ -293,6 +308,14 @@ namespace MediaBrowser.Api.Playback
|
|
{
|
|
{
|
|
options.MaxBitrate = GetMaxBitrate(maxBitrate);
|
|
options.MaxBitrate = GetMaxBitrate(maxBitrate);
|
|
|
|
|
|
|
|
+ if (item is Audio)
|
|
|
|
+ {
|
|
|
|
+ if (!user.Policy.EnableAudioPlaybackTranscoding)
|
|
|
|
+ {
|
|
|
|
+ options.ForceDirectStream = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// The MediaSource supports direct stream, now test to see if the client supports it
|
|
// The MediaSource supports direct stream, now test to see if the client supports it
|
|
var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ?
|
|
var streamInfo = string.Equals(item.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase) ?
|
|
streamBuilder.BuildAudioItem(options) :
|
|
streamBuilder.BuildAudioItem(options) :
|