package mediabrowser.apiinteraction.connect; import mediabrowser.apiinteraction.EmptyResponse; import mediabrowser.apiinteraction.QueryStringDictionary; import mediabrowser.apiinteraction.Response; import mediabrowser.apiinteraction.SerializedResponse; import mediabrowser.apiinteraction.cryptography.Md5; import mediabrowser.apiinteraction.http.HttpRequest; import mediabrowser.apiinteraction.http.IAsyncHttpClient; import mediabrowser.model.connect.*; import mediabrowser.model.logging.ILogger; import mediabrowser.model.registration.RegistrationInfo; import mediabrowser.model.serialization.IJsonSerializer; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; public class ConnectService { public IJsonSerializer JsonSerializer; private ILogger _logger; private IAsyncHttpClient _httpClient; private String appName; private String appVersion; public ConnectService(IJsonSerializer jsonSerializer, ILogger logger, IAsyncHttpClient httpClient, String appName, String appVersion) { JsonSerializer = jsonSerializer; _logger = logger; _httpClient = httpClient; this.appName = appName; this.appVersion = appVersion; } public void Authenticate(String username, String password, final Response<ConnectAuthenticationResult> response) throws UnsupportedEncodingException, NoSuchAlgorithmException { QueryStringDictionary args = new QueryStringDictionary(); args.Add("nameOrEmail", username); args.Add("password", Md5.getHash(ConnectPassword.PerformPreHashFilter(password))); String url = GetConnectUrl("user/authenticate"); HttpRequest request = new HttpRequest(); request.setMethod("POST"); request.setUrl(url); request.setPostData(args); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<ConnectAuthenticationResult>(response, JsonSerializer, ConnectAuthenticationResult.class)); } public void CreatePin(String deviceId, final Response<PinCreationResult> response) { QueryStringDictionary args = new QueryStringDictionary(); args.Add("deviceId", deviceId); String url = GetConnectUrl("pin") + "?" + args.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("POST"); request.setUrl(url); request.setPostData(args); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<PinCreationResult>(response, JsonSerializer, PinCreationResult.class)); } public void GetPinStatus(PinCreationResult pin, final Response<PinStatusResult> response) { QueryStringDictionary dict = new QueryStringDictionary(); dict.Add("deviceId", pin.getDeviceId()); dict.Add("pin", pin.getPin()); String url = GetConnectUrl("pin") + "?" + dict.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("GET"); request.setUrl(url); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<PinStatusResult>(response, JsonSerializer, PinStatusResult.class)); } public void ExchangePin(PinCreationResult pin, final Response<PinExchangeResult> response) { QueryStringDictionary args = new QueryStringDictionary(); args.Add("deviceId", pin.getDeviceId()); args.Add("pin", pin.getPin()); String url = GetConnectUrl("pin/authenticate"); HttpRequest request = new HttpRequest(); request.setMethod("POST"); request.setUrl(url); request.setPostData(args); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<PinExchangeResult>(response, JsonSerializer, PinExchangeResult.class)); } public void GetConnectUser(ConnectUserQuery query, String connectAccessToken, final Response<ConnectUser> response) { QueryStringDictionary dict = new QueryStringDictionary(); if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getId())) { dict.Add("id", query.getId()); } else if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getName())) { dict.Add("name", query.getName()); } else if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getEmail())) { dict.Add("email", query.getEmail()); } else if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getNameOrEmail())) { dict.Add("nameOrEmail", query.getNameOrEmail()); } else { throw new IllegalArgumentException("Empty ConnectUserQuery"); } String url = GetConnectUrl("user") + "?" + dict.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("GET"); request.setUrl(url); AddUserAccessToken(request, connectAccessToken); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<ConnectUser>(response, JsonSerializer, ConnectUser.class)); } public void GetServers(String userId, String connectAccessToken, final Response<ConnectUserServer[]> response) { QueryStringDictionary dict = new QueryStringDictionary(); dict.Add("userId", userId); String url = GetConnectUrl("servers") + "?" + dict.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("GET"); request.setUrl(url); AddUserAccessToken(request, connectAccessToken); AddXApplicationName(request); _httpClient.Send(request, new SerializedResponse<ConnectUserServer[]>(response, JsonSerializer, new ConnectUserServer[]{}.getClass())); } public void GetRegistrationInfo(String serverId, String deviceId, String embyUsername, EmptyResponse response) { QueryStringDictionary dict = new QueryStringDictionary(); dict.Add("serverId", serverId); dict.Add("embyUserName", embyUsername); dict.Add("deviceId", deviceId); String url = "https://mb3admin.com/admin/service/registration/validateDevice" + "?" + dict.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("POST"); request.setUrl(url); AddXApplicationName(request); _httpClient.Send(request, new Response<String>(response)); } public void DeleteServer(String userId, String connectAccessToken, String serverId, EmptyResponse response) { QueryStringDictionary dict = new QueryStringDictionary(); dict.Add("userId", userId); dict.Add("serverId", serverId); String url = GetConnectUrl("serverAuthorizations") + "?" + dict.GetQueryString(); HttpRequest request = new HttpRequest(); request.setMethod("DELETE"); request.setUrl(url); AddUserAccessToken(request, connectAccessToken); AddXApplicationName(request); _httpClient.Send(request, new Response<String>(response)); } public void Logout(String connectAccessToken, final EmptyResponse response) { String url = GetConnectUrl("user/logout"); HttpRequest request = new HttpRequest(); request.setMethod("POST"); request.setUrl(url); AddUserAccessToken(request, connectAccessToken); AddXApplicationName(request); _httpClient.Send(request, new Response<String>(response)); } private String GetConnectUrl(String handler) { return "https://connect.emby.media/service/" + handler; } private void AddUserAccessToken(HttpRequest request, String accessToken) { if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(accessToken)) { throw new IllegalArgumentException("accessToken"); } request.getRequestHeaders().put("X-Connect-UserToken", accessToken); } private void AddXApplicationName(HttpRequest request) { request.getRequestHeaders().put("X-Application", appName + "/" + appVersion); } }