adjust audio direct play checks

This commit is contained in:
Luke Pulverenti 2015-03-12 21:55:22 -04:00
parent aa64e1df78
commit 0ec38a9d40
7 changed files with 115 additions and 66 deletions

View File

@ -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&lt;SessionInfo&gt;.</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.

View File

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

View File

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

View File

@ -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 = { '/', '|', ';', '\\' };

View File

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

View File

@ -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,

View File

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