adjust audio direct play checks
This commit is contained in:
parent
aa64e1df78
commit
0ec38a9d40
|
@ -283,18 +283,20 @@ namespace MediaBrowser.Controller.Session
|
|||
/// Gets the session by authentication token.
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="deviceId">The device identifier.</param>
|
||||
/// <param name="remoteEndpoint">The remote endpoint.</param>
|
||||
/// <returns>SessionInfo.</returns>
|
||||
Task<SessionInfo> GetSessionByAuthenticationToken(string token, string remoteEndpoint);
|
||||
Task<SessionInfo> GetSessionByAuthenticationToken(string token, string deviceId, string remoteEndpoint);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the session by authentication token.
|
||||
/// </summary>
|
||||
/// <param name="info">The information.</param>
|
||||
/// <param name="deviceId">The device identifier.</param>
|
||||
/// <param name="remoteEndpoint">The remote endpoint.</param>
|
||||
/// <param name="appVersion">The application version.</param>
|
||||
/// <returns>Task<SessionInfo>.</returns>
|
||||
Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string remoteEndpoint, string appVersion);
|
||||
Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion);
|
||||
|
||||
/// <summary>
|
||||
/// Logouts the specified access token.
|
||||
|
|
|
@ -138,72 +138,60 @@ namespace MediaBrowser.Model.Dlna
|
|||
DeviceProfile = options.Profile
|
||||
};
|
||||
|
||||
int? maxBitrateSetting = options.GetMaxBitrate();
|
||||
List<PlayMethod> directPlayMethods = GetAudioDirectPlayMethods(item, options);
|
||||
|
||||
MediaStream audioStream = item.DefaultAudioStream;
|
||||
|
||||
// Honor the max bitrate setting
|
||||
if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting))
|
||||
if (directPlayMethods.Count > 0)
|
||||
{
|
||||
DirectPlayProfile directPlay = null;
|
||||
foreach (DirectPlayProfile i in options.Profile.DirectPlayProfiles)
|
||||
MediaStream audioStream = item.DefaultAudioStream;
|
||||
|
||||
string audioCodec = audioStream == null ? null : audioStream.Codec;
|
||||
|
||||
// Make sure audio codec profiles are satisfied
|
||||
if (!string.IsNullOrEmpty(audioCodec))
|
||||
{
|
||||
if (i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream))
|
||||
ConditionProcessor conditionProcessor = new ConditionProcessor();
|
||||
|
||||
List<ProfileCondition> conditions = new List<ProfileCondition>();
|
||||
foreach (CodecProfile i in options.Profile.CodecProfiles)
|
||||
{
|
||||
directPlay = i;
|
||||
break;
|
||||
if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
|
||||
{
|
||||
foreach (ProfileCondition c in i.Conditions)
|
||||
{
|
||||
conditions.Add(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (directPlay != null)
|
||||
{
|
||||
string audioCodec = audioStream == null ? null : audioStream.Codec;
|
||||
int? audioChannels = audioStream.Channels;
|
||||
int? audioBitrate = audioStream.BitRate;
|
||||
|
||||
// Make sure audio codec profiles are satisfied
|
||||
if (!string.IsNullOrEmpty(audioCodec))
|
||||
bool all = true;
|
||||
foreach (ProfileCondition c in conditions)
|
||||
{
|
||||
ConditionProcessor conditionProcessor = new ConditionProcessor();
|
||||
|
||||
List<ProfileCondition> conditions = new List<ProfileCondition>();
|
||||
foreach (CodecProfile i in options.Profile.CodecProfiles)
|
||||
if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))
|
||||
{
|
||||
if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
|
||||
{
|
||||
foreach (ProfileCondition c in i.Conditions)
|
||||
{
|
||||
conditions.Add(c);
|
||||
}
|
||||
}
|
||||
all = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (all)
|
||||
{
|
||||
if (item.Protocol == MediaProtocol.File &&
|
||||
directPlayMethods.Contains(PlayMethod.DirectPlay) &&
|
||||
_localPlayer.CanAccessFile(item.Path))
|
||||
{
|
||||
playlistItem.PlayMethod = PlayMethod.DirectPlay;
|
||||
}
|
||||
else if (directPlayMethods.Contains(PlayMethod.DirectStream))
|
||||
{
|
||||
playlistItem.PlayMethod = PlayMethod.DirectStream;
|
||||
}
|
||||
|
||||
int? audioChannels = audioStream.Channels;
|
||||
int? audioBitrate = audioStream.BitRate;
|
||||
playlistItem.Container = item.Container;
|
||||
|
||||
bool all = true;
|
||||
foreach (ProfileCondition c in conditions)
|
||||
{
|
||||
if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))
|
||||
{
|
||||
all = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (all)
|
||||
{
|
||||
if (item.Protocol == MediaProtocol.File && _localPlayer.CanAccessFile(item.Path))
|
||||
{
|
||||
playlistItem.PlayMethod = PlayMethod.DirectPlay;
|
||||
}
|
||||
else
|
||||
{
|
||||
playlistItem.PlayMethod = PlayMethod.DirectStream;
|
||||
}
|
||||
|
||||
playlistItem.Container = item.Container;
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
return playlistItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -272,6 +260,41 @@ namespace MediaBrowser.Model.Dlna
|
|||
return playlistItem;
|
||||
}
|
||||
|
||||
private List<PlayMethod> GetAudioDirectPlayMethods(MediaSourceInfo item, AudioOptions options)
|
||||
{
|
||||
MediaStream audioStream = item.DefaultAudioStream;
|
||||
|
||||
DirectPlayProfile directPlayProfile = null;
|
||||
foreach (DirectPlayProfile i in options.Profile.DirectPlayProfiles)
|
||||
{
|
||||
if (i.Type == DlnaProfileType.Audio && IsAudioDirectPlaySupported(i, item, audioStream))
|
||||
{
|
||||
directPlayProfile = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
List<PlayMethod> playMethods = new List<PlayMethod>();
|
||||
|
||||
if (directPlayProfile != null)
|
||||
{
|
||||
// While options takes the network and other factors into account. Only applies to direct stream
|
||||
if (IsAudioEligibleForDirectPlay(item, options.GetMaxBitrate()))
|
||||
{
|
||||
playMethods.Add(PlayMethod.DirectStream);
|
||||
}
|
||||
|
||||
// The profile describes what the device supports
|
||||
// If device requirements are satisfied then allow both direct stream and direct play
|
||||
if (IsAudioEligibleForDirectPlay(item, options.Profile.MaxStaticBitrate))
|
||||
{
|
||||
playMethods.Add(PlayMethod.DirectPlay);
|
||||
}
|
||||
}
|
||||
|
||||
return playMethods;
|
||||
}
|
||||
|
||||
private StreamInfo BuildVideoItem(MediaSourceInfo item, VideoOptions options)
|
||||
{
|
||||
StreamInfo playlistItem = new StreamInfo
|
||||
|
|
|
@ -252,7 +252,7 @@ namespace MediaBrowser.Providers.Manager
|
|||
|
||||
if (sourceHasAlbumArtist != null && targetHasAlbumArtist != null)
|
||||
{
|
||||
if (replaceData || targetHasAlbumArtist.AlbumArtists.Count > 0)
|
||||
if (replaceData || targetHasAlbumArtist.AlbumArtists.Count == 0)
|
||||
{
|
||||
targetHasAlbumArtist.AlbumArtists = sourceHasAlbumArtist.AlbumArtists;
|
||||
}
|
||||
|
|
|
@ -210,7 +210,15 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
}
|
||||
}
|
||||
|
||||
var albumArtist = FFProbeHelpers.GetDictionaryValue(tags, "albumartist") ?? FFProbeHelpers.GetDictionaryValue(tags, "album artist") ?? FFProbeHelpers.GetDictionaryValue(tags, "album_artist");
|
||||
var albumArtist = FFProbeHelpers.GetDictionaryValue(tags, "albumartist");
|
||||
if (string.IsNullOrWhiteSpace(albumArtist))
|
||||
{
|
||||
albumArtist = FFProbeHelpers.GetDictionaryValue(tags, "album artist");
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(albumArtist))
|
||||
{
|
||||
albumArtist = FFProbeHelpers.GetDictionaryValue(tags, "album_artist");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(albumArtist))
|
||||
{
|
||||
|
@ -277,8 +285,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
|
||||
return value.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(i => i.Trim())
|
||||
.Where(i => !string.IsNullOrWhiteSpace(i))
|
||||
.FirstOrDefault();
|
||||
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
|
||||
}
|
||||
|
||||
private readonly char[] _nameDelimiters = { '/', '|', ';', '\\' };
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
|
|||
if (!string.IsNullOrWhiteSpace(authorization.Token))
|
||||
{
|
||||
var auth = GetTokenInfo(requestContext);
|
||||
return _sessionManager.GetSessionByAuthenticationToken(auth, requestContext.RemoteIp, authorization.Version);
|
||||
return _sessionManager.GetSessionByAuthenticationToken(auth, authorization.DeviceId, requestContext.RemoteIp, authorization.Version);
|
||||
}
|
||||
|
||||
var session = _sessionManager.GetSession(authorization.DeviceId, authorization.Client, authorization.Version);
|
||||
|
|
|
@ -1639,7 +1639,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|||
string.Equals(i.Client, client));
|
||||
}
|
||||
|
||||
public Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string remoteEndpoint, string appVersion)
|
||||
public Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion)
|
||||
{
|
||||
if (info == null)
|
||||
{
|
||||
|
@ -1654,10 +1654,26 @@ namespace MediaBrowser.Server.Implementations.Session
|
|||
? "1"
|
||||
: appVersion;
|
||||
|
||||
return GetSessionInfo(info.AppName, appVersion, info.DeviceId, info.DeviceName, remoteEndpoint, user);
|
||||
var deviceName = info.DeviceName;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(deviceId))
|
||||
{
|
||||
// Replace the info from the token with more recent info
|
||||
var device = _deviceManager.GetDevice(deviceId);
|
||||
if (device != null)
|
||||
{
|
||||
deviceName = device.Name;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
deviceId = info.DeviceId;
|
||||
}
|
||||
|
||||
return GetSessionInfo(info.AppName, appVersion, deviceId, deviceName, remoteEndpoint, user);
|
||||
}
|
||||
|
||||
public Task<SessionInfo> GetSessionByAuthenticationToken(string token, string remoteEndpoint)
|
||||
public Task<SessionInfo> GetSessionByAuthenticationToken(string token, string deviceId, string remoteEndpoint)
|
||||
{
|
||||
var result = _authRepo.Get(new AuthenticationInfoQuery
|
||||
{
|
||||
|
@ -1676,7 +1692,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|||
return null;
|
||||
}
|
||||
|
||||
return GetSessionByAuthenticationToken(info, remoteEndpoint, null);
|
||||
return GetSessionByAuthenticationToken(info, deviceId, remoteEndpoint, null);
|
||||
}
|
||||
|
||||
public Task SendMessageToUserSessions<T>(string userId, string name, T data,
|
||||
|
|
|
@ -103,7 +103,8 @@ namespace MediaBrowser.Server.Implementations.Session
|
|||
{
|
||||
return Task.FromResult<SessionInfo>(null);
|
||||
}
|
||||
return _sessionManager.GetSessionByAuthenticationToken(token, remoteEndpoint);
|
||||
var deviceId = queryString["deviceId"];
|
||||
return _sessionManager.GetSessionByAuthenticationToken(token, deviceId, remoteEndpoint);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
|
Loading…
Reference in New Issue
Block a user