package mediabrowser.apiinteraction;
import mediabrowser.apiinteraction.cryptography.Md5;
import mediabrowser.apiinteraction.cryptography.Sha1;
import mediabrowser.apiinteraction.device.IDevice;
import mediabrowser.apiinteraction.http.HttpRequest;
import mediabrowser.apiinteraction.http.IAsyncHttpClient;
import mediabrowser.apiinteraction.network.INetworkConnection;
import mediabrowser.apiinteraction.tasks.CancellationToken;
import mediabrowser.apiinteraction.tasks.IProgress;
import mediabrowser.apiinteraction.websocket.ApiWebSocket;
import mediabrowser.model.apiclient.ConnectionMode;
import mediabrowser.model.apiclient.RemoteLogoutReason;
import mediabrowser.model.apiclient.ServerInfo;
import mediabrowser.model.channels.AllChannelMediaQuery;
import mediabrowser.model.channels.ChannelFeatures;
import mediabrowser.model.channels.ChannelItemQuery;
import mediabrowser.model.channels.ChannelQuery;
import mediabrowser.model.configuration.ServerConfiguration;
import mediabrowser.model.configuration.UserConfiguration;
import mediabrowser.model.connect.ConnectPassword;
import mediabrowser.model.devices.ContentUploadHistory;
import mediabrowser.model.devices.DevicesOptions;
import mediabrowser.model.devices.LocalFileInfo;
import mediabrowser.model.dto.*;
import mediabrowser.model.entities.DisplayPreferences;
import mediabrowser.model.entities.ParentalRating;
import mediabrowser.model.extensions.StringHelper;
import mediabrowser.model.globalization.CountryInfo;
import mediabrowser.model.globalization.CultureDto;
import mediabrowser.model.livetv.*;
import mediabrowser.model.logging.ILogger;
import mediabrowser.model.mediainfo.*;
import mediabrowser.model.net.EndPointInfo;
import mediabrowser.model.net.HttpException;
import mediabrowser.model.playlists.PlaylistCreationRequest;
import mediabrowser.model.playlists.PlaylistCreationResult;
import mediabrowser.model.playlists.PlaylistItemQuery;
import mediabrowser.model.querying.*;
import mediabrowser.model.registration.AppstoreRegRequest;
import mediabrowser.model.registration.AppstoreRegWrapper;
import mediabrowser.model.registration.RegistrationInfo;
import mediabrowser.model.results.*;
import mediabrowser.model.search.SearchHintResult;
import mediabrowser.model.search.SearchQuery;
import mediabrowser.model.serialization.IJsonSerializer;
import mediabrowser.model.session.*;
import mediabrowser.model.sync.*;
import mediabrowser.model.system.PublicSystemInfo;
import mediabrowser.model.system.SystemInfo;
import mediabrowser.model.users.AuthenticationResult;
import mediabrowser.model.users.UserAction;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Observable;
public class ApiClient extends BaseApiClient {
protected IAsyncHttpClient httpClient;
private ApiEventListener apiEventListener;
private INetworkConnection networkConnection;
private ApiWebSocket apiWebSocket;
private ServerInfo serverInfo;
public ServerInfo getServerInfo(){
return serverInfo;
}
private ConnectionMode connectionMode = ConnectionMode.Local;
private Observable authenticatedObservable = new AutomaticObservable();
public Observable getAuthenticatedObservable() {
return authenticatedObservable;
}
public ApiClient(IAsyncHttpClient httpClient, IJsonSerializer jsonSerializer, ILogger logger, String serverAddress, String accessToken, ApiEventListener apiEventListener)
{
super(logger, jsonSerializer, serverAddress, accessToken);
this.httpClient = httpClient;
this.apiEventListener = apiEventListener;
ResetHttpHeaders();
}
public ApiClient(IAsyncHttpClient httpClient, IJsonSerializer jsonSerializer, ILogger logger, String serverAddress, String appName, String applicationVersion, IDevice device, ApiEventListener apiEventListener)
{
super(logger, jsonSerializer, serverAddress, appName, device, applicationVersion);
this.httpClient = httpClient;
this.apiEventListener = apiEventListener;
ResetHttpHeaders();
}
public void EnableAutomaticNetworking(ServerInfo info, ConnectionMode initialMode, INetworkConnection networkConnection)
{
this.networkConnection = networkConnection;
this.connectionMode = initialMode;
this.serverInfo = info;
String serverAddress = info.GetAddress(initialMode);
setServerAddress(serverAddress);
}
public void ensureWebSocket(){
if (apiWebSocket == null){
Logger.Debug("Creating ApiWebSocket");
apiWebSocket = new ApiWebSocket(getJsonSerializer(), Logger, apiEventListener, this);
}
apiWebSocket.EnsureWebSocket();
}
void OnRemoteLoggedOut(HttpException httpError) {
RemoteLogoutReason reason = RemoteLogoutReason.GeneralAccesError;
if (httpError.getHeaders() != null ){
String errorCode = httpError.getHeaders().get("X-Application-Error-Code");
if (StringHelper.EqualsIgnoreCase(errorCode, "ParentalControl")) {
reason = RemoteLogoutReason.ParentalControlRestriction;
}
}
apiEventListener.onRemoteLoggedOut(this, reason);
}
private void SendRequest(HttpRequest request, final boolean fireGlobalEvents, final Response<String> response)
{
httpClient.Send(request, new ApiClientRequestListener(this, fireGlobalEvents, response));
}
private void Send(String url, String method, final Response<String> response)
{
HttpRequest request = new HttpRequest();
request.setUrl(url);
request.setMethod(method);
request.setRequestHeaders(this.HttpHeaders);
SendRequest(request, true, response);
}
private void Send(String url, String method, String requestContent, String requestContentType, final Response<String> response)
{
HttpRequest request = new HttpRequest();
request.setUrl(url);
request.setMethod(method);
request.setRequestHeaders(this.HttpHeaders);
request.setRequestContent(requestContent);
request.setRequestContentType(requestContentType);
SendRequest(request, true, response);
}
private void Send(String url,
String method,
QueryStringDictionary postData,
boolean fireGlobalEvents,
final Response<String> response)
{
HttpRequest request = new HttpRequest();
request.setUrl(url);
request.setMethod(method);
request.setRequestHeaders(this.HttpHeaders);
request.setPostData(postData);
SendRequest(request, fireGlobalEvents, response);
}
public void getResponseStream(String address, Response<ResponseStreamInfo> response){
getResponseStreamInternal(address, response);
}
protected void getResponseStreamInternal(String address, Response<ResponseStreamInfo> response){
Logger.Debug("Getting response stream from " + address);
HttpURLConnection conn = null;
try
{
URL url = new URL(address);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("GET");
conn.setRequestProperty("Connection", "Keep-Alive");
for (String key: this.HttpHeaders.keySet()){
conn.setRequestProperty(key, this.HttpHeaders.get(key));
}
conn.connect();
ResponseStreamInfo info = new ResponseStreamInfo();
info.ContentLength = conn.getContentLength();
InputStream inputStream = conn.getInputStream();
info.Stream = inputStream;
response.onResponse(info);
}
catch (Exception ex)
{
response.onError(ex);
}
}
public void GetItemAsync(String id, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/Items/" + id);
GetItemFromUrl(url, response);
}
public void GetIntrosAsync(String itemId, String userId, final Response<ItemsResult> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Intros");
GetItemsFromUrl(url, response);
}
public void GetItemCountsAsync(ItemCountsQuery query, final Response<ItemCounts> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNull("IsFavorite", query.getIsFavorite());
String url = GetApiUrl("Items/Counts", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemCounts>(response, jsonSerializer, ItemCounts.class));
}
public void GetRegistrationInfo(String feature, final Response<RegistrationInfo> response)
{
if (feature == null)
{
throw new IllegalArgumentException("feature");
}
String url = GetApiUrl("Registrations/" + feature);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<>(response, jsonSerializer, RegistrationInfo.class));
}
public void GetRootFolderAsync(String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/Items/Root");
GetItemFromUrl(url, response);
}
public void GetUsersAsync(UserQuery query, final Response<UserDto[]> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNull("IsDisabled", query.getIsDisabled());
queryString.AddIfNotNull("IsHidden", query.getIsHidden());
String url = GetApiUrl("Users", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<UserDto[]>(response, jsonSerializer, new UserDto[]{}.getClass()));
}
public void GetPublicUsersAsync(final Response<UserDto[]> response)
{
String url = GetApiUrl("Users/Public");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<UserDto[]>(response, jsonSerializer, new UserDto[]{}.getClass()));
}
public void GetClientSessionsAsync(SessionQuery query, final Response<SessionInfoDto[]> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("ControllableByUserId", query.getControllableByUserId());
String url = GetApiUrl("Sessions", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SessionInfoDto[]>(response, jsonSerializer, new SessionInfoDto[]{}.getClass()));
}
private void GetItemsFromUrl(String url, final Response<ItemsResult> response) {
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
private void GetItemFromUrl(String url, final Response<BaseItemDto> response) {
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto>(response, jsonSerializer, BaseItemDto.class));
}
public void GetItemsAsync(ItemQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
String url = GetItemListUrl(query);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the next up async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">query</exception>
public void GetNextUpEpisodesAsync(NextUpQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
String url = GetNextUpUrl(query);
GetItemsFromUrl(url, response);
}
public void GetUpcomingEpisodesAsync(UpcomingEpisodesQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNull("Fields", query.getFields());
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("StartIndex", query.getStartIndex());
dict.Add("UserId", query.getUserId());
dict.AddIfNotNull("EnableImages", query.getEnableImages());
dict.AddIfNotNull("ImageTypeLimit", query.getImageTypeLimit());
dict.AddIfNotNull("EnableImageTypes", query.getEnableImageTypes());
String url = GetApiUrl("Shows/Upcoming", dict);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the similar movies async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">query</exception>
public void GetSimilarItems(SimilarItemsQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
String url = GetSimilarItemListUrl(query, "Items");
GetItemsFromUrl(url, response);
}
public void GetEpisodesAsync(EpisodeQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNull("Season", query.getSeasonNumber());
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNullOrEmpty("SeasonId", query.getSeasonId());
dict.AddIfNotNull("Fields", query.getFields());
dict.AddIfNotNullOrEmpty("AdjacentTo", query.getAdjacentTo());
dict.AddIfNotNull("IsMissing", query.getIsMissing());
dict.AddIfNotNull("IsVirtualUnaired", query.getIsVirtualUnaired());
String url = GetApiUrl("Shows/" + query.getSeriesId() + "/Episodes", dict);
GetItemsFromUrl(url, response);
}
public void GetSeasonsAsync(SeasonQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNull("Fields", query.getFields());
dict.AddIfNotNull("IsMissing", query.getIsMissing());
dict.AddIfNotNull("IsVirtualUnaired", query.getIsVirtualUnaired());
dict.AddIfNotNull("IsSpecialSeason", query.getIsSpecialSeason());
String url = GetApiUrl("Shows/" + query.getSeriesId() + "/Seasons", dict);
GetItemsFromUrl(url, response);
}
public void closeLiveStream(String liveStreamId, EmptyResponse response){
// LiveStreams/Close
// LiveStreamId
QueryStringDictionary dict = new QueryStringDictionary ();
dict.Add("LiveStreamId", liveStreamId);
String url = GetApiUrl("LiveStreams/Close", dict);
PostAsync(url, new QueryStringDictionary (), response);
}
/// <summary>
/// Gets the people async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetPeopleAsync(PersonsQuery query, final Response<ItemsResult> response)
{
String url = GetItemByNameListUrl("Persons", query);
if (query.getPersonTypes() != null && query.getPersonTypes().length > 0)
{
url += "&PersonTypes=" + tangible.DotNetToJavaStringHelper.join(",", query.getPersonTypes());
}
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the instant mix from album async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">query</exception>
public void GetInstantMixFromItem(SimilarItemsQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
String url = GetInstantMixUrl(query, "Items");
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the genres async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
public void GetGenresAsync(ItemsByNameQuery query, final Response<ItemsResult> response)
{
String url = GetItemByNameListUrl("Genres", query);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the studios async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
public void GetStudiosAsync(ItemsByNameQuery query, final Response<ItemsResult> response)
{
String url = GetItemByNameListUrl("Studios", query);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the artists.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetArtistsAsync(ArtistsQuery query, final Response<ItemsResult> response)
{
String url = GetItemByNameListUrl("Artists", query);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets the artists.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetAlbumArtistsAsync(ArtistsQuery query, final Response<ItemsResult> response)
{
String url = GetItemByNameListUrl("Artists/AlbumArtists", query);
GetItemsFromUrl(url, response);
}
/// <summary>
/// Gets a studio
/// </summary>
/// <param name="name">The name.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{BaseItemDto}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetStudioAsync(String name, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
String url = GetApiUrl("Studios/" + GetSlugName(name), dict);
GetItemFromUrl(url, response);
}
/// <summary>
/// Gets a genre
/// </summary>
/// <param name="name">The name.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{BaseItemDto}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetGenreAsync(String name, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
String url = GetApiUrl("Genres/" + GetSlugName(name), dict);
GetItemFromUrl(url, response);
}
public void GetMusicGenreAsync(String name, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
String url = GetApiUrl("MusicGenres/" + GetSlugName(name), dict);
GetItemFromUrl(url, response);
}
public void GetGameGenreAsync(String name, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
String url = GetApiUrl("GameGenres/" + GetSlugName(name), dict);
GetItemFromUrl(url, response);
}
/// <summary>
/// Gets the music genre async.
/// </summary>
/// <param name="name">The name.</param>
/// <returns>Task{BaseItemDto}.</returns>
/// <exception cref="System.IllegalArgumentException">name</exception>
public void GetMusicGenreAsync(String name, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
String url = GetApiUrl("MusicGenres/" + GetSlugName(name));
GetItemFromUrl(url, response);
}
/// <summary>
/// Gets the artist async.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{BaseItemDto}.</returns>
/// <exception cref="System.IllegalArgumentException">name</exception>
public void GetArtistAsync(String name, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(name))
{
throw new IllegalArgumentException("name");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
String url = GetApiUrl("Artists/" + GetSlugName(name), dict);
GetItemFromUrl(url, response);
}
/// <summary>
/// Restarts the server async.
/// </summary>
/// <returns>Task.</returns>
public void RestartServerAsync(final EmptyResponse response)
{
String url = GetApiUrl("System/Restart");
PostAsync(url, response);
}
/// <summary>
/// Gets the system status async.
/// </summary>
/// <returns>Task{SystemInfo}.</returns>
public void GetSystemInfoAsync(final Response<SystemInfo> response)
{
String url = GetApiUrl("System/Info");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SystemInfo>(response, jsonSerializer, SystemInfo.class));
}
public void GetEndPointInfo(final Response<EndPointInfo> response)
{
String url = GetApiUrl("System/Endpoint");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<EndPointInfo>(response, jsonSerializer, EndPointInfo.class));
}
/// <summary>
/// get public system information as an asynchronous operation.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task<PublicSystemInfo>.</returns>
public void GetPublicSystemInfoAsync(final Response<PublicSystemInfo> response)
{
String url = GetApiUrl("System/Info/Public");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<PublicSystemInfo>(response, jsonSerializer, PublicSystemInfo.class));
}
/// <summary>
/// Gets the current server configuration
/// </summary>
/// <returns>Task{ServerConfiguration}.</returns>
public void GetServerConfigurationAsync(final Response<ServerConfiguration> response)
{
String url = GetApiUrl("System/Configuration");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ServerConfiguration>(response, jsonSerializer, ServerConfiguration.class));
}
/// <summary>
/// Gets a user by id
/// </summary>
/// <param name="id">The id.</param>
/// <returns>Task{UserDto}.</returns>
/// <exception cref="System.IllegalArgumentException">id</exception>
public void GetUserAsync(String id, final Response<UserDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
String url = GetApiUrl("Users/" + id);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<UserDto>(response, jsonSerializer, UserDto.class));
}
/// <summary>
/// Gets the parental ratings async.
/// </summary>
/// <returns>Task{List{ParentalRating}}.</returns>
public void GetParentalRatingsAsync(final Response<ParentalRating[]> response)
{
String url = GetApiUrl("Localization/ParentalRatings");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ParentalRating[]>(response, jsonSerializer, new ParentalRating[]{}.getClass()));
}
/// <summary>
/// Gets local trailers for an item
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="itemId">The item id.</param>
/// <returns>Task{ItemsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">query</exception>
public void GetLocalTrailersAsync(String userId, String itemId, final Response<BaseItemDto[]> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
String url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/LocalTrailers");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto[]>(response, jsonSerializer, new BaseItemDto[]{}.getClass()));
}
/// <summary>
/// Gets special features for an item
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="itemId">The item id.</param>
/// <returns>Task{BaseItemDto[]}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void GetSpecialFeaturesAsync(String userId, String itemId, final Response<BaseItemDto[]> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
String url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/SpecialFeatures");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto[]>(response, jsonSerializer, new BaseItemDto[]{}.getClass()));
}
/// <summary>
/// Gets the cultures async.
/// </summary>
/// <returns>Task{CultureDto[]}.</returns>
public void GetCulturesAsync(final Response<CultureDto[]> response)
{
String url = GetApiUrl("Localization/Cultures");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<CultureDto[]>(response, jsonSerializer, new CultureDto[]{}.getClass()));
}
/// <summary>
/// Gets the countries async.
/// </summary>
/// <returns>Task{CountryInfo[]}.</returns>
public void GetCountriesAsync(final Response<CountryInfo[]> response)
{
String url = GetApiUrl("Localization/Countries");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<CountryInfo[]>(response, jsonSerializer, new CountryInfo[]{}.getClass()));
}
/// <summary>
/// Gets the game system summaries async.
/// </summary>
/// <returns>Task{List{GameSystemSummary}}.</returns>
public void GetGameSystemSummariesAsync(final Response<GameSystemSummary[]> response)
{
String url = GetApiUrl("Games/SystemSummaries");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<GameSystemSummary[]>(response, jsonSerializer, new GameSystemSummary[]{}.getClass()));
}
public void MarkPlayedAsync(String itemId, String userId, Date datePlayed, final Response<UserItemDataDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId)) {
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId)) {
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary();
if (datePlayed != null)
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
dict.Add("DatePlayed", formatter.format(datePlayed));
}
String url = GetApiUrl("Users/" + userId + "/PlayedItems/" + itemId, dict);
url = AddDataFormat(url);
Send(url, "POST", dict, true, new SerializedResponse<UserItemDataDto>(response, jsonSerializer, UserItemDataDto.class));
}
/// <summary>
/// Marks the unplayed async.
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.IllegalArgumentException">
/// itemId
/// or
/// userId
/// </exception>
public void MarkUnplayedAsync(String itemId, String userId, final Response<UserItemDataDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId)) {
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId)) {
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/PlayedItems/" + itemId);
url = AddDataFormat(url);
Send(url, "DELETE", new SerializedResponse<UserItemDataDto>(response, jsonSerializer, new UserItemDataDto().getClass()));
}
/// <summary>
/// Updates the favorite status async.
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <param name="isFavorite">if set to <c>true</c> [is favorite].</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void UpdateFavoriteStatusAsync(String itemId, String userId, Boolean isFavorite, final Response<UserItemDataDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId)) {
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId)) {
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/FavoriteItems/" + itemId);
url = AddDataFormat(url);
Send(url, isFavorite ? "POST" : "DELETE", new SerializedResponse<UserItemDataDto>(response, jsonSerializer, new UserItemDataDto().getClass()));
}
/// <summary>
/// Reports to the server that the user has begun playing an item
/// </summary>
/// <param name="info">The information.</param>
/// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void ReportPlaybackStartAsync(PlaybackStartInfo info, final EmptyResponse response)
{
if (info == null)
{
throw new IllegalArgumentException("info");
}
String ticks = info.getPositionTicks() == null ? "null" : info.getPositionTicks().toString();
Logger.Info("ReportPlaybackStart: Item %s, Ticks: %s", info.getItem().getName(), ticks);
String url = GetApiUrl("Sessions/Playing");
PostAsync(url, info, response);
}
/// <summary>
/// Reports playback progress to the server
/// </summary>
/// <param name="info">The information.</param>
/// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void ReportPlaybackProgressAsync(PlaybackProgressInfo info, final EmptyResponse response)
{
if (info == null)
{
throw new IllegalArgumentException("info");
}
if (apiWebSocket != null && apiWebSocket.IsWebSocketOpen()){
//apiWebSocket.SendWebSocketMessage("ReportPlaybackProgress", info, response);
//return;
}
String url = GetApiUrl("Sessions/Playing/Progress");
PostAsync(url, info, response);
}
/// <summary>
/// Reports to the server that the user has stopped playing an item
/// </summary>
/// <param name="info">The information.</param>
/// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void ReportPlaybackStoppedAsync(PlaybackStopInfo info, final EmptyResponse response)
{
if (info == null)
{
throw new IllegalArgumentException("info");
}
String ticks = info.getPositionTicks() == null ? "null" : info.getPositionTicks().toString();
Logger.Info("ReportPlaybackStopped: Item %s, Ticks: %s", info.getItem().getName(), ticks);
String url = GetApiUrl("Sessions/Playing/Stopped");
PostAsync(url, info, response);
}
/// <summary>
/// Instructs another client to browse to a library item.
/// </summary>
/// <param name="sessionId">The session id.</param>
/// <param name="itemId">The id of the item to browse to.</param>
/// <param name="itemName">The name of the item to browse to.</param>
/// <param name="itemType">The type of the item to browse to.</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">sessionId
/// or
/// itemId
/// or
/// itemName
/// or
/// itemType</exception>
public void SendBrowseCommandAsync(String sessionId, String itemId, String itemName, String itemType, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("DisplayContent");
cmd.getArguments().put("ItemType", itemType);
cmd.getArguments().put("ItemId", itemId);
cmd.getArguments().put("ItemName", itemName);
SendCommandAsync(sessionId, cmd, response);
}
/// <summary>
/// Sends the play command async.
/// </summary>
/// <param name="sessionId">The session id.</param>
/// <param name="request">The request.</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">sessionId
/// or
/// request</exception>
public void SendPlayCommandAsync(String sessionId, PlayRequest request, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(sessionId))
{
throw new IllegalArgumentException("sessionId");
}
if (request == null)
{
throw new IllegalArgumentException("request");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("ItemIds", request.getItemIds());
dict.AddIfNotNull("StartPositionTicks", request.getStartPositionTicks());
dict.Add("PlayCommand", request.getPlayCommand());
String url = GetApiUrl("Sessions/" + sessionId + "/Playing", dict);
PostAsync(url, response);
}
public void SendMessageCommandAsync(String sessionId, MessageCommand command, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("DisplayMessage");
cmd.getArguments().put("Header", command.getHeader());
cmd.getArguments().put("Text", command.getText());
if (command.getTimeoutMs() != null)
{
cmd.getArguments().put("Timeout", StringHelper.ToStringCultureInvariant(command.getTimeoutMs()));
}
SendCommandAsync(sessionId, cmd, response);
}
/// <summary>
/// Sends the system command async.
/// </summary>
/// <param name="sessionId">The session id.</param>
/// <param name="command">The command.</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">sessionId</exception>
public void SendCommandAsync(String sessionId, GeneralCommand command, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(sessionId))
{
throw new IllegalArgumentException("sessionId");
}
String url = GetApiUrl("Sessions/" + sessionId + "/Command");
PostAsync(url, command, response);
}
private void DeleteAsync(String url, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(url))
{
throw new IllegalArgumentException("url");
}
Response<String> stringResponse = new Response<String>(response);
Send(url, "DELETE", stringResponse);
}
private void PostAsync(String url, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(url))
{
throw new IllegalArgumentException("url");
}
PostAsync(url, new QueryStringDictionary(), response);
}
private void PostAsync(String url,
QueryStringDictionary postBody,
boolean fireGlobalEvents,
final Response<String> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(url))
{
throw new IllegalArgumentException("url");
}
Send(url, "POST", postBody, fireGlobalEvents, response);
}
private void PostAsync(String url, Object obj, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(url))
{
throw new IllegalArgumentException("url");
}
Response<String> jsonResponse = new Response<String>(response);
String json = getJsonSerializer().SerializeToString(obj);
Send(url, "POST", json, "application/json", jsonResponse);
}
/// <summary>
/// Sends the playstate command async.
/// </summary>
/// <param name="sessionId">The session id.</param>
/// <param name="request">The request.</param>
/// <returns>Task.</returns>
public void SendPlaystateCommandAsync(String sessionId, PlaystateRequest request, final EmptyResponse response)
{
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNull("SeekPositionTicks", request.getSeekPositionTicks());
String url = GetApiUrl("Sessions/" + sessionId + "/Playing/" + request.getCommand(), dict);
PostAsync(url, response);
}
/// <summary>
/// Clears a user's rating for an item
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void ClearUserItemRatingAsync(String itemId, String userId, final Response<UserItemDataDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Rating");
url = AddDataFormat(url);
Send(url, "DELETE", new SerializedResponse<UserItemDataDto>(response, jsonSerializer, new UserItemDataDto().getClass()));
}
/// <summary>
/// Updates a user's rating for an item, based on likes or dislikes
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <param name="likes">if set to <c>true</c> [likes].</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">itemId</exception>
public void UpdateUserItemRatingAsync(String itemId, String userId, Boolean likes, final Response<UserItemDataDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.Add("likes", likes);
String url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Rating", dict);
url = AddDataFormat(url);
Send(url, "POST", new SerializedResponse<UserItemDataDto>(response, jsonSerializer, new UserItemDataDto().getClass()));
}
/// <summary>
/// Authenticates a user and returns the result
/// </summary>
/// <param name="username">The username.</param>
/// <param name="sha1Hash">The sha1 hash.</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void AuthenticateUserAsync(String username, String password, final Response<AuthenticationResult> response)
throws NoSuchAlgorithmException, UnsupportedEncodingException
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(username))
{
throw new IllegalArgumentException("username");
}
String url = GetApiUrl("Users/AuthenticateByName");
QueryStringDictionary dict = new QueryStringDictionary ();
dict.Add("username", username);
dict.Add("password", Sha1.getHash(password));
dict.Add("passwordMd5", Md5.getHash(ConnectPassword.PerformPreHashFilter(password)));
url = AddDataFormat(url);
Response<String> jsonResponse = new Response<String>(response){
@Override
public void onResponse(String jsonResponse) {
AuthenticationResult obj = DeserializeFromString(jsonResponse, AuthenticationResult.class);
SetAuthenticationInfo(obj.getAccessToken(), obj.getUser().getId());
getAuthenticatedObservable().notifyObservers(obj);
response.onResponse(obj);
}
};
PostAsync(url, dict, false, jsonResponse);
}
/// <summary>
/// Updates the server configuration async.
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <returns>Task.</returns>
/// <exception cref="System.IllegalArgumentException">configuration</exception>
public void UpdateServerConfigurationAsync(ServerConfiguration configuration, final EmptyResponse response)
{
if (configuration == null)
{
throw new IllegalArgumentException("configuration");
}
String url = GetApiUrl("System/Configuration");
PostAsync(url, configuration, response);
}
/// <summary>
/// Registers the sale of an Emby feature through an app store.
/// </summary>
/// <param name="id">The id.</param>
/// <param name="triggers">The triggers.</param>
/// <returns>Task{RequestResult}.</returns>
/// <exception cref="System.IllegalArgumentException">id</exception>
public void RegisterAppstoreSaleAsync(AppstoreRegRequest request, final EmptyResponse response)
{
if (request == null)
{
throw new IllegalArgumentException("request");
}
String url = GetApiUrl("Appstore/register");
AppstoreRegWrapper wrapper = new AppstoreRegWrapper();
wrapper.Parameters = jsonSerializer.SerializeToString(request);
PostAsync(url, wrapper, response);
}
/// <summary>
/// Gets the display preferences.
/// </summary>
/// <param name="id">The id.</param>
/// <param name="userId">The user id.</param>
/// <param name="client">The client.</param>
/// <returns>Task{BaseItemDto}.</returns>
public void GetDisplayPreferencesAsync(String id, String userId, String client, final Response<DisplayPreferences> response)
{
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
dict.Add("client", client);
String url = GetApiUrl("DisplayPreferences/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<DisplayPreferences>(response, jsonSerializer, DisplayPreferences.class));
}
/// <summary>
/// Updates display preferences for a user
/// </summary>
/// <param name="displayPreferences">The display preferences.</param>
/// <returns>Task{DisplayPreferences}.</returns>
/// <exception cref="System.IllegalArgumentException">userId</exception>
public void UpdateDisplayPreferencesAsync(DisplayPreferences displayPreferences, String userId, String client, final EmptyResponse response)
{
if (displayPreferences == null)
{
throw new IllegalArgumentException("displayPreferences");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("userId", userId);
dict.Add("client", client);
String url = GetApiUrl("DisplayPreferences/" + displayPreferences.getId(), dict);
PostAsync(url, displayPreferences, response);
}
public void MarkNotificationsRead(String userId, String[] notificationIdList, Boolean isRead, final EmptyResponse response)
{
String url = "Notifications/" + userId;
url += isRead ? "/Read" : "/Unread";
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("Ids", notificationIdList);
url = GetApiUrl(url, dict);
PostAsync(url, response);
}
public void GetAllThemeMediaAsync(String userId, String itemId, Boolean inheritFromParent, final Response<AllThemeMediaResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("InheritFromParent", inheritFromParent);
queryString.AddIfNotNullOrEmpty("UserId", userId);
String url = GetApiUrl("Items/" + itemId + "/ThemeMedia", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<AllThemeMediaResult>(response, jsonSerializer, AllThemeMediaResult.class));
}
public void GetSearchHintsAsync(SearchQuery query, final Response<SearchHintResult> response)
{
if (query == null || tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getSearchTerm()))
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("SearchTerm", query.getSearchTerm());
queryString.AddIfNotNullOrEmpty("UserId", query.getUserId());
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.Add("IncludeArtists", query.getIncludeArtists());
queryString.Add("IncludeGenres", query.getIncludeGenres());
queryString.Add("IncludeMedia", query.getIncludeMedia());
queryString.Add("IncludePeople", query.getIncludePeople());
queryString.Add("IncludeStudios", query.getIncludeStudios());
queryString.Add("IncludeItemTypes", query.getIncludeItemTypes());
String url = GetApiUrl("Search/Hints", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SearchHintResult>(response, jsonSerializer, SearchHintResult.class));
}
public void GetThemeSongsAsync(String userId, String itemId, Boolean inheritFromParent, final Response<ThemeMediaResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("InheritFromParent", inheritFromParent);
queryString.AddIfNotNullOrEmpty("UserId", userId);
String url = GetApiUrl("Items/" + itemId + "/ThemeSongs", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ThemeMediaResult>(response, jsonSerializer, ThemeMediaResult.class));
}
public void GetThemeVideosAsync(String userId, String itemId, Boolean inheritFromParent, final Response<ThemeMediaResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("InheritFromParent", inheritFromParent);
queryString.AddIfNotNullOrEmpty("UserId", userId);
String url = GetApiUrl("Items/" + itemId + "/ThemeVideos", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ThemeMediaResult>(response, jsonSerializer, ThemeMediaResult.class));
}
/// <summary>
/// Gets the critic reviews.
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="startIndex">The start index.</param>
/// <param name="limit">The limit.</param>
/// <returns>Task{ItemReviewsResult}.</returns>
/// <exception cref="System.IllegalArgumentException">
/// id
/// or
/// userId
/// </exception>
public void GetCriticReviews(String itemId, Integer startIndex, Integer limit, final Response<ItemReviewsResult> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(itemId))
{
throw new IllegalArgumentException("itemId");
}
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNull("startIndex", startIndex);
queryString.AddIfNotNull("limit", limit);
String url = GetApiUrl("Items/" + itemId + "/CriticReviews", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemReviewsResult>(response, jsonSerializer, ItemReviewsResult.class));
}
/// <summary>
/// Gets the index of the game player.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{List{ItemIndex}}.</returns>
public void GetGamePlayerIndex(String userId, final Response<ItemIndex[]> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", userId);
String url = GetApiUrl("Games/PlayerIndex", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemIndex[]>(response, jsonSerializer, new ItemIndex[]{}.getClass()));
}
/// <summary>
/// Gets the index of the year.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="includeItemTypes">The include item types.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{List{ItemIndex}}.</returns>
public void GetYearIndex(String userId, String[] includeItemTypes, final Response<ItemIndex[]> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", userId);
queryString.AddIfNotNull("IncludeItemTypes", includeItemTypes);
String url = GetApiUrl("Items/YearIndex", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemIndex[]>(response, jsonSerializer, new ItemIndex[]{}.getClass()));
}
public void ReportCapabilities(ClientCapabilities capabilities, final EmptyResponse response)
{
if (capabilities == null)
{
throw new IllegalArgumentException("capabilities");
}
String url = GetApiUrl("Sessions/Capabilities/Full");
PostAsync(url, capabilities, response);
}
public void GetLiveTvInfoAsync(final Response<LiveTvInfo> response)
{
String url = GetApiUrl("LiveTv/Info");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<LiveTvInfo>(response, jsonSerializer, LiveTvInfo.class));
}
public void GetLiveTvRecordingGroupsAsync(RecordingGroupQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
String url = GetApiUrl("LiveTv/Recordings/Groups", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
public void GetLiveTvRecordingsAsync(RecordingQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNullOrEmpty("ChannelId", query.getChannelId());
dict.AddIfNotNullOrEmpty("GroupId", query.getGroupId());
dict.AddIfNotNullOrEmpty("Id", query.getUserId());
dict.AddIfNotNullOrEmpty("SeriesTimerId", query.getSeriesTimerId());
dict.AddIfNotNull("IsInProgress", query.getIsInProgress());
dict.AddIfNotNull("StartIndex", query.getStartIndex());
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("IsSeries", query.getIsSeries());
dict.AddIfNotNull("IsKids", query.getIsKids());
dict.AddIfNotNull("IsMovie", query.getIsMovie());
dict.AddIfNotNull("IsSports", query.getIsSports());
dict.AddIfNotNull("EnableImages", query.getEnableImages());
dict.AddIfNotNull("ImageTypeLimit", query.getImageTypeLimit());
dict.AddIfNotNull("EnableImageTypes", query.getEnableImageTypes());
dict.AddIfNotNull("Fields", query.getFields());
if (!query.getEnableTotalRecordCount())
{
dict.Add("EnableTotalRecordCount", "false");
}
String url = GetApiUrl("LiveTv/Recordings", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
public void GetLiveTvChannelsAsync(LiveTvChannelQuery query, final Response<ChannelInfoDtoResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNull("StartIndex", query.getStartIndex());
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("IsFavorite", query.getIsFavorite());
dict.AddIfNotNull("IsLiked", query.getIsLiked());
dict.AddIfNotNull("IsDisliked", query.getIsDisliked());
dict.AddIfNotNull("EnableFavoriteSorting", query.getEnableFavoriteSorting());
dict.AddIfNotNull("SortBy",query.getSortBy());
dict.AddIfNotNull("SortOrder",query.getSortOrder());
if (query.getChannelType() != null)
{
dict.Add("ChannelType", query.getChannelType());
}
String url = GetApiUrl("LiveTv/Channels", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ChannelInfoDtoResult>(response, jsonSerializer, ChannelInfoDtoResult.class));
}
public void CancelLiveTvSeriesTimerAsync(String id, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
String url = GetApiUrl("LiveTv/SeriesTimers/" + id, dict);
DeleteAsync(url, response);
}
public void CancelLiveTvTimerAsync(String id, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
String url = GetApiUrl("LiveTv/Timers/" + id, dict);
DeleteAsync(url, response);
}
public void GetLiveTvChannelAsync(String id, String userId, final Response<ChannelInfoDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("userId", userId);
String url = GetApiUrl("LiveTv/Channels/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ChannelInfoDto>(response, jsonSerializer, ChannelInfoDto.class));
}
public void GetLiveTvRecordingAsync(String id, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("userId", userId);
String url = GetApiUrl("LiveTv/Recordings/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto>(response, jsonSerializer, BaseItemDto.class));
}
public void GetLiveTvRecordingGroupAsync(String id, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("userId", userId);
String url = GetApiUrl("LiveTv/Recordings/Groups/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto>(response, jsonSerializer, BaseItemDto.class));
}
public void GetLiveTvSeriesTimerAsync(String id, final Response<SeriesTimerInfoDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
String url = GetApiUrl("LiveTv/SeriesTimers/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SeriesTimerInfoDto>(response, jsonSerializer, SeriesTimerInfoDto.class));
}
public void GetLiveTvSeriesTimersAsync(SeriesTimerQuery query, final Response<SeriesTimerInfoDtoResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("SortBy", query.getSortBy());
dict.Add("SortOrder", query.getSortOrder());
String url = GetApiUrl("LiveTv/SeriesTimers", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SeriesTimerInfoDtoResult>(response, jsonSerializer, SeriesTimerInfoDtoResult.class));
}
public void GetLiveTvTimerAsync(String id, final Response<TimerInfoDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
String url = GetApiUrl("LiveTv/Timers/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<TimerInfoDto>(response, jsonSerializer, TimerInfoDto.class));
}
public void GetLiveTvTimersAsync(TimerQuery query, final Response<TimerInfoDtoResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("ChannelId", query.getChannelId());
dict.AddIfNotNullOrEmpty("SeriesTimerId", query.getSeriesTimerId());
dict.AddIfNotNull("IsScheduled", query.getIsScheduled());
String url = GetApiUrl("LiveTv/Timers", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<TimerInfoDtoResult>(response, jsonSerializer, new TimerInfoDtoResult().getClass()));
}
public void GetLiveTvProgramsAsync(ProgramQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
String isoDateFormat = "o";
if (query.getMaxEndDate() != null)
{
dict.Add("MaxEndDate", getIsoString(query.getMaxEndDate()));
}
if (query.getMaxStartDate() != null)
{
dict.Add("MaxStartDate", getIsoString(query.getMaxStartDate()));
}
if (query.getMinEndDate() != null)
{
dict.Add("MinEndDate", getIsoString(query.getMinEndDate()));
}
if (query.getMinStartDate() != null)
{
dict.Add("MinStartDate", getIsoString(query.getMinStartDate()));
}
if (!query.getEnableTotalRecordCount())
{
dict.Add("EnableTotalRecordCount", "false");
}
dict.AddIfNotNull("EnableImages", query.getEnableImages());
dict.AddIfNotNull("ImageTypeLimit", query.getImageTypeLimit());
dict.AddIfNotNull("EnableImageTypes", query.getEnableImageTypes());
dict.AddIfNotNull("Fields", query.getFields());
dict.AddIfNotNull("SortBy", query.getSortBy());
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
if (query.getChannelIds() != null)
{
dict.Add("ChannelIds", tangible.DotNetToJavaStringHelper.join(",", query.getChannelIds()));
}
// TODO: This endpoint supports POST if the query String is too long
String url = GetApiUrl("LiveTv/Programs", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
public void GetRecommendedLiveTvProgramsAsync(RecommendedProgramQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary dict = new QueryStringDictionary ();
if (!query.getEnableTotalRecordCount())
{
dict.Add("EnableTotalRecordCount", "false");
}
dict.AddIfNotNull("EnableImages", query.getEnableImages());
dict.AddIfNotNull("ImageTypeLimit", query.getImageTypeLimit());
dict.AddIfNotNull("EnableImageTypes", query.getEnableImageTypes());
dict.AddIfNotNull("Fields", query.getFields());
dict.AddIfNotNullOrEmpty("UserId", query.getUserId());
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("HasAired", query.getHasAired());
dict.AddIfNotNull("IsAiring", query.getIsAiring());
dict.AddIfNotNull("IsMovie", query.getIsMovie());
dict.AddIfNotNull("IsSeries", query.getIsSeries());
dict.AddIfNotNull("IsSports", query.getIsSports());
dict.AddIfNotNull("IsKids", query.getIsKids());
dict.AddIfNotNull("IsNews", query.getIsNews());
if (!query.getEnableTotalRecordCount())
{
dict.Add("EnableTotalRecordCount", "false");
}
String url = GetApiUrl("LiveTv/Programs/Recommended", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
public void CreateLiveTvSeriesTimerAsync(SeriesTimerInfoDto timer, final EmptyResponse response)
{
if (timer == null)
{
throw new IllegalArgumentException("timer");
}
String url = GetApiUrl("LiveTv/SeriesTimers");
PostAsync(url, timer, response);
}
public void CreateLiveTvTimerAsync(BaseTimerInfoDto timer, final EmptyResponse response)
{
if (timer == null)
{
throw new IllegalArgumentException("timer");
}
String url = GetApiUrl("LiveTv/Timers");
PostAsync(url, timer, response);
}
public void GetDefaultLiveTvTimerInfo(String programId, final Response<SeriesTimerInfoDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(programId))
{
throw new IllegalArgumentException("programId");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("programId", programId);
String url = GetApiUrl("LiveTv/Timers/Defaults", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SeriesTimerInfoDto>(response, jsonSerializer, SeriesTimerInfoDto.class));
}
public void GetDefaultLiveTvTimerInfo(final Response<SeriesTimerInfoDto> response)
{
String url = GetApiUrl("LiveTv/Timers/Defaults");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SeriesTimerInfoDto>(response, jsonSerializer, SeriesTimerInfoDto.class));
}
public void GetLiveTvGuideInfo(final Response<GuideInfo> response)
{
String url = GetApiUrl("LiveTv/GuideInfo");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<GuideInfo>(response, jsonSerializer, GuideInfo.class));
}
public void GetLiveTvProgramAsync(String id, String userId, final Response<BaseItemDto> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
QueryStringDictionary dict = new QueryStringDictionary ();
dict.AddIfNotNullOrEmpty("userId", userId);
String url = GetApiUrl("LiveTv/Programs/" + id, dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto>(response, jsonSerializer, BaseItemDto.class));
}
public void UpdateLiveTvSeriesTimerAsync(SeriesTimerInfoDto timer, final EmptyResponse response)
{
if (timer == null)
{
throw new IllegalArgumentException("timer");
}
String url = GetApiUrl("LiveTv/SeriesTimers/" + timer.getId());
PostAsync(url, timer, response);
}
public void UpdateLiveTvTimerAsync(TimerInfoDto timer, final EmptyResponse response)
{
if (timer == null)
{
throw new IllegalArgumentException("timer");
}
String url = GetApiUrl("LiveTv/Timers/" + timer.getId());
PostAsync(url, timer, response);
}
public void SendString(String sessionId, String text, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("SendString");
cmd.getArguments().put("String", text);
SendCommandAsync(sessionId, cmd, response);
}
public void SetAudioStreamIndex(String sessionId, int index, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("SetAudioStreamIndex");
cmd.getArguments().put("Index", StringHelper.ToStringCultureInvariant(index));
SendCommandAsync(sessionId, cmd, response);
}
public void SetSubtitleStreamIndex(String sessionId, Integer index, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("SetSubtitleStreamIndex");
int indexValue = index == null ? -1 : index.intValue();
cmd.getArguments().put("Index", StringHelper.ToStringCultureInvariant(indexValue));
SendCommandAsync(sessionId, cmd, response);
}
public void SetVolume(String sessionId, int volume, final EmptyResponse response)
{
GeneralCommand cmd = new GeneralCommand();
cmd.setName("SetVolume");
cmd.getArguments().put("Volume", StringHelper.ToStringCultureInvariant(volume));
SendCommandAsync(sessionId, cmd, response);
}
public void GetAdditionalParts(String itemId, String userId, final Response<ItemsResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", userId);
String url = GetApiUrl("Videos/" + itemId + "/AdditionalParts", queryString);
GetItemsFromUrl(url, response);
}
public void GetChannelFeatures(String channelId, final Response<ChannelFeatures> response)
{
String url = GetApiUrl("Channels/" + channelId + "/Features");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ChannelFeatures>(response, jsonSerializer, ChannelFeatures.class));
}
public void GetChannelItems(ChannelItemQuery query, final Response<ItemsResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", query.getUserId());
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.AddIfNotNullOrEmpty("FolderId", query.getFolderId());
queryString.AddIfNotNull("Fields", query.getFields());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.AddIfNotNull("Filters", query.getFilters());
queryString.AddIfNotNull("SortBy", query.getSortBy());
queryString.Add("SortOrder", query.getSortOrder());
String url = GetApiUrl("Channels/" + query.getChannelId() + "/Items", queryString);
GetItemsFromUrl(url, response);
}
public void GetChannels(ChannelQuery query, final Response<ItemsResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", query.getUserId());
queryString.AddIfNotNull("SupportsLatestItems", query.getSupportsLatestItems());
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.AddIfNotNull("IsFavorite", query.getIsFavorite());
String url = GetApiUrl("Channels", queryString);
GetItemsFromUrl(url, response);
}
public void GetCurrentSessionAsync(final Response<SessionInfoDto> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("DeviceId", getDeviceId());
String url = GetApiUrl("Sessions", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SessionInfoDto>(response, jsonSerializer, SessionInfoDto.class));
}
public void StopTranscodingProcesses(String deviceId, String playSessionId, final EmptyResponse response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("DeviceId", getDeviceId());
queryString.AddIfNotNullOrEmpty("PlaySessionId", playSessionId);
String url = GetApiUrl("Videos/ActiveEncodings", queryString);
DeleteAsync(url, response);
}
public void GetLatestChannelItems(AllChannelMediaQuery query, final Response<ItemsResult> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(query.getUserId()))
{
throw new IllegalArgumentException("UserId");
}
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("UserId", query.getUserId());
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
if (query.getFilters() != null) {
queryString.AddIfNotNull("Filters", query.getFilters());
}
if (query.getFields() != null) {
queryString.AddIfNotNull("Fields", query.getFields() != null && query.getFields().size() > 0
? query.getFields().toArray(new ItemFields[query.getFields().size()]) : null);
}
queryString.AddIfNotNull("ChannelIds", query.getChannelIds());
String url = GetApiUrl("Channels/Items/Latest", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ItemsResult>(response, jsonSerializer, ItemsResult.class));
}
public void DeleteItem(String id, final EmptyResponse response)
{
String url = GetApiUrl("Items/" + id);
DeleteAsync(url, response);
}
public void Logout(final EmptyResponse response)
{
String url = GetApiUrl("Sessions/Logout");
PostAsync(url, new EmptyResponse() {
@Override
public void onResponse() {
ClearAuthenticationInfo();
response.onResponse();
}
@Override
public void onError(Exception ex) {
Logger.ErrorException("Error logging out", ex);
ClearAuthenticationInfo();
response.onResponse();
}
});
if (apiWebSocket != null && apiWebSocket.IsWebSocketOpenOrConnecting()){
apiWebSocket.Close();
apiWebSocket = null;
}
}
public void GetUserViews(String userId, final Response<ItemsResult> response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(userId))
{
throw new IllegalArgumentException("userId");
}
String url = GetApiUrl("Users/" + userId + "/Views");
GetItemsFromUrl(url, response);
}
public void GetLatestItems(LatestItemsQuery query, final Response<BaseItemDto[]> response)
{
if (query == null)
{
throw new IllegalArgumentException("query");
}
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNull("GroupItems", query.getGroupItems());
queryString.AddIfNotNull("IncludeItemTypes", query.getIncludeItemTypes());
queryString.AddIfNotNullOrEmpty("ParentId", query.getParentId());
queryString.AddIfNotNull("IsPlayed", query.getIsPlayed());
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.AddIfNotNull("Fields", query.getFields());
String url = GetApiUrl("Users/" + query.getUserId() + "/Items/Latest", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<BaseItemDto[]>(response, jsonSerializer, new BaseItemDto[]{}.getClass()));
}
public void AddToPlaylist(String playlistId, String[] itemIds, String userId, final EmptyResponse response)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(playlistId))
{
throw new IllegalArgumentException("playlistId");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNull("Ids", itemIds);
String url = GetApiUrl("Playlists/"+playlistId+"/Items", dict);
PostAsync(url, response);
}
public void CreatePlaylist(PlaylistCreationRequest request, final Response<PlaylistCreationResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.Add("UserId", request.getUserId());
queryString.Add("Name", request.getName());
queryString.AddIfNotNullOrEmpty("MediaType", request.getMediaType());
queryString.AddIfNotNull("Ids", request.getItemIdList());
String url = GetApiUrl("Playlists/", queryString);
url = AddDataFormat(url);
Send(url, "POST", new SerializedResponse<PlaylistCreationResult>(response, jsonSerializer, PlaylistCreationResult.class));
}
public void GetPlaylistItems(PlaylistItemQuery query, final Response<ItemsResult> response)
{
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNull("StartIndex", query.getStartIndex());
queryString.AddIfNotNull("Limit", query.getLimit());
queryString.Add("UserId", query.getUserId());
queryString.AddIfNotNull("fields", query.getFields());
String url = GetApiUrl("Playlists/" + query.getId() + "/Items", queryString);
GetItemsFromUrl(url, response);
}
public void RemoveFromPlaylist(String playlistId, String[] entryIds, final EmptyResponse response)
{
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNull("EntryIds", entryIds);
String url = GetApiUrl("Playlists/"+playlistId+"/Items", dict);
DeleteAsync(url, response);
}
public void GetFilters(String userId,
String parentId,
String[] mediaTypes,
String[] itemTypes,
Response<QueryFilters> response) {
QueryStringDictionary queryString = new QueryStringDictionary();
queryString.AddIfNotNullOrEmpty("UserId", userId);
queryString.AddIfNotNullOrEmpty("ParentId", parentId);
queryString.AddIfNotNull("IncludeItemTypes", itemTypes);
queryString.AddIfNotNull("MediaTypes", mediaTypes);
String url = GetApiUrl("Items/Filters", queryString);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<QueryFilters>(response, jsonSerializer, QueryFilters.class));
}
public void GetPlaybackInfo(PlaybackInfoRequest request, final Response<PlaybackInfoResponse> response)
{
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("UserId", request.getUserId());
String url = GetApiUrl("Items/" + request.getId() + "/PlaybackInfo", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<PlaybackInfoResponse>(response, jsonSerializer, PlaybackInfoResponse.class));
}
public void GetPlaybackInfoWithPost(PlaybackInfoRequest request, final Response<PlaybackInfoResponse> response)
{
String url = GetApiUrl("Items/" + request.getId() + "/PlaybackInfo");
url = AddDataFormat(url);
Send(url, "POST", jsonSerializer.SerializeToString(request), "application/json", new SerializedResponse<PlaybackInfoResponse>(response, jsonSerializer, PlaybackInfoResponse.class));
}
public void OpenLiveStream(LiveStreamRequest request, final Response<LiveStreamResponse> response)
{
String url = GetApiUrl("LiveStreams/Open");
url = AddDataFormat(url);
String json = getJsonSerializer().SerializeToString(request);
Send(url, "POST", json, "application/json", new SerializedResponse<LiveStreamResponse>(response, jsonSerializer, LiveStreamResponse.class));
}
public void GetDevicesOptions(final Response<DevicesOptions> response)
{
String url = GetApiUrl("System/Configuration/devices");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<DevicesOptions>(response, jsonSerializer, DevicesOptions.class));
}
public void GetContentUploadHistory(final Response<ContentUploadHistory> response)
{
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("DeviceId", getDeviceId());
String url = GetApiUrl("Devices/CameraUploads", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ContentUploadHistory>(response, jsonSerializer, ContentUploadHistory.class));
}
public void UploadFile(FileInputStream fileInputStream,
LocalFileInfo file,
IProgress<Double> progress,
CancellationToken cancellationToken) throws IOException, IllegalArgumentException {
UploadFileInternal(fileInputStream, file, progress, cancellationToken);
}
protected void UploadFileInternal(FileInputStream fileInputStream,
LocalFileInfo file,
IProgress<Double> progress,
CancellationToken cancellationToken) throws IOException ,IllegalArgumentException {
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(getDeviceId()))
{
throw new IllegalArgumentException("ApiClient.deviceId cannot be null or empty");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(file.getId()))
{
throw new IllegalArgumentException("file.getId() cannot be null or empty");
}
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(file.getName()))
{
throw new IllegalArgumentException("file.getName() cannot be null or empty");
}
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("DeviceId", getDeviceId());
dict.Add("Name", file.getName());
dict.Add("Id", file.getId());
dict.AddIfNotNullOrEmpty("Album", file.getAlbum());
HttpURLConnection conn = null;
DataOutputStream dos = null;
URL url = new URL(GetApiUrl("Devices/CameraUploads", dict));
int maxBufferSize = 1 * 1024 * 1024;
try {
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", file.getMimeType());
for (String key: this.HttpHeaders.keySet()){
conn.setRequestProperty(key, this.HttpHeaders.get(key));
}
String parameter = this.HttpHeaders.getAuthorizationParameter();
if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(parameter))
{
String value = this.HttpHeaders.getAuthorizationScheme() + " " + parameter;
conn.setRequestProperty("Authorization", value);
}
dos = new DataOutputStream(conn.getOutputStream());
// createUserAction a buffer of maximum size
int bytesAvailable = fileInputStream.available();
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
// read file and write it into form...
long bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
String serverResponseMessage = conn.getResponseMessage();
int responseCode = conn.getResponseCode();
if(responseCode == 200 || responseCode == 204){
progress.reportComplete();
}
else{
HttpException ex = new HttpException(serverResponseMessage);
ex.setStatusCode(responseCode);
progress.reportError(ex);
}
}
catch (Exception ex) {
Logger.ErrorException("Error uploading file", ex);
progress.reportError(new HttpException(ex.getMessage()));
}
finally {
//close the streams //
fileInputStream.close();
if (dos != null){
dos.flush();
dos.close();
}
}
}
public void UpdateUserConfiguration(String userId, UserConfiguration configuration, EmptyResponse response) {
response.onError(new UnsupportedOperationException());
}
public void CreateSyncJob(SyncJobRequest request, Response<SyncJobCreationResult> response){
if (request == null)
{
throw new IllegalArgumentException("request");
}
String url = GetApiUrl("Sync/Jobs");
url = AddDataFormat(url);
Send(url, "POST", jsonSerializer.SerializeToString(request), "application/json", new SerializedResponse<SyncJobCreationResult>(response, jsonSerializer, SyncJobCreationResult.class));
}
public void CancelSyncJob(SyncJob job, EmptyResponse response) {
if (job == null)
{
throw new IllegalArgumentException("job");
}
String url = GetApiUrl("Sync/Jobs/" + job.getId());
DeleteAsync(url, response);
}
public void UpdateSyncJob(SyncJob job, EmptyResponse response){
if (job == null)
{
throw new IllegalArgumentException("job");
}
String url = GetApiUrl("Sync/Jobs/" + job.getId());
PostAsync(url, job, response);
}
public void GetSyncJobItemFile(String id, Response<ResponseStreamInfo> response){
getResponseStream(getSyncJobItemFileUrl(id), response);
}
public String getSyncJobItemFileUrl(String id)
{
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
return GetApiUrl("Sync/JobItems/" + id + "/File");
}
public void GetSyncJobs(SyncJobQuery query, Response<SyncJobQueryResult> response) {
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("StartIndex", query.getStartIndex());
dict.AddIfNotNull("SyncNewContent", query.getSyncNewContent());
dict.AddIfNotNullOrEmpty("TargetId", query.getTargetId());
dict.AddIfNotNull("Statuses", query.getStatuses(), ",");
String url = GetApiUrl("Sync/Jobs", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SyncJobQueryResult>(response, jsonSerializer, SyncJobQueryResult.class));
}
public void GetSyncJobItems(SyncJobItemQuery query, Response<SyncJobItemQueryResult> response) {
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNullOrEmpty("JobId", query.getJobId());
dict.AddIfNotNull("Limit", query.getLimit());
dict.AddIfNotNull("StartIndex", query.getStartIndex());
dict.AddIfNotNullOrEmpty("TargetId", query.getTargetId());
dict.AddIfNotNull("Statuses", query.getStatuses(), ",");
String url = GetApiUrl("Sync/JobItems", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SyncJobItemQueryResult>(response, jsonSerializer, SyncJobItemQueryResult.class));
}
public void reportSyncJobItemTransferred(String id, EmptyResponse response) {
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
String url = GetApiUrl("Sync/JobItems/" + id + "/Transferred");
PostAsync(url, response);
}
public void GetOfflineUser(String id, Response<UserDto> response) {
if (tangible.DotNetToJavaStringHelper.isNullOrEmpty(id))
{
throw new IllegalArgumentException("id");
}
String url = GetApiUrl("Users/" + id + "/Offline");
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<UserDto>(response, jsonSerializer, UserDto.class));
}
public void ReportOfflineActions(ArrayList<UserAction> actions, EmptyResponse response) {
if (actions == null || actions.size() == 0)
{
throw new IllegalArgumentException("actions");
}
String url = GetApiUrl("Sync/OfflineActions");
PostAsync(url, actions, response);
}
public void SyncData(SyncDataRequest request, final Response<SyncDataResponse> response) {
if (request == null)
{
throw new IllegalArgumentException("request");
}
String url = GetApiUrl("Sync/Data");
url = AddDataFormat(url);
String json = getJsonSerializer().SerializeToString(request);
Send(url, "POST", json, "application/json", new SerializedResponse<SyncDataResponse>(response, jsonSerializer, SyncDataResponse.class));
}
public void getSyncJobItemAdditionalFile(String syncJobItemId, String filename, final Response<ResponseStreamInfo> response){
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNullOrEmpty("Name", filename);
String url = GetApiUrl("Sync/JobItems/" + syncJobItemId + "/AdditionalFiles", dict);
getResponseStream(url, response);
}
public void getReadySyncItems(String targetId, final Response<ReadySyncItemsResult> response) {
QueryStringDictionary dict = new QueryStringDictionary();
dict.AddIfNotNullOrEmpty("TargetId", targetId);
String url = GetApiUrl("Sync/Items/Ready", dict);
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<ReadySyncItemsResult>(response, jsonSerializer, url, Logger, new ReadySyncItemsResult().getClass()));
}
public void detectBitrate(final Response<Long> response) {
// First try a small amount so that we don't hang up their mobile connection
detectBitrate(1000000, new Response<Long>(response) {
@Override
public void onResponse(Long bitrate) {
if (bitrate < 3000000) {
response.onResponse(Math.round(bitrate * .8));
return;
}
// If that produced a fairly high speed, try again with a larger size to get a more accurate result
detectBitrate(3000000, new Response<Long>(response) {
@Override
public void onResponse(Long bitrate) {
response.onResponse(Math.round(bitrate * .8));
}
});
}
});
}
protected void detectBitrate(final long downloadBytes, final Response<Long> response) {
detectBitrateInternal(downloadBytes, response);
}
protected void detectBitrateInternal(final long downloadBytes, final Response<Long> response) {
QueryStringDictionary dict = new QueryStringDictionary();
dict.Add("Size", downloadBytes);
String address = GetApiUrl("Playback/BitrateTest", dict);
HttpURLConnection conn = null;
try
{
URL url = new URL(address);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("GET");
conn.setRequestProperty("Connection", "Keep-Alive");
for (String key: this.HttpHeaders.keySet()){
conn.setRequestProperty(key, this.HttpHeaders.get(key));
}
final long startTime = System.currentTimeMillis();
try (InputStream inputStream = conn.getInputStream()){
byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.
int n;
while ( (n = inputStream.read(byteChunk)) > 0 ) {
}
double time = System.currentTimeMillis() - startTime;
double bitrate = downloadBytes * 8;
bitrate /= time;
bitrate *= 1000;
response.onResponse(Math.round(bitrate));
}
catch (IOException ioException){
response.onError(ioException);
return;
}
}
catch (Exception ex)
{
response.onError(ex);
}
}
public void getSubtitles(String url, Response<SubtitleTrackInfo> response) {
url = AddDataFormat(url);
Send(url, "GET", new SerializedResponse<SubtitleTrackInfo>(response, jsonSerializer, url, Logger, new SubtitleTrackInfo().getClass()));
}
}