diff --git a/Emby.Server.Implementations/SyncPlay/GroupController.cs b/Emby.Server.Implementations/SyncPlay/GroupController.cs index 31df8404b4..612fba5048 100644 --- a/Emby.Server.Implementations/SyncPlay/GroupController.cs +++ b/Emby.Server.Implementations/SyncPlay/GroupController.cs @@ -13,6 +13,7 @@ using MediaBrowser.Controller.SyncPlay; using MediaBrowser.Controller.SyncPlay.GroupStates; using MediaBrowser.Controller.SyncPlay.Queue; using MediaBrowser.Model.SyncPlay; +using MediaBrowser.Model.SyncPlay.RequestBodies; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.SyncPlay @@ -256,7 +257,7 @@ namespace Emby.Server.Implementations.SyncPlay public bool IsGroupEmpty() => _participants.Count == 0; /// - public void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken) + public void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken) { GroupName = request.GroupName; AddSession(session); @@ -291,7 +292,7 @@ namespace Emby.Server.Implementations.SyncPlay } /// - public void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken) + public void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken) { AddSession(session); @@ -307,7 +308,7 @@ namespace Emby.Server.Implementations.SyncPlay } /// - public void SessionRestore(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken) + public void SessionRestore(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken) { var updateSession = NewSyncPlayGroupUpdate(GroupUpdateType.GroupJoined, GetInfo()); SendGroupUpdate(session, SyncPlayBroadcastType.CurrentSession, updateSession, cancellationToken); diff --git a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs b/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs index be94c39825..5a0d619269 100644 --- a/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs +++ b/Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Session; using MediaBrowser.Controller.SyncPlay; using MediaBrowser.Model.SyncPlay; +using MediaBrowser.Model.SyncPlay.RequestBodies; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.SyncPlay @@ -94,7 +94,7 @@ namespace Emby.Server.Implementations.SyncPlay } /// - public void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken) + public void NewGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken) { // TODO: create abstract class for GroupRequests to avoid explicit request type here. if (!IsRequestValid(session, GroupRequestType.NewGroup, request)) @@ -124,7 +124,7 @@ namespace Emby.Server.Implementations.SyncPlay } /// - public void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequest request, CancellationToken cancellationToken) + public void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequestBody request, CancellationToken cancellationToken) { // TODO: create abstract class for GroupRequests to avoid explicit request type here. if (!IsRequestValid(session, GroupRequestType.JoinGroup, request)) @@ -304,7 +304,10 @@ namespace Emby.Server.Implementations.SyncPlay return; } - var request = new JoinGroupRequest(groupId); + var request = new JoinGroupRequestBody() + { + GroupId = groupId + }; JoinGroup(session, groupId, request, CancellationToken.None); } diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index 530cce1ea7..e8c9a09568 100644 --- a/Jellyfin.Api/Controllers/SyncPlayController.cs +++ b/Jellyfin.Api/Controllers/SyncPlayController.cs @@ -9,6 +9,7 @@ using MediaBrowser.Controller.Session; using MediaBrowser.Controller.SyncPlay; using MediaBrowser.Controller.SyncPlay.PlaybackRequests; using MediaBrowser.Model.SyncPlay; +using MediaBrowser.Model.SyncPlay.RequestBodies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -44,34 +45,32 @@ namespace Jellyfin.Api.Controllers /// /// Create a new SyncPlay group. /// - /// The name of the new group. + /// The settings of the new group. /// New group created. /// A indicating success. [HttpPost("New")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayCreateGroup( - [FromQuery, Required] string groupName) + [FromBody, Required] NewGroupRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var newGroupRequest = new NewGroupRequest(groupName); - _syncPlayManager.NewGroup(currentSession, newGroupRequest, CancellationToken.None); + _syncPlayManager.NewGroup(currentSession, requestData, CancellationToken.None); return NoContent(); } /// /// Join an existing SyncPlay group. /// - /// The sync play group id. + /// The group to join. /// Group join successful. /// A indicating success. [HttpPost("Join")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayJoinGroup( - [FromQuery, Required] Guid groupId) + [FromBody, Required] JoinGroupRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var joinRequest = new JoinGroupRequest(groupId); - _syncPlayManager.JoinGroup(currentSession, groupId, joinRequest, CancellationToken.None); + _syncPlayManager.JoinGroup(currentSession, requestData.GroupId, requestData, CancellationToken.None); return NoContent(); } @@ -105,20 +104,19 @@ namespace Jellyfin.Api.Controllers /// /// Request play in SyncPlay group. /// - /// The playing queue. Item ids in the playing queue, comma delimited. - /// The playing item position from the queue. - /// The start position ticks. + /// The new playlist to play in the group. /// Play request sent to all group members. /// A indicating success. [HttpPost("Play")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayPlay( - [FromQuery, Required] Guid[] playingQueue, - [FromQuery, Required] int playingItemPosition, - [FromQuery, Required] long startPositionTicks) + [FromBody, Required] PlayRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new PlayGroupRequest(playingQueue, playingItemPosition, startPositionTicks); + var syncPlayRequest = new PlayGroupRequest( + requestData.PlayingQueue, + requestData.PlayingItemPosition, + requestData.StartPositionTicks); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -126,16 +124,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to change playlist item in SyncPlay group. /// - /// The playlist id of the item. + /// The new item to play. /// Queue update request sent to all group members. /// A indicating success. [HttpPost("SetPlaylistItem")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlaySetPlaylistItem( - [FromQuery, Required] string playlistItemId) + [FromBody, Required] SetPlaylistItemRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new SetPlaylistItemGroupRequest(playlistItemId); + var syncPlayRequest = new SetPlaylistItemGroupRequest(requestData.PlaylistItemId); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -143,16 +141,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to remove items from the playlist in SyncPlay group. /// - /// The playlist ids of the items to remove. + /// The items to remove. /// Queue update request sent to all group members. /// A indicating success. [HttpPost("RemoveFromPlaylist")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayRemoveFromPlaylist( - [FromQuery, Required] string[] playlistItemIds) + [FromBody, Required] RemoveFromPlaylistRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new RemoveFromPlaylistGroupRequest(playlistItemIds); + var syncPlayRequest = new RemoveFromPlaylistGroupRequest(requestData.PlaylistItemIds); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -160,18 +158,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to move an item in the playlist in SyncPlay group. /// - /// The playlist id of the item to move. - /// The new position. + /// The new position for the item. /// Queue update request sent to all group members. /// A indicating success. [HttpPost("MovePlaylistItem")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayMovePlaylistItem( - [FromQuery, Required] string playlistItemId, - [FromQuery, Required] int newIndex) + [FromBody, Required] MovePlaylistItemRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new MovePlaylistItemGroupRequest(playlistItemId, newIndex); + var syncPlayRequest = new MovePlaylistItemGroupRequest(requestData.PlaylistItemId, requestData.NewIndex); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -179,18 +175,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to queue items to the playlist of a SyncPlay group. /// - /// The items to add. - /// The mode in which to enqueue the items. + /// The items to add. /// Queue update request sent to all group members. /// A indicating success. [HttpPost("Queue")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayQueue( - [FromQuery, Required] Guid[] itemIds, - [FromQuery, Required] GroupQueueMode mode) + [FromBody, Required] QueueRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new QueueGroupRequest(itemIds, mode); + var syncPlayRequest = new QueueGroupRequest(requestData.ItemIds, requestData.Mode); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -243,50 +237,58 @@ namespace Jellyfin.Api.Controllers /// /// Request seek in SyncPlay group. /// - /// The playback position in ticks. + /// The new playback position. /// Seek request sent to all group members. /// A indicating success. [HttpPost("Seek")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlaySeek( - [FromQuery, Required] long positionTicks) + [FromBody, Required] SeekRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new SeekGroupRequest(positionTicks); + var syncPlayRequest = new SeekGroupRequest(requestData.PositionTicks); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } /// - /// Request group wait in SyncPlay group while buffering. + /// Notify SyncPlay group that member is buffering. /// - /// When the request has been made by the client. - /// The playback position in ticks. - /// Whether the client's playback is playing or not. - /// The playlist item id. - /// Whether the buffering is done. - /// Buffering request sent to all group members. + /// The player status. + /// Group state update sent to all group members. /// A indicating success. [HttpPost("Buffering")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayBuffering( - [FromQuery, Required] DateTime when, - [FromQuery, Required] long positionTicks, - [FromQuery, Required] bool isPlaying, - [FromQuery, Required] string playlistItemId, - [FromQuery, Required] bool bufferingDone) + [FromBody, Required] BufferRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - IGroupPlaybackRequest syncPlayRequest; - if (!bufferingDone) - { - syncPlayRequest = new BufferGroupRequest(when, positionTicks, isPlaying, playlistItemId); - } - else - { - syncPlayRequest = new ReadyGroupRequest(when, positionTicks, isPlaying, playlistItemId); - } + var syncPlayRequest = new BufferGroupRequest( + requestData.When, + requestData.PositionTicks, + requestData.IsPlaying, + requestData.PlaylistItemId); + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + /// + /// Notify SyncPlay group that member is ready for playback. + /// + /// The player status. + /// Group state update sent to all group members. + /// A indicating success. + [HttpPost("Ready")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public ActionResult SyncPlayReady( + [FromBody, Required] ReadyRequestBody requestData) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new ReadyGroupRequest( + requestData.When, + requestData.PositionTicks, + requestData.IsPlaying, + requestData.PlaylistItemId); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -294,16 +296,16 @@ namespace Jellyfin.Api.Controllers /// /// Request SyncPlay group to ignore member during group-wait. /// - /// Whether to ignore the member. + /// The settings to set. /// Member state updated. /// A indicating success. [HttpPost("SetIgnoreWait")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlaySetIgnoreWait( - [FromQuery, Required] bool ignoreWait) + [FromBody, Required] IgnoreWaitRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new IgnoreWaitGroupRequest(ignoreWait); + var syncPlayRequest = new IgnoreWaitGroupRequest(requestData.IgnoreWait); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -311,16 +313,16 @@ namespace Jellyfin.Api.Controllers /// /// Request next track in SyncPlay group. /// - /// The playing item id. + /// The current track information. /// Next track request sent to all group members. /// A indicating success. [HttpPost("NextTrack")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayNextTrack( - [FromQuery, Required] string playlistItemId) + [FromBody, Required] NextTrackRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new NextTrackGroupRequest(playlistItemId); + var syncPlayRequest = new NextTrackGroupRequest(requestData.PlaylistItemId); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -328,16 +330,16 @@ namespace Jellyfin.Api.Controllers /// /// Request previous track in SyncPlay group. /// - /// The playing item id. + /// The current track information. /// Previous track request sent to all group members. /// A indicating success. [HttpPost("PreviousTrack")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayPreviousTrack( - [FromQuery, Required] string playlistItemId) + [FromBody, Required] PreviousTrackRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new PreviousTrackGroupRequest(playlistItemId); + var syncPlayRequest = new PreviousTrackGroupRequest(requestData.PlaylistItemId); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -345,16 +347,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to set repeat mode in SyncPlay group. /// - /// The repeat mode. + /// The new repeat mode. /// Play queue update sent to all group members. /// A indicating success. [HttpPost("SetRepeatMode")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlaySetRepeatMode( - [FromQuery, Required] GroupRepeatMode mode) + [FromBody, Required] SetRepeatModeRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new SetRepeatModeGroupRequest(mode); + var syncPlayRequest = new SetRepeatModeGroupRequest(requestData.Mode); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -362,16 +364,16 @@ namespace Jellyfin.Api.Controllers /// /// Request to set shuffle mode in SyncPlay group. /// - /// The shuffle mode. + /// The new shuffle mode. /// Play queue update sent to all group members. /// A indicating success. [HttpPost("SetShuffleMode")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlaySetShuffleMode( - [FromQuery, Required] GroupShuffleMode mode) + [FromBody, Required] SetShuffleModeRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new SetShuffleModeGroupRequest(mode); + var syncPlayRequest = new SetShuffleModeGroupRequest(requestData.Mode); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } @@ -379,16 +381,16 @@ namespace Jellyfin.Api.Controllers /// /// Update session ping. /// - /// The ping. + /// The new ping. /// Ping updated. /// A indicating success. [HttpPost("Ping")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult SyncPlayPing( - [FromQuery, Required] double ping) + [FromBody, Required] PingRequestBody requestData) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); - var syncPlayRequest = new PingGroupRequest(Convert.ToInt64(ping)); + var syncPlayRequest = new PingGroupRequest(requestData.Ping); _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); return NoContent(); } diff --git a/MediaBrowser.Controller/SyncPlay/IGroupController.cs b/MediaBrowser.Controller/SyncPlay/IGroupController.cs index aa8bb9eaea..5bcc3e2ca3 100644 --- a/MediaBrowser.Controller/SyncPlay/IGroupController.cs +++ b/MediaBrowser.Controller/SyncPlay/IGroupController.cs @@ -4,6 +4,7 @@ using Jellyfin.Data.Entities; using MediaBrowser.Controller.Session; using MediaBrowser.Controller.SyncPlay.Queue; using MediaBrowser.Model.SyncPlay; +using MediaBrowser.Model.SyncPlay.RequestBodies; namespace MediaBrowser.Controller.SyncPlay { @@ -36,7 +37,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The session. /// The request. /// The cancellation token. - void CreateGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken); + void CreateGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken); /// /// Adds the session to the group. @@ -44,7 +45,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The session. /// The request. /// The cancellation token. - void SessionJoin(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken); + void SessionJoin(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken); /// /// Restores the state of a session that already joined the group. @@ -52,7 +53,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The session. /// The request. /// The cancellation token. - void SessionRestore(SessionInfo session, JoinGroupRequest request, CancellationToken cancellationToken); + void SessionRestore(SessionInfo session, JoinGroupRequestBody request, CancellationToken cancellationToken); /// /// Removes the session from the group. diff --git a/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs b/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs index a980016827..26fcb009ca 100644 --- a/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs +++ b/MediaBrowser.Controller/SyncPlay/ISyncPlayManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using MediaBrowser.Controller.Session; using MediaBrowser.Model.SyncPlay; +using MediaBrowser.Model.SyncPlay.RequestBodies; namespace MediaBrowser.Controller.SyncPlay { @@ -17,7 +18,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The session that's creating the group. /// The request. /// The cancellation token. - void NewGroup(SessionInfo session, NewGroupRequest request, CancellationToken cancellationToken); + void NewGroup(SessionInfo session, NewGroupRequestBody request, CancellationToken cancellationToken); /// /// Adds the session to a group. @@ -26,7 +27,7 @@ namespace MediaBrowser.Controller.SyncPlay /// The group identifier. /// The request. /// The cancellation token. - void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequest request, CancellationToken cancellationToken); + void JoinGroup(SessionInfo session, Guid groupId, JoinGroupRequestBody request, CancellationToken cancellationToken); /// /// Removes the session from a group. diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs index 7d27f61518..dbe2987357 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/PlayGroupRequest.cs @@ -17,7 +17,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// The playing queue. /// The playing item position. /// The start position ticks. - public PlayGroupRequest(Guid[] playingQueue, int playingItemPosition, long startPositionTicks) + public PlayGroupRequest(IReadOnlyList playingQueue, int playingItemPosition, long startPositionTicks) { PlayingQueue = playingQueue ?? Array.Empty(); PlayingItemPosition = playingItemPosition; diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs index 106daecc8c..d6247ddd6d 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/QueueGroupRequest.cs @@ -16,7 +16,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// /// The items to add to the queue. /// The enqueue mode. - public QueueGroupRequest(Guid[] items, GroupQueueMode mode) + public QueueGroupRequest(IReadOnlyList items, GroupQueueMode mode) { ItemIds = items ?? Array.Empty(); Mode = mode; diff --git a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs index 1e892d8196..dc7ba8465c 100644 --- a/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs +++ b/MediaBrowser.Controller/SyncPlay/PlaybackRequests/RemoveFromPlaylistGroupRequest.cs @@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.SyncPlay.PlaybackRequests /// Initializes a new instance of the class. /// /// The playlist ids of the items to remove. - public RemoveFromPlaylistGroupRequest(string[] items) + public RemoveFromPlaylistGroupRequest(IReadOnlyList items) { PlaylistItemIds = items ?? Array.Empty(); } diff --git a/MediaBrowser.Model/SyncPlay/JoinGroupRequest.cs b/MediaBrowser.Model/SyncPlay/JoinGroupRequest.cs deleted file mode 100644 index 7402c4ce29..0000000000 --- a/MediaBrowser.Model/SyncPlay/JoinGroupRequest.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; - -namespace MediaBrowser.Model.SyncPlay -{ - /// - /// Class JoinGroupRequest. - /// - public class JoinGroupRequest - { - /// - /// 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; } - } -} diff --git a/MediaBrowser.Model/SyncPlay/NewGroupRequest.cs b/MediaBrowser.Model/SyncPlay/NewGroupRequest.cs deleted file mode 100644 index ba4bd3ef1c..0000000000 --- a/MediaBrowser.Model/SyncPlay/NewGroupRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MediaBrowser.Model.SyncPlay -{ - /// - /// Class NewGroupRequest. - /// - public class NewGroupRequest - { - /// - /// 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; } - } -} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/BufferRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/BufferRequestBody.cs new file mode 100644 index 0000000000..09ca712e51 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/BufferRequestBody.cs @@ -0,0 +1,42 @@ +using System; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class BufferRequestBody. + /// + public class BufferRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public BufferRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets when the request has been made by the client. + /// + /// The date of the request. + public DateTime When { get; set; } + + /// + /// Gets or sets the position ticks. + /// + /// The position ticks. + public long PositionTicks { get; set; } + + /// + /// Gets or sets a value indicating whether the client playback is unpaused. + /// + /// The client playback status. + public bool IsPlaying { get; set; } + + /// + /// Gets or sets the playlist item identifier of the playing item. + /// + /// The playlist item identifier. + public string PlaylistItemId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/IgnoreWaitRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/IgnoreWaitRequestBody.cs new file mode 100644 index 0000000000..22407e88ed --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/IgnoreWaitRequestBody.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class IgnoreWaitRequestBody. + /// + public class IgnoreWaitRequestBody + { + /// + /// Gets or sets a value indicating whether the client should be ignored. + /// + /// The client group-wait status. + public bool IgnoreWait { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/JoinGroupRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/JoinGroupRequestBody.cs new file mode 100644 index 0000000000..2cec7bdc21 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/JoinGroupRequestBody.cs @@ -0,0 +1,16 @@ +using System; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class JoinGroupRequestBody. + /// + public class JoinGroupRequestBody + { + /// + /// Gets or sets the group identifier. + /// + /// The identifier of the group to join. + public Guid GroupId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/MovePlaylistItemRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/MovePlaylistItemRequestBody.cs new file mode 100644 index 0000000000..d18eb68ffe --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/MovePlaylistItemRequestBody.cs @@ -0,0 +1,28 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class MovePlaylistItemRequestBody. + /// + public class MovePlaylistItemRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public MovePlaylistItemRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets the playlist identifier of the item. + /// + /// The playlist identifier of the item. + public string PlaylistItemId { get; set; } + + /// + /// Gets or sets the new position. + /// + /// The new position. + public int NewIndex { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/NewGroupRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/NewGroupRequestBody.cs new file mode 100644 index 0000000000..1a85d276b9 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/NewGroupRequestBody.cs @@ -0,0 +1,22 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class NewGroupRequestBody. + /// + public class NewGroupRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public NewGroupRequestBody() + { + GroupName = string.Empty; + } + + /// + /// Gets or sets the group name. + /// + /// The name of the new group. + public string GroupName { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/NextTrackRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/NextTrackRequestBody.cs new file mode 100644 index 0000000000..1d8d135cbb --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/NextTrackRequestBody.cs @@ -0,0 +1,22 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class NextTrackRequestBody. + /// + public class NextTrackRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public NextTrackRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets the playing item identifier. + /// + /// The playing item identifier. + public string PlaylistItemId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/PingRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/PingRequestBody.cs new file mode 100644 index 0000000000..f08015bc46 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/PingRequestBody.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class PingRequestBody. + /// + public class PingRequestBody + { + /// + /// Gets or sets the ping time. + /// + /// The ping time. + public long Ping { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/PlayRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/PlayRequestBody.cs new file mode 100644 index 0000000000..97ec95c624 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/PlayRequestBody.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class PlayRequestBody. + /// + public class PlayRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public PlayRequestBody() + { + PlayingQueue = Array.Empty(); + } + + /// + /// Gets or sets the playing queue. + /// + /// The playing queue. + public IReadOnlyList PlayingQueue { get; set; } + + /// + /// Gets or sets the position of the playing item in the queue. + /// + /// The playing item position. + public int PlayingItemPosition { get; set; } + + /// + /// Gets or sets the start position ticks. + /// + /// The start position ticks. + public long StartPositionTicks { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/PreviousTrackRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/PreviousTrackRequestBody.cs new file mode 100644 index 0000000000..95ebeeb908 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/PreviousTrackRequestBody.cs @@ -0,0 +1,22 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class PreviousTrackRequestBody. + /// + public class PreviousTrackRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public PreviousTrackRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets the playing item identifier. + /// + /// The playing item identifier. + public string PlaylistItemId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/QueueRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/QueueRequestBody.cs new file mode 100644 index 0000000000..1afc61dd46 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/QueueRequestBody.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class QueueRequestBody. + /// + public class QueueRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public QueueRequestBody() + { + ItemIds = Array.Empty(); + } + + /// + /// Gets or sets the items to enqueue. + /// + /// The items to enqueue. + public IReadOnlyList ItemIds { get; set; } + + /// + /// Gets or sets the mode in which to add the new items. + /// + /// The enqueue mode. + public GroupQueueMode Mode { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/ReadyRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/ReadyRequestBody.cs new file mode 100644 index 0000000000..359186e781 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/ReadyRequestBody.cs @@ -0,0 +1,42 @@ +using System; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class ReadyRequest. + /// + public class ReadyRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public ReadyRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets when the request has been made by the client. + /// + /// The date of the request. + public DateTime When { get; set; } + + /// + /// Gets or sets the position ticks. + /// + /// The position ticks. + public long PositionTicks { get; set; } + + /// + /// Gets or sets a value indicating whether the client playback is unpaused. + /// + /// The client playback status. + public bool IsPlaying { get; set; } + + /// + /// Gets or sets the playlist item identifier of the playing item. + /// + /// The playlist item identifier. + public string PlaylistItemId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/RemoveFromPlaylistRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/RemoveFromPlaylistRequestBody.cs new file mode 100644 index 0000000000..a2b617cd03 --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/RemoveFromPlaylistRequestBody.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class RemoveFromPlaylistRequestBody. + /// + public class RemoveFromPlaylistRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public RemoveFromPlaylistRequestBody() + { + PlaylistItemIds = Array.Empty(); + } + + /// + /// Gets or sets the playlist identifiers ot the items. + /// + /// The playlist identifiers ot the items. + public IReadOnlyList PlaylistItemIds { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/SeekRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/SeekRequestBody.cs new file mode 100644 index 0000000000..689183bb6a --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/SeekRequestBody.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class SeekRequestBody. + /// + public class SeekRequestBody + { + /// + /// Gets or sets the position ticks. + /// + /// The position ticks. + public long PositionTicks { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/SetPlaylistItemRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/SetPlaylistItemRequestBody.cs new file mode 100644 index 0000000000..abe66c479e --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/SetPlaylistItemRequestBody.cs @@ -0,0 +1,22 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class SetPlaylistItemRequestBody. + /// + public class SetPlaylistItemRequestBody + { + /// + /// Initializes a new instance of the class. + /// + public SetPlaylistItemRequestBody() + { + PlaylistItemId = string.Empty; + } + + /// + /// Gets or sets the playlist identifier of the playing item. + /// + /// The playlist identifier of the playing item. + public string PlaylistItemId { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/SetRepeatModeRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/SetRepeatModeRequestBody.cs new file mode 100644 index 0000000000..6de5415cae --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/SetRepeatModeRequestBody.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class SetRepeatModeRequestBody. + /// + public class SetRepeatModeRequestBody + { + /// + /// Gets or sets the repeat mode. + /// + /// The repeat mode. + public GroupRepeatMode Mode { get; set; } + } +} diff --git a/MediaBrowser.Model/SyncPlay/RequestBodies/SetShuffleModeRequestBody.cs b/MediaBrowser.Model/SyncPlay/RequestBodies/SetShuffleModeRequestBody.cs new file mode 100644 index 0000000000..867cb938dc --- /dev/null +++ b/MediaBrowser.Model/SyncPlay/RequestBodies/SetShuffleModeRequestBody.cs @@ -0,0 +1,14 @@ +namespace MediaBrowser.Model.SyncPlay.RequestBodies +{ + /// + /// Class SetShuffleModeRequestBody. + /// + public class SetShuffleModeRequestBody + { + /// + /// Gets or sets the shuffle mode. + /// + /// The shuffle mode. + public GroupShuffleMode Mode { get; set; } + } +}