From 44f33fdb555aa9be3d710f7e81b995730ae836be Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 10 May 2013 08:18:07 -0400 Subject: progress on remote control --- .../MediaBrowser.Server.Implementations.csproj | 4 +- .../ServerManager/WebSocketConnection.cs | 12 ++- .../Session/SessionManager.cs | 66 ++++++------- .../Session/SessionWebSocketListener.cs | 104 ++++++++++++++++++++- 4 files changed, 144 insertions(+), 42 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 45515b81f..3474f2e05 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -207,7 +207,9 @@ - + + PreserveNewest + PreserveNewest diff --git a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs index 5a074d194..6b6826bdc 100644 --- a/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs +++ b/MediaBrowser.Server.Implementations/ServerManager/WebSocketConnection.cs @@ -32,7 +32,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager /// /// The _send semaphore /// - private readonly SemaphoreSlim _sendSemaphore = new SemaphoreSlim(1,1); + private readonly SemaphoreSlim _sendSemaphore = new SemaphoreSlim(1, 1); /// /// The logger @@ -100,7 +100,13 @@ namespace MediaBrowser.Server.Implementations.ServerManager using (var memoryStream = new MemoryStream(bytes)) { - info = (WebSocketMessageInfo)_jsonSerializer.DeserializeFromStream(memoryStream, typeof(WebSocketMessageInfo)); + var stub = (WebSocketMessage)_jsonSerializer.DeserializeFromStream(memoryStream, typeof(WebSocketMessage)); + + info = new WebSocketMessageInfo + { + MessageType = stub.MessageType, + Data = stub.Data == null ? null : stub.Data.ToString() + }; } info.Connection = this; @@ -163,7 +169,7 @@ namespace MediaBrowser.Server.Implementations.ServerManager { throw new ArgumentNullException("cancellationToken"); } - + cancellationToken.ThrowIfCancellationRequested(); // Per msdn docs, attempting to send simultaneous messages will result in one failing. diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 99407e349..2f9c7e389 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -1,14 +1,12 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Session; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -18,10 +16,19 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Session { + /// + /// Class SessionManager + /// public class SessionManager : ISessionManager { + /// + /// The _user data repository + /// private readonly IUserDataRepository _userDataRepository; + /// + /// The _user repository + /// private readonly IUserRepository _userRepository; /// @@ -54,6 +61,13 @@ namespace MediaBrowser.Server.Implementations.Session /// public event EventHandler PlaybackStopped; + /// + /// Initializes a new instance of the class. + /// + /// The user data repository. + /// The configuration manager. + /// The logger. + /// The user repository. public SessionManager(IUserDataRepository userDataRepository, IServerConfigurationManager configurationManager, ILogger logger, IUserRepository userRepository) { _userDataRepository = userDataRepository; @@ -66,20 +80,14 @@ namespace MediaBrowser.Server.Implementations.Session /// Gets all connections. /// /// All connections. - public IEnumerable AllConnections + public IEnumerable Sessions { - get { return _activeConnections.Values.OrderByDescending(c => c.LastActivityDate); } + get { return _activeConnections.Values.OrderByDescending(c => c.LastActivityDate).ToList(); } } /// - /// Gets the active connections. + /// The _true task result /// - /// The active connections. - public IEnumerable RecentConnections - { - get { return AllConnections.Where(c => (DateTime.UtcNow - c.LastActivityDate).TotalMinutes <= 5); } - } - private readonly Task _trueTaskResult = Task.FromResult(true); /// @@ -124,11 +132,13 @@ namespace MediaBrowser.Server.Implementations.Session /// The device id. /// Name of the device. /// The item. + /// if set to true [is paused]. /// The current position ticks. - private void UpdateNowPlayingItemId(User user, string clientType, string deviceId, string deviceName, BaseItem item, long? currentPositionTicks = null) + private void UpdateNowPlayingItemId(User user, string clientType, string deviceId, string deviceName, BaseItem item, bool isPaused, long? currentPositionTicks = null) { var conn = GetConnection(clientType, deviceId, deviceName, user); + conn.IsPaused = isPaused; conn.NowPlayingPositionTicks = currentPositionTicks; conn.NowPlayingItem = item; conn.LastActivityDate = DateTime.UtcNow; @@ -150,6 +160,7 @@ namespace MediaBrowser.Server.Implementations.Session { conn.NowPlayingItem = null; conn.NowPlayingPositionTicks = null; + conn.IsPaused = null; } } @@ -187,7 +198,8 @@ namespace MediaBrowser.Server.Implementations.Session /// 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) @@ -199,7 +211,7 @@ namespace MediaBrowser.Server.Implementations.Session throw new ArgumentNullException(); } - UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item); + UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item, false); // Nothing to save here // Fire events to inform plugins @@ -216,12 +228,14 @@ namespace MediaBrowser.Server.Implementations.Session /// The user. /// The item. /// The position ticks. + /// if set to true [is paused]. /// 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) + /// + /// + public async Task OnPlaybackProgress(User user, BaseItem item, long? positionTicks, bool isPaused, string clientType, string deviceId, string deviceName) { if (user == null) { @@ -232,7 +246,7 @@ namespace MediaBrowser.Server.Implementations.Session throw new ArgumentNullException(); } - UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item, positionTicks); + UpdateNowPlayingItemId(user, clientType, deviceId, deviceName, item, isPaused, positionTicks); var key = item.GetUserDataKey(); @@ -262,7 +276,8 @@ namespace MediaBrowser.Server.Implementations.Session /// 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) @@ -355,20 +370,5 @@ namespace MediaBrowser.Server.Implementations.Session data.LastPlayedDate = DateTime.UtcNow; } } - - /// - /// Identifies the web socket. - /// - /// The session id. - /// The web socket. - public void IdentifyWebSocket(Guid sessionId, IWebSocketConnection webSocket) - { - var session = AllConnections.FirstOrDefault(i => i.Id == sessionId); - - if (session != null) - { - session.WebSocket = webSocket; - } - } } } diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index 59c79c23e..ed1280ea9 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -1,5 +1,9 @@ -using MediaBrowser.Common.Net; +using System.Globalization; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Logging; using System; using System.Linq; using System.Threading.Tasks; @@ -22,12 +26,26 @@ namespace MediaBrowser.Server.Implementations.Session private readonly ISessionManager _sessionManager; /// - /// Initializes a new instance of the class. + /// The _logger + /// + private readonly ILogger _logger; + + private readonly IUserManager _userManager; + private readonly ILibraryManager _libraryManager; + + /// + /// Initializes a new instance of the class. /// /// The session manager. - public SessionWebSocketListener(ISessionManager sessionManager) + /// The logger. + /// The library manager. + /// The user manager. + public SessionWebSocketListener(ISessionManager sessionManager, ILogger logger, ILibraryManager libraryManager, IUserManager userManager) { _sessionManager = sessionManager; + _logger = logger; + _libraryManager = libraryManager; + _userManager = userManager; } /// @@ -44,11 +62,87 @@ namespace MediaBrowser.Server.Implementations.Session var client = vals[0]; var deviceId = vals[1]; - var session = _sessionManager.AllConnections.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) && string.Equals(i.Client, client)); + var session = _sessionManager.Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) && string.Equals(i.Client, client)); + + if (session != null) + { + session.WebSocket = message.Connection; + } + } + else if (string.Equals(message.MessageType, "Context", StringComparison.OrdinalIgnoreCase)) + { + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); if (session != null) { - ((SessionManager)_sessionManager).IdentifyWebSocket(session.Id, message.Connection); + var vals = message.Data.Split('|'); + + session.NowViewingItemType = vals[0]; + session.NowViewingItemIdentifier = vals[1]; + session.NowViewingContext = vals.Length > 2 ? vals[2] : null; + } + } + else if (string.Equals(message.MessageType, "PlaybackStart", StringComparison.OrdinalIgnoreCase)) + { + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + + if (session != null && session.UserId.HasValue) + { + var item = DtoBuilder.GetItemByClientId(message.Data, _userManager, _libraryManager); + + _sessionManager.OnPlaybackStart(_userManager.GetUserById(session.UserId.Value), item, session.Client, session.DeviceId, session.DeviceName); + } + } + else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase)) + { + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + + if (session != null && session.UserId.HasValue) + { + var vals = message.Data.Split('|'); + + var item = DtoBuilder.GetItemByClientId(vals[0], _userManager, _libraryManager); + + long? positionTicks = null; + + if (vals.Length > 1) + { + long pos; + + if (long.TryParse(vals[1], out pos)) + { + positionTicks = pos; + } + } + + var isPaused = vals.Length > 2 && string.Equals(vals[2], "true", StringComparison.OrdinalIgnoreCase); + + _sessionManager.OnPlaybackProgress(_userManager.GetUserById(session.UserId.Value), item, positionTicks, isPaused, session.Client, session.DeviceId, session.DeviceName); + } + } + else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase)) + { + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + + if (session != null && session.UserId.HasValue) + { + var vals = message.Data.Split('|'); + + var item = DtoBuilder.GetItemByClientId(vals[0], _userManager, _libraryManager); + + long? positionTicks = null; + + if (vals.Length > 1) + { + long pos; + + if (long.TryParse(vals[1], out pos)) + { + positionTicks = pos; + } + } + + _sessionManager.OnPlaybackStopped(_userManager.GetUserById(session.UserId.Value), item, positionTicks, session.Client, session.DeviceId, session.DeviceName); } } -- cgit v1.2.3