|
@@ -0,0 +1,149 @@
|
|
|
+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.Session
|
|
|
+{
|
|
|
+ public class RokuController : ISessionController
|
|
|
+ {
|
|
|
+ private readonly IHttpClient _httpClient;
|
|
|
+ private readonly IJsonSerializer _json;
|
|
|
+ private readonly IServerApplicationHost _appHost;
|
|
|
+
|
|
|
+ public SessionInfo Session { get; private set; }
|
|
|
+
|
|
|
+ public RokuController(IHttpClient httpClient, IJsonSerializer json, IServerApplicationHost appHost, SessionInfo session)
|
|
|
+ {
|
|
|
+ _httpClient = httpClient;
|
|
|
+ _json = json;
|
|
|
+ _appHost = appHost;
|
|
|
+ Session = session;
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool SupportsMediaRemoteControl
|
|
|
+ {
|
|
|
+ get { return true; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool IsSessionActive
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ return (DateTime.UtcNow - Session.LastActivityDate).TotalMinutes <= 10;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendSystemCommand(SystemCommand command, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<string>
|
|
|
+ {
|
|
|
+ MessageType = "SystemCommand",
|
|
|
+ Data = command.ToString()
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<MessageCommand>
|
|
|
+ {
|
|
|
+ MessageType = "MessageCommand",
|
|
|
+ Data = command
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<PlayRequest>
|
|
|
+ {
|
|
|
+ MessageType = "Play",
|
|
|
+ Data = command
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendBrowseCommand(BrowseRequest command, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<BrowseRequest>
|
|
|
+ {
|
|
|
+ MessageType = "Browse",
|
|
|
+ Data = command
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<PlaystateRequest>
|
|
|
+ {
|
|
|
+ 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<SystemInfo>
|
|
|
+ {
|
|
|
+ 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<string>
|
|
|
+ {
|
|
|
+ MessageType = "ServerShuttingDown",
|
|
|
+ Data = string.Empty
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task SendServerRestartNotification(CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ return SendCommand(new WebSocketMessage<string>
|
|
|
+ {
|
|
|
+ MessageType = "ServerRestarting",
|
|
|
+ Data = string.Empty
|
|
|
+
|
|
|
+ }, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Task SendCommand(object obj, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var json = _json.SerializeToString(obj);
|
|
|
+
|
|
|
+ return _httpClient.Post(new HttpRequestOptions
|
|
|
+ {
|
|
|
+ Url = "mb/remotecontrol",
|
|
|
+ CancellationToken = cancellationToken,
|
|
|
+ RequestContent = json,
|
|
|
+ RequestContentType = "application/json"
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|