aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/ApiClient
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Model/ApiClient')
-rw-r--r--MediaBrowser.Model/ApiClient/ApiClientExtensions.cs6
-rw-r--r--MediaBrowser.Model/ApiClient/ConnectionResult.cs2
-rw-r--r--MediaBrowser.Model/ApiClient/ConnectionState.cs4
-rw-r--r--MediaBrowser.Model/ApiClient/IApiClient.cs137
-rw-r--r--MediaBrowser.Model/ApiClient/IConnectionManager.cs9
-rw-r--r--MediaBrowser.Model/ApiClient/IServerEvents.cs18
-rw-r--r--MediaBrowser.Model/ApiClient/ServerCredentials.cs6
-rw-r--r--MediaBrowser.Model/ApiClient/ServerInfo.cs48
-rw-r--r--MediaBrowser.Model/ApiClient/ServerUserInfo.cs9
9 files changed, 211 insertions, 28 deletions
diff --git a/MediaBrowser.Model/ApiClient/ApiClientExtensions.cs b/MediaBrowser.Model/ApiClient/ApiClientExtensions.cs
index 4b0effa55..b5bf29990 100644
--- a/MediaBrowser.Model/ApiClient/ApiClientExtensions.cs
+++ b/MediaBrowser.Model/ApiClient/ApiClientExtensions.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Sync;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -31,5 +32,10 @@ namespace MediaBrowser.Model.ApiClient
{
return apiClient.GetItemsAsync(query, CancellationToken.None);
}
+
+ public static Task<SyncDialogOptions> GetSyncOptions(this IApiClient apiClient, SyncJob job)
+ {
+ return apiClient.GetSyncOptions(job.RequestedItemIds, job.UserId, job.ParentId, job.Category);
+ }
}
}
diff --git a/MediaBrowser.Model/ApiClient/ConnectionResult.cs b/MediaBrowser.Model/ApiClient/ConnectionResult.cs
index 12a80ee15..32a80d1a3 100644
--- a/MediaBrowser.Model/ApiClient/ConnectionResult.cs
+++ b/MediaBrowser.Model/ApiClient/ConnectionResult.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Model.Connect;
+using MediaBrowser.Model.Dto;
using System.Collections.Generic;
namespace MediaBrowser.Model.ApiClient
@@ -9,6 +10,7 @@ namespace MediaBrowser.Model.ApiClient
public List<ServerInfo> Servers { get; set; }
public IApiClient ApiClient { get; set; }
public ConnectUser ConnectUser { get; set; }
+ public UserDto OfflineUser { get; set; }
public ConnectionResult()
{
diff --git a/MediaBrowser.Model/ApiClient/ConnectionState.cs b/MediaBrowser.Model/ApiClient/ConnectionState.cs
index 5e47d688e..9b753c7bb 100644
--- a/MediaBrowser.Model/ApiClient/ConnectionState.cs
+++ b/MediaBrowser.Model/ApiClient/ConnectionState.cs
@@ -6,6 +6,8 @@ namespace MediaBrowser.Model.ApiClient
ServerSignIn = 2,
SignedIn = 3,
ServerSelection = 4,
- ConnectSignIn = 5
+ ConnectSignIn = 5,
+ OfflineSignIn = 6,
+ OfflineSignedIn = 7
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 9faa8fced..ca49c6c5a 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -41,7 +41,7 @@ namespace MediaBrowser.Model.ApiClient
/// Occurs when [authenticated].
/// </summary>
event EventHandler<GenericEventArgs<AuthenticationResult>> Authenticated;
-
+
/// <summary>
/// Gets the API URL.
/// </summary>
@@ -201,7 +201,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;HttpResponse&gt;.</returns>
Task<HttpResponse> GetResponse(string url, CancellationToken cancellationToken = default(CancellationToken));
-
+
/// <summary>
/// Updates the user configuration.
/// </summary>
@@ -225,7 +225,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="query">The query.</param>
/// <returns>Task&lt;QueryResult&lt;BaseItemDto&gt;&gt;.</returns>
Task<BaseItemDto[]> GetLatestItems(LatestItemsQuery query);
-
+
/// <summary>
/// Gets the intros async.
/// </summary>
@@ -324,7 +324,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task&lt;ItemsResult&gt;.</returns>
Task<ItemsResult> GetUserViews(string userId, CancellationToken cancellationToken = default(CancellationToken));
-
+
/// <summary>
/// Gets the instant mix from song async.
/// </summary>
@@ -558,6 +558,13 @@ namespace MediaBrowser.Model.ApiClient
Task<UserDto> GetUserAsync(string id);
/// <summary>
+ /// Gets the offline user asynchronous.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task&lt;UserDto&gt;.</returns>
+ Task<UserDto> GetOfflineUserAsync(string id);
+
+ /// <summary>
/// Gets the parental ratings async.
/// </summary>
/// <returns>Task{List{ParentalRating}}.</returns>
@@ -754,7 +761,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="password">The password.</param>
/// <returns>Task.</returns>
/// <exception cref="ArgumentNullException">userId</exception>
- Task<AuthenticationResult> AuthenticateUserAsync(string username,
+ Task<AuthenticationResult> AuthenticateUserAsync(string username,
string password);
/// <summary>
@@ -867,7 +874,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="accessToken">The access token.</param>
/// <param name="userId">The user identifier.</param>
void SetAuthenticationInfo(string accessToken, string userId);
-
+
/// <summary>
/// Sets the authentication information.
/// </summary>
@@ -887,6 +894,35 @@ namespace MediaBrowser.Model.ApiClient
void ChangeServerLocation(string address, bool keepExistingAuth = false);
/// <summary>
+ /// Starts the receiving synchronize job updates.
+ /// </summary>
+ /// <param name="intervalMs">The interval ms.</param>
+ /// <param name="jobId">The job identifier.</param>
+ /// <returns>Task.</returns>
+ Task StartReceivingSyncJobUpdates(int intervalMs, string jobId);
+
+ /// <summary>
+ /// Stops the receiving synchronize job updates.
+ /// </summary>
+ /// <returns>Task.</returns>
+ Task StopReceivingSyncJobUpdates();
+
+ /// <summary>
+ /// Starts the receiving synchronize jobs updates.
+ /// </summary>
+ /// <param name="intervalMs">The interval ms.</param>
+ /// <param name="userId">The user identifier.</param>
+ /// <param name="targetId">The target identifier.</param>
+ /// <returns>Task.</returns>
+ Task StartReceivingSyncJobsUpdates(int intervalMs, string userId, string targetId);
+
+ /// <summary>
+ /// Stops the receiving synchronize jobs updates.
+ /// </summary>
+ /// <returns>Task.</returns>
+ Task StopReceivingSyncJobsUpdates();
+
+ /// <summary>
/// Starts the receiving session updates.
/// </summary>
/// <param name="intervalMs">The interval ms.</param>
@@ -898,7 +934,7 @@ namespace MediaBrowser.Model.ApiClient
/// </summary>
/// <returns>Task.</returns>
Task StopReceivingSessionUpdates();
-
+
/// <summary>
/// Gets the image URL.
/// </summary>
@@ -1317,24 +1353,6 @@ namespace MediaBrowser.Model.ApiClient
Task<QueryResult<BaseItemDto>> GetPlaylistItems(PlaylistItemQuery query);
/// <summary>
- /// Gets the url needed to stream a video file
- /// </summary>
- /// <param name="options">The options.</param>
- /// <returns>System.String.</returns>
- /// <exception cref="ArgumentNullException">options</exception>
- [Obsolete]
- string GetVideoStreamUrl(VideoStreamOptions options);
-
- /// <summary>
- /// Formulates a url for streaming video using the HLS protocol
- /// </summary>
- /// <param name="options">The options.</param>
- /// <returns>System.String.</returns>
- /// <exception cref="ArgumentNullException">options</exception>
- [Obsolete]
- string GetHlsVideoStreamUrl(VideoStreamOptions options);
-
- /// <summary>
/// Sends the context message asynchronous.
/// </summary>
/// <param name="itemType">Type of the item.</param>
@@ -1360,7 +1378,7 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="file">The file.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- Task UploadFile(Stream stream,
+ Task UploadFile(Stream stream,
LocalFileInfo file,
CancellationToken cancellationToken);
@@ -1385,6 +1403,13 @@ namespace MediaBrowser.Model.ApiClient
Task<SyncJob> CreateSyncJob(SyncJobRequest request);
/// <summary>
+ /// Updates the synchronize job.
+ /// </summary>
+ /// <param name="job">The job.</param>
+ /// <returns>Task.</returns>
+ Task UpdateSyncJob(SyncJob job);
+
+ /// <summary>
/// Gets the synchronize jobs.
/// </summary>
/// <param name="query">The query.</param>
@@ -1414,6 +1439,15 @@ namespace MediaBrowser.Model.ApiClient
Task<Stream> GetSyncJobItemFile(string id, CancellationToken cancellationToken);
/// <summary>
+ /// Gets the synchronize job item additional file.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <param name="name">The name.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task&lt;Stream&gt;.</returns>
+ Task<Stream> GetSyncJobItemAdditionalFile(string id, string name, CancellationToken cancellationToken);
+
+ /// <summary>
/// Opens the web socket.
/// </summary>
/// <param name="webSocketFactory">The web socket factory.</param>
@@ -1440,5 +1474,56 @@ namespace MediaBrowser.Model.ApiClient
/// <param name="request">The request.</param>
/// <returns>Task&lt;SyncDataResponse&gt;.</returns>
Task<SyncDataResponse> SyncData(SyncDataRequest request);
+ /// <summary>
+ /// Gets the synchronize job item file URL.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>System.String.</returns>
+ string GetSyncJobItemFileUrl(string id);
+ /// <summary>
+ /// Marks the synchronize job item for removal.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task MarkSyncJobItemForRemoval(string id);
+ /// <summary>
+ /// Unmarks the synchronize job item for removal.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task UnmarkSyncJobItemForRemoval(string id);
+ /// <summary>
+ /// Queues the failed synchronize job item for retry.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task QueueFailedSyncJobItemForRetry(string id);
+ /// <summary>
+ /// Cancels the synchronize job.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task CancelSyncJob(string id);
+ /// <summary>
+ /// Cancels the synchronize job item.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task CancelSyncJobItem(string id);
+ /// <summary>
+ /// Enables the cancelled synchronize job item.
+ /// </summary>
+ /// <param name="id">The identifier.</param>
+ /// <returns>Task.</returns>
+ Task EnableCancelledSyncJobItem(string id);
+ /// <summary>
+ /// Gets the synchronize options.
+ /// </summary>
+ /// <param name="userId">The user identifier.</param>
+ /// <param name="itemIds">The item ids.</param>
+ /// <param name="parentId">The parent identifier.</param>
+ /// <param name="category">The category.</param>
+ /// <returns>Task&lt;SyncOptions&gt;.</returns>
+ Task<SyncDialogOptions> GetSyncOptions(IEnumerable<string> itemIds, string userId, string parentId = null, SyncCategory? category = null);
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/ApiClient/IConnectionManager.cs b/MediaBrowser.Model/ApiClient/IConnectionManager.cs
index a54c330ac..658c71ac5 100644
--- a/MediaBrowser.Model/ApiClient/IConnectionManager.cs
+++ b/MediaBrowser.Model/ApiClient/IConnectionManager.cs
@@ -136,5 +136,14 @@ namespace MediaBrowser.Model.ApiClient
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
Task<List<ServerInfo>> GetAvailableServers(CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Authenticates an offline user with their password
+ /// </summary>
+ /// <param name="user">The user.</param>
+ /// <param name="password">The password.</param>
+ /// <param name="rememberCredentials">if set to <c>true</c> [remember credentials].</param>
+ /// <returns>Task.</returns>
+ Task AuthenticateOffline(UserDto user, string password, bool rememberCredentials);
}
}
diff --git a/MediaBrowser.Model/ApiClient/IServerEvents.cs b/MediaBrowser.Model/ApiClient/IServerEvents.cs
index 88faad388..ae2d5d323 100644
--- a/MediaBrowser.Model/ApiClient/IServerEvents.cs
+++ b/MediaBrowser.Model/ApiClient/IServerEvents.cs
@@ -3,9 +3,11 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Session;
+using MediaBrowser.Model.Sync;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Updates;
using System;
+using System.Collections.Generic;
namespace MediaBrowser.Model.ApiClient
{
@@ -130,5 +132,21 @@ namespace MediaBrowser.Model.ApiClient
/// Occurs when [session ended].
/// </summary>
event EventHandler<GenericEventArgs<SessionInfoDto>> SessionEnded;
+ /// <summary>
+ /// Occurs when [synchronize job created].
+ /// </summary>
+ event EventHandler<GenericEventArgs<SyncJobCreationResult>> SyncJobCreated;
+ /// <summary>
+ /// Occurs when [synchronize job cancelled].
+ /// </summary>
+ event EventHandler<GenericEventArgs<SyncJob>> SyncJobCancelled;
+ /// <summary>
+ /// Occurs when [synchronize jobs updated].
+ /// </summary>
+ event EventHandler<GenericEventArgs<List<SyncJob>>> SyncJobsUpdated;
+ /// <summary>
+ /// Occurs when [synchronize job updated].
+ /// </summary>
+ event EventHandler<GenericEventArgs<CompleteSyncJobInfo>> SyncJobUpdated;
}
}
diff --git a/MediaBrowser.Model/ApiClient/ServerCredentials.cs b/MediaBrowser.Model/ApiClient/ServerCredentials.cs
index fbbc6c05d..d911f8121 100644
--- a/MediaBrowser.Model/ApiClient/ServerCredentials.cs
+++ b/MediaBrowser.Model/ApiClient/ServerCredentials.cs
@@ -70,6 +70,10 @@ namespace MediaBrowser.Model.ApiClient
{
existing.LastConnectionMode = server.LastConnectionMode;
}
+ foreach (ServerUserInfo user in server.Users)
+ {
+ existing.AddOrUpdate(user);
+ }
}
else
{
@@ -85,7 +89,7 @@ namespace MediaBrowser.Model.ApiClient
foreach (var server in servers)
{
- if (StringHelper.Equals(id, server.Id))
+ if (StringHelper.EqualsIgnoreCase(id, server.Id))
{
return index;
}
diff --git a/MediaBrowser.Model/ApiClient/ServerInfo.cs b/MediaBrowser.Model/ApiClient/ServerInfo.cs
index 46cc560af..cc062f2f6 100644
--- a/MediaBrowser.Model/ApiClient/ServerInfo.cs
+++ b/MediaBrowser.Model/ApiClient/ServerInfo.cs
@@ -1,12 +1,16 @@
using MediaBrowser.Model.Connect;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.System;
using System;
using System.Collections.Generic;
+using System.Linq;
namespace MediaBrowser.Model.ApiClient
{
public class ServerInfo
{
+ public List<ServerUserInfo> Users { get; set; }
+
public String Name { get; set; }
public String Id { get; set; }
public String LocalAddress { get; set; }
@@ -23,6 +27,7 @@ namespace MediaBrowser.Model.ApiClient
public ServerInfo()
{
WakeOnLanInfos = new List<WakeOnLanInfo>();
+ Users = new List<ServerUserInfo>();
}
public void ImportInfo(PublicSystemInfo systemInfo)
@@ -70,5 +75,48 @@ namespace MediaBrowser.Model.ApiClient
throw new ArgumentException("Unexpected ConnectionMode");
}
}
+
+ public void AddOrUpdate(ServerUserInfo user)
+ {
+ if (user == null)
+ {
+ throw new ArgumentNullException("user");
+ }
+
+ var list = Users.ToList();
+
+ var index = FindIndex(list, user.Id);
+
+ if (index != -1)
+ {
+ var existing = list[index];
+
+ // Merge the data
+ existing.IsSignedInOffline = user.IsSignedInOffline;
+ }
+ else
+ {
+ list.Add(user);
+ }
+
+ Users = list;
+ }
+
+ private int FindIndex(List<ServerUserInfo> users, string id)
+ {
+ var index = 0;
+
+ foreach (var user in users)
+ {
+ if (StringHelper.EqualsIgnoreCase(id, user.Id))
+ {
+ return index;
+ }
+
+ index++;
+ }
+
+ return -1;
+ }
}
}
diff --git a/MediaBrowser.Model/ApiClient/ServerUserInfo.cs b/MediaBrowser.Model/ApiClient/ServerUserInfo.cs
new file mode 100644
index 000000000..812da7402
--- /dev/null
+++ b/MediaBrowser.Model/ApiClient/ServerUserInfo.cs
@@ -0,0 +1,9 @@
+
+namespace MediaBrowser.Model.ApiClient
+{
+ public class ServerUserInfo
+ {
+ public string Id { get; set; }
+ public bool IsSignedInOffline { get; set; }
+ }
+}