< Summary - Jellyfin

Information
Class: MediaBrowser.Controller.SyncPlay.GroupStates.PausedGroupState
Assembly: MediaBrowser.Controller
File(s): /srv/git/jellyfin/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 54
Coverable lines: 54
Total lines: 161
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
SessionJoined(...)100%210%
SessionLeaving(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)0%620%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)0%2040%
HandleRequest(...)100%210%
HandleRequest(...)100%210%

File(s)

/srv/git/jellyfin/MediaBrowser.Controller/SyncPlay/GroupStates/PausedGroupState.cs

#LineLine coverage
 1#nullable disable
 2
 3using System;
 4using System.Threading;
 5using MediaBrowser.Controller.Session;
 6using MediaBrowser.Controller.SyncPlay.PlaybackRequests;
 7using MediaBrowser.Model.SyncPlay;
 8using Microsoft.Extensions.Logging;
 9
 10namespace MediaBrowser.Controller.SyncPlay.GroupStates
 11{
 12    /// <summary>
 13    /// Class PausedGroupState.
 14    /// </summary>
 15    /// <remarks>
 16    /// Class is not thread-safe, external locking is required when accessing methods.
 17    /// </remarks>
 18    public class PausedGroupState : AbstractGroupState
 19    {
 20        /// <summary>
 21        /// Initializes a new instance of the <see cref="PausedGroupState"/> class.
 22        /// </summary>
 23        /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
 24        public PausedGroupState(ILoggerFactory loggerFactory)
 025            : base(loggerFactory)
 26        {
 027        }
 28
 29        /// <inheritdoc />
 30        public override GroupStateType Type { get; } = GroupStateType.Paused;
 31
 32        /// <inheritdoc />
 33        public override void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, Ca
 34        {
 35            // Wait for session to be ready.
 036            var waitingState = new WaitingGroupState(LoggerFactory);
 037            context.SetState(waitingState);
 038            waitingState.SessionJoined(context, Type, session, cancellationToken);
 039        }
 40
 41        /// <inheritdoc />
 42        public override void SessionLeaving(IGroupStateContext context, GroupStateType prevState, SessionInfo session, C
 43        {
 44            // Do nothing.
 045        }
 46
 47        /// <inheritdoc />
 48        public override void HandleRequest(PlayGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 49        {
 50            // Change state.
 051            var waitingState = new WaitingGroupState(LoggerFactory);
 052            context.SetState(waitingState);
 053            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 054        }
 55
 56        /// <inheritdoc />
 57        public override void HandleRequest(UnpauseGroupRequest request, IGroupStateContext context, GroupStateType prevS
 58        {
 59            // Change state.
 060            var playingState = new PlayingGroupState(LoggerFactory);
 061            context.SetState(playingState);
 062            playingState.HandleRequest(request, context, Type, session, cancellationToken);
 063        }
 64
 65        /// <inheritdoc />
 66        public override void HandleRequest(PauseGroupRequest request, IGroupStateContext context, GroupStateType prevSta
 67        {
 068            if (!prevState.Equals(Type))
 69            {
 70                // Pause group and compute the media playback position.
 071                var currentTime = DateTime.UtcNow;
 072                var elapsedTime = currentTime - context.LastActivity;
 073                context.LastActivity = currentTime;
 74                // Elapsed time is negative if event happens
 75                // during the delay added to account for latency.
 76                // In this phase clients haven't started the playback yet.
 77                // In other words, LastActivity is in the future,
 78                // when playback unpause is supposed to happen.
 79                // Seek only if playback actually started.
 080                context.PositionTicks += Math.Max(elapsedTime.Ticks, 0);
 81
 082                var command = context.NewSyncPlayCommand(SendCommandType.Pause);
 083                context.SendCommand(session, SyncPlayBroadcastType.AllGroup, command, cancellationToken);
 84
 85                // Notify relevant state change event.
 086                SendGroupStateUpdate(context, request, session, cancellationToken);
 87            }
 88            else
 89            {
 90                // Client got lost, sending current state.
 091                var command = context.NewSyncPlayCommand(SendCommandType.Pause);
 092                context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
 93            }
 094        }
 95
 96        /// <inheritdoc />
 97        public override void HandleRequest(StopGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 98        {
 99            // Change state.
 0100            var idleState = new IdleGroupState(LoggerFactory);
 0101            context.SetState(idleState);
 0102            idleState.HandleRequest(request, context, Type, session, cancellationToken);
 0103        }
 104
 105        /// <inheritdoc />
 106        public override void HandleRequest(SeekGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 107        {
 108            // Change state.
 0109            var waitingState = new WaitingGroupState(LoggerFactory);
 0110            context.SetState(waitingState);
 0111            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0112        }
 113
 114        /// <inheritdoc />
 115        public override void HandleRequest(BufferGroupRequest request, IGroupStateContext context, GroupStateType prevSt
 116        {
 117            // Change state.
 0118            var waitingState = new WaitingGroupState(LoggerFactory);
 0119            context.SetState(waitingState);
 0120            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0121        }
 122
 123        /// <inheritdoc />
 124        public override void HandleRequest(ReadyGroupRequest request, IGroupStateContext context, GroupStateType prevSta
 125        {
 0126            if (prevState.Equals(Type))
 127            {
 128                // Client got lost, sending current state.
 0129                var command = context.NewSyncPlayCommand(SendCommandType.Pause);
 0130                context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
 131            }
 0132            else if (prevState.Equals(GroupStateType.Waiting))
 133            {
 134                // Sending current state to all clients.
 0135                var command = context.NewSyncPlayCommand(SendCommandType.Pause);
 0136                context.SendCommand(session, SyncPlayBroadcastType.AllGroup, command, cancellationToken);
 137
 138                // Notify relevant state change event.
 0139                SendGroupStateUpdate(context, request, session, cancellationToken);
 140            }
 0141        }
 142
 143        /// <inheritdoc />
 144        public override void HandleRequest(NextItemGroupRequest request, IGroupStateContext context, GroupStateType prev
 145        {
 146            // Change state.
 0147            var waitingState = new WaitingGroupState(LoggerFactory);
 0148            context.SetState(waitingState);
 0149            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0150        }
 151
 152        /// <inheritdoc />
 153        public override void HandleRequest(PreviousItemGroupRequest request, IGroupStateContext context, GroupStateType 
 154        {
 155            // Change state.
 0156            var waitingState = new WaitingGroupState(LoggerFactory);
 0157            context.SetState(waitingState);
 0158            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0159        }
 160    }
 161}

Methods/Properties

.ctor(Microsoft.Extensions.Logging.ILoggerFactory)
SessionJoined(MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
SessionLeaving(MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.PlayGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.UnpauseGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.PauseGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.StopGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.SeekGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.BufferGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.ReadyGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.NextItemGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.PreviousItemGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)