Pārlūkot izejas kodu

Merge pull request #5648 from OancaAndrei/syncplay-sessions-fix

Fix session references in SyncPlay
Claus Vium 3 gadi atpakaļ
vecāks
revīzija
00f7f68e53

+ 4 - 2
Emby.Server.Implementations/Session/SessionManager.cs

@@ -1199,16 +1199,18 @@ namespace Emby.Server.Implementations.Session
         }
 
         /// <inheritdoc />
-        public async Task SendSyncPlayCommand(SessionInfo session, SendCommand command, CancellationToken cancellationToken)
+        public async Task SendSyncPlayCommand(string sessionId, SendCommand command, CancellationToken cancellationToken)
         {
             CheckDisposed();
+            var session = GetSession(sessionId);
             await SendMessageToSession(session, SessionMessageType.SyncPlayCommand, command, cancellationToken).ConfigureAwait(false);
         }
 
         /// <inheritdoc />
-        public async Task SendSyncPlayGroupUpdate<T>(SessionInfo session, GroupUpdate<T> command, CancellationToken cancellationToken)
+        public async Task SendSyncPlayGroupUpdate<T>(string sessionId, GroupUpdate<T> command, CancellationToken cancellationToken)
         {
             CheckDisposed();
+            var session = GetSession(sessionId);
             await SendMessageToSession(session, SessionMessageType.SyncPlayGroupUpdate, command, cancellationToken).ConfigureAwait(false);
         }
 

+ 18 - 16
Emby.Server.Implementations/SyncPlay/Group.cs

@@ -164,26 +164,26 @@ namespace Emby.Server.Implementations.SyncPlay
         /// <summary>
         /// Filters sessions of this group.
         /// </summary>
-        /// <param name="from">The current session.</param>
+        /// <param name="fromId">The current session identifier.</param>
         /// <param name="type">The filtering type.</param>
         /// <returns>The list of sessions matching the filter.</returns>
-        private IEnumerable<SessionInfo> FilterSessions(SessionInfo from, SyncPlayBroadcastType type)
+        private IEnumerable<string> FilterSessions(string fromId, SyncPlayBroadcastType type)
         {
             return type switch
             {
-                SyncPlayBroadcastType.CurrentSession => new SessionInfo[] { from },
+                SyncPlayBroadcastType.CurrentSession => new string[] { fromId },
                 SyncPlayBroadcastType.AllGroup => _participants
                     .Values
-                    .Select(session => session.Session),
+                    .Select(member => member.SessionId),
                 SyncPlayBroadcastType.AllExceptCurrentSession => _participants
                     .Values
-                    .Select(session => session.Session)
-                    .Where(session => !session.Id.Equals(from.Id, StringComparison.OrdinalIgnoreCase)),
+                    .Select(member => member.SessionId)
+                    .Where(sessionId => !sessionId.Equals(fromId, StringComparison.OrdinalIgnoreCase)),
                 SyncPlayBroadcastType.AllReady => _participants
                     .Values
-                    .Where(session => !session.IsBuffering)
-                    .Select(session => session.Session),
-                _ => Enumerable.Empty<SessionInfo>()
+                    .Where(member => !member.IsBuffering)
+                    .Select(member => member.SessionId),
+                _ => Enumerable.Empty<string>()
             };
         }
 
@@ -225,7 +225,7 @@ namespace Emby.Server.Implementations.SyncPlay
             // Get list of users.
             var users = _participants
                 .Values
-                .Select(participant => _userManager.GetUserById(participant.Session.UserId));
+                .Select(participant => _userManager.GetUserById(participant.UserId));
 
             // Find problematic users.
             var usersWithNoAccess = users.Where(user => !HasAccessToQueue(user, queue));
@@ -353,7 +353,7 @@ namespace Emby.Server.Implementations.SyncPlay
         /// <returns>The group info for the clients.</returns>
         public GroupInfoDto GetInfo()
         {
-            var participants = _participants.Values.Select(session => session.Session.UserName).Distinct().ToList();
+            var participants = _participants.Values.Select(session => session.UserName).Distinct().ToList();
             return new GroupInfoDto(GroupId, GroupName, _state.Type, participants, DateTime.UtcNow);
         }
 
@@ -389,9 +389,9 @@ namespace Emby.Server.Implementations.SyncPlay
         {
             IEnumerable<Task> GetTasks()
             {
-                foreach (var session in FilterSessions(from, type))
+                foreach (var sessionId in FilterSessions(from.Id, type))
                 {
-                    yield return _sessionManager.SendSyncPlayGroupUpdate(session, message, cancellationToken);
+                    yield return _sessionManager.SendSyncPlayGroupUpdate(sessionId, message, cancellationToken);
                 }
             }
 
@@ -403,9 +403,9 @@ namespace Emby.Server.Implementations.SyncPlay
         {
             IEnumerable<Task> GetTasks()
             {
-                foreach (var session in FilterSessions(from, type))
+                foreach (var sessionId in FilterSessions(from.Id, type))
                 {
-                    yield return _sessionManager.SendSyncPlayCommand(session, message, cancellationToken);
+                    yield return _sessionManager.SendSyncPlayCommand(sessionId, message, cancellationToken);
                 }
             }
 
@@ -659,8 +659,9 @@ namespace Emby.Server.Implementations.SyncPlay
         public PlayQueueUpdate GetPlayQueueUpdate(PlayQueueUpdateReason reason)
         {
             var startPositionTicks = PositionTicks;
+            var isPlaying = _state.Type.Equals(GroupStateType.Playing);
 
-            if (_state.Type.Equals(GroupStateType.Playing))
+            if (isPlaying)
             {
                 var currentTime = DateTime.UtcNow;
                 var elapsedTime = currentTime - LastActivity;
@@ -679,6 +680,7 @@ namespace Emby.Server.Implementations.SyncPlay
                 PlayQueue.GetPlaylist(),
                 PlayQueue.PlayingItemIndex,
                 startPositionTicks,
+                isPlaying,
                 PlayQueue.ShuffleMode,
                 PlayQueue.RepeatMode);
         }

+ 4 - 4
Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs

@@ -160,7 +160,7 @@ namespace Emby.Server.Implementations.SyncPlay
                     _logger.LogWarning("Session {SessionId} tried to join group {GroupId} that does not exist.", session.Id, request.GroupId);
 
                     var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.GroupDoesNotExist, string.Empty);
-                    _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
+                    _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
                     return;
                 }
 
@@ -172,7 +172,7 @@ namespace Emby.Server.Implementations.SyncPlay
                         _logger.LogWarning("Session {SessionId} tried to join group {GroupId} but does not have access to some content of the playing queue.", session.Id, group.GroupId.ToString());
 
                         var error = new GroupUpdate<string>(group.GroupId, GroupUpdateType.LibraryAccessDenied, string.Empty);
-                        _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
+                        _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
                         return;
                     }
 
@@ -249,7 +249,7 @@ namespace Emby.Server.Implementations.SyncPlay
                     _logger.LogWarning("Session {SessionId} does not belong to any group.", session.Id);
 
                     var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.NotInGroup, string.Empty);
-                    _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
+                    _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
                     return;
                 }
             }
@@ -329,7 +329,7 @@ namespace Emby.Server.Implementations.SyncPlay
                 _logger.LogWarning("Session {SessionId} does not belong to any group.", session.Id);
 
                 var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.NotInGroup, string.Empty);
-                _sessionManager.SendSyncPlayGroupUpdate(session, error, CancellationToken.None);
+                _sessionManager.SendSyncPlayGroupUpdate(session.Id, error, CancellationToken.None);
             }
         }
 

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

@@ -157,21 +157,21 @@ namespace MediaBrowser.Controller.Session
         /// <summary>
         /// Sends a SyncPlayCommand to a session.
         /// </summary>
-        /// <param name="session">The session.</param>
+        /// <param name="sessionId">The identifier of the session.</param>
         /// <param name="command">The command.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task.</returns>
-        Task SendSyncPlayCommand(SessionInfo session, SendCommand command, CancellationToken cancellationToken);
+        Task SendSyncPlayCommand(string sessionId, SendCommand command, CancellationToken cancellationToken);
 
         /// <summary>
         /// Sends a SyncPlayGroupUpdate to a session.
         /// </summary>
-        /// <param name="session">The session.</param>
+        /// <param name="sessionId">The identifier of the session.</param>
         /// <param name="command">The group update.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <typeparam name="T">Type of group.</typeparam>
         /// <returns>Task.</returns>
-        Task SendSyncPlayGroupUpdate<T>(SessionInfo session, GroupUpdate<T> command, CancellationToken cancellationToken);
+        Task SendSyncPlayGroupUpdate<T>(string sessionId, GroupUpdate<T> command, CancellationToken cancellationToken);
 
         /// <summary>
         /// Sends the browse command.

+ 19 - 4
MediaBrowser.Controller/SyncPlay/GroupMember.cs

@@ -1,5 +1,6 @@
 #nullable disable
 
+using System;
 using MediaBrowser.Controller.Session;
 
 namespace MediaBrowser.Controller.SyncPlay
@@ -15,14 +16,28 @@ namespace MediaBrowser.Controller.SyncPlay
         /// <param name="session">The session.</param>
         public GroupMember(SessionInfo session)
         {
-            Session = session;
+            SessionId = session.Id;
+            UserId = session.UserId;
+            UserName = session.UserName;
         }
 
         /// <summary>
-        /// Gets the session.
+        /// Gets the identifier of the session.
         /// </summary>
-        /// <value>The session.</value>
-        public SessionInfo Session { get; }
+        /// <value>The session identifier.</value>
+        public string SessionId { get; }
+
+        /// <summary>
+        /// Gets the identifier of the user.
+        /// </summary>
+        /// <value>The user identifier.</value>
+        public Guid UserId { get; }
+
+        /// <summary>
+        /// Gets the username.
+        /// </summary>
+        /// <value>The username.</value>
+        public string UserName { get; }
 
         /// <summary>
         /// Gets or sets the ping, in milliseconds.

+ 9 - 1
MediaBrowser.Model/SyncPlay/PlayQueueUpdate.cs

@@ -16,15 +16,17 @@ namespace MediaBrowser.Model.SyncPlay
         /// <param name="playlist">The playlist.</param>
         /// <param name="playingItemIndex">The playing item index in the playlist.</param>
         /// <param name="startPositionTicks">The start position ticks.</param>
+        /// <param name="isPlaying">The playing item status.</param>
         /// <param name="shuffleMode">The shuffle mode.</param>
         /// <param name="repeatMode">The repeat mode.</param>
-        public PlayQueueUpdate(PlayQueueUpdateReason reason, DateTime lastUpdate, IReadOnlyList<QueueItem> playlist, int playingItemIndex, long startPositionTicks, GroupShuffleMode shuffleMode, GroupRepeatMode repeatMode)
+        public PlayQueueUpdate(PlayQueueUpdateReason reason, DateTime lastUpdate, IReadOnlyList<QueueItem> playlist, int playingItemIndex, long startPositionTicks, bool isPlaying, GroupShuffleMode shuffleMode, GroupRepeatMode repeatMode)
         {
             Reason = reason;
             LastUpdate = lastUpdate;
             Playlist = playlist;
             PlayingItemIndex = playingItemIndex;
             StartPositionTicks = startPositionTicks;
+            IsPlaying = isPlaying;
             ShuffleMode = shuffleMode;
             RepeatMode = repeatMode;
         }
@@ -59,6 +61,12 @@ namespace MediaBrowser.Model.SyncPlay
         /// <value>The start position ticks.</value>
         public long StartPositionTicks { get; }
 
+        /// <summary>
+        /// Gets a value indicating whether the current item is playing.
+        /// </summary>
+        /// <value>The playing item status.</value>
+        public bool IsPlaying { get; }
+
         /// <summary>
         /// Gets the shuffle mode.
         /// </summary>