Create common interface for SyncPlay requests

This commit is contained in:
Ionut Andrei Oanca 2020-11-28 16:03:02 +01:00
parent c60714e365
commit 78ea8ef99e
31 changed files with 238 additions and 121 deletions

View File

@ -12,8 +12,8 @@ using MediaBrowser.Controller.Session;
using MediaBrowser.Controller.SyncPlay; using MediaBrowser.Controller.SyncPlay;
using MediaBrowser.Controller.SyncPlay.GroupStates; using MediaBrowser.Controller.SyncPlay.GroupStates;
using MediaBrowser.Controller.SyncPlay.Queue; using MediaBrowser.Controller.SyncPlay.Queue;
using MediaBrowser.Controller.SyncPlay.Requests;
using MediaBrowser.Model.SyncPlay; using MediaBrowser.Model.SyncPlay;
using MediaBrowser.Model.SyncPlay.RequestBodies;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.SyncPlay namespace Emby.Server.Implementations.SyncPlay
@ -257,7 +257,7 @@ namespace Emby.Server.Implementations.SyncPlay
public bool IsGroupEmpty() => _participants.Count == 0; public bool IsGroupEmpty() => _participants.Count == 0;
/// <inheritdoc /> /// <inheritdoc />
public void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken) public void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken)
{ {
GroupName = request.GroupName; GroupName = request.GroupName;
AddSession(session); AddSession(session);
@ -292,7 +292,7 @@ namespace Emby.Server.Implementations.SyncPlay
} }
/// <inheritdoc /> /// <inheritdoc />
public void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken) public void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken)
{ {
AddSession(session); AddSession(session);
@ -308,7 +308,7 @@ namespace Emby.Server.Implementations.SyncPlay
} }
/// <inheritdoc /> /// <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()); var updateSession = NewSyncPlayGroupUpdate(GroupUpdateType.GroupJoined, GetInfo());
SendGroupUpdate(session, SyncPlayBroadcastType.CurrentSession, updateSession, cancellationToken); SendGroupUpdate(session, SyncPlayBroadcastType.CurrentSession, updateSession, cancellationToken);
@ -322,7 +322,7 @@ namespace Emby.Server.Implementations.SyncPlay
} }
/// <inheritdoc /> /// <inheritdoc />
public void SessionLeave(SessionInfo session, CancellationToken cancellationToken) public void SessionLeave(SessionInfo session, LeaveGroupRequest request, CancellationToken cancellationToken)
{ {
_state.SessionLeaving(this, _state.Type, session, 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 // 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 // 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. // 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); request.Apply(this, _state, session, cancellationToken);
} }

View File

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

View File

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

View File

@ -209,14 +209,14 @@ namespace MediaBrowser.Controller.SyncPlay.GroupStates
protected void SendGroupStateUpdate(IGroupStateContext context, IGroupPlaybackRequest reason, SessionInfo session, CancellationToken cancellationToken) protected void SendGroupStateUpdate(IGroupStateContext context, IGroupPlaybackRequest reason, SessionInfo session, CancellationToken cancellationToken)
{ {
// Notify relevant state change event. // 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); var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.StateUpdate, stateUpdate);
context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken); context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
} }
private void UnhandledRequest(IGroupPlaybackRequest request) 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);
} }
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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