diff options
Diffstat (limited to 'MediaBrowser.Model/ApiClient')
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ApiClientExtensions.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ConnectionResult.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ConnectionState.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/IApiClient.cs | 137 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/IConnectionManager.cs | 9 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/IServerEvents.cs | 18 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ServerCredentials.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ServerInfo.cs | 48 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/ServerUserInfo.cs | 9 |
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<HttpResponse>.</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<QueryResult<BaseItemDto>>.</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<ItemsResult>.</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<UserDto>.</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<Stream>.</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<SyncDataResponse>.</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<SyncOptions>.</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; } + } +} |
