From 0b5019ed1b8c7624eae27aebe715132e07f8a417 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 17 Apr 2017 14:40:42 -0400 Subject: support automatic progress reporting --- MediaBrowser.Controller/Session/SessionInfo.cs | 95 ++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 4 deletions(-) (limited to 'MediaBrowser.Controller/Session') diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index 343b15a04f..6cb6f4bb69 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -4,16 +4,23 @@ using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Threading; namespace MediaBrowser.Controller.Session { /// /// Class SessionInfo /// - public class SessionInfo + public class SessionInfo : IDisposable { - public SessionInfo() + private ISessionManager _sessionManager; + private readonly ILogger _logger; + + public SessionInfo(ISessionManager sessionManager, ILogger logger) { + _sessionManager = sessionManager; + _logger = logger; QueueableMediaTypes = new List(); AdditionalUsers = new List(); @@ -21,7 +28,7 @@ namespace MediaBrowser.Controller.Session } public PlayerStateInfo PlayState { get; set; } - + public List AdditionalUsers { get; set; } public ClientCapabilities Capabilities { get; set; } @@ -133,7 +140,7 @@ namespace MediaBrowser.Controller.Session /// /// The application icon URL. public string AppIconUrl { get; set; } - + /// /// Gets or sets the supported commands. /// @@ -196,5 +203,85 @@ namespace MediaBrowser.Controller.Session { return (UserId ?? Guid.Empty) == userId || AdditionalUsers.Any(i => userId == new Guid(i.UserId)); } + + private readonly object _progressLock = new object(); + private ITimer _progressTimer; + private PlaybackProgressInfo _lastProgressInfo; + + public void StartAutomaticProgress(ITimerFactory timerFactory, PlaybackProgressInfo progressInfo) + { + lock (_progressLock) + { + _lastProgressInfo = progressInfo; + + if (_progressTimer != null) + { + return; + } + + _progressTimer = timerFactory.Create(OnProgressTimerCallback, null, 1000, 1000); + } + } + + // 1 second + private const long ProgressIncrement = 10000000; + + private async void OnProgressTimerCallback(object state) + { + var progressInfo = _lastProgressInfo; + if (progressInfo == null) + { + return; + } + if (progressInfo.IsPaused) + { + return; + } + var positionTicks = progressInfo.PositionTicks ?? 0; + if (positionTicks <= 0) + { + return; + } + + var newPositionTicks = positionTicks + ProgressIncrement; + var item = progressInfo.Item; + long? runtimeTicks = item == null ? null : item.RunTimeTicks; + + // Don't report beyond the runtime + if (runtimeTicks.HasValue && newPositionTicks >= runtimeTicks.Value) + { + return; + } + + progressInfo.PositionTicks = newPositionTicks; + + try + { + await _sessionManager.OnPlaybackProgress(progressInfo).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error reporting playback progress", ex); + } + } + + public void StopAutomaticProgress() + { + lock (_progressLock) + { + if (_progressTimer != null) + { + _progressTimer.Dispose(); + _progressTimer = null; + } + _lastProgressInfo = null; + } + } + + public void Dispose() + { + StopAutomaticProgress(); + _sessionManager = null; + } } } -- cgit v1.2.3