using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Session; using MediaBrowser.Model.System; using System; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Roku { public class RokuSessionController : ISessionController { private readonly IHttpClient _httpClient; private readonly IJsonSerializer _json; private readonly IServerApplicationHost _appHost; public SessionInfo Session { get; private set; } public RokuSessionController(IHttpClient httpClient, IJsonSerializer json, IServerApplicationHost appHost, SessionInfo session) { _httpClient = httpClient; _json = json; _appHost = appHost; Session = session; } public bool SupportsMediaRemoteControl { get { return false; } } public bool IsSessionActive { get { return (DateTime.UtcNow - Session.LastActivityDate).TotalMinutes <= 10; } } public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { return Task.FromResult(true); } public Task SendPlaybackStartNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { return Task.FromResult(true); } public Task SendPlaybackStoppedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { return Task.FromResult(true); } public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "Play", Data = command }, cancellationToken); } public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "Playstate", Data = command }, cancellationToken); } public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken) { // Roku probably won't care about this return Task.FromResult(true); } public Task SendRestartRequiredNotification(CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "RestartRequired", Data = _appHost.GetSystemInfo() }, cancellationToken); } public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken) { // Roku probably won't care about this return Task.FromResult(true); } public Task SendServerShutdownNotification(CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "ServerShuttingDown", Data = string.Empty }, cancellationToken); } public Task SendServerRestartNotification(CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "ServerRestarting", Data = string.Empty }, cancellationToken); } private Task SendCommand(object obj, CancellationToken cancellationToken) { var json = _json.SerializeToString(obj); return _httpClient.Post(new HttpRequestOptions { Url = "http://" + Session.RemoteEndPoint + "/mb/remotecontrol", CancellationToken = cancellationToken, RequestContent = json, RequestContentType = "application/json" }); } public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken) { return SendCommand(new WebSocketMessage { MessageType = "Command", Data = command }, cancellationToken); } } }