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;
}
///