From e1f8c18b516f5bd31f64b8faaa53266a3daddd7a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 9 May 2013 13:38:02 -0400 Subject: added ability to track web sockets per session --- .../Library/UserManager.cs | 302 +-------------------- 1 file changed, 6 insertions(+), 296 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Library/UserManager.cs') diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index 99485f726..dc863ca4d 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -7,7 +7,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; -using MediaBrowser.Model.Connectivity; using MediaBrowser.Model.Logging; using System; using System.Collections.Concurrent; @@ -17,6 +16,7 @@ using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.Session; namespace MediaBrowser.Server.Implementations.Library { @@ -28,8 +28,8 @@ namespace MediaBrowser.Server.Implementations.Library /// /// The _active connections /// - private readonly ConcurrentDictionary _activeConnections = - new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private readonly ConcurrentDictionary _activeConnections = + new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); /// /// The _users @@ -70,7 +70,7 @@ namespace MediaBrowser.Server.Implementations.Library /// Gets all connections. /// /// All connections. - public IEnumerable AllConnections + public IEnumerable AllConnections { get { return _activeConnections.Values.OrderByDescending(c => c.LastActivityDate); } } @@ -79,7 +79,7 @@ namespace MediaBrowser.Server.Implementations.Library /// Gets the active connections. /// /// The active connections. - public IEnumerable RecentConnections + public IEnumerable RecentConnections { get { return AllConnections.Where(c => (DateTime.UtcNow - c.LastActivityDate).TotalMinutes <= 5); } } @@ -89,8 +89,6 @@ namespace MediaBrowser.Server.Implementations.Library /// private readonly ILogger _logger; - private readonly IUserDataRepository _userDataRepository; - /// /// Gets or sets the configuration manager. /// @@ -109,11 +107,10 @@ namespace MediaBrowser.Server.Implementations.Library /// The logger. /// The configuration manager. /// The user data repository. - public UserManager(ILogger logger, IServerConfigurationManager configurationManager, IUserDataRepository userDataRepository) + public UserManager(ILogger logger, IServerConfigurationManager configurationManager) { _logger = logger; ConfigurationManager = configurationManager; - _userDataRepository = userDataRepository; } #region Events @@ -222,116 +219,6 @@ namespace MediaBrowser.Server.Implementations.Library } } - /// - /// Logs the user activity. - /// - /// The user. - /// Type of the client. - /// The device id. - /// Name of the device. - /// Task. - /// user - public Task LogUserActivity(User user, string clientType, string deviceId, string deviceName) - { - if (user == null) - { - throw new ArgumentNullException("user"); - } - - var activityDate = DateTime.UtcNow; - - var lastActivityDate = user.LastActivityDate; - - user.LastActivityDate = activityDate; - - LogConnection(user.Id, clientType, deviceId, deviceName, activityDate); - - // Don't log in the db anymore frequently than 10 seconds - if (lastActivityDate.HasValue && (activityDate - lastActivityDate.Value).TotalSeconds < 10) - { - return Task.FromResult(true); - } - - // Save this directly. No need to fire off all the events for this. - return UserRepository.SaveUser(user, CancellationToken.None); - } - - /// - /// Updates the now playing item id. - /// - /// The user. - /// Type of the client. - /// The device id. - /// Name of the device. - /// The item. - /// The current position ticks. - private void UpdateNowPlayingItemId(User user, string clientType, string deviceId, string deviceName, BaseItem item, long? currentPositionTicks = null) - { - var conn = GetConnection(user.Id, clientType, deviceId, deviceName); - - conn.NowPlayingPositionTicks = currentPositionTicks; - conn.NowPlayingItem = DtoBuilder.GetBaseItemInfo(item); - conn.LastActivityDate = DateTime.UtcNow; - } - - /// - /// Removes the now playing item id. - /// - /// The user. - /// Type of the client. - /// The device id. - /// Name of the device. - /// The item. - private void RemoveNowPlayingItemId(User user, string clientType, string deviceId, string deviceName, BaseItem item) - { - var conn = GetConnection(user.Id, clientType, deviceId, deviceName); - - if (conn.NowPlayingItem != null && conn.NowPlayingItem.Id.Equals(item.Id.ToString())) - { - conn.NowPlayingItem = null; - conn.NowPlayingPositionTicks = null; - } - } - - /// - /// Logs the connection. - /// - /// The user id. - /// Type of the client. - /// The device id. - /// Name of the device. - /// The last activity date. - private void LogConnection(Guid userId, string clientType, string deviceId, string deviceName, DateTime lastActivityDate) - { - GetConnection(userId, clientType, deviceId, deviceName).LastActivityDate = lastActivityDate; - } - - /// - /// Gets the connection. - /// - /// The user id. - /// Type of the client. - /// The device id. - /// Name of the device. - /// ClientConnectionInfo. - private ClientConnectionInfo GetConnection(Guid userId, string clientType, string deviceId, string deviceName) - { - var key = clientType + deviceId; - - var connection = _activeConnections.GetOrAdd(key, keyName => new ClientConnectionInfo - { - UserId = userId.ToString(), - Client = clientType, - DeviceName = deviceName, - DeviceId = deviceId - }); - - connection.DeviceName = deviceName; - connection.UserId = userId.ToString(); - - return connection; - } - /// /// Loads the users from the repository /// @@ -560,182 +447,5 @@ namespace MediaBrowser.Server.Implementations.Library DateModified = DateTime.UtcNow }; } - - /// - /// Used to report that playback has started for an item - /// - /// The user. - /// The item. - /// Type of the client. - /// The device id. - /// Name of the device. - /// - public void OnPlaybackStart(User user, BaseItem item, string clientType, string deviceId, string deviceName) - { - if (user == null) - { - throw new ArgumentNullException(); - } - if (item == null) - { - throw new ArgumentNullException(); - } - - UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item); - - // Nothing to save here - // Fire events to inform plugins - EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs - { - Item = item, - User = user - }, _logger); - } - - /// - /// Used to report playback progress for an item - /// - /// The user. - /// The item. - /// The position ticks. - /// Type of the client. - /// The device id. - /// Name of the device. - /// Task. - /// - public async Task OnPlaybackProgress(User user, BaseItem item, long? positionTicks, string clientType, string deviceId, string deviceName) - { - if (user == null) - { - throw new ArgumentNullException(); - } - if (item == null) - { - throw new ArgumentNullException(); - } - - UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item, positionTicks); - - var key = item.GetUserDataKey(); - - if (positionTicks.HasValue) - { - var data = await _userDataRepository.GetUserData(user.Id, key).ConfigureAwait(false); - - UpdatePlayState(item, data, positionTicks.Value, false); - await _userDataRepository.SaveUserData(user.Id, key, data, CancellationToken.None).ConfigureAwait(false); - } - - EventHelper.QueueEventIfNotNull(PlaybackProgress, this, new PlaybackProgressEventArgs - { - Item = item, - User = user, - PlaybackPositionTicks = positionTicks - }, _logger); - } - - /// - /// Used to report that playback has ended for an item - /// - /// The user. - /// The item. - /// The position ticks. - /// Type of the client. - /// The device id. - /// Name of the device. - /// Task. - /// - public async Task OnPlaybackStopped(User user, BaseItem item, long? positionTicks, string clientType, string deviceId, string deviceName) - { - if (user == null) - { - throw new ArgumentNullException(); - } - if (item == null) - { - throw new ArgumentNullException(); - } - - RemoveNowPlayingItemId(user, clientType, deviceId, deviceName, item); - - var key = item.GetUserDataKey(); - - var data = await _userDataRepository.GetUserData(user.Id, key).ConfigureAwait(false); - - if (positionTicks.HasValue) - { - UpdatePlayState(item, data, positionTicks.Value, true); - } - else - { - // If the client isn't able to report this, then we'll just have to make an assumption - data.PlayCount++; - data.Played = true; - } - - await _userDataRepository.SaveUserData(user.Id, key, data, CancellationToken.None).ConfigureAwait(false); - - EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackProgressEventArgs - { - Item = item, - User = user, - PlaybackPositionTicks = positionTicks - }, _logger); - } - - /// - /// Updates playstate position for an item but does not save - /// - /// The item - /// User data for the item - /// The current playback position - /// Whether or not to increment playcount - private void UpdatePlayState(BaseItem item, UserItemData data, long positionTicks, bool incrementPlayCount) - { - // If a position has been reported, and if we know the duration - if (positionTicks > 0 && item.RunTimeTicks.HasValue && item.RunTimeTicks > 0) - { - var pctIn = Decimal.Divide(positionTicks, item.RunTimeTicks.Value) * 100; - - // Don't track in very beginning - if (pctIn < ConfigurationManager.Configuration.MinResumePct) - { - positionTicks = 0; - incrementPlayCount = false; - } - - // If we're at the end, assume completed - else if (pctIn > ConfigurationManager.Configuration.MaxResumePct || positionTicks >= item.RunTimeTicks.Value) - { - positionTicks = 0; - data.Played = true; - } - - else - { - // Enforce MinResumeDuration - var durationSeconds = TimeSpan.FromTicks(item.RunTimeTicks.Value).TotalSeconds; - - if (durationSeconds < ConfigurationManager.Configuration.MinResumeDurationSeconds) - { - positionTicks = 0; - data.Played = true; - } - } - } - - if (item is Audio) - { - data.PlaybackPositionTicks = 0; - } - - data.PlaybackPositionTicks = positionTicks; - - if (incrementPlayCount) - { - data.PlayCount++; - data.LastPlayedDate = DateTime.UtcNow; - } - } } } -- cgit v1.2.3