浏览代码

adjust audio direct play checks

Luke Pulverenti 10 年之前
父节点
当前提交
0ec38a9d40

+ 4 - 2
MediaBrowser.Controller/Session/ISessionManager.cs

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

+ 71 - 48
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -138,72 +138,60 @@ namespace MediaBrowser.Model.Dlna
                 DeviceProfile = options.Profile
             };
 
-            int? maxBitrateSetting = options.GetMaxBitrate();
-
-            MediaStream audioStream = item.DefaultAudioStream;
+            List<PlayMethod> directPlayMethods = GetAudioDirectPlayMethods(item, options);
 
-            // Honor the max bitrate setting
-            if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting))
+            if (directPlayMethods.Count > 0)
             {
-                DirectPlayProfile directPlay = null;
-                foreach (DirectPlayProfile i in options.Profile.DirectPlayProfiles)
-                {
-                    if (i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream))
-                    {
-                        directPlay = i;
-                        break;
-                    }
-                }
+                MediaStream audioStream = item.DefaultAudioStream;
 
-                if (directPlay != null)
+                string audioCodec = audioStream == null ? null : audioStream.Codec;
+
+                // Make sure audio codec profiles are satisfied
+                if (!string.IsNullOrEmpty(audioCodec))
                 {
-                    string audioCodec = audioStream == null ? null : audioStream.Codec;
+                    ConditionProcessor conditionProcessor = new ConditionProcessor();
 
-                    // Make sure audio codec profiles are satisfied
-                    if (!string.IsNullOrEmpty(audioCodec))
+                    List<ProfileCondition> conditions = new List<ProfileCondition>();
+                    foreach (CodecProfile i in options.Profile.CodecProfiles)
                     {
-                        ConditionProcessor conditionProcessor = new ConditionProcessor();
-
-                        List<ProfileCondition> conditions = new List<ProfileCondition>();
-                        foreach (CodecProfile i in options.Profile.CodecProfiles)
+                        if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
                         {
-                            if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
+                            foreach (ProfileCondition c in i.Conditions)
                             {
-                                foreach (ProfileCondition c in i.Conditions)
-                                {
-                                    conditions.Add(c);
-                                }
+                                conditions.Add(c);
                             }
                         }
+                    }
 
-                        int? audioChannels = audioStream.Channels;
-                        int? audioBitrate = audioStream.BitRate;
+                    int? audioChannels = audioStream.Channels;
+                    int? audioBitrate = audioStream.BitRate;
 
-                        bool all = true;
-                        foreach (ProfileCondition c in conditions)
+                    bool all = true;
+                    foreach (ProfileCondition c in conditions)
+                    {
+                        if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))
                         {
-                            if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))
-                            {
-                                all = false;
-                                break;
-                            }
+                            all = false;
+                            break;
                         }
+                    }
 
-                        if (all)
+                    if (all)
+                    {
+                        if (item.Protocol == MediaProtocol.File &&
+                            directPlayMethods.Contains(PlayMethod.DirectPlay) && 
+                            _localPlayer.CanAccessFile(item.Path))
                         {
-                            if (item.Protocol == MediaProtocol.File && _localPlayer.CanAccessFile(item.Path))
-                            {
-                                playlistItem.PlayMethod = PlayMethod.DirectPlay;
-                            }
-                            else
-                            {
-                                playlistItem.PlayMethod = PlayMethod.DirectStream;
-                            }
+                            playlistItem.PlayMethod = PlayMethod.DirectPlay;
+                        }
+                        else if (directPlayMethods.Contains(PlayMethod.DirectStream))
+                        {
+                            playlistItem.PlayMethod = PlayMethod.DirectStream;
+                        }
 
-                            playlistItem.Container = item.Container;
+                        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

+ 1 - 1
MediaBrowser.Providers/Manager/ProviderUtils.cs

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

+ 10 - 3
MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs

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

+ 1 - 1
MediaBrowser.Server.Implementations/HttpServer/Security/SessionContext.cs

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

+ 20 - 4
MediaBrowser.Server.Implementations/Session/SessionManager.cs

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

+ 2 - 1
MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs

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