< Summary - Jellyfin

Information
Class: MediaBrowser.Controller.SyncPlay.GroupStates.PlayingGroupState
Assembly: MediaBrowser.Controller
File(s): /srv/git/jellyfin/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 52
Coverable lines: 52
Total lines: 164
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
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(...)0%620%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)0%620%
HandleRequest(...)0%2040%
HandleRequest(...)100%210%
HandleRequest(...)100%210%

File(s)

/srv/git/jellyfin/MediaBrowser.Controller/SyncPlay/GroupStates/PlayingGroupState.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 PlayingGroupState.
 14    /// </summary>
 15    /// <remarks>
 16    /// Class is not thread-safe, external locking is required when accessing methods.
 17    /// </remarks>
 18    public class PlayingGroupState : AbstractGroupState
 19    {
 20        /// <summary>
 21        /// Initializes a new instance of the <see cref="PlayingGroupState"/> class.
 22        /// </summary>
 23        /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
 24        public PlayingGroupState(ILoggerFactory loggerFactory)
 025            : base(loggerFactory)
 26        {
 027        }
 28
 29        /// <inheritdoc />
 30        public override GroupStateType Type { get; } = GroupStateType.Playing;
 31
 32        /// <summary>
 33        /// Gets or sets a value indicating whether requests for buffering should be ignored.
 34        /// </summary>
 35        public bool IgnoreBuffering { get; set; }
 36
 37        /// <inheritdoc />
 38        public override void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, Ca
 39        {
 40            // Wait for session to be ready.
 041            var waitingState = new WaitingGroupState(LoggerFactory);
 042            context.SetState(waitingState);
 043            waitingState.SessionJoined(context, Type, session, cancellationToken);
 044        }
 45
 46        /// <inheritdoc />
 47        public override void SessionLeaving(IGroupStateContext context, GroupStateType prevState, SessionInfo session, C
 48        {
 49            // Do nothing.
 050        }
 51
 52        /// <inheritdoc />
 53        public override void HandleRequest(PlayGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 54        {
 55            // Change state.
 056            var waitingState = new WaitingGroupState(LoggerFactory);
 057            context.SetState(waitingState);
 058            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 059        }
 60
 61        /// <inheritdoc />
 62        public override void HandleRequest(UnpauseGroupRequest request, IGroupStateContext context, GroupStateType prevS
 63        {
 064            if (!prevState.Equals(Type))
 65            {
 66                // Pick a suitable time that accounts for latency.
 067                var delayMillis = Math.Max(context.GetHighestPing() * 2, context.DefaultPing);
 68
 69                // Unpause group and set starting point in future.
 70                // Clients will start playback at LastActivity (datetime) from PositionTicks (playback position).
 71                // The added delay does not guarantee, of course, that the command will be received in time.
 72                // Playback synchronization will mainly happen client side.
 073                context.LastActivity = DateTime.UtcNow.AddMilliseconds(delayMillis);
 74
 075                var command = context.NewSyncPlayCommand(SendCommandType.Unpause);
 076                context.SendCommand(session, SyncPlayBroadcastType.AllGroup, command, cancellationToken);
 77
 78                // Notify relevant state change event.
 079                SendGroupStateUpdate(context, request, session, cancellationToken);
 80            }
 81            else
 82            {
 83                // Client got lost, sending current state.
 084                var command = context.NewSyncPlayCommand(SendCommandType.Unpause);
 085                context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
 86            }
 087        }
 88
 89        /// <inheritdoc />
 90        public override void HandleRequest(PauseGroupRequest request, IGroupStateContext context, GroupStateType prevSta
 91        {
 92            // Change state.
 093            var pausedState = new PausedGroupState(LoggerFactory);
 094            context.SetState(pausedState);
 095            pausedState.HandleRequest(request, context, Type, session, cancellationToken);
 096        }
 97
 98        /// <inheritdoc />
 99        public override void HandleRequest(StopGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 100        {
 101            // Change state.
 0102            var idleState = new IdleGroupState(LoggerFactory);
 0103            context.SetState(idleState);
 0104            idleState.HandleRequest(request, context, Type, session, cancellationToken);
 0105        }
 106
 107        /// <inheritdoc />
 108        public override void HandleRequest(SeekGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 109        {
 110            // Change state.
 0111            var waitingState = new WaitingGroupState(LoggerFactory);
 0112            context.SetState(waitingState);
 0113            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0114        }
 115
 116        /// <inheritdoc />
 117        public override void HandleRequest(BufferGroupRequest request, IGroupStateContext context, GroupStateType prevSt
 118        {
 0119            if (IgnoreBuffering)
 120            {
 0121                return;
 122            }
 123
 124            // Change state.
 0125            var waitingState = new WaitingGroupState(LoggerFactory);
 0126            context.SetState(waitingState);
 0127            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0128        }
 129
 130        /// <inheritdoc />
 131        public override void HandleRequest(ReadyGroupRequest request, IGroupStateContext context, GroupStateType prevSta
 132        {
 0133            if (prevState.Equals(Type))
 134            {
 135                // Group was not waiting, make sure client has latest state.
 0136                var command = context.NewSyncPlayCommand(SendCommandType.Unpause);
 0137                context.SendCommand(session, SyncPlayBroadcastType.CurrentSession, command, cancellationToken);
 138            }
 0139            else if (prevState.Equals(GroupStateType.Waiting))
 140            {
 141                // Notify relevant state change event.
 0142                SendGroupStateUpdate(context, request, session, cancellationToken);
 143            }
 0144        }
 145
 146        /// <inheritdoc />
 147        public override void HandleRequest(NextItemGroupRequest request, IGroupStateContext context, GroupStateType prev
 148        {
 149            // Change state.
 0150            var waitingState = new WaitingGroupState(LoggerFactory);
 0151            context.SetState(waitingState);
 0152            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0153        }
 154
 155        /// <inheritdoc />
 156        public override void HandleRequest(PreviousItemGroupRequest request, IGroupStateContext context, GroupStateType 
 157        {
 158            // Change state.
 0159            var waitingState = new WaitingGroupState(LoggerFactory);
 0160            context.SetState(waitingState);
 0161            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 0162        }
 163    }
 164}

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)