add more info to playback events

This commit is contained in:
Luke Pulverenti 2013-12-30 12:18:18 -05:00
parent 6cfd21122b
commit 6f969ab468
3 changed files with 35 additions and 13 deletions

View File

@ -11,5 +11,15 @@ namespace MediaBrowser.Controller.Library
public User User { get; set; } public User User { get; set; }
public long? PlaybackPositionTicks { get; set; } public long? PlaybackPositionTicks { get; set; }
public BaseItem Item { get; set; } public BaseItem Item { get; set; }
public UserItemData UserData { get; set; }
}
public class PlaybackStopEventArgs : PlaybackProgressEventArgs
{
/// <summary>
/// Gets or sets a value indicating whether [played to completion].
/// </summary>
/// <value><c>true</c> if [played to completion]; otherwise, <c>false</c>.</value>
public bool PlayedToCompletion { get; set; }
} }
} }

View File

@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Session
/// <summary> /// <summary>
/// Occurs when [playback stopped]. /// Occurs when [playback stopped].
/// </summary> /// </summary>
event EventHandler<PlaybackProgressEventArgs> PlaybackStopped; event EventHandler<PlaybackStopEventArgs> PlaybackStopped;
/// <summary> /// <summary>
/// Gets the sessions. /// Gets the sessions.

View File

@ -63,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.Session
/// <summary> /// <summary>
/// Occurs when [playback stopped]. /// Occurs when [playback stopped].
/// </summary> /// </summary>
public event EventHandler<PlaybackProgressEventArgs> PlaybackStopped; public event EventHandler<PlaybackStopEventArgs> PlaybackStopped;
private IEnumerable<ISessionControllerFactory> _sessionFactories = new List<ISessionControllerFactory>(); private IEnumerable<ISessionControllerFactory> _sessionFactories = new List<ISessionControllerFactory>();
@ -284,7 +284,9 @@ namespace MediaBrowser.Server.Implementations.Session
EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs
{ {
Item = item, Item = item,
User = user User = user,
UserData = data
}, _logger); }, _logger);
} }
@ -315,10 +317,10 @@ namespace MediaBrowser.Server.Implementations.Session
var user = session.User; var user = session.User;
var data = _userDataRepository.GetUserData(user.Id, key);
if (info.PositionTicks.HasValue) if (info.PositionTicks.HasValue)
{ {
var data = _userDataRepository.GetUserData(user.Id, key);
UpdatePlayState(info.Item, data, info.PositionTicks.Value); UpdatePlayState(info.Item, data, info.PositionTicks.Value);
await _userDataRepository.SaveUserData(user.Id, info.Item, data, UserDataSaveReason.PlaybackProgress, CancellationToken.None).ConfigureAwait(false); 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, Item = info.Item,
User = user, User = user,
PlaybackPositionTicks = info.PositionTicks PlaybackPositionTicks = info.PositionTicks,
UserData = data
}, _logger); }, _logger);
} }
@ -371,10 +374,11 @@ namespace MediaBrowser.Server.Implementations.Session
var user = session.User; var user = session.User;
var data = _userDataRepository.GetUserData(user.Id, key); var data = _userDataRepository.GetUserData(user.Id, key);
bool playedToCompletion;
if (info.PositionTicks.HasValue) if (info.PositionTicks.HasValue)
{ {
UpdatePlayState(info.Item, data, info.PositionTicks.Value); playedToCompletion = UpdatePlayState(info.Item, data, info.PositionTicks.Value);
} }
else else
{ {
@ -382,15 +386,19 @@ namespace MediaBrowser.Server.Implementations.Session
data.PlayCount++; data.PlayCount++;
data.Played = true; data.Played = true;
data.PlaybackPositionTicks = 0; data.PlaybackPositionTicks = 0;
playedToCompletion = true;
} }
await _userDataRepository.SaveUserData(user.Id, info.Item, data, UserDataSaveReason.PlaybackFinished, CancellationToken.None).ConfigureAwait(false); 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, Item = info.Item,
User = user, User = user,
PlaybackPositionTicks = info.PositionTicks PlaybackPositionTicks = info.PositionTicks,
UserData = data,
PlayedToCompletion = playedToCompletion
}, _logger); }, _logger);
} }
@ -400,8 +408,10 @@ namespace MediaBrowser.Server.Implementations.Session
/// <param name="item">The item</param> /// <param name="item">The item</param>
/// <param name="data">User data for the item</param> /// <param name="data">User data for the item</param>
/// <param name="positionTicks">The current playback position</param> /// <param name="positionTicks">The current playback position</param>
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; var hasRuntime = item.RunTimeTicks.HasValue && item.RunTimeTicks > 0;
// If a position has been reported, and if we know the duration // 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) else if (pctIn > _configurationManager.Configuration.MaxResumePct || positionTicks >= item.RunTimeTicks.Value)
{ {
positionTicks = 0; positionTicks = 0;
data.Played = true; data.Played = playedToCompletion = true;
} }
else else
@ -430,14 +440,14 @@ namespace MediaBrowser.Server.Implementations.Session
if (durationSeconds < _configurationManager.Configuration.MinResumeDurationSeconds) if (durationSeconds < _configurationManager.Configuration.MinResumeDurationSeconds)
{ {
positionTicks = 0; positionTicks = 0;
data.Played = true; data.Played = playedToCompletion = true;
} }
} }
} }
else if (!hasRuntime) else if (!hasRuntime)
{ {
// If we don't know the runtime we'll just have to assume it was fully played // 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; positionTicks = 0;
} }
@ -447,6 +457,8 @@ namespace MediaBrowser.Server.Implementations.Session
} }
data.PlaybackPositionTicks = positionTicks; data.PlaybackPositionTicks = positionTicks;
return playedToCompletion;
} }
/// <summary> /// <summary>