< Summary - Jellyfin

Information
Class: MediaBrowser.Controller.SyncPlay.GroupStates.AbstractGroupState
Assembly: MediaBrowser.Controller
File(s): /srv/git/jellyfin/MediaBrowser.Controller/SyncPlay/GroupStates/AbstractGroupState.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 81
Coverable lines: 81
Total lines: 233
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
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%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)0%4260%
HandleRequest(...)0%620%
HandleRequest(...)0%2040%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
HandleRequest(...)100%210%
SendGroupStateUpdate(...)100%210%
UnhandledRequest(...)100%210%

File(s)

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

#LineLine coverage
 1#nullable disable
 2
 3using System.Threading;
 4using MediaBrowser.Controller.Session;
 5using MediaBrowser.Controller.SyncPlay.PlaybackRequests;
 6using MediaBrowser.Model.SyncPlay;
 7using Microsoft.Extensions.Logging;
 8
 9namespace MediaBrowser.Controller.SyncPlay.GroupStates
 10{
 11    /// <summary>
 12    /// Class AbstractGroupState.
 13    /// </summary>
 14    /// <remarks>
 15    /// Class is not thread-safe, external locking is required when accessing methods.
 16    /// </remarks>
 17    public abstract class AbstractGroupState : IGroupState
 18    {
 19        /// <summary>
 20        /// The logger.
 21        /// </summary>
 22        private readonly ILogger<AbstractGroupState> _logger;
 23
 24        /// <summary>
 25        /// Initializes a new instance of the <see cref="AbstractGroupState"/> class.
 26        /// </summary>
 27        /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
 28        protected AbstractGroupState(ILoggerFactory loggerFactory)
 29        {
 30            LoggerFactory = loggerFactory;
 031            _logger = loggerFactory.CreateLogger<AbstractGroupState>();
 032        }
 33
 34        /// <inheritdoc />
 35        public abstract GroupStateType Type { get; }
 36
 37        /// <summary>
 38        /// Gets the logger factory.
 39        /// </summary>
 40        protected ILoggerFactory LoggerFactory { get; }
 41
 42        /// <inheritdoc />
 43        public abstract void SessionJoined(IGroupStateContext context, GroupStateType prevState, SessionInfo session, Ca
 44
 45        /// <inheritdoc />
 46        public abstract void SessionLeaving(IGroupStateContext context, GroupStateType prevState, SessionInfo session, C
 47
 48        /// <inheritdoc />
 49        public virtual void HandleRequest(IGroupPlaybackRequest request, IGroupStateContext context, GroupStateType prev
 50        {
 051            UnhandledRequest(request);
 052        }
 53
 54        /// <inheritdoc />
 55        public virtual void HandleRequest(PlayGroupRequest request, IGroupStateContext context, GroupStateType prevState
 56        {
 057            UnhandledRequest(request);
 058        }
 59
 60        /// <inheritdoc />
 61        public virtual void HandleRequest(SetPlaylistItemGroupRequest request, IGroupStateContext context, GroupStateTyp
 62        {
 063            var waitingState = new WaitingGroupState(LoggerFactory);
 064            context.SetState(waitingState);
 065            waitingState.HandleRequest(request, context, Type, session, cancellationToken);
 066        }
 67
 68        /// <inheritdoc />
 69        public virtual void HandleRequest(RemoveFromPlaylistGroupRequest request, IGroupStateContext context, GroupState
 70        {
 71            bool playingItemRemoved;
 072            if (request.ClearPlaylist)
 73            {
 074                context.ClearPlayQueue(request.ClearPlayingItem);
 075                playingItemRemoved = request.ClearPlayingItem;
 76            }
 77            else
 78            {
 079                playingItemRemoved = context.RemoveFromPlayQueue(request.PlaylistItemIds);
 80            }
 81
 082            var playQueueUpdate = context.GetPlayQueueUpdate(PlayQueueUpdateReason.RemoveItems);
 083            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.PlayQueue, playQueueUpdate);
 084            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 85
 086            if (playingItemRemoved && !context.PlayQueue.IsItemPlaying())
 87            {
 088                _logger.LogDebug("Play queue in group {GroupId} is now empty.", context.GroupId.ToString());
 89
 090                IGroupState idleState = new IdleGroupState(LoggerFactory);
 091                context.SetState(idleState);
 092                var stopRequest = new StopGroupRequest();
 093                idleState.HandleRequest(stopRequest, context, Type, session, cancellationToken);
 94            }
 095        }
 96
 97        /// <inheritdoc />
 98        public virtual void HandleRequest(MovePlaylistItemGroupRequest request, IGroupStateContext context, GroupStateTy
 99        {
 0100            var result = context.MoveItemInPlayQueue(request.PlaylistItemId, request.NewIndex);
 101
 0102            if (!result)
 103            {
 0104                _logger.LogError("Unable to move item in group {GroupId}.", context.GroupId.ToString());
 0105                return;
 106            }
 107
 0108            var playQueueUpdate = context.GetPlayQueueUpdate(PlayQueueUpdateReason.MoveItem);
 0109            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.PlayQueue, playQueueUpdate);
 0110            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 0111        }
 112
 113        /// <inheritdoc />
 114        public virtual void HandleRequest(QueueGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 115        {
 0116            var result = context.AddToPlayQueue(request.ItemIds, request.Mode);
 117
 0118            if (!result)
 119            {
 0120                _logger.LogError("Unable to add items to play queue in group {GroupId}.", context.GroupId.ToString());
 0121                return;
 122            }
 123
 0124            var reason = request.Mode switch
 0125            {
 0126                GroupQueueMode.QueueNext => PlayQueueUpdateReason.QueueNext,
 0127                _ => PlayQueueUpdateReason.Queue
 0128            };
 0129            var playQueueUpdate = context.GetPlayQueueUpdate(reason);
 0130            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.PlayQueue, playQueueUpdate);
 0131            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 0132        }
 133
 134        /// <inheritdoc />
 135        public virtual void HandleRequest(UnpauseGroupRequest request, IGroupStateContext context, GroupStateType prevSt
 136        {
 0137            UnhandledRequest(request);
 0138        }
 139
 140        /// <inheritdoc />
 141        public virtual void HandleRequest(PauseGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 142        {
 0143            UnhandledRequest(request);
 0144        }
 145
 146        /// <inheritdoc />
 147        public virtual void HandleRequest(StopGroupRequest request, IGroupStateContext context, GroupStateType prevState
 148        {
 0149            UnhandledRequest(request);
 0150        }
 151
 152        /// <inheritdoc />
 153        public virtual void HandleRequest(SeekGroupRequest request, IGroupStateContext context, GroupStateType prevState
 154        {
 0155            UnhandledRequest(request);
 0156        }
 157
 158        /// <inheritdoc />
 159        public virtual void HandleRequest(BufferGroupRequest request, IGroupStateContext context, GroupStateType prevSta
 160        {
 0161            UnhandledRequest(request);
 0162        }
 163
 164        /// <inheritdoc />
 165        public virtual void HandleRequest(ReadyGroupRequest request, IGroupStateContext context, GroupStateType prevStat
 166        {
 0167            UnhandledRequest(request);
 0168        }
 169
 170        /// <inheritdoc />
 171        public virtual void HandleRequest(NextItemGroupRequest request, IGroupStateContext context, GroupStateType prevS
 172        {
 0173            UnhandledRequest(request);
 0174        }
 175
 176        /// <inheritdoc />
 177        public virtual void HandleRequest(PreviousItemGroupRequest request, IGroupStateContext context, GroupStateType p
 178        {
 0179            UnhandledRequest(request);
 0180        }
 181
 182        /// <inheritdoc />
 183        public virtual void HandleRequest(SetRepeatModeGroupRequest request, IGroupStateContext context, GroupStateType 
 184        {
 0185            context.SetRepeatMode(request.Mode);
 0186            var playQueueUpdate = context.GetPlayQueueUpdate(PlayQueueUpdateReason.RepeatMode);
 0187            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.PlayQueue, playQueueUpdate);
 0188            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 0189        }
 190
 191        /// <inheritdoc />
 192        public virtual void HandleRequest(SetShuffleModeGroupRequest request, IGroupStateContext context, GroupStateType
 193        {
 0194            context.SetShuffleMode(request.Mode);
 0195            var playQueueUpdate = context.GetPlayQueueUpdate(PlayQueueUpdateReason.ShuffleMode);
 0196            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.PlayQueue, playQueueUpdate);
 0197            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 0198        }
 199
 200        /// <inheritdoc />
 201        public virtual void HandleRequest(PingGroupRequest request, IGroupStateContext context, GroupStateType prevState
 202        {
 203            // Collected pings are used to account for network latency when unpausing playback.
 0204            context.UpdatePing(session, request.Ping);
 0205        }
 206
 207        /// <inheritdoc />
 208        public virtual void HandleRequest(IgnoreWaitGroupRequest request, IGroupStateContext context, GroupStateType pre
 209        {
 0210            context.SetIgnoreGroupWait(session, request.IgnoreWait);
 0211        }
 212
 213        /// <summary>
 214        /// Sends a group state update to all group.
 215        /// </summary>
 216        /// <param name="context">The context of the state.</param>
 217        /// <param name="reason">The reason of the state change.</param>
 218        /// <param name="session">The session.</param>
 219        /// <param name="cancellationToken">The cancellation token.</param>
 220        protected void SendGroupStateUpdate(IGroupStateContext context, IGroupPlaybackRequest reason, SessionInfo sessio
 221        {
 222            // Notify relevant state change event.
 0223            var stateUpdate = new GroupStateUpdate(Type, reason.Action);
 0224            var update = context.NewSyncPlayGroupUpdate(GroupUpdateType.StateUpdate, stateUpdate);
 0225            context.SendGroupUpdate(session, SyncPlayBroadcastType.AllGroup, update, cancellationToken);
 0226        }
 227
 228        private void UnhandledRequest(IGroupPlaybackRequest request)
 229        {
 0230            _logger.LogWarning("Unhandled request of type {RequestType} in {StateType} state.", request.Action, Type);
 0231        }
 232    }
 233}

Methods/Properties

.ctor(Microsoft.Extensions.Logging.ILoggerFactory)
HandleRequest(MediaBrowser.Controller.SyncPlay.IGroupPlaybackRequest,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.SetPlaylistItemGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.RemoveFromPlaylistGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.MovePlaylistItemGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.QueueGroupRequest,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)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.SetRepeatModeGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.SetShuffleModeGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.PingGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
HandleRequest(MediaBrowser.Controller.SyncPlay.PlaybackRequests.IgnoreWaitGroupRequest,MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Model.SyncPlay.GroupStateType,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
SendGroupStateUpdate(MediaBrowser.Controller.SyncPlay.IGroupStateContext,MediaBrowser.Controller.SyncPlay.IGroupPlaybackRequest,MediaBrowser.Controller.Session.SessionInfo,System.Threading.CancellationToken)
UnhandledRequest(MediaBrowser.Controller.SyncPlay.IGroupPlaybackRequest)