diff --git a/Emby.Server.Implementations/SyncPlay/GroupController.cs b/Emby.Server.Implementations/SyncPlay/GroupController.cs index 612fba5048..dc262f1cfc 100644 --- a/Emby.Server.Implementations/SyncPlay/GroupController.cs +++ b/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; /// - 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 } /// - 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 } /// - 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 } /// - 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); } diff --git a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs b/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs index 5a0d619269..fbd3c3cfb2 100644 --- a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs +++ b/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 } /// - 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 } /// - 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(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 } /// - 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 } /// - public List ListGroups(SessionInfo session) + public List 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(); } @@ -256,8 +254,7 @@ namespace Emby.Server.Implementations.SyncPlay /// 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); } /// @@ -409,13 +403,11 @@ namespace Emby.Server.Implementations.SyncPlay /// Checks if a given session is allowed to make a given request. /// /// The session. - /// The request type. /// The request. - /// Whether to check if request is null. - /// true if the request is valid, false otherwise. Will return false also when session is null. - private bool IsRequestValid(SessionInfo session, GroupRequestType requestType, T request, bool checkRequest = true) + /// true if the request is valid, false otherwise. Will return false also when session or request is null. + 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(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; } - - /// - /// Checks if a given session is allowed to make a given type of request. - /// - /// The session. - /// The request type. - /// true if the request is valid, false otherwise. Will return false also when session is null. - private bool IsRequestValid(SessionInfo session, GroupRequestType requestType) - { - return IsRequestValid(session, requestType, session, false); - } } } diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index e8c9a09568..ed5ea3c8a7 100644 --- a/Jellyfin.Api/Controllers/SyncPlayController.cs +++ b/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> SyncPlayGetGroups() { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - return Ok(_syncPlayManager.ListGroups(currentSession)); + var syncPlayRequest = new ListGroupsRequest(); + return Ok(_syncPlayManager.ListGroups(currentSession, syncPlayRequest)); } /// diff --git a/MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs b/MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs index 057488d6b4..0b15e3ae4a 100644 --- a/MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs +++ b/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); } } } diff --git a/MediaBrowser.Controller/SyncPlay/IGroupController.cs b/MediaBrowser.Controller/SyncPlay/IGroupController.cs index 5bcc3e2ca3..07f9659dd1 100644 --- a/MediaBrowser.Controller/SyncPlay/IGroupController.cs +++ b/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 /// The session. /// The request. /// The cancellation token. - void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken); + void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken); /// /// Adds the session to the group. @@ -45,7 +45,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The session. /// The request. /// The cancellation token. - void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken); + void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken); /// /// Restores the state of a session that already joined the group. @@ -53,14 +53,15 @@ namespace MediaBrowser.Controller.SyncPlay /// The session. /// The request. /// The cancellation token. - void SessionRestore(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken); + void SessionRestore(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken); /// /// Removes the session from the group. /// /// The session. + /// The request. /// The cancellation token. - void SessionLeave(SessionInfo session, CancellationToken cancellationToken); + void SessionLeave(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken); /// /// Handles the requested action by the session. diff --git a/MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs b/MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs index 3b195e98ca..201f29952f 100644 --- a/MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/IGroupPlaybackRequest.cs @@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay /// /// Interface IGroupPlaybackRequest. /// - public interface IGroupPlaybackRequest + public interface IGroupPlaybackRequest : ISyncPlayRequest { /// /// Gets the playback request type. /// /// The playback request type. - PlaybackRequestType Type { get; } + PlaybackRequestType Action { get; } /// /// Applies the request to a group. diff --git a/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs b/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs index 26fcb009ca..146e4351df 100644 --- a/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs +++ b/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 /// The session that's creating the group. /// The request. /// The cancellation token. - void NewGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken); + void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken); /// /// Adds the session to a group. /// /// The session. - /// The group identifier. /// The request. /// The cancellation token. - void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequestBody request, CancellationToken cancellationToken); + void JoinGroup(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken); /// /// Removes the session from a group. /// /// The session. + /// The request. /// The cancellation token. - void LeaveGroup(SessionInfo session, CancellationToken cancellationToken); + void LeaveGroup(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken); /// /// Gets list of available groups for a session. /// /// The session. + /// The request. /// The list of available groups. - List ListGroups(SessionInfo session); + List ListGroups(SessionInfo session, ListGroupsRequest request); /// /// Handle a request by a session in a group. diff --git a/MediaBrowser.Controller/SyncPlay/ISyncPlayRequest.cs b/MediaBrowser.Controller/SyncPlay/ISyncPlayRequest.cs new file mode 100644 index 0000000000..bf19817732 --- /dev/null +++ b/MediaBrowser.Controller/SyncPlay/ISyncPlayRequest.cs @@ -0,0 +1,16 @@ +using MediaBrowser.Model.SyncPlay; + +namespace MediaBrowser.Controller.SyncPlay +{ + /// + /// Interface ISyncPlayRequest. + /// + public interface ISyncPlayRequest + { + /// + /// Gets the request type. + /// + /// The request type. + RequestType Type { get; } + } +} diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/AbstractPlaybackRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/AbstractPlaybackRequest.cs new file mode 100644 index 0000000000..4090f65b9c --- /dev/null +++ b/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 +{ + /// + /// Class AbstractPlaybackRequest. + /// + public abstract class AbstractPlaybackRequest : IGroupPlaybackRequest + { + /// + /// Initializes a new instance of the class. + /// + protected AbstractPlaybackRequest() + { + // Do nothing. + } + + /// + public RequestType Type { get; } = RequestType.Playback; + + /// + public abstract PlaybackRequestType Action { get; } + + /// + public abstract void Apply(IGroupStateContext context, IGroupState state, SessionInfo session, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs index a12ab96b77..2981dbbdd6 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/BufferGroupRequest.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class BufferGroupRequest. /// - public class BufferGroupRequest : IGroupPlaybackRequest + public class BufferGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -50,10 +50,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public string PlaylistItemId { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Buffer; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Buffer; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs index 25034cb10b..a375895ad0 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/IgnoreWaitGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class IgnoreWaitGroupRequest. /// - public class IgnoreWaitGroupRequest : IGroupPlaybackRequest + public class IgnoreWaitGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public bool IgnoreWait { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.IgnoreWait; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.IgnoreWait; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs index a12eff8b84..efca4ed3ef 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/MovePlaylistItemGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class MovePlaylistItemGroupRequest. /// - public class MovePlaylistItemGroupRequest : IGroupPlaybackRequest + public class MovePlaylistItemGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -33,10 +33,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public int NewIndex { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.MovePlaylistItem; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.MovePlaylistItem; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs index f87bbc556d..73b7d0908b 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/NextTrackGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class NextTrackGroupRequest. /// - public class NextTrackGroupRequest : IGroupPlaybackRequest + public class NextTrackGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public string PlaylistItemId { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.NextTrack; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.NextTrack; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs index 0dcd1423fd..8ce2b1fc80 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PauseGroupRequest.cs @@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class PauseGroupRequest. /// - public class PauseGroupRequest : IGroupPlaybackRequest + public class PauseGroupRequest : AbstractPlaybackRequest { /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Pause; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Pause; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs index 2528bb3e70..19c940cdf8 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PingGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class PingGroupRequest. /// - public class PingGroupRequest : IGroupPlaybackRequest + public class PingGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public long Ping { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Ping; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Ping; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs index dbe2987357..88e0ebad2b 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class PlayGroupRequest. /// - public class PlayGroupRequest : IGroupPlaybackRequest + public class PlayGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -43,10 +43,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public long StartPositionTicks { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Play; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Play; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs index 206fef3312..4c70beb0ef 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PreviousTrackGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class PreviousTrackGroupRequest. /// - public class PreviousTrackGroupRequest : IGroupPlaybackRequest + public class PreviousTrackGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public string PlaylistItemId { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.PreviousTrack; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.PreviousTrack; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs index d6247ddd6d..ba5e3e2327 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class QueueGroupRequest. /// - public class QueueGroupRequest : IGroupPlaybackRequest + public class QueueGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -35,10 +35,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public GroupQueueMode Mode { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Queue; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Queue; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs index a2b3553cee..b09db4ba80 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/ReadyGroupRequest.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class ReadyGroupRequest. /// - public class ReadyGroupRequest : IGroupPlaybackRequest + public class ReadyGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -50,10 +50,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public string PlaylistItemId { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Ready; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Ready; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs index dc7ba8465c..dac1914aa7 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs @@ -9,7 +9,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class RemoveFromPlaylistGroupRequest. /// - public class RemoveFromPlaylistGroupRequest : IGroupPlaybackRequest + public class RemoveFromPlaylistGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -27,10 +27,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public IReadOnlyList PlaylistItemIds { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.RemoveFromPlaylist; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.RemoveFromPlaylist; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs index f7bfc19788..41e28467c0 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SeekGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class SeekGroupRequest. /// - public class SeekGroupRequest : IGroupPlaybackRequest + public class SeekGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public long PositionTicks { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Seek; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Seek; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs index 2ca33c1ccf..58fed3fa07 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetPlaylistItemGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class SetPlaylistItemGroupRequest. /// - public class SetPlaylistItemGroupRequest : IGroupPlaybackRequest + public class SetPlaylistItemGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public string PlaylistItemId { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.SetPlaylistItem; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetPlaylistItem; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs index cd4505e4d0..6a5ec1d117 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetRepeatModeGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class SetRepeatModeGroupRequest. /// - public class SetRepeatModeGroupRequest : IGroupPlaybackRequest + public class SetRepeatModeGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public GroupRepeatMode Mode { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.SetRepeatMode; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetRepeatMode; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs index 4530a34c02..fe007c8d89 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/SetShuffleModeGroupRequest.cs @@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class SetShuffleModeGroupRequest. /// - public class SetShuffleModeGroupRequest : IGroupPlaybackRequest + public class SetShuffleModeGroupRequest : AbstractPlaybackRequest { /// /// Initializes a new instance of the class. @@ -25,10 +25,10 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests public GroupShuffleMode Mode { get; } /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.SetShuffleMode; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.SetShuffleMode; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs index ec01cd1105..c42e229d1f 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/StopGroupRequest.cs @@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class StopGroupRequest. /// - public class StopGroupRequest : IGroupPlaybackRequest + public class StopGroupRequest : AbstractPlaybackRequest { /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Stop; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Stop; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs index bdf4fd4767..b4c1744e95 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/UnpauseGroupRequest.cs @@ -7,13 +7,13 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// Class UnpauseGroupRequest. /// - public class UnpauseGroupRequest : IGroupPlaybackRequest + public class UnpauseGroupRequest : AbstractPlaybackRequest { /// - public PlaybackRequestType Type { get; } = PlaybackRequestType.Unpause; + public override PlaybackRequestType Action { get; } = PlaybackRequestType.Unpause; /// - 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); } diff --git a/MediaBrowser.Controller/SyncPlay/Requests/JoinGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/Requests/JoinGroupRequest.cs new file mode 100644 index 0000000000..38c9e8e20c --- /dev/null +++ b/MediaBrowser.Controller/SyncPlay/Requests/JoinGroupRequest.cs @@ -0,0 +1,29 @@ +using System; +using MediaBrowser.Model.SyncPlay; + +namespace MediaBrowser.Controller.SyncPlay.Requests +{ + /// + /// Class JoinGroupRequest. + /// + public class JoinGroupRequest : ISyncPlayRequest + { + /// + /// Initializes a new instance of the class. + /// + /// The identifier of the group to join. + public JoinGroupRequest(Guid groupId) + { + GroupId = groupId; + } + + /// + /// Gets the group identifier. + /// + /// The identifier of the group to join. + public Guid GroupId { get; } + + /// + public RequestType Type { get; } = RequestType.JoinGroup; + } +} diff --git a/MediaBrowser.Controller/SyncPlay/Requests/LeaveGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/Requests/LeaveGroupRequest.cs new file mode 100644 index 0000000000..545778264f --- /dev/null +++ b/MediaBrowser.Controller/SyncPlay/Requests/LeaveGroupRequest.cs @@ -0,0 +1,13 @@ +using MediaBrowser.Model.SyncPlay; + +namespace MediaBrowser.Controller.SyncPlay.Requests +{ + /// + /// Class LeaveGroupRequest. + /// + public class LeaveGroupRequest : ISyncPlayRequest + { + /// + public RequestType Type { get; } = RequestType.LeaveGroup; + } +} diff --git a/MediaBrowser.Controller/SyncPlay/Requests/ListGroupsRequest.cs b/MediaBrowser.Controller/SyncPlay/Requests/ListGroupsRequest.cs new file mode 100644 index 0000000000..4a234fdab5 --- /dev/null +++ b/MediaBrowser.Controller/SyncPlay/Requests/ListGroupsRequest.cs @@ -0,0 +1,13 @@ +using MediaBrowser.Model.SyncPlay; + +namespace MediaBrowser.Controller.SyncPlay.Requests +{ + /// + /// Class ListGroupsRequest. + /// + public class ListGroupsRequest : ISyncPlayRequest + { + /// + public RequestType Type { get; } = RequestType.ListGroups; + } +} diff --git a/MediaBrowser.Controller/SyncPlay/Requests/NewGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/Requests/NewGroupRequest.cs new file mode 100644 index 0000000000..1321f0de8e --- /dev/null +++ b/MediaBrowser.Controller/SyncPlay/Requests/NewGroupRequest.cs @@ -0,0 +1,28 @@ +using MediaBrowser.Model.SyncPlay; + +namespace MediaBrowser.Controller.SyncPlay.Requests +{ + /// + /// Class NewGroupRequest. + /// + public class NewGroupRequest : ISyncPlayRequest + { + /// + /// Initializes a new instance of the class. + /// + /// The name of the new group. + public NewGroupRequest(string groupName) + { + GroupName = groupName; + } + + /// + /// Gets the group name. + /// + /// The name of the new group. + public string GroupName { get; } + + /// + public RequestType Type { get; } = RequestType.NewGroup; + } +} diff --git a/MediaBrowser.Model/SyncPlay/GroupRequestType.cs b/MediaBrowser.Model/SyncPlay/RequestType.cs similarity index 91% rename from MediaBrowser.Model/SyncPlay/GroupRequestType.cs rename to MediaBrowser.Model/SyncPlay/RequestType.cs index 75c0712364..a6e397dcd6 100644 --- a/MediaBrowser.Model/SyncPlay/GroupRequestType.cs +++ b/MediaBrowser.Model/SyncPlay/RequestType.cs @@ -1,9 +1,9 @@ namespace MediaBrowser.Model.SyncPlay { /// - /// Enum GroupRequestType. + /// Enum RequestType. /// - public enum GroupRequestType + public enum RequestType { /// /// A user is requesting to create a new group.