From 9a2bcd6266fb222491abe6ea31d5e7e734699d5f Mon Sep 17 00:00:00 2001 From: David Date: Wed, 15 Jul 2020 16:15:17 +0200 Subject: Move SyncPlay api to Jellyfin.Api --- Jellyfin.Api/Controllers/SyncPlayController.cs | 186 +++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 Jellyfin.Api/Controllers/SyncPlayController.cs (limited to 'Jellyfin.Api/Controllers/SyncPlayController.cs') diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs new file mode 100644 index 000000000..99f828518 --- /dev/null +++ b/Jellyfin.Api/Controllers/SyncPlayController.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Threading; +using Jellyfin.Api.Constants; +using Jellyfin.Api.Helpers; +using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Session; +using MediaBrowser.Controller.SyncPlay; +using MediaBrowser.Model.SyncPlay; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Jellyfin.Api.Controllers +{ + /// + /// The sync play controller. + /// + [Authorize(Policy = Policies.DefaultAuthorization)] + public class SyncPlayController : BaseJellyfinApiController + { + private readonly ISessionManager _sessionManager; + private readonly IAuthorizationContext _authorizationContext; + private readonly ISyncPlayManager _syncPlayManager; + + /// + /// Initializes a new instance of the class. + /// + /// Instance of the interface. + /// Instance of the interface. + /// Instance of the interface. + public SyncPlayController( + ISessionManager sessionManager, + IAuthorizationContext authorizationContext, + ISyncPlayManager syncPlayManager) + { + _sessionManager = sessionManager; + _authorizationContext = authorizationContext; + _syncPlayManager = syncPlayManager; + } + + /// + /// Create a new SyncPlay group. + /// + /// A indicating success. + [HttpPost("New")] + public ActionResult CreateNewGroup() + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + _syncPlayManager.NewGroup(currentSession, CancellationToken.None); + return NoContent(); + } + + /// + /// Join an existing SyncPlay group. + /// + /// The sync play group id. + /// A indicating success. + [HttpPost("Join")] + public ActionResult JoinGroup([FromQuery, Required] Guid groupId) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + + var joinRequest = new JoinGroupRequest() + { + GroupId = groupId + }; + + _syncPlayManager.JoinGroup(currentSession, groupId, joinRequest, CancellationToken.None); + return NoContent(); + } + + /// + /// Leave the joined SyncPlay group. + /// + /// A indicating success. + [HttpPost("Leave")] + public ActionResult LeaveGroup() + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + _syncPlayManager.LeaveGroup(currentSession, CancellationToken.None); + return NoContent(); + } + + /// + /// Gets all SyncPlay groups. + /// + /// Optional. Filter by item id. + /// An containing the available SyncPlay groups. + [HttpGet("List")] + public ActionResult> GetSyncPlayGroups([FromQuery] Guid? filterItemId) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + return Ok(_syncPlayManager.ListGroups(currentSession, filterItemId.HasValue ? filterItemId.Value : Guid.Empty)); + } + + /// + /// Request play in SyncPlay group. + /// + /// A indicating success. + [HttpPost] + public ActionResult Play() + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new PlaybackRequest() + { + Type = PlaybackRequestType.Play + }; + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + + /// + /// Request pause in SyncPlay group. + /// + /// A indicating success. + [HttpPost] + public ActionResult Pause() + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new PlaybackRequest() + { + Type = PlaybackRequestType.Pause + }; + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + + /// + /// Request seek in SyncPlay group. + /// + /// The playback position in ticks. + /// A indicating success. + [HttpPost] + public ActionResult Seek([FromQuery] long positionTicks) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new PlaybackRequest() + { + Type = PlaybackRequestType.Seek, + PositionTicks = positionTicks + }; + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + + /// + /// Request group wait in SyncPlay group while buffering. + /// + /// When the request has been made by the client. + /// The playback position in ticks. + /// Whether the buffering is done. + /// A indicating success. + [HttpPost] + public ActionResult Buffering([FromQuery] DateTime when, [FromQuery] long positionTicks, [FromQuery] bool bufferingDone) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new PlaybackRequest() + { + Type = bufferingDone ? PlaybackRequestType.BufferingDone : PlaybackRequestType.Buffering, + When = when, + PositionTicks = positionTicks + }; + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + + /// + /// Update session ping. + /// + /// The ping. + /// A indicating success. + [HttpPost] + public ActionResult Ping([FromQuery] double ping) + { + var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); + var syncPlayRequest = new PlaybackRequest() + { + Type = PlaybackRequestType.UpdatePing, + Ping = Convert.ToInt64(ping) + }; + _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); + return NoContent(); + } + } +} -- cgit v1.2.3 From cbf5c682e93ce9e60a80b0130d04e4493f4cb684 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 21 Jul 2020 22:06:07 +0200 Subject: Change enum values --- Jellyfin.Api/Controllers/SyncPlayController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Jellyfin.Api/Controllers/SyncPlayController.cs') diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index 99f828518..c0544091c 100644 --- a/Jellyfin.Api/Controllers/SyncPlayController.cs +++ b/Jellyfin.Api/Controllers/SyncPlayController.cs @@ -157,7 +157,7 @@ namespace Jellyfin.Api.Controllers var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); var syncPlayRequest = new PlaybackRequest() { - Type = bufferingDone ? PlaybackRequestType.BufferingDone : PlaybackRequestType.Buffering, + Type = bufferingDone ? PlaybackRequestType.Ready : PlaybackRequestType.Buffer, When = when, PositionTicks = positionTicks }; @@ -176,7 +176,7 @@ namespace Jellyfin.Api.Controllers var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); var syncPlayRequest = new PlaybackRequest() { - Type = PlaybackRequestType.UpdatePing, + Type = PlaybackRequestType.Ping, Ping = Convert.ToInt64(ping) }; _syncPlayManager.HandleRequest(currentSession, syncPlayRequest, CancellationToken.None); -- cgit v1.2.3 From 9996afbf25ee7025bd7d0d7bceb0dbd75253b6d7 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 22 Jul 2020 10:20:51 +0200 Subject: Add response code documentation --- Jellyfin.Api/Controllers/SyncPlayController.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'Jellyfin.Api/Controllers/SyncPlayController.cs') diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index c0544091c..3f40c7309 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.Model.SyncPlay; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Jellyfin.Api.Controllers @@ -42,8 +43,10 @@ namespace Jellyfin.Api.Controllers /// /// Create a new SyncPlay group. /// + /// New group created. /// A indicating success. [HttpPost("New")] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult CreateNewGroup() { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -55,8 +58,10 @@ namespace Jellyfin.Api.Controllers /// Join an existing SyncPlay group. /// /// The sync play group id. + /// Group join successful. /// A indicating success. [HttpPost("Join")] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult JoinGroup([FromQuery, Required] Guid groupId) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -73,8 +78,10 @@ namespace Jellyfin.Api.Controllers /// /// Leave the joined SyncPlay group. /// + /// Group leave successful. /// A indicating success. [HttpPost("Leave")] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult LeaveGroup() { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -86,8 +93,10 @@ namespace Jellyfin.Api.Controllers /// Gets all SyncPlay groups. /// /// Optional. Filter by item id. + /// Groups returned. /// An containing the available SyncPlay groups. [HttpGet("List")] + [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult> GetSyncPlayGroups([FromQuery] Guid? filterItemId) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -97,8 +106,10 @@ namespace Jellyfin.Api.Controllers /// /// Request play in SyncPlay group. /// + /// Play request sent to all group members. /// A indicating success. [HttpPost] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Play() { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -113,8 +124,10 @@ namespace Jellyfin.Api.Controllers /// /// Request pause in SyncPlay group. /// + /// Pause request sent to all group members. /// A indicating success. [HttpPost] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Pause() { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -130,8 +143,10 @@ namespace Jellyfin.Api.Controllers /// Request seek in SyncPlay group. /// /// The playback position in ticks. + /// Seek request sent to all group members. /// A indicating success. [HttpPost] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Seek([FromQuery] long positionTicks) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -150,8 +165,10 @@ namespace Jellyfin.Api.Controllers /// When the request has been made by the client. /// The playback position in ticks. /// Whether the buffering is done. + /// Buffering request sent to all group members. /// A indicating success. [HttpPost] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Buffering([FromQuery] DateTime when, [FromQuery] long positionTicks, [FromQuery] bool bufferingDone) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); @@ -169,8 +186,10 @@ namespace Jellyfin.Api.Controllers /// Update session ping. /// /// The ping. + /// Ping updated. /// A indicating success. [HttpPost] + [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Ping([FromQuery] double ping) { var currentSession = RequestHelpers.GetSession(_sessionManager, _authorizationContext, Request); -- cgit v1.2.3 From 15ac8095b4d7e4b87c420a8789aeaec600827b68 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 22 Jul 2020 16:49:52 +0200 Subject: Apply suggestions from code review Co-authored-by: Cody Robibero --- Jellyfin.Api/Controllers/SyncPlayController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'Jellyfin.Api/Controllers/SyncPlayController.cs') diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index 3f40c7309..c240960e7 100644 --- a/Jellyfin.Api/Controllers/SyncPlayController.cs +++ b/Jellyfin.Api/Controllers/SyncPlayController.cs @@ -108,7 +108,7 @@ namespace Jellyfin.Api.Controllers /// /// Play request sent to all group members. /// A indicating success. - [HttpPost] + [HttpPost("Play")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Play() { @@ -126,7 +126,7 @@ namespace Jellyfin.Api.Controllers /// /// Pause request sent to all group members. /// A indicating success. - [HttpPost] + [HttpPost("Pause")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Pause() { @@ -145,7 +145,7 @@ namespace Jellyfin.Api.Controllers /// The playback position in ticks. /// Seek request sent to all group members. /// A indicating success. - [HttpPost] + [HttpPost("Seek")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Seek([FromQuery] long positionTicks) { @@ -167,7 +167,7 @@ namespace Jellyfin.Api.Controllers /// Whether the buffering is done. /// Buffering request sent to all group members. /// A indicating success. - [HttpPost] + [HttpPost("Buffering")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Buffering([FromQuery] DateTime when, [FromQuery] long positionTicks, [FromQuery] bool bufferingDone) { -- cgit v1.2.3 From 69e6dd2747df84dd732ecf89fea9118085f064ea Mon Sep 17 00:00:00 2001 From: David Date: Wed, 22 Jul 2020 16:53:56 +0200 Subject: Update Jellyfin.Api/Controllers/SyncPlayController.cs Co-authored-by: Cody Robibero --- Jellyfin.Api/Controllers/SyncPlayController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Jellyfin.Api/Controllers/SyncPlayController.cs') diff --git a/Jellyfin.Api/Controllers/SyncPlayController.cs b/Jellyfin.Api/Controllers/SyncPlayController.cs index c240960e7..55ed42227 100644 --- a/Jellyfin.Api/Controllers/SyncPlayController.cs +++ b/Jellyfin.Api/Controllers/SyncPlayController.cs @@ -188,7 +188,7 @@ namespace Jellyfin.Api.Controllers /// The ping. /// Ping updated. /// A indicating success. - [HttpPost] + [HttpPost("Ping")] [ProducesResponseType(StatusCodes.Status204NoContent)] public ActionResult Ping([FromQuery] double ping) { -- cgit v1.2.3