updated nuget

This commit is contained in:
Luke Pulverenti
2013-10-02 21:22:50 -04:00
parent 33a3e215d0
commit eb72c2db51
18 changed files with 390 additions and 235 deletions

View File

@@ -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);
}

View File

@@ -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,79 +70,98 @@ 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));
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);
}
ReportPlaybackProgress(message);
}
else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase))
{
_logger.Debug("Received PlaybackStopped message");
var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection));
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);
}
ReportPlaybackStopped(message);
}
return _trueTaskResult;
}
/// <summary>
/// Processes the identity message.
/// </summary>
/// <param name="message">The message.</param>
private void ProcessIdentityMessage(WebSocketMessageInfo message)
{
_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 controller = new WebSocketController(session, _appHost);
controller.Sockets.Add(message.Connection);
session.SessionController = controller;
}
else
{
_logger.Warn("Unable to determine session based on identity message: {0}", message.Data);
}
}
/// <summary>
/// Processes the context message.
/// </summary>
/// <param name="message">The message.</param>
private void ProcessContextMessage(WebSocketMessageInfo message)
{
var session = GetSessionFromMessage(message);
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;
}
}
/// <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 (controller != null)
{
if (controller.Sockets.Any(s => s.Id == message.Connection.Id))
{
return true;
}
}
return false;
});
if (result == null)
{
_logger.Error("Unable to session based on web socket message");
}
return result;
}
/// <summary>
/// Reports the playback start.
/// </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);
}
}
}
}

View File

@@ -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);
}
}
}