aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Session
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-10-02 21:22:50 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-10-02 21:22:50 -0400
commiteb72c2db513f5306eecccb94f0f1cd5296a7d7db (patch)
treea344f75c10085a9a8f5ac57c4926dbab09161e45 /MediaBrowser.Server.Implementations/Session
parent33a3e215d03d2e8dad3e653e7c75258dc7eb4989 (diff)
updated nuget
Diffstat (limited to 'MediaBrowser.Server.Implementations/Session')
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionManager.cs54
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs258
-rw-r--r--MediaBrowser.Server.Implementations/Session/WebSocketController.cs85
3 files changed, 256 insertions, 141 deletions
diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
index efb8dbe10..ac69b0dc5 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
@@ -78,12 +78,6 @@ namespace MediaBrowser.Server.Implementations.Session
_userRepository = userRepository;
}
- private List<ISessionController> _remoteControllers;
- public void AddParts(IEnumerable<ISessionController> remoteControllers)
- {
- _remoteControllers = remoteControllers.ToList();
- }
-
/// <summary>
/// Gets all connections.
/// </summary>
@@ -433,18 +427,8 @@ namespace MediaBrowser.Server.Implementations.Session
{
throw new ArgumentException(string.Format("Session {0} does not support remote control.", session.Id));
}
-
- return session;
- }
- /// <summary>
- /// Gets the controllers.
- /// </summary>
- /// <param name="session">The session.</param>
- /// <returns>IEnumerable{ISessionRemoteController}.</returns>
- private IEnumerable<ISessionController> GetControllers(SessionInfo session)
- {
- return _remoteControllers.Where(i => i.Supports(session));
+ return session;
}
/// <summary>
@@ -458,9 +442,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
var session = GetSessionForRemoteControl(sessionId);
- var tasks = GetControllers(session).Select(i => i.SendSystemCommand(session, command, cancellationToken));
-
- return Task.WhenAll(tasks);
+ return session.SessionController.SendSystemCommand(command, cancellationToken);
}
/// <summary>
@@ -474,9 +456,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
var session = GetSessionForRemoteControl(sessionId);
- var tasks = GetControllers(session).Select(i => i.SendMessageCommand(session, command, cancellationToken));
-
- return Task.WhenAll(tasks);
+ return session.SessionController.SendMessageCommand(command, cancellationToken);
}
/// <summary>
@@ -490,9 +470,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
var session = GetSessionForRemoteControl(sessionId);
- var tasks = GetControllers(session).Select(i => i.SendPlayCommand(session, command, cancellationToken));
-
- return Task.WhenAll(tasks);
+ return session.SessionController.SendPlayCommand(command, cancellationToken);
}
/// <summary>
@@ -506,9 +484,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
var session = GetSessionForRemoteControl(sessionId);
- var tasks = GetControllers(session).Select(i => i.SendBrowseCommand(session, command, cancellationToken));
-
- return Task.WhenAll(tasks);
+ return session.SessionController.SendBrowseCommand(command, cancellationToken);
}
/// <summary>
@@ -522,7 +498,25 @@ namespace MediaBrowser.Server.Implementations.Session
{
var session = GetSessionForRemoteControl(sessionId);
- var tasks = GetControllers(session).Select(i => i.SendPlaystateCommand(session, command, cancellationToken));
+ return session.SessionController.SendPlaystateCommand(command, cancellationToken);
+ }
+
+ public Task SendRestartRequiredMessage(CancellationToken cancellationToken)
+ {
+ var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList();
+
+ var tasks = sessions.Select(session => Task.Run(async () =>
+ {
+ try
+ {
+ await session.SessionController.SendRestartRequiredMessage(cancellationToken).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in SendRestartRequiredMessage.", ex);
+ }
+
+ }));
return Task.WhenAll(tasks);
}
diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
index 0781e8228..e90dd8eb9 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs
@@ -1,8 +1,8 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
using System;
using System.Linq;
using System.Threading.Tasks;
@@ -33,6 +33,7 @@ namespace MediaBrowser.Server.Implementations.Session
/// The _dto service
/// </summary>
private readonly IDtoService _dtoService;
+ private readonly IServerApplicationHost _appHost;
/// <summary>
/// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class.
@@ -40,11 +41,12 @@ namespace MediaBrowser.Server.Implementations.Session
/// <param name="sessionManager">The session manager.</param>
/// <param name="logManager">The log manager.</param>
/// <param name="dtoService">The dto service.</param>
- public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IDtoService dtoService)
+ public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IDtoService dtoService, IServerApplicationHost appHost)
{
_sessionManager = sessionManager;
_logger = logManager.GetLogger(GetType().Name);
_dtoService = dtoService;
+ _appHost = appHost;
}
/// <summary>
@@ -56,48 +58,11 @@ namespace MediaBrowser.Server.Implementations.Session
{
if (string.Equals(message.MessageType, "Identity", StringComparison.OrdinalIgnoreCase))
{
- _logger.Debug("Received Identity message");
-
- var vals = message.Data.Split('|');
-
- var client = vals[0];
- var deviceId = vals[1];
- var version = vals[2];
-
- var session = _sessionManager.Sessions
- .FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) &&
- string.Equals(i.Client, client) &&
- string.Equals(i.ApplicationVersion, version));
-
- if (session != null)
- {
- var sockets = session.WebSockets.Where(i => i.State == WebSocketState.Open).ToList();
- sockets.Add(message.Connection);
-
- session.WebSockets = sockets;
- }
- else
- {
- _logger.Warn("Unable to determine session based on identity message: {0}", message.Data);
- }
+ ProcessIdentityMessage(message);
}
else if (string.Equals(message.MessageType, "Context", StringComparison.OrdinalIgnoreCase))
{
- var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));
-
- if (session != null)
- {
- var vals = message.Data.Split('|');
-
- session.NowViewingItemType = vals[0];
- session.NowViewingItemId = vals[1];
- session.NowViewingItemName = vals[2];
- session.NowViewingContext = vals.Length > 3 ? vals[3] : null;
- }
- else
- {
- _logger.Warn("Unable to determine session based on context message: {0}", message.Data);
- }
+ ProcessContextMessage(message);
}
else if (string.Equals(message.MessageType, "PlaybackStart", StringComparison.OrdinalIgnoreCase))
{
@@ -105,77 +70,96 @@ namespace MediaBrowser.Server.Implementations.Session
}
else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase))
{
- var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));
+ ReportPlaybackProgress(message);
+ }
+ else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase))
+ {
+ ReportPlaybackStopped(message);
+ }
- if (session != null && session.User != null)
- {
- var vals = message.Data.Split('|');
+ return _trueTaskResult;
+ }
- var item = _dtoService.GetItemByDtoId(vals[0]);
+ /// <summary>
+ /// Processes the identity message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void ProcessIdentityMessage(WebSocketMessageInfo message)
+ {
+ _logger.Debug("Received Identity message");
- long? positionTicks = null;
+ var vals = message.Data.Split('|');
- if (vals.Length > 1)
- {
- long pos;
+ var client = vals[0];
+ var deviceId = vals[1];
+ var version = vals[2];
- if (long.TryParse(vals[1], out pos))
- {
- positionTicks = pos;
- }
- }
+ var session = _sessionManager.Sessions
+ .FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) &&
+ string.Equals(i.Client, client) &&
+ string.Equals(i.ApplicationVersion, version));
- var isPaused = vals.Length > 2 && string.Equals(vals[2], "true", StringComparison.OrdinalIgnoreCase);
- var isMuted = vals.Length > 3 && string.Equals(vals[3], "true", StringComparison.OrdinalIgnoreCase);
+ if (session != null)
+ {
+ var controller = new WebSocketController(session, _appHost);
+ controller.Sockets.Add(message.Connection);
- var info = new PlaybackProgressInfo
- {
- Item = item,
- PositionTicks = positionTicks,
- IsMuted = isMuted,
- IsPaused = isPaused,
- SessionId = session.Id
- };
-
- _sessionManager.OnPlaybackProgress(info);
- }
+ session.SessionController = controller;
}
- else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase))
+ else
{
- _logger.Debug("Received PlaybackStopped message");
-
- var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));
+ _logger.Warn("Unable to determine session based on identity message: {0}", message.Data);
+ }
+ }
- if (session != null && session.User != null)
- {
- var vals = message.Data.Split('|');
+ /// <summary>
+ /// Processes the context message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void ProcessContextMessage(WebSocketMessageInfo message)
+ {
+ var session = GetSessionFromMessage(message);
- var item = _dtoService.GetItemByDtoId(vals[0]);
+ if (session != null)
+ {
+ var vals = message.Data.Split('|');
- long? positionTicks = null;
+ session.NowViewingItemType = vals[0];
+ session.NowViewingItemId = vals[1];
+ session.NowViewingItemName = vals[2];
+ session.NowViewingContext = vals.Length > 3 ? vals[3] : null;
+ }
+ }
- if (vals.Length > 1)
- {
- long pos;
+ /// <summary>
+ /// Gets the session from message.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <returns>SessionInfo.</returns>
+ private SessionInfo GetSessionFromMessage(WebSocketMessageInfo message)
+ {
+ var result = _sessionManager.Sessions.FirstOrDefault(i =>
+ {
+ var controller = i.SessionController as WebSocketController;
- if (long.TryParse(vals[1], out pos))
- {
- positionTicks = pos;
- }
+ if (controller != null)
+ {
+ if (controller.Sockets.Any(s => s.Id == message.Connection.Id))
+ {
+ return true;
}
+ }
- var info = new PlaybackStopInfo
- {
- Item = item,
- PositionTicks = positionTicks,
- SessionId = session.Id
- };
+ return false;
- _sessionManager.OnPlaybackStopped(info);
- }
+ });
+
+ if (result == null)
+ {
+ _logger.Error("Unable to session based on web socket message");
}
- return _trueTaskResult;
+ return result;
}
/// <summary>
@@ -185,9 +169,8 @@ namespace MediaBrowser.Server.Implementations.Session
private void ReportPlaybackStart(WebSocketMessageInfo message)
{
_logger.Debug("Received PlaybackStart message");
-
- var session = _sessionManager.Sessions
- .FirstOrDefault(i => i.WebSockets.Contains(message.Connection));
+
+ var session = GetSessionFromMessage(message);
if (session != null && session.User != null)
{
@@ -206,7 +189,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
queueableMediaTypes = vals[2];
}
-
+
var info = new PlaybackInfo
{
CanSeek = canSeek,
@@ -218,5 +201,86 @@ namespace MediaBrowser.Server.Implementations.Session
_sessionManager.OnPlaybackStart(info);
}
}
+
+ /// <summary>
+ /// Reports the playback progress.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void ReportPlaybackProgress(WebSocketMessageInfo message)
+ {
+ var session = GetSessionFromMessage(message);
+
+ if (session != null && session.User != null)
+ {
+ var vals = message.Data.Split('|');
+
+ var item = _dtoService.GetItemByDtoId(vals[0]);
+
+ 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);
+ var isMuted = vals.Length > 3 && string.Equals(vals[3], "true", StringComparison.OrdinalIgnoreCase);
+
+ var info = new PlaybackProgressInfo
+ {
+ Item = item,
+ PositionTicks = positionTicks,
+ IsMuted = isMuted,
+ IsPaused = isPaused,
+ SessionId = session.Id
+ };
+
+ _sessionManager.OnPlaybackProgress(info);
+ }
+ }
+
+ /// <summary>
+ /// Reports the playback stopped.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ private void ReportPlaybackStopped(WebSocketMessageInfo message)
+ {
+ _logger.Debug("Received PlaybackStopped message");
+
+ var session = GetSessionFromMessage(message);
+
+ if (session != null && session.User != null)
+ {
+ var vals = message.Data.Split('|');
+
+ var item = _dtoService.GetItemByDtoId(vals[0]);
+
+ long? positionTicks = null;
+
+ if (vals.Length > 1)
+ {
+ long pos;
+
+ if (long.TryParse(vals[1], out pos))
+ {
+ positionTicks = pos;
+ }
+ }
+
+ var info = new PlaybackStopInfo
+ {
+ Item = item,
+ PositionTicks = positionTicks,
+ SessionId = session.Id
+ };
+
+ _sessionManager.OnPlaybackStopped(info);
+ }
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs
index fb0bc9b7c..46c8f752d 100644
--- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs
+++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs
@@ -1,8 +1,12 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using MediaBrowser.Model.Session;
+using MediaBrowser.Model.System;
using System;
+using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -11,15 +15,39 @@ namespace MediaBrowser.Server.Implementations.Session
{
public class WebSocketController : ISessionController
{
- public bool Supports(SessionInfo session)
+ public SessionInfo Session { get; private set; }
+ public List<IWebSocketConnection> Sockets { get; private set; }
+
+ private readonly IServerApplicationHost _appHost;
+
+ public WebSocketController(SessionInfo session, IServerApplicationHost appHost)
{
- return session.WebSockets.Any(i => i.State == WebSocketState.Open);
+ Session = session;
+ _appHost = appHost;
+ Sockets = new List<IWebSocketConnection>();
}
- private IWebSocketConnection GetSocket(SessionInfo session)
+ public bool SupportsMediaRemoteControl
{
- var socket = session.WebSockets.OrderByDescending(i => i.LastActivityDate).FirstOrDefault(i => i.State == WebSocketState.Open);
+ get
+ {
+ return Sockets.Any(i => i.State == WebSocketState.Open);
+ }
+ }
+ public bool IsSessionActive
+ {
+ get
+ {
+ return Sockets.Any(i => i.State == WebSocketState.Open);
+ }
+ }
+
+ private IWebSocketConnection GetActiveSocket()
+ {
+ var socket = Sockets
+ .OrderByDescending(i => i.LastActivityDate)
+ .FirstOrDefault(i => i.State == WebSocketState.Open);
if (socket == null)
{
@@ -29,9 +57,9 @@ namespace MediaBrowser.Server.Implementations.Session
return socket;
}
- public Task SendSystemCommand(SessionInfo session, SystemCommand command, CancellationToken cancellationToken)
+ public Task SendSystemCommand(SystemCommand command, CancellationToken cancellationToken)
{
- var socket = GetSocket(session);
+ var socket = GetActiveSocket();
return socket.SendAsync(new WebSocketMessage<string>
{
@@ -41,9 +69,9 @@ namespace MediaBrowser.Server.Implementations.Session
}, cancellationToken);
}
- public Task SendMessageCommand(SessionInfo session, MessageCommand command, CancellationToken cancellationToken)
+ public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken)
{
- var socket = GetSocket(session);
+ var socket = GetActiveSocket();
return socket.SendAsync(new WebSocketMessage<MessageCommand>
{
@@ -53,9 +81,9 @@ namespace MediaBrowser.Server.Implementations.Session
}, cancellationToken);
}
- public Task SendPlayCommand(SessionInfo session, PlayRequest command, CancellationToken cancellationToken)
+ public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
{
- var socket = GetSocket(session);
+ var socket = GetActiveSocket();
return socket.SendAsync(new WebSocketMessage<PlayRequest>
{
@@ -65,9 +93,9 @@ namespace MediaBrowser.Server.Implementations.Session
}, cancellationToken);
}
- public Task SendBrowseCommand(SessionInfo session, BrowseRequest command, CancellationToken cancellationToken)
+ public Task SendBrowseCommand(BrowseRequest command, CancellationToken cancellationToken)
{
- var socket = GetSocket(session);
+ var socket = GetActiveSocket();
return socket.SendAsync(new WebSocketMessage<BrowseRequest>
{
@@ -77,9 +105,9 @@ namespace MediaBrowser.Server.Implementations.Session
}, cancellationToken);
}
- public Task SendPlaystateCommand(SessionInfo session, PlaystateRequest command, CancellationToken cancellationToken)
+ public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken)
{
- var socket = GetSocket(session);
+ var socket = GetActiveSocket();
return socket.SendAsync(new WebSocketMessage<PlaystateRequest>
{
@@ -88,5 +116,34 @@ namespace MediaBrowser.Server.Implementations.Session
}, cancellationToken);
}
+
+ public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken)
+ {
+ var socket = GetActiveSocket();
+
+ return socket.SendAsync(new WebSocketMessage<LibraryUpdateInfo>
+ {
+ MessageType = "Playstate",
+ Data = info
+
+ }, cancellationToken);
+ }
+
+ /// <summary>
+ /// Sends the restart required message.
+ /// </summary>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task.</returns>
+ public Task SendRestartRequiredMessage(CancellationToken cancellationToken)
+ {
+ var socket = GetActiveSocket();
+
+ return socket.SendAsync(new WebSocketMessage<SystemInfo>
+ {
+ MessageType = "RestartRequired",
+ Data = _appHost.GetSystemInfo()
+
+ }, cancellationToken);
+ }
}
}