diff --git a/MediaBrowser.Api/SessionsService.cs b/MediaBrowser.Api/SessionsService.cs index 271e5bbd6c..eae5d6d6ae 100644 --- a/MediaBrowser.Api/SessionsService.cs +++ b/MediaBrowser.Api/SessionsService.cs @@ -98,12 +98,15 @@ namespace MediaBrowser.Api throw new ResourceNotFoundException(string.Format("Session {0} not found.", request.Id)); } - session.WebSocket.SendAsync(new WebSocketMessage + foreach (var socket in session.WebSockets) { - MessageType = "Browse", - Data = request + socket.SendAsync(new WebSocketMessage + { + MessageType = "Browse", + Data = request - }, CancellationToken.None); + }, CancellationToken.None); + } } } } diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index 93ef4f6947..c9ed47756b 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -1,4 +1,6 @@ -using MediaBrowser.Common.Net; +using System.Collections.Generic; +using System.Linq; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Net; using System; @@ -10,6 +12,11 @@ namespace MediaBrowser.Controller.Session /// public class SessionInfo { + public SessionInfo() + { + WebSockets = new List(); + } + /// /// Gets or sets the id. /// @@ -86,7 +93,7 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the web socket. /// /// The web socket. - public IWebSocketConnection WebSocket { get; set; } + public List WebSockets { get; set; } /// /// Gets a value indicating whether this instance is active. @@ -96,9 +103,9 @@ namespace MediaBrowser.Controller.Session { get { - if (WebSocket != null) + if (WebSockets.Count > 0) { - return WebSocket.State == WebSocketState.Open; + return WebSockets.Any(i => i.State == WebSocketState.Open); } return (DateTime.UtcNow - LastActivityDate).TotalMinutes <= 5; @@ -113,7 +120,7 @@ namespace MediaBrowser.Controller.Session { get { - return WebSocket != null && WebSocket.State == WebSocketState.Open; + return WebSockets.Any(i => i.State == WebSocketState.Open); } } } diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index ed1280ea95..19d177a948 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -7,6 +7,7 @@ using MediaBrowser.Model.Logging; using System; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Model.Net; namespace MediaBrowser.Server.Implementations.Session { @@ -66,12 +67,15 @@ namespace MediaBrowser.Server.Implementations.Session if (session != null) { - session.WebSocket = message.Connection; + var sockets = session.WebSockets.Where(i => i.State == WebSocketState.Open).ToList(); + sockets.Add(message.Connection); + + session.WebSockets = sockets; } } else if (string.Equals(message.MessageType, "Context", StringComparison.OrdinalIgnoreCase)) { - var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); if (session != null) { @@ -84,7 +88,7 @@ namespace MediaBrowser.Server.Implementations.Session } else if (string.Equals(message.MessageType, "PlaybackStart", StringComparison.OrdinalIgnoreCase)) { - var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); if (session != null && session.UserId.HasValue) { @@ -95,7 +99,7 @@ namespace MediaBrowser.Server.Implementations.Session } else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase)) { - var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); if (session != null && session.UserId.HasValue) { @@ -122,7 +126,7 @@ namespace MediaBrowser.Server.Implementations.Session } else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase)) { - var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSocket == message.Connection); + var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); if (session != null && session.UserId.HasValue) {