From c8e4889ac72b4b6fa01ffd0ccf293363ca5ce744 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 May 2014 00:24:10 -0400 Subject: add subtitle management page --- .../Session/WebSocketController.cs | 86 ++++++++++++---------- 1 file changed, 49 insertions(+), 37 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Session/WebSocketController.cs') diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs index 0edd57d2a..040705171 100644 --- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs +++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using MediaBrowser.Model.Session; using MediaBrowser.Model.System; @@ -19,11 +20,13 @@ namespace MediaBrowser.Server.Implementations.Session public List Sockets { get; private set; } private readonly IServerApplicationHost _appHost; + private readonly ILogger _logger; - public WebSocketController(SessionInfo session, IServerApplicationHost appHost) + public WebSocketController(SessionInfo session, IServerApplicationHost appHost, ILogger logger) { Session = session; _appHost = appHost; + _logger = logger; Sockets = new List(); } @@ -35,11 +38,17 @@ namespace MediaBrowser.Server.Implementations.Session } } - private IWebSocketConnection GetActiveSocket() + private IEnumerable GetActiveSockets() { - var socket = Sockets + return Sockets .OrderByDescending(i => i.LastActivityDate) - .FirstOrDefault(i => i.State == WebSocketState.Open); + .Where(i => i.State == WebSocketState.Open); + } + + private IWebSocketConnection GetActiveSocket() + { + var socket = GetActiveSockets() + .FirstOrDefault(); if (socket == null) { @@ -51,9 +60,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessage(new WebSocketMessage { MessageType = "Play", Data = command @@ -63,9 +70,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessage(new WebSocketMessage { MessageType = "Playstate", Data = command @@ -75,9 +80,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "LibraryChanged", Data = info @@ -92,9 +95,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. public Task SendRestartRequiredNotification(CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "RestartRequired", Data = _appHost.GetSystemInfo() @@ -111,9 +112,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "UserDataChanged", Data = info @@ -128,9 +127,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. public Task SendServerShutdownNotification(CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "ServerShuttingDown", Data = string.Empty @@ -145,9 +142,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. public Task SendServerRestartNotification(CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "ServerRestarting", Data = string.Empty @@ -157,9 +152,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessage(new WebSocketMessage { MessageType = "GeneralCommand", Data = command @@ -169,9 +162,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "SessionEnded", Data = sessionInfo @@ -181,9 +172,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaybackStartNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "PlaybackStart", Data = sessionInfo @@ -193,14 +182,37 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaybackStoppedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - var socket = GetActiveSocket(); - - return socket.SendAsync(new WebSocketMessage + return SendMessages(new WebSocketMessage { MessageType = "PlaybackStopped", Data = sessionInfo }, cancellationToken); } + + private Task SendMessage(WebSocketMessage message, CancellationToken cancellationToken) + { + var socket = GetActiveSocket(); + + return socket.SendAsync(message, cancellationToken); + } + + private Task SendMessages(WebSocketMessage message, CancellationToken cancellationToken) + { + var tasks = GetActiveSockets().Select(i => Task.Run(async () => + { + try + { + await i.SendAsync(message, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error sending web socket message", ex); + } + + }, cancellationToken)); + + return Task.WhenAll(tasks); + } } } -- cgit v1.2.3