瀏覽代碼

Create common interface for SyncPlay requests

Ionut Andrei Oanca 4 年之前
父節點
當前提交
78ea8ef99e
共有 31 個文件被更改,包括 238 次插入121 次删除
  1. 6 6
      Emby.Server.Implementations/SyncPlay/GroupController.cs
  2. 25 44
      Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
  3. 9 4
      Jellyfin.Api/Controllers/SyncPlayController.cs
  4. 2 2
      MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs
  5. 6 5
      MediaBrowser.Controller/SyncPlay/IGroupController.cs
  6. 2 2
      MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs
  7. 7 5
      MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs
  8. 16 0
      MediaBrowser.Controller/SyncPlay/ISyncPlayRequest.cs
  9. 29 0
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/AbstractPlaybackRequest.cs
  10. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs
  11. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs
  12. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs
  13. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs
  14. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs
  15. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs
  16. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs
  17. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs
  18. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs
  19. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs
  20. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs
  21. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs
  22. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs
  23. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs
  24. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs
  25. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs
  26. 3 3
      MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs
  27. 29 0
      MediaBrowser.Controller/SyncPlay/Requests/JoinGroupRequest.cs
  28. 13 0
      MediaBrowser.Controller/SyncPlay/Requests/LeaveGroupRequest.cs
  29. 13 0
      MediaBrowser.Controller/SyncPlay/Requests/ListGroupsRequest.cs
  30. 28 0
      MediaBrowser.Controller/SyncPlay/Requests/NewGroupRequest.cs
  31. 2 2
      MediaBrowser.Model/SyncPlay/RequestType.cs

+ 6 - 6
Emby.Server.Implementations/SyncPlay/GroupController.cs

@@ -12,8 +12,8 @@ using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.SyncPlay;
 using MediaBrowser.Controller.SyncPlay.GroupStates;
 using MediaBrowser.Controller.SyncPlay.Queue;
+using MediaBrowser.Controller.SyncPlay.Requests;
 using MediaBrowser.Model.SyncPlay;
-using MediaBrowser.Model.SyncPlay.RequestBodies;
 using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.SyncPlay
@@ -257,7 +257,7 @@ namespace Emby.Server.Implementations.SyncPlay
         public bool IsGroupEmpty() => _participants.Count == 0;
 
         /// <inheritdoc />
-        public void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken)
+        public void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken)
         {
             GroupName = request.GroupName;
             AddSession(session);
@@ -292,7 +292,7 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken)
+        public void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken)
         {
             AddSession(session);
 
@@ -308,7 +308,7 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void SessionRestore(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken)
+        public void SessionRestore(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken)
         {
             var updateSession = NewSyncPlayGroupUpdate(GroupUpdateType.GroupJoined, GetInfo());
             SendGroupUpdate(session, SyncPlayBroadcastType.CurrentSession, updateSession, cancellationToken);
@@ -322,7 +322,7 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void SessionLeave(SessionInfo session, CancellationToken cancellationToken)
+        public void SessionLeave(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken)
         {
             _state.SessionLeaving(this, _state.Type, session, cancellationToken);
 
@@ -343,7 +343,7 @@ namespace Emby.Server.Implementations.SyncPlay
             // The server's job is to maintain a consistent state for clients to reference
             // and notify clients of state changes. The actual syncing of media playback
             // happens client side. Clients are aware of the server's time and use it to sync.
-            _logger.LogInformation("Session {SessionId} requested {RequestType} in group {GroupId} that is {StateType}.", session.Id, request.Type, GroupId.ToString(), _state.Type);
+            _logger.LogInformation("Session {SessionId} requested {RequestType} in group {GroupId} that is {StateType}.", session.Id, request.Action, GroupId.ToString(), _state.Type);
             request.Apply(this, _state, session, cancellationToken);
         }
 

+ 25 - 44
Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs

@@ -5,8 +5,8 @@ using Jellyfin.Data.Enums;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.SyncPlay;
+using MediaBrowser.Controller.SyncPlay.Requests;
 using MediaBrowser.Model.SyncPlay;
-using MediaBrowser.Model.SyncPlay.RequestBodies;
 using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.SyncPlay
@@ -94,10 +94,9 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void NewGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken)
+        public void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken)
         {
-            // TODO: create abstract class for GroupRequests to avoid explicit request type here.
-            if (!IsRequestValid(session, GroupRequestType.NewGroup, request))
+            if (!IsRequestValid(session, request))
             {
                 return;
             }
@@ -111,7 +110,8 @@ namespace Emby.Server.Implementations.SyncPlay
                 {
                     if (IsSessionInGroup(session))
                     {
-                        LeaveGroup(session, cancellationToken);
+                        var leaveGroupRequest = new LeaveGroupRequest();
+                        LeaveGroup(session, leaveGroupRequest, cancellationToken);
                     }
 
                     var group = new GroupController(_loggerFactory, _userManager, _sessionManager, _libraryManager);
@@ -124,10 +124,9 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequestBody request, CancellationToken cancellationToken)
+        public void JoinGroup(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken)
         {
-            // TODO: create abstract class for GroupRequests to avoid explicit request type here.
-            if (!IsRequestValid(session, GroupRequestType.JoinGroup, request))
+            if (!IsRequestValid(session, request))
             {
                 return;
             }
@@ -137,11 +136,11 @@ namespace Emby.Server.Implementations.SyncPlay
             // Locking required to access list of groups.
             lock (_groupsLock)
             {
-                _groups.TryGetValue(groupId, out IGroupController group);
+                _groups.TryGetValue(request.GroupId, out IGroupController group);
 
                 if (group == null)
                 {
-                    _logger.LogWarning("Session {SessionId} tried to join group {GroupId} that does not exist.", session.Id, groupId);
+                    _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);
@@ -165,13 +164,14 @@ namespace Emby.Server.Implementations.SyncPlay
 
                         if (IsSessionInGroup(session))
                         {
-                            if (FindJoinedGroupId(session).Equals(groupId))
+                            if (FindJoinedGroupId(session).Equals(request.GroupId))
                             {
                                 group.SessionRestore(session, request, cancellationToken);
                                 return;
                             }
 
-                            LeaveGroup(session, cancellationToken);
+                            var leaveGroupRequest = new LeaveGroupRequest();
+                            LeaveGroup(session, leaveGroupRequest, cancellationToken);
                         }
 
                         AddSessionToGroup(session, group);
@@ -182,10 +182,9 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public void LeaveGroup(SessionInfo session, CancellationToken cancellationToken)
+        public void LeaveGroup(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken)
         {
-            // TODO: create abstract class for GroupRequests to avoid explicit request type here.
-            if (!IsRequestValid(session, GroupRequestType.LeaveGroup))
+            if (!IsRequestValid(session, request))
             {
                 return;
             }
@@ -210,7 +209,7 @@ namespace Emby.Server.Implementations.SyncPlay
                     lock (group)
                     {
                         RemoveSessionFromGroup(session, group);
-                        group.SessionLeave(session, cancellationToken);
+                        group.SessionLeave(session, request, cancellationToken);
 
                         if (group.IsGroupEmpty())
                         {
@@ -223,10 +222,9 @@ namespace Emby.Server.Implementations.SyncPlay
         }
 
         /// <inheritdoc />
-        public List<GroupInfoDto> ListGroups(SessionInfo session)
+        public List<GroupInfoDto> ListGroups(SessionInfo session, ListGroupsRequest request)
         {
-            // TODO: create abstract class for GroupRequests to avoid explicit request type here.
-            if (!IsRequestValid(session, GroupRequestType.ListGroups))
+            if (!IsRequestValid(session, request))
             {
                 return new List<GroupInfoDto>();
             }
@@ -256,8 +254,7 @@ namespace Emby.Server.Implementations.SyncPlay
         /// <inheritdoc />
         public void HandleRequest(SessionInfo session, IGroupPlaybackRequest request, CancellationToken cancellationToken)
         {
-            // TODO: create abstract class for GroupRequests to avoid explicit request type here.
-            if (!IsRequestValid(session, GroupRequestType.Playback, request))
+            if (!IsRequestValid(session, request))
             {
                 return;
             }
@@ -304,11 +301,8 @@ namespace Emby.Server.Implementations.SyncPlay
                 return;
             }
 
-            var request = new JoinGroupRequestBody()
-            {
-                GroupId = groupId
-            };
-            JoinGroup(session, groupId, request, CancellationToken.None);
+            var request = new JoinGroupRequest(groupId);
+            JoinGroup(session, request, CancellationToken.None);
         }
 
         /// <summary>
@@ -409,13 +403,11 @@ namespace Emby.Server.Implementations.SyncPlay
         /// Checks if a given session is allowed to make a given request.
         /// </summary>
         /// <param name="session">The session.</param>
-        /// <param name="requestType">The request type.</param>
         /// <param name="request">The request.</param>
-        /// <param name="checkRequest">Whether to check if request is null.</param>
-        /// <returns><c>true</c> if the request is valid, <c>false</c> otherwise. Will return <c>false</c> also when session is null.</returns>
-        private bool IsRequestValid<T>(SessionInfo session, GroupRequestType requestType, T request, bool checkRequest = true)
+        /// <returns><c>true</c> if the request is valid, <c>false</c> otherwise. Will return <c>false</c> also when session or request is null.</returns>
+        private bool IsRequestValid(SessionInfo session, ISyncPlayRequest request)
         {
-            if (session == null || (request == null && checkRequest))
+            if (session == null || (request == null))
             {
                 return false;
             }
@@ -424,7 +416,7 @@ namespace Emby.Server.Implementations.SyncPlay
 
             if (user.SyncPlayAccess == SyncPlayAccess.None)
             {
-                _logger.LogWarning("Session {SessionId} requested {RequestType} but does not have access to SyncPlay.", session.Id, requestType);
+                _logger.LogWarning("Session {SessionId} requested {RequestType} but does not have access to SyncPlay.", session.Id, request.Type);
 
                 // TODO: rename to a more generic error. Next PR will fix this.
                 var error = new GroupUpdate<string>(Guid.Empty, GroupUpdateType.JoinGroupDenied, string.Empty);
@@ -432,7 +424,7 @@ namespace Emby.Server.Implementations.SyncPlay
                 return false;
             }
 
-            if (requestType.Equals(GroupRequestType.NewGroup) && user.SyncPlayAccess != SyncPlayAccess.CreateAndJoinGroups)
+            if (request.Type.Equals(RequestType.NewGroup) && user.SyncPlayAccess != SyncPlayAccess.CreateAndJoinGroups)
             {
                 _logger.LogWarning("Session {SessionId} does not have permission to create groups.", session.Id);
 
@@ -443,16 +435,5 @@ namespace Emby.Server.Implementations.SyncPlay
 
             return true;
         }
-
-        /// <summary>
-        /// Checks if a given session is allowed to make a given type of request.
-        /// </summary>
-        /// <param name="session">The session.</param>
-        /// <param name="requestType">The request type.</param>
-        /// <returns><c>true</c> if the request is valid, <c>false</c> otherwise. Will return <c>false</c> also when session is null.</returns>
-        private bool IsRequestValid(SessionInfo session, GroupRequestType requestType)
-        {
-            return IsRequestValid(session, requestType, session, false);
-        }
     }
 }

+ 9 - 4
Jellyfin.Api/Controllers/SyncPlayController.cs

@@ -8,6 +8,7 @@ using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.SyncPlay;
 using MediaBrowser.Controller.SyncPlay.PlaybackRequests;
+using MediaBrowser.Controller.SyncPlay.Requests;
 using MediaBrowser.Model.SyncPlay;
 using MediaBrowser.Model.SyncPlay.RequestBodies;
 using Microsoft.AspNetCore.Authorization;
@@ -54,7 +55,8 @@ namespace Jellyfin.Api.Controllers
             [FromBody, Required] NewGroupRequestBody requestData)
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request);
-            _syncPlayManager.NewGroup(currentSession, requestData, CancellationToken.None);
+            var syncPlayRequest = new NewGroupRequest(requestData.GroupName);
+            _syncPlayManager.NewGroup(currentSession, syncPlayRequest, CancellationToken.None);
             return NoContent();
         }
 
@@ -70,7 +72,8 @@ namespace Jellyfin.Api.Controllers
             [FromBody, Required] JoinGroupRequestBody requestData)
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request);
-            _syncPlayManager.JoinGroup(currentSession, requestData.GroupId, requestData, CancellationToken.None);
+            var syncPlayRequest = new JoinGroupRequest(requestData.GroupId);
+            _syncPlayManager.JoinGroup(currentSession, syncPlayRequest, CancellationToken.None);
             return NoContent();
         }
 
@@ -84,7 +87,8 @@ namespace Jellyfin.Api.Controllers
         public ActionResult SyncPlayLeaveGroup()
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request);
-            _syncPlayManager.LeaveGroup(currentSession, CancellationToken.None);
+            var syncPlayRequest = new LeaveGroupRequest();
+            _syncPlayManager.LeaveGroup(currentSession, syncPlayRequest, CancellationToken.None);
             return NoContent();
         }
 
@@ -98,7 +102,8 @@ namespace Jellyfin.Api.Controllers
         public ActionResult<IEnumerable<GroupInfoDto>> SyncPlayGetGroups()
         {
             var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request);
-            return Ok(_syncPlayManager.ListGroups(currentSession));
+            var syncPlayRequest = new ListGroupsRequest();
+            return Ok(_syncPlayManager.ListGroups(currentSession, syncPlayRequest));
         }
 
         /// <summary>

+ 2 - 2
MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs

@@ -209,14 +209,14 @@ namespace MediaBrowser.Controller.SyncPlay.GroupStates
         protected void SendGroupStateUpdate(IGroupStateContext context, IGroupPlaybackRequest reason, SessionInfo session, CancellationToken cancellationToken)
         {
             // Notify relevant state change event.
-            var stateUpdate = new GroupStateUpdate(Type, reason.Type);
+            var stateUpdate = new GroupStateUpdate(Type, reason.Action);
             var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.StateUpdate, stateUpdate);
             context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
         }
 
         private void UnhandledRequest(IGroupPlaybackRequest request)
         {
-            _logger.LogWarning("Unhandled request of type {RequestType} in {StateType} state.", request.Type, Type);
+            _logger.LogWarning("Unhandled request of type {RequestType} in {StateType} state.", request.Action, Type);
         }
     }
 }

+ 6 - 5
MediaBrowser.Controller/SyncPlay/IGroupController.cs

@@ -3,8 +3,8 @@ using System.Threading;
 using Jellyfin.Data.Entities;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.SyncPlay.Queue;
+using MediaBrowser.Controller.SyncPlay.Requests;
 using MediaBrowser.Model.SyncPlay;
-using MediaBrowser.Model.SyncPlay.RequestBodies;
 
 namespace MediaBrowser.Controller.SyncPlay
 {
@@ -37,7 +37,7 @@ namespace MediaBrowser.Controller.SyncPlay
         /// <param name="session">The session.</param>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken);
+        void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Adds the session to the group.
@@ -45,7 +45,7 @@ namespace MediaBrowser.Controller.SyncPlay
         /// <param name="session">The session.</param>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken);
+        void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Restores the state of a session that already joined the group.
@@ -53,14 +53,15 @@ namespace MediaBrowser.Controller.SyncPlay
         /// <param name="session">The session.</param>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void SessionRestore(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken);
+        void SessionRestore(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Removes the session from the group.
         /// </summary>
         /// <param name="session">The session.</param>
+        /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void SessionLeave(SessionInfo session, CancellationToken cancellationToken);
+        void SessionLeave(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Handles the requested action by the session.

+ 2 - 2
MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs

@@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay
     /// <summary>
     /// Interface IGroupPlaybackRequest.
     /// </summary>
-    public interface IGroupPlaybackRequest
+    public interface IGroupPlaybackRequest : ISyncPlayRequest
     {
         /// <summary>
         /// Gets the playback request type.
         /// </summary>
         /// <returns>The playback request type.</returns>
-        PlaybackRequestType Type { get; }
+        PlaybackRequestType Action { get; }
 
         /// <summary>
         /// Applies the request to a group.

+ 7 - 5
MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs

@@ -2,6 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Threading;
 using MediaBrowser.Controller.Session;
+using MediaBrowser.Controller.SyncPlay.Requests;
 using MediaBrowser.Model.SyncPlay;
 using MediaBrowser.Model.SyncPlay.RequestBodies;
 
@@ -18,30 +19,31 @@ namespace MediaBrowser.Controller.SyncPlay
         /// <param name="session">The session that's creating the group.</param>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void NewGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken);
+        void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Adds the session to a group.
         /// </summary>
         /// <param name="session">The session.</param>
-        /// <param name="groupId">The group identifier.</param>
         /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequestBody request, CancellationToken cancellationToken);
+        void JoinGroup(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Removes the session from a group.
         /// </summary>
         /// <param name="session">The session.</param>
+        /// <param name="request">The request.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        void LeaveGroup(SessionInfo session, CancellationToken cancellationToken);
+        void LeaveGroup(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets list of available groups for a session.
         /// </summary>
         /// <param name="session">The session.</param>
+        /// <param name="request">The request.</param>
         /// <returns>The list of available groups.</returns>
-        List<GroupInfoDto> ListGroups(SessionInfo session);
+        List<GroupInfoDto> ListGroups(SessionInfo session, ListGroupsRequest request);
 
         /// <summary>
         /// Handle a request by a session in a group.

+ 16 - 0
MediaBrowser.Controller/SyncPlay/ISyncPlayRequest.cs

@@ -0,0 +1,16 @@
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay
+{
+    /// <summary>
+    /// Interface ISyncPlayRequest.
+    /// </summary>
+    public interface ISyncPlayRequest
+    {
+        /// <summary>
+        /// Gets the request type.
+        /// </summary>
+        /// <returns>The request type.</returns>
+        RequestType Type { get; }
+    }
+}

+ 29 - 0
MediaBrowser.Controller/SyncPlay/PlaybackRequests/AbstractPlaybackRequest.cs

@@ -0,0 +1,29 @@
+using System.Threading;
+using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
+{
+    /// <summary>
+    /// Class AbstractPlaybackRequest.
+    /// </summary>
+    public abstract class AbstractPlaybackRequest : IGroupPlaybackRequest
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="AbstractPlaybackRequest"/> class.
+        /// </summary>
+        protected AbstractPlaybackRequest()
+        {
+            // Do nothing.
+        }
+
+        /// <inheritdoc />
+        public RequestType Type { get; } = RequestType.Playback;
+
+        /// <inheritdoc />
+        public abstract PlaybackRequestType Action { get; }
+
+        /// <inheritdoc />
+        public abstract void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken);
+    }
+}

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs

@@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class BufferGroupRequest.
     /// </summary>
-    public class BufferGroupRequest : IGroupPlaybackRequest
+    public class BufferGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="BufferGroupRequest"/> class.
@@ -50,10 +50,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public string PlaylistItemId { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Buffer;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Buffer;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class IgnoreWaitGroupRequest.
     /// </summary>
-    public class IgnoreWaitGroupRequest : IGroupPlaybackRequest
+    public class IgnoreWaitGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="IgnoreWaitGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public bool IgnoreWait { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.IgnoreWait;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.IgnoreWait;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class MovePlaylistItemGroupRequest.
     /// </summary>
-    public class MovePlaylistItemGroupRequest : IGroupPlaybackRequest
+    public class MovePlaylistItemGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="MovePlaylistItemGroupRequest"/> class.
@@ -33,10 +33,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public int NewIndex { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.MovePlaylistItem;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.MovePlaylistItem;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class NextTrackGroupRequest.
     /// </summary>
-    public class NextTrackGroupRequest : IGroupPlaybackRequest
+    public class NextTrackGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="NextTrackGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public string PlaylistItemId { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.NextTrack;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.NextTrack;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs

@@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class PauseGroupRequest.
     /// </summary>
-    public class PauseGroupRequest : IGroupPlaybackRequest
+    public class PauseGroupRequest : AbstractPlaybackRequest
     {
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Pause;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Pause;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class PingGroupRequest.
     /// </summary>
-    public class PingGroupRequest : IGroupPlaybackRequest
+    public class PingGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="PingGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public long Ping { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Ping;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Ping;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class PlayGroupRequest.
     /// </summary>
-    public class PlayGroupRequest : IGroupPlaybackRequest
+    public class PlayGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="PlayGroupRequest"/> class.
@@ -43,10 +43,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public long StartPositionTicks { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Play;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Play;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class PreviousTrackGroupRequest.
     /// </summary>
-    public class PreviousTrackGroupRequest : IGroupPlaybackRequest
+    public class PreviousTrackGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="PreviousTrackGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public string PlaylistItemId { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.PreviousTrack;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.PreviousTrack;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class QueueGroupRequest.
     /// </summary>
-    public class QueueGroupRequest : IGroupPlaybackRequest
+    public class QueueGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="QueueGroupRequest"/> class.
@@ -35,10 +35,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public GroupQueueMode Mode { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Queue;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Queue;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs

@@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class ReadyGroupRequest.
     /// </summary>
-    public class ReadyGroupRequest : IGroupPlaybackRequest
+    public class ReadyGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="ReadyGroupRequest"/> class.
@@ -50,10 +50,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public string PlaylistItemId { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Ready;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Ready;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class RemoveFromPlaylistGroupRequest.
     /// </summary>
-    public class RemoveFromPlaylistGroupRequest : IGroupPlaybackRequest
+    public class RemoveFromPlaylistGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="RemoveFromPlaylistGroupRequest"/> class.
@@ -27,10 +27,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public IReadOnlyList<string> PlaylistItemIds { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.RemoveFromPlaylist;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.RemoveFromPlaylist;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class SeekGroupRequest.
     /// </summary>
-    public class SeekGroupRequest : IGroupPlaybackRequest
+    public class SeekGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="SeekGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public long PositionTicks { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Seek;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Seek;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class SetPlaylistItemGroupRequest.
     /// </summary>
-    public class SetPlaylistItemGroupRequest : IGroupPlaybackRequest
+    public class SetPlaylistItemGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="SetPlaylistItemGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public string PlaylistItemId { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.SetPlaylistItem;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetPlaylistItem;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class SetRepeatModeGroupRequest.
     /// </summary>
-    public class SetRepeatModeGroupRequest : IGroupPlaybackRequest
+    public class SetRepeatModeGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="SetRepeatModeGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public GroupRepeatMode Mode { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.SetRepeatMode;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetRepeatMode;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class SetShuffleModeGroupRequest.
     /// </summary>
-    public class SetShuffleModeGroupRequest : IGroupPlaybackRequest
+    public class SetShuffleModeGroupRequest : AbstractPlaybackRequest
     {
         /// <summary>
         /// Initializes a new instance of the <see cref="SetShuffleModeGroupRequest"/> class.
@@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
         public GroupShuffleMode Mode { get; }
 
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.SetShuffleMode;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetShuffleMode;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs

@@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class StopGroupRequest.
     /// </summary>
-    public class StopGroupRequest : IGroupPlaybackRequest
+    public class StopGroupRequest : AbstractPlaybackRequest
     {
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Stop;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Stop;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 3 - 3
MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs

@@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests
     /// <summary>
     /// Class UnpauseGroupRequest.
     /// </summary>
-    public class UnpauseGroupRequest : IGroupPlaybackRequest
+    public class UnpauseGroupRequest : AbstractPlaybackRequest
     {
         /// <inheritdoc />
-        public PlaybackRequestType Type { get; } = PlaybackRequestType.Unpause;
+        public override PlaybackRequestType Action { get; } = PlaybackRequestType.Unpause;
 
         /// <inheritdoc />
-        public void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
+        public override void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken)
         {
             state.HandleRequest(context, state.Type, this, session, cancellationToken);
         }

+ 29 - 0
MediaBrowser.Controller/SyncPlay/Requests/JoinGroupRequest.cs

@@ -0,0 +1,29 @@
+using System;
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay.Requests
+{
+    /// <summary>
+    /// Class JoinGroupRequest.
+    /// </summary>
+    public class JoinGroupRequest : ISyncPlayRequest
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="JoinGroupRequest"/> class.
+        /// </summary>
+        /// <param name="groupId">The identifier of the group to join.</param>
+        public JoinGroupRequest(Guid groupId)
+        {
+            GroupId = groupId;
+        }
+
+        /// <summary>
+        /// Gets the group identifier.
+        /// </summary>
+        /// <value>The identifier of the group to join.</value>
+        public Guid GroupId { get; }
+
+        /// <inheritdoc />
+        public RequestType Type { get; } = RequestType.JoinGroup;
+    }
+}

+ 13 - 0
MediaBrowser.Controller/SyncPlay/Requests/LeaveGroupRequest.cs

@@ -0,0 +1,13 @@
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay.Requests
+{
+    /// <summary>
+    /// Class LeaveGroupRequest.
+    /// </summary>
+    public class LeaveGroupRequest : ISyncPlayRequest
+    {
+        /// <inheritdoc />
+        public RequestType Type { get; } = RequestType.LeaveGroup;
+    }
+}

+ 13 - 0
MediaBrowser.Controller/SyncPlay/Requests/ListGroupsRequest.cs

@@ -0,0 +1,13 @@
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay.Requests
+{
+    /// <summary>
+    /// Class ListGroupsRequest.
+    /// </summary>
+    public class ListGroupsRequest : ISyncPlayRequest
+    {
+        /// <inheritdoc />
+        public RequestType Type { get; } = RequestType.ListGroups;
+    }
+}

+ 28 - 0
MediaBrowser.Controller/SyncPlay/Requests/NewGroupRequest.cs

@@ -0,0 +1,28 @@
+using MediaBrowser.Model.SyncPlay;
+
+namespace MediaBrowser.Controller.SyncPlay.Requests
+{
+    /// <summary>
+    /// Class NewGroupRequest.
+    /// </summary>
+    public class NewGroupRequest : ISyncPlayRequest
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NewGroupRequest"/> class.
+        /// </summary>
+        /// <param name="groupName">The name of the new group.</param>
+        public NewGroupRequest(string groupName)
+        {
+            GroupName = groupName;
+        }
+
+        /// <summary>
+        /// Gets the group name.
+        /// </summary>
+        /// <value>The name of the new group.</value>
+        public string GroupName { get; }
+
+        /// <inheritdoc />
+        public RequestType Type { get; } = RequestType.NewGroup;
+    }
+}

+ 2 - 2
MediaBrowser.Model/SyncPlay/GroupRequestType.cs → MediaBrowser.Model/SyncPlay/RequestType.cs

@@ -1,9 +1,9 @@
 namespace MediaBrowser.Model.SyncPlay
 {
     /// <summary>
-    /// Enum GroupRequestType.
+    /// Enum RequestType.
     /// </summary>
-    public enum GroupRequestType
+    public enum RequestType
     {
         /// <summary>
         /// A user is requesting to create a new group.