diff --git a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs index 7cf9b1d69..ec2219395 100644 --- a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs +++ b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs @@ -11,5 +11,15 @@ namespace MediaBrowser.Controller.Library public User User { get; set; } public long? PlaybackPositionTicks { get; set; } public BaseItem Item { get; set; } + public UserItemData UserData { get; set; } + } + + public class PlaybackStopEventArgs : PlaybackProgressEventArgs + { + /// + /// Gets or sets a value indicating whether [played to completion]. + /// + /// true if [played to completion]; otherwise, false. + public bool PlayedToCompletion { get; set; } } } diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs index ec138bfb4..e0163a3e1 100644 --- a/MediaBrowser.Controller/Session/ISessionManager.cs +++ b/MediaBrowser.Controller/Session/ISessionManager.cs @@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Session /// /// Occurs when [playback stopped]. /// - event EventHandler PlaybackStopped; + event EventHandler PlaybackStopped; /// /// Gets the sessions. diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index c42f33ec3..37b695776 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -63,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.Session /// /// Occurs when [playback stopped]. /// - public event EventHandler PlaybackStopped; + public event EventHandler PlaybackStopped; private IEnumerable _sessionFactories = new List(); @@ -284,7 +284,9 @@ namespace MediaBrowser.Server.Implementations.Session EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs { Item = item, - User = user + User = user, + UserData = data + }, _logger); } @@ -315,10 +317,10 @@ namespace MediaBrowser.Server.Implementations.Session var user = session.User; + var data = _userDataRepository.GetUserData(user.Id, key); + if (info.PositionTicks.HasValue) { - var data = _userDataRepository.GetUserData(user.Id, key); - UpdatePlayState(info.Item, data, info.PositionTicks.Value); await _userDataRepository.SaveUserData(user.Id, info.Item, data, UserDataSaveReason.PlaybackProgress, CancellationToken.None).ConfigureAwait(false); @@ -328,7 +330,8 @@ namespace MediaBrowser.Server.Implementations.Session { Item = info.Item, User = user, - PlaybackPositionTicks = info.PositionTicks + PlaybackPositionTicks = info.PositionTicks, + UserData = data }, _logger); } @@ -371,10 +374,11 @@ namespace MediaBrowser.Server.Implementations.Session var user = session.User; var data = _userDataRepository.GetUserData(user.Id, key); + bool playedToCompletion; if (info.PositionTicks.HasValue) { - UpdatePlayState(info.Item, data, info.PositionTicks.Value); + playedToCompletion = UpdatePlayState(info.Item, data, info.PositionTicks.Value); } else { @@ -382,15 +386,19 @@ namespace MediaBrowser.Server.Implementations.Session data.PlayCount++; data.Played = true; data.PlaybackPositionTicks = 0; + playedToCompletion = true; } await _userDataRepository.SaveUserData(user.Id, info.Item, data, UserDataSaveReason.PlaybackFinished, CancellationToken.None).ConfigureAwait(false); - EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackProgressEventArgs + EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackStopEventArgs { Item = info.Item, User = user, - PlaybackPositionTicks = info.PositionTicks + PlaybackPositionTicks = info.PositionTicks, + UserData = data, + PlayedToCompletion = playedToCompletion + }, _logger); } @@ -400,8 +408,10 @@ namespace MediaBrowser.Server.Implementations.Session /// The item /// User data for the item /// The current playback position - private void UpdatePlayState(BaseItem item, UserItemData data, long positionTicks) + private bool UpdatePlayState(BaseItem item, UserItemData data, long positionTicks) { + var playedToCompletion = false; + var hasRuntime = item.RunTimeTicks.HasValue && item.RunTimeTicks > 0; // If a position has been reported, and if we know the duration @@ -419,7 +429,7 @@ namespace MediaBrowser.Server.Implementations.Session else if (pctIn > _configurationManager.Configuration.MaxResumePct || positionTicks >= item.RunTimeTicks.Value) { positionTicks = 0; - data.Played = true; + data.Played = playedToCompletion = true; } else @@ -430,14 +440,14 @@ namespace MediaBrowser.Server.Implementations.Session if (durationSeconds < _configurationManager.Configuration.MinResumeDurationSeconds) { positionTicks = 0; - data.Played = true; + data.Played = playedToCompletion = true; } } } else if (!hasRuntime) { // If we don't know the runtime we'll just have to assume it was fully played - data.Played = true; + data.Played = playedToCompletion = true; positionTicks = 0; } @@ -447,6 +457,8 @@ namespace MediaBrowser.Server.Implementations.Session } data.PlaybackPositionTicks = positionTicks; + + return playedToCompletion; } ///