diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Session')
3 files changed, 50 insertions, 13 deletions
diff --git a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs index 4a64d3753..4d5c40853 100644 --- a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs +++ b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs @@ -209,6 +209,12 @@ namespace MediaBrowser.Server.Implementations.Session return SendMessage(command.Name, command.Arguments, cancellationToken); } + public Task SendMessage<T>(string name, T data, CancellationToken cancellationToken) + { + // Not supported or needed right now + return Task.FromResult(true); + } + private string ToQueryString(Dictionary<string, string> nvc) { var array = (from item in nvc diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index d9ec9b7e4..8bf39fd6b 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -1632,5 +1632,26 @@ namespace MediaBrowser.Server.Implementations.Session return Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) && string.Equals(i.Client, client)); } + + public Task SendMessageToUserSessions<T>(string userId, string name, T data, + CancellationToken cancellationToken) + { + var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null && i.ContainsUser(userId)).ToList(); + + var tasks = sessions.Select(session => Task.Run(async () => + { + try + { + await session.SessionController.SendMessage(name, data, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error in SendPlaybackStoppedNotification.", ex); + } + + }, cancellationToken)); + + return Task.WhenAll(tasks); + } } }
\ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs index 7d1057397..19aaaf8a5 100644 --- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs +++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs @@ -90,7 +90,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<PlayRequest> + return SendMessageInternal(new WebSocketMessage<PlayRequest> { MessageType = "Play", Data = command @@ -100,7 +100,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<PlaystateRequest> + return SendMessageInternal(new WebSocketMessage<PlaystateRequest> { MessageType = "Playstate", Data = command @@ -110,7 +110,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<LibraryUpdateInfo> + return SendMessagesInternal(new WebSocketMessage<LibraryUpdateInfo> { MessageType = "LibraryChanged", Data = info @@ -126,7 +126,7 @@ namespace MediaBrowser.Server.Implementations.Session /// <returns>Task.</returns> public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<SystemInfo> + return SendMessagesInternal(new WebSocketMessage<SystemInfo> { MessageType = "RestartRequired", Data = info @@ -143,7 +143,7 @@ namespace MediaBrowser.Server.Implementations.Session /// <returns>Task.</returns> public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<UserDataChangeInfo> + return SendMessagesInternal(new WebSocketMessage<UserDataChangeInfo> { MessageType = "UserDataChanged", Data = info @@ -158,7 +158,7 @@ namespace MediaBrowser.Server.Implementations.Session /// <returns>Task.</returns> public Task SendServerShutdownNotification(CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<string> + return SendMessagesInternal(new WebSocketMessage<string> { MessageType = "ServerShuttingDown", Data = string.Empty @@ -173,7 +173,7 @@ namespace MediaBrowser.Server.Implementations.Session /// <returns>Task.</returns> public Task SendServerRestartNotification(CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<string> + return SendMessagesInternal(new WebSocketMessage<string> { MessageType = "ServerRestarting", Data = string.Empty @@ -183,7 +183,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<GeneralCommand> + return SendMessageInternal(new WebSocketMessage<GeneralCommand> { MessageType = "GeneralCommand", Data = command @@ -193,7 +193,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<SessionInfoDto> + return SendMessagesInternal(new WebSocketMessage<SessionInfoDto> { MessageType = "SessionEnded", Data = sessionInfo @@ -203,7 +203,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaybackStartNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<SessionInfoDto> + return SendMessagesInternal(new WebSocketMessage<SessionInfoDto> { MessageType = "PlaybackStart", Data = sessionInfo @@ -213,7 +213,7 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlaybackStoppedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { - return SendMessages(new WebSocketMessage<SessionInfoDto> + return SendMessagesInternal(new WebSocketMessage<SessionInfoDto> { MessageType = "PlaybackStopped", Data = sessionInfo @@ -221,7 +221,17 @@ namespace MediaBrowser.Server.Implementations.Session }, cancellationToken); } - private Task SendMessage<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) + public Task SendMessage<T>(string name, T data, CancellationToken cancellationToken) + { + return SendMessagesInternal(new WebSocketMessage<T> + { + Data = data, + MessageType = name + + }, cancellationToken); + } + + private Task SendMessageInternal<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) { if (SkipSending()) return Task.FromResult(true); @@ -230,7 +240,7 @@ namespace MediaBrowser.Server.Implementations.Session return socket.SendAsync(message, cancellationToken); } - private Task SendMessages<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) + private Task SendMessagesInternal<T>(WebSocketMessage<T> message, CancellationToken cancellationToken) { if (SkipSending()) return Task.FromResult(true); |
