Parcourir la source

update download error handling

Luke Pulverenti il y a 7 ans
Parent
commit
b7867214ef
36 fichiers modifiés avec 23 ajouts et 2469 suppressions
  1. 0 1
      Emby.Server.Implementations/ApplicationHost.cs
  2. 1 1
      Emby.Server.Implementations/Dto/DtoService.cs
  3. 2 2
      Emby.Server.Implementations/Library/LibraryManager.cs
  4. 1 1
      Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  5. 5 2
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  6. 1 1
      MediaBrowser.Api/Reports/Data/ReportBuilder.cs
  7. 1 2
      MediaBrowser.Controller/Entities/IHasSpecialFeatures.cs
  8. 3 3
      MediaBrowser.Controller/Entities/Movies/Movie.cs
  9. 2 2
      MediaBrowser.Controller/Entities/UserViewBuilder.cs
  10. 0 1
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  11. 1 14
      MediaBrowser.Controller/Sync/ISyncManager.cs
  12. 0 80
      MediaBrowser.Controller/Sync/ISyncRepository.cs
  13. 0 48
      MediaBrowser.Model/ApiClient/ApiClientExtensions.cs
  14. 0 22
      MediaBrowser.Model/ApiClient/ApiHelpers.cs
  15. 0 9
      MediaBrowser.Model/ApiClient/ConnectionMode.cs
  16. 0 29
      MediaBrowser.Model/ApiClient/ConnectionOptions.cs
  17. 0 21
      MediaBrowser.Model/ApiClient/ConnectionResult.cs
  18. 0 13
      MediaBrowser.Model/ApiClient/ConnectionState.cs
  19. 0 1427
      MediaBrowser.Model/ApiClient/IApiClient.cs
  20. 0 54
      MediaBrowser.Model/ApiClient/IClientWebSocket.cs
  21. 0 192
      MediaBrowser.Model/ApiClient/IConnectionManager.cs
  22. 0 44
      MediaBrowser.Model/ApiClient/IDevice.cs
  23. 0 152
      MediaBrowser.Model/ApiClient/IServerEvents.cs
  24. 0 30
      MediaBrowser.Model/ApiClient/NetworkStatus.cs
  25. 0 9
      MediaBrowser.Model/ApiClient/RemoteLogoutReason.cs
  26. 0 131
      MediaBrowser.Model/ApiClient/ServerCredentials.cs
  27. 0 127
      MediaBrowser.Model/ApiClient/ServerInfo.cs
  28. 0 9
      MediaBrowser.Model/ApiClient/ServerUserInfo.cs
  29. 0 12
      MediaBrowser.Model/Dto/BaseItemDto.cs
  30. 0 16
      MediaBrowser.Model/MediaBrowser.Model.csproj
  31. 0 5
      MediaBrowser.Model/Sync/SyncJobItem.cs
  32. 1 3
      MediaBrowser.Model/Sync/SyncJobItemStatus.cs
  33. 1 2
      MediaBrowser.Model/Sync/SyncJobStatus.cs
  34. 1 1
      Nuget/MediaBrowser.Common.nuspec
  35. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec
  36. 1 1
      SharedVersion.cs

+ 0 - 1
Emby.Server.Implementations/ApplicationHost.cs

@@ -212,7 +212,6 @@ namespace Emby.Server.Implementations
         internal IUserViewManager UserViewManager { get; set; }
 
         private IAuthenticationRepository AuthenticationRepository { get; set; }
-        private ISyncRepository SyncRepository { get; set; }
         private ITVSeriesManager TVSeriesManager { get; set; }
         private ICollectionManager CollectionManager { get; set; }
         private IMediaSourceManager MediaSourceManager { get; set; }

+ 1 - 1
Emby.Server.Implementations/Dto/DtoService.cs

@@ -1263,7 +1263,7 @@ namespace Emby.Server.Implementations.Dto
             var hasSpecialFeatures = item as IHasSpecialFeatures;
             if (hasSpecialFeatures != null)
             {
-                var specialFeatureCount = hasSpecialFeatures.SpecialFeatureIds.Count;
+                var specialFeatureCount = hasSpecialFeatures.SpecialFeatureIds.Length;
 
                 if (specialFeatureCount > 0)
                 {

+ 2 - 2
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -2610,7 +2610,7 @@ namespace Emby.Server.Implementations.Library
                     return video;
 
                     // Sort them so that the list can be easily compared for changes
-                }).OrderBy(i => i.Path).ToList();
+                }).OrderBy(i => i.Path);
         }
 
         private static readonly string[] ExtrasSubfolderNames = new[] { "extras", "specials", "shorts", "scenes", "featurettes", "behind the scenes", "deleted scenes", "interviews" };
@@ -2652,7 +2652,7 @@ namespace Emby.Server.Implementations.Library
                     return video;
 
                     // Sort them so that the list can be easily compared for changes
-                }).OrderBy(i => i.Path).ToList();
+                }).OrderBy(i => i.Path);
         }
 
         public string GetPathAfterNetworkSubstitution(string path, BaseItem ownerItem)

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -69,7 +69,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
 
             if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase))
             {
-                return ResolveVideos<MusicVideo>(parent, files, directoryService, false, collectionType);
+                return ResolveVideos<MusicVideo>(parent, files, directoryService, true, collectionType);
             }
 
             if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) ||

+ 5 - 2
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -207,9 +207,12 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
                 inputModifier += " -fflags " + string.Join("", flags.ToArray());
             }
 
-            if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType))
+            var videoStream = mediaSource.VideoStream;
+            var videoDecoder = videoStream == null ? null : new EncodingHelper(_mediaEncoder, _fileSystem, null).GetVideoDecoder(VideoType.VideoFile, videoStream, GetEncodingOptions());
+
+            if (!string.IsNullOrWhiteSpace(videoDecoder))
             {
-                inputModifier += " -hwaccel auto";
+                inputModifier += " " + videoDecoder;
             }
 
             if (mediaSource.ReadAtNativeFramerate)

+ 1 - 1
MediaBrowser.Api/Reports/Data/ReportBuilder.cs

@@ -613,7 +613,7 @@ namespace MediaBrowser.Api.Reports
                 HasImageTagsPrimary = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Primary) > 0,
                 HasImageTagsBackdrop = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Backdrop) > 0,
                 HasImageTagsLogo = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Logo) > 0,
-                HasSpecials = hasSpecialFeatures != null ? hasSpecialFeatures.SpecialFeatureIds.Count > 0 : false,
+                HasSpecials = hasSpecialFeatures != null ? hasSpecialFeatures.SpecialFeatureIds.Length > 0 : false,
                 HasSubtitles = video != null ? video.HasSubtitles : false,
                 RowType = ReportHelper.GetRowType(item.GetClientTypeName())
             };

+ 1 - 2
MediaBrowser.Controller/Entities/IHasSpecialFeatures.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Entities
 {
@@ -9,6 +8,6 @@ namespace MediaBrowser.Controller.Entities
         /// Gets or sets the special feature ids.
         /// </summary>
         /// <value>The special feature ids.</value>
-        List<Guid> SpecialFeatureIds { get; set; }
+        Guid[] SpecialFeatureIds { get; set; }
     }
 }

+ 3 - 3
MediaBrowser.Controller/Entities/Movies/Movie.cs

@@ -19,11 +19,11 @@ namespace MediaBrowser.Controller.Entities.Movies
     /// </summary>
     public class Movie : Video, IHasSpecialFeatures, IHasTrailers, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping
     {
-        public List<Guid> SpecialFeatureIds { get; set; }
+        public Guid[] SpecialFeatureIds { get; set; }
 
         public Movie()
         {
-            SpecialFeatureIds = new List<Guid>();
+            SpecialFeatureIds = EmptyGuidArray;
             RemoteTrailers = EmptyMediaUrlArray;
             LocalTrailerIds = EmptyGuidArray;
             RemoteTrailerIds = EmptyGuidArray;
@@ -77,7 +77,7 @@ namespace MediaBrowser.Controller.Entities.Movies
         private async Task<bool> RefreshSpecialFeatures(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
         {
             var newItems = LibraryManager.FindExtras(this, fileSystemChildren, options.DirectoryService).ToList();
-            var newItemIds = newItems.Select(i => i.Id).ToList();
+            var newItemIds = newItems.Select(i => i.Id).ToArray();
 
             var itemsChanged = !SpecialFeatureIds.SequenceEqual(newItemIds);
 

+ 2 - 2
MediaBrowser.Controller/Entities/UserViewBuilder.cs

@@ -1387,8 +1387,8 @@ namespace MediaBrowser.Controller.Entities
                 if (movie != null)
                 {
                     var ok = filterValue
-                        ? movie.SpecialFeatureIds.Count > 0
-                        : movie.SpecialFeatureIds.Count == 0;
+                        ? movie.SpecialFeatureIds.Length > 0
+                        : movie.SpecialFeatureIds.Length == 0;
 
                     if (!ok)
                     {

+ 0 - 1
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -336,7 +336,6 @@
     <Compile Include="Sync\ISyncDataProvider.cs" />
     <Compile Include="Sync\ISyncManager.cs" />
     <Compile Include="Sync\ISyncProvider.cs" />
-    <Compile Include="Sync\ISyncRepository.cs" />
     <Compile Include="Sync\SyncedFileInfo.cs" />
     <Compile Include="Sync\SyncedItemProgress.cs" />
     <Compile Include="TV\ITVSeriesManager.cs" />

+ 1 - 14
MediaBrowser.Controller/Sync/ISyncManager.cs

@@ -16,6 +16,7 @@ namespace MediaBrowser.Controller.Sync
         event EventHandler<GenericEventArgs<SyncJob>> SyncJobUpdated;
         event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemUpdated;
         event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCreated;
+        event EventHandler<GenericEventArgs<SyncJobItem>> SyncJobItemCancelled;
 
         /// <summary>
         /// Creates the job.
@@ -134,20 +135,6 @@ namespace MediaBrowser.Controller.Sync
         /// <returns>Task&lt;SyncDataResponse&gt;.</returns>
         Task<SyncDataResponse> SyncData(SyncDataRequest request);
 
-        /// <summary>
-        /// Marks the job item for removal.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task.</returns>
-        Task MarkJobItemForRemoval(string id);
-
-        /// <summary>
-        /// Unmarks the job item for removal.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task.</returns>
-        Task UnmarkJobItemForRemoval(string id);
-
         /// <summary>
         /// Gets the library item ids.
         /// </summary>

+ 0 - 80
MediaBrowser.Controller/Sync/ISyncRepository.cs

@@ -1,80 +0,0 @@
-using System.Collections.Generic;
-using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Sync;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Controller.Sync
-{
-    public interface ISyncRepository
-    {
-        /// <summary>
-        /// Gets the job.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>SyncJob.</returns>
-        SyncJob GetJob(string id);
-
-        /// <summary>
-        /// Creates the specified job.
-        /// </summary>
-        /// <param name="job">The job.</param>
-        /// <returns>Task.</returns>
-        Task Create(SyncJob job);
-
-        /// <summary>
-        /// Updates the specified job.
-        /// </summary>
-        /// <param name="job">The job.</param>
-        /// <returns>Task.</returns>
-        Task Update(SyncJob job);
-
-        /// <summary>
-        /// Deletes the job.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task.</returns>
-        Task DeleteJob(string id);
-
-        /// <summary>
-        /// Gets the jobs.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>QueryResult&lt;SyncJob&gt;.</returns>
-        QueryResult<SyncJob> GetJobs(SyncJobQuery query);
-
-        /// <summary>
-        /// Gets the job item.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>SyncJobItem.</returns>
-        SyncJobItem GetJobItem(string id);
-
-        /// <summary>
-        /// Creates the specified job item.
-        /// </summary>
-        /// <param name="jobItem">The job item.</param>
-        /// <returns>Task.</returns>
-        Task Create(SyncJobItem jobItem);
-
-        /// <summary>
-        /// Updates the specified job item.
-        /// </summary>
-        /// <param name="jobItem">The job item.</param>
-        /// <returns>Task.</returns>
-        Task Update(SyncJobItem jobItem);
-
-        /// <summary>
-        /// Gets the job items.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>IEnumerable&lt;SyncJobItem&gt;.</returns>
-        QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query);
-
-        /// <summary>
-        /// Gets the library item ids.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>QueryResult&lt;System.String&gt;.</returns>
-        Dictionary<string, SyncedItemProgress> GetSyncedItemProgresses(SyncJobItemQuery query);
-    }
-}

+ 0 - 48
MediaBrowser.Model/ApiClient/ApiClientExtensions.cs

@@ -1,48 +0,0 @@
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Sync;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    /// <summary>
-    /// Class ApiClientExtensions
-    /// </summary>
-    public static class ApiClientExtensions
-    {
-        /// <summary>
-        /// Gets the image stream async.
-        /// </summary>
-        /// <param name="apiClient">The API client.</param>
-        /// <param name="url">The URL.</param>
-        /// <returns>Task{Stream}.</returns>
-        public static Task<Stream> GetImageStreamAsync(this IApiClient apiClient, string url)
-        {
-            return apiClient.GetImageStreamAsync(url, CancellationToken.None);
-        }
-
-        public static Task<UserDto[]> GetPublicUsersAsync(this IApiClient apiClient)
-        {
-            return apiClient.GetPublicUsersAsync(CancellationToken.None);
-        }
-
-        public static Task<ItemsResult> GetItemsAsync(this IApiClient apiClient, ItemQuery query)
-        {
-            return apiClient.GetItemsAsync(query, CancellationToken.None);
-        }
-
-        public static Task<SyncDialogOptions> GetSyncOptions(this IApiClient apiClient, SyncJob job)
-        {
-            return apiClient.GetSyncOptions(new SyncJobRequest
-            {
-                Category = job.Category,
-                ItemIds = job.RequestedItemIds,
-                ParentId = job.ParentId,
-                TargetId = job.TargetId,
-                UserId = job.UserId
-            });
-        }
-    }
-}

+ 0 - 22
MediaBrowser.Model/ApiClient/ApiHelpers.cs

@@ -1,22 +0,0 @@
-using System;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public static class ApiHelpers
-    {
-        /// <summary>
-        /// Gets the name of the slug.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <returns>System.String.</returns>
-        public static string GetSlugName(string name)
-        {
-            if (string.IsNullOrEmpty(name))
-            {
-                throw new ArgumentNullException("name");
-            }
-
-            return name.Replace('/', '-').Replace('?', '-').Replace('&', '-');
-        }
-    }
-}

+ 0 - 9
MediaBrowser.Model/ApiClient/ConnectionMode.cs

@@ -1,9 +0,0 @@
-namespace MediaBrowser.Model.ApiClient
-{
-    public enum ConnectionMode
-    {
-        Local = 1,
-        Remote = 2,
-        Manual = 3
-    }
-}

+ 0 - 29
MediaBrowser.Model/ApiClient/ConnectionOptions.cs

@@ -1,29 +0,0 @@
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public class ConnectionOptions
-    {
-        /// <summary>
-        /// Gets or sets a value indicating whether [enable web socket].
-        /// </summary>
-        /// <value><c>true</c> if [enable web socket]; otherwise, <c>false</c>.</value>
-        public bool EnableWebSocket { get; set; }
-        /// <summary>
-        /// Gets or sets a value indicating whether [report capabilities].
-        /// </summary>
-        /// <value><c>true</c> if [report capabilities]; otherwise, <c>false</c>.</value>
-        public bool ReportCapabilities { get; set; }
-        /// <summary>
-        /// Gets or sets a value indicating whether [update date last accessed].
-        /// </summary>
-        /// <value><c>true</c> if [update date last accessed]; otherwise, <c>false</c>.</value>
-        public bool UpdateDateLastAccessed { get; set; }
-
-        public ConnectionOptions()
-        {
-            EnableWebSocket = true;
-            ReportCapabilities = true;
-            UpdateDateLastAccessed = true;
-        }
-    }
-}

+ 0 - 21
MediaBrowser.Model/ApiClient/ConnectionResult.cs

@@ -1,21 +0,0 @@
-using MediaBrowser.Model.Connect;
-using MediaBrowser.Model.Dto;
-using System.Collections.Generic;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public class ConnectionResult
-    {
-        public ConnectionState State { get; set; }
-        public List<ServerInfo> Servers { get; set; }
-        public IApiClient ApiClient { get; set; }
-        public ConnectUser ConnectUser { get; set; }
-        public UserDto OfflineUser { get; set; }
-
-        public ConnectionResult()
-        {
-            State = ConnectionState.Unavailable;
-            Servers = new List<ServerInfo>();
-        }
-    }
-}

+ 0 - 13
MediaBrowser.Model/ApiClient/ConnectionState.cs

@@ -1,13 +0,0 @@
-namespace MediaBrowser.Model.ApiClient
-{
-    public enum ConnectionState
-    {
-        Unavailable = 1,
-        ServerSignIn = 2,
-        SignedIn = 3,
-        ServerSelection = 4,
-        ConnectSignIn = 5,
-        OfflineSignIn = 6,
-        OfflineSignedIn = 7
-    }
-}

+ 0 - 1427
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -1,1427 +0,0 @@
-using MediaBrowser.Model.Channels;
-using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Devices;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Globalization;
-using MediaBrowser.Model.LiveTv;
-using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Net;
-using MediaBrowser.Model.Notifications;
-using MediaBrowser.Model.Playlists;
-using MediaBrowser.Model.Plugins;
-using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Search;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Session;
-using MediaBrowser.Model.Sync;
-using MediaBrowser.Model.System;
-using MediaBrowser.Model.Tasks;
-using MediaBrowser.Model.Users;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    /// <summary>
-    /// Interface IApiClient
-    /// </summary>
-    public interface IApiClient : IServerEvents, IDisposable
-    {
-        /// <summary>
-        /// Occurs when [remote logged out].
-        /// </summary>
-        event EventHandler<GenericEventArgs<RemoteLogoutReason>> RemoteLoggedOut;
-
-        /// <summary>
-        /// Gets the API URL.
-        /// </summary>
-        /// <param name="handler">The handler.</param>
-        /// <returns>System.String.</returns>
-        string GetApiUrl(string handler);
-
-        /// <summary>
-        /// Gets the game system summaries async.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{List{GameSystemSummary}}.</returns>
-        Task<List<GameSystemSummary>> GetGameSystemSummariesAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the async.
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="url">The URL.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{``0}.</returns>
-        Task<T> GetAsync<T>(string url, CancellationToken cancellationToken = default(CancellationToken))
-            where T : class;
-
-        /// <summary>
-        /// Reports the capabilities.
-        /// </summary>
-        /// <param name="capabilities">The capabilities.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task ReportCapabilities(ClientCapabilities capabilities, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Logouts this instance.
-        /// </summary>
-        /// <returns>Task.</returns>
-        Task Logout();
-
-        /// <summary>
-        /// Gets the index of the game players.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{List{ItemIndex}}.</returns>
-        Task<List<ItemIndex>> GetGamePlayerIndex(string userId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <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>
-        Task<List<ItemIndex>> GetYearIndex(string userId, string[] includeItemTypes, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the critic reviews.
-        /// </summary>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <param name="startIndex">The start index.</param>
-        /// <param name="limit">The limit.</param>
-        /// <returns>Task{ItemReviewsResult}.</returns>
-        Task<QueryResult<ItemReview>> GetCriticReviews(string itemId, CancellationToken cancellationToken = default(CancellationToken), int? startIndex = null, int? limit = null);
-
-        /// <summary>
-        /// Gets the theme songs async.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ThemeMediaResult}.</returns>
-        Task<ThemeMediaResult> GetThemeSongsAsync(string userId, string itemId, bool inheritFromParents, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the search hints async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{SearchHintResult}.</returns>
-        Task<SearchHintResult> GetSearchHintsAsync(SearchQuery query);
-
-        /// <summary>
-        /// Gets the filters.
-        /// </summary>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="parentId">The parent identifier.</param>
-        /// <param name="mediaTypes">The media types.</param>
-        /// <param name="itemTypes">The item types.</param>
-        /// <returns>Task&lt;QueryFilters&gt;.</returns>
-        Task<QueryFilters> GetFilters(string userId, string parentId, string[] mediaTypes, string[] itemTypes);
-
-        /// <summary>
-        /// Gets the theme videos async.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ThemeMediaResult}.</returns>
-        Task<ThemeMediaResult> GetThemeVideosAsync(string userId, string itemId, bool inheritFromParents, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets all theme media async.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="inheritFromParents">if set to <c>true</c> [inherit from parents].</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{AllThemeMediaResult}.</returns>
-        Task<AllThemeMediaResult> GetAllThemeMediaAsync(string userId, string itemId, bool inheritFromParents, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Marks the notifications read.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <param name="notificationIdList">The notification id list.</param>
-        /// <param name="isRead">if set to <c>true</c> [is read].</param>
-        /// <returns>Task.</returns>
-        Task MarkNotificationsRead(string userId, IEnumerable<string> notificationIdList, bool isRead);
-
-        /// <summary>
-        /// Gets the notifications summary.
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{NotificationsSummary}.</returns>
-        Task<NotificationsSummary> GetNotificationsSummary(string userId);
-
-        /// <summary>
-        /// Gets the notifications async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{NotificationResult}.</returns>
-        Task<NotificationResult> GetNotificationsAsync(NotificationQuery query);
-
-        /// <summary>
-        /// Gets an image stream based on a url
-        /// </summary>
-        /// <param name="url">The URL.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{Stream}.</returns>
-        /// <exception cref="ArgumentNullException">url</exception>
-        Task<Stream> GetImageStreamAsync(string url, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the stream.
-        /// </summary>
-        /// <param name="url">The URL.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;Stream&gt;.</returns>
-        Task<Stream> GetStream(string url, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the response.
-        /// </summary>
-        /// <param name="url">The URL.</param>
-        /// <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>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="configuration">The configuration.</param>
-        /// <returns>Task.</returns>
-        Task UpdateUserConfiguration(string userId, UserConfiguration configuration);
-
-        /// <summary>
-        /// Gets a BaseItem
-        /// </summary>
-        /// <param name="id">The id.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        /// <exception cref="ArgumentNullException">id</exception>
-        Task<BaseItemDto> GetItemAsync(string id, string userId);
-
-        /// <summary>
-        /// Gets the latest items.
-        /// </summary>
-        /// <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>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetIntrosAsync(string itemId, string userId);
-
-        /// <summary>
-        /// Gets a BaseItem
-        /// </summary>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        Task<BaseItemDto> GetRootFolderAsync(string userId);
-
-        /// <summary>
-        /// Gets the additional parts.
-        /// </summary>
-        /// <param name="itemId">The item identifier.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <returns>Task{BaseItemDto[]}.</returns>
-        Task<ItemsResult> GetAdditionalParts(string itemId, string userId);
-
-        /// <summary>
-        /// Gets the playback information.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        /// <returns>Task&lt;LiveMediaInfoResult&gt;.</returns>
-        Task<PlaybackInfoResponse> GetPlaybackInfo(PlaybackInfoRequest request);
-
-        /// <summary>
-        /// Gets the users async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{UserDto[]}.</returns>
-        Task<UserDto[]> GetUsersAsync(UserQuery query);
-
-        /// <summary>
-        /// Gets the public users async.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{UserDto[]}.</returns>
-        Task<UserDto[]> GetPublicUsersAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets active client sessions.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{SessionInfoDto[]}.</returns>
-        Task<SessionInfoDto[]> GetClientSessionsAsync(SessionQuery query);
-
-        /// <summary>
-        /// Gets the client session asynchronous.
-        /// </summary>
-        /// <returns>Task{SessionInfoDto}.</returns>
-        Task<SessionInfoDto> GetCurrentSessionAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the item counts async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemCounts}.</returns>
-        Task<ItemCounts> GetItemCountsAsync(ItemCountsQuery query);
-
-        /// <summary>
-        /// Gets the episodes asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetEpisodesAsync(EpisodeQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the seasons asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetSeasonsAsync(SeasonQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        Task<PluginSecurityInfo> GetRegistrationInfo();
-
-        /// <summary>
-        /// Queries for items
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        /// <exception cref="ArgumentNullException">query</exception>
-        Task<ItemsResult> GetItemsAsync(ItemQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the user views.
-        /// </summary>
-        /// <param name="userId">The user identifier.</param>
-        /// <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 item asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task&lt;ItemsResult&gt;.</returns>
-        Task<ItemsResult> GetInstantMixFromItemAsync(SimilarItemsQuery query);
-
-        /// <summary>
-        /// Gets the similar movies async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetSimilarItemsAsync(SimilarItemsQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the people async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        Task<ItemsResult> GetPeopleAsync(PersonsQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the artists.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        Task<ItemsResult> GetArtistsAsync(ArtistsQuery query);
-
-        /// <summary>
-        /// Gets the album artists asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetAlbumArtistsAsync(ArtistsQuery query);
-
-        /// <summary>
-        /// Gets the next up async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetNextUpEpisodesAsync(NextUpQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the upcoming episodes asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetUpcomingEpisodesAsync(UpcomingEpisodesQuery query);
-
-        /// <summary>
-        /// Gets a genre
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        Task<BaseItemDto> GetGenreAsync(string name, string userId);
-
-        /// <summary>
-        /// Gets the genres async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetGenresAsync(ItemsByNameQuery query);
-
-        /// <summary>
-        /// Gets the studios async.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task{ItemsResult}.</returns>
-        Task<ItemsResult> GetStudiosAsync(ItemsByNameQuery query);
-
-        /// <summary>
-        /// Gets the music genre async.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        Task<BaseItemDto> GetMusicGenreAsync(string name, string userId);
-
-        /// <summary>
-        /// Gets the game genre async.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        Task<BaseItemDto> GetGameGenreAsync(string name, string userId);
-
-        /// <summary>
-        /// Restarts the server.
-        /// </summary>
-        /// <returns>Task.</returns>
-        Task RestartServerAsync();
-
-        /// <summary>
-        /// Gets the system status async.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{SystemInfo}.</returns>
-        Task<SystemInfo> GetSystemInfoAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the public system information asynchronous.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;PublicSystemInfo&gt;.</returns>
-        Task<PublicSystemInfo> GetPublicSystemInfoAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets a list of plugins installed on the server
-        /// </summary>
-        /// <returns>Task{PluginInfo[]}.</returns>
-        Task<PluginInfo[]> GetInstalledPluginsAsync();
-
-        /// <summary>
-        /// Gets the current server configuration
-        /// </summary>
-        /// <returns>Task{ServerConfiguration}.</returns>
-        Task<ServerConfiguration> GetServerConfigurationAsync();
-
-        /// <summary>
-        /// Gets the scheduled tasks.
-        /// </summary>
-        /// <returns>Task{TaskInfo[]}.</returns>
-        Task<TaskInfo[]> GetScheduledTasksAsync();
-
-        /// <summary>
-        /// Gets the scheduled task async.
-        /// </summary>
-        /// <param name="id">The id.</param>
-        /// <returns>Task{TaskInfo}.</returns>
-        /// <exception cref="ArgumentNullException">id</exception>
-        Task<TaskInfo> GetScheduledTaskAsync(string id);
-
-        /// <summary>
-        /// Gets a user by id
-        /// </summary>
-        /// <param name="id">The id.</param>
-        /// <returns>Task{UserDto}.</returns>
-        /// <exception cref="ArgumentNullException">id</exception>
-        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>
-        Task<List<ParentalRating>> GetParentalRatingsAsync();
-
-        /// <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="ArgumentNullException">query</exception>
-        Task<BaseItemDto[]> GetLocalTrailersAsync(string userId, string itemId);
-
-        /// <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="ArgumentNullException">userId</exception>
-        Task<BaseItemDto[]> GetSpecialFeaturesAsync(string userId, string itemId);
-
-        /// <summary>
-        /// Gets the cultures async.
-        /// </summary>
-        /// <returns>Task{CultureDto[]}.</returns>
-        Task<CultureDto[]> GetCulturesAsync();
-
-        /// <summary>
-        /// Gets the countries async.
-        /// </summary>
-        /// <returns>Task{CountryInfo[]}.</returns>
-        Task<CountryInfo[]> GetCountriesAsync();
-
-        /// <summary>
-        /// Marks the played async.
-        /// </summary>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="userId">The user id.</param>
-        /// <param name="datePlayed">The date played.</param>
-        /// <returns>Task{UserItemDataDto}.</returns>
-        Task<UserItemDataDto> MarkPlayedAsync(string itemId, string userId, DateTime? datePlayed);
-
-        /// <summary>
-        /// Marks the unplayed async.
-        /// </summary>
-        /// <param name="itemId">The item id.</param>
-        /// <param name="userId">The user id.</param>
-        /// <returns>Task{UserItemDataDto}.</returns>
-        Task<UserItemDataDto> MarkUnplayedAsync(string itemId, string userId);
-
-        /// <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="ArgumentNullException">itemId</exception>
-        Task<UserItemDataDto> UpdateFavoriteStatusAsync(string itemId, string userId, bool isFavorite);
-
-        /// <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="ArgumentNullException">itemId</exception>
-        Task ReportPlaybackStartAsync(PlaybackStartInfo info);
-
-        /// <summary>
-        /// Reports playback progress to the server
-        /// </summary>
-        /// <param name="info">The information.</param>
-        /// <returns>Task{UserItemDataDto}.</returns>
-        /// <exception cref="ArgumentNullException">itemId</exception>
-        Task ReportPlaybackProgressAsync(PlaybackProgressInfo info);
-
-        /// <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="ArgumentNullException">itemId</exception>
-        Task ReportPlaybackStoppedAsync(PlaybackStopInfo info);
-
-        /// <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>
-        Task SendBrowseCommandAsync(string sessionId, string itemId, string itemName, string itemType);
-
-        /// <summary>
-        /// Sends the playstate command async.
-        /// </summary>
-        /// <param name="sessionId">The session id.</param>
-        /// <param name="request">The request.</param>
-        /// <returns>Task.</returns>
-        Task SendPlaystateCommandAsync(string sessionId, PlaystateRequest request);
-
-        /// <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="ArgumentNullException">sessionId
-        /// or
-        /// request</exception>
-        Task SendPlayCommandAsync(string sessionId, PlayRequest request);
-
-        /// <summary>
-        /// Sends the command asynchronous.
-        /// </summary>
-        /// <param name="sessionId">The session identifier.</param>
-        /// <param name="command">The command.</param>
-        /// <returns>Task.</returns>
-        Task SendCommandAsync(string sessionId, GeneralCommand command);
-
-        /// <summary>
-        /// Sends the string.
-        /// </summary>
-        /// <param name="sessionId">The session identifier.</param>
-        /// <param name="text">The text.</param>
-        /// <returns>Task.</returns>
-        Task SendString(string sessionId, string text);
-
-        /// <summary>
-        /// Sets the volume.
-        /// </summary>
-        /// <param name="sessionId">The session identifier.</param>
-        /// <param name="volume">The volume.</param>
-        /// <returns>Task.</returns>
-        Task SetVolume(string sessionId, int volume);
-
-        /// <summary>
-        /// Stops the transcoding processes.
-        /// </summary>
-        /// <param name="deviceId">The device identifier.</param>
-        /// <param name="streamId">The stream identifier.</param>
-        /// <returns>Task.</returns>
-        Task StopTranscodingProcesses(string deviceId, string streamId);
-
-        /// <summary>
-        /// Sets the index of the audio stream.
-        /// </summary>
-        /// <param name="sessionId">The session identifier.</param>
-        /// <param name="index">The index.</param>
-        /// <returns>Task.</returns>
-        Task SetAudioStreamIndex(string sessionId, int index);
-
-        /// <summary>
-        /// Sets the index of the subtitle stream.
-        /// </summary>
-        /// <param name="sessionId">The session identifier.</param>
-        /// <param name="index">The index.</param>
-        /// <returns>Task.</returns>
-        Task SetSubtitleStreamIndex(string sessionId, int? index);
-
-        /// <summary>
-        /// Instructs the client to display a message to the user
-        /// </summary>
-        /// <param name="sessionId">The session id.</param>
-        /// <param name="command">The command.</param>
-        /// <returns>Task.</returns>
-        Task SendMessageCommandAsync(string sessionId, MessageCommand command);
-
-        /// <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="ArgumentNullException">itemId</exception>
-        Task<UserItemDataDto> ClearUserItemRatingAsync(string itemId, string userId);
-
-        /// <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="ArgumentNullException">itemId</exception>
-        Task<UserItemDataDto> UpdateUserItemRatingAsync(string itemId, string userId, bool likes);
-
-        /// <summary>
-        /// Authenticates a user and returns the result
-        /// </summary>
-        /// <param name="username">The username.</param>
-        /// <param name="password">The password.</param>
-        /// <returns>Task.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        Task<AuthenticationResult> AuthenticateUserAsync(string username,
-            string password);
-
-        /// <summary>
-        /// Updates the server configuration async.
-        /// </summary>
-        /// <param name="configuration">The configuration.</param>
-        /// <returns>Task.</returns>
-        /// <exception cref="ArgumentNullException">configuration</exception>
-        Task UpdateServerConfigurationAsync(ServerConfiguration configuration);
-
-        /// <summary>
-        /// Updates the scheduled task triggers.
-        /// </summary>
-        /// <param name="id">The id.</param>
-        /// <param name="triggers">The triggers.</param>
-        /// <returns>Task{RequestResult}.</returns>
-        /// <exception cref="ArgumentNullException">id</exception>
-        Task UpdateScheduledTaskTriggersAsync(string id, TaskTriggerInfo[] triggers);
-
-        /// <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>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{BaseItemDto}.</returns>
-        Task<DisplayPreferences> GetDisplayPreferencesAsync(string id, string userId, string client, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Updates display preferences for a user
-        /// </summary>
-        /// <param name="displayPreferences">The display preferences.</param>
-        /// <param name="userId">The user id.</param>
-        /// <param name="client">The client.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{DisplayPreferences}.</returns>
-        /// <exception cref="System.ArgumentNullException">userId</exception>
-        Task UpdateDisplayPreferencesAsync(DisplayPreferences displayPreferences, string userId, string client, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Posts a set of data to a url, and deserializes the return stream into T
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="url">The URL.</param>
-        /// <param name="args">The args.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{``0}.</returns>
-        Task<T> PostAsync<T>(string url, Dictionary<string, string> args, CancellationToken cancellationToken = default(CancellationToken))
-            where T : class;
-
-        /// <summary>
-        /// This is a helper around getting a stream from the server that contains serialized data
-        /// </summary>
-        /// <param name="url">The URL.</param>
-        /// <returns>Task{Stream}.</returns>
-        Task<Stream> GetSerializedStreamAsync(string url);
-
-        /// <summary>
-        /// Gets the json serializer.
-        /// </summary>
-        /// <value>The json serializer.</value>
-        IJsonSerializer JsonSerializer { get; set; }
-
-        /// <summary>
-        /// Gets or sets the server address
-        /// </summary>
-        /// <value>The server address.</value>
-        string ServerAddress { get; }
-
-        /// <summary>
-        /// Gets or sets the type of the client.
-        /// </summary>
-        /// <value>The type of the client.</value>
-        string ClientName { get; set; }
-
-        /// <summary>
-        /// Gets the device.
-        /// </summary>
-        /// <value>The device.</value>
-        IDevice Device { get; }
-
-        /// <summary>
-        /// Gets or sets the name of the device.
-        /// </summary>
-        /// <value>The name of the device.</value>
-        string DeviceName { get; }
-
-        /// <summary>
-        /// Gets or sets the device id.
-        /// </summary>
-        /// <value>The device id.</value>
-        string DeviceId { get; }
-
-        /// <summary>
-        /// Gets or sets the current user id.
-        /// </summary>
-        /// <value>The current user id.</value>
-        string CurrentUserId { get; }
-
-        /// <summary>
-        /// Gets the access token.
-        /// </summary>
-        /// <value>The access token.</value>
-        string AccessToken { get; }
-
-        /// <summary>
-        /// Sets the authentication information.
-        /// </summary>
-        /// <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>
-        /// <param name="accessToken">The access token.</param>
-        void SetAuthenticationInfo(string accessToken);
-
-        /// <summary>
-        /// Clears the authentication information.
-        /// </summary>
-        void ClearAuthenticationInfo();
-
-        /// <summary>
-        /// Changes the server location.
-        /// </summary>
-        /// <param name="address">The address.</param>
-        /// <param name="keepExistingAuth">if set to <c>true</c> [keep existing authentication].</param>
-        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>
-        /// <returns>Task.</returns>
-        Task StartReceivingSessionUpdates(int intervalMs);
-
-        /// <summary>
-        /// Stops the receiving session updates.
-        /// </summary>
-        /// <returns>Task.</returns>
-        Task StopReceivingSessionUpdates();
-
-        /// <summary>
-        /// Gets the image URL.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">item</exception>
-        string GetImageUrl(BaseItemDto item, ImageOptions options);
-
-        /// <summary>
-        /// Gets the image URL.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetImageUrl(ChannelInfoDto item, ImageOptions options);
-
-        /// <summary>
-        /// Gets the subtitle URL.
-        /// </summary>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetSubtitleUrl(SubtitleDownloadOptions options);
-
-        /// <summary>
-        /// Gets an image url that can be used to download an image from the api
-        /// </summary>
-        /// <param name="itemId">The Id of the item</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">itemId</exception>
-        string GetImageUrl(string itemId, ImageOptions options);
-
-        /// <summary>
-        /// Gets the user image URL.
-        /// </summary>
-        /// <param name="user">The user.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">user</exception>
-        string GetUserImageUrl(UserDto user, ImageOptions options);
-
-        /// <summary>
-        /// Gets an image url that can be used to download an image from the api
-        /// </summary>
-        /// <param name="userId">The Id of the user</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">userId</exception>
-        string GetUserImageUrl(string userId, ImageOptions options);
-
-        /// <summary>
-        /// Gets the person image URL.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">item</exception>
-        string GetPersonImageUrl(BaseItemPerson item, ImageOptions options);
-
-        /// <summary>
-        /// Gets an image url that can be used to download an image from the api
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">name</exception>
-        string GetGenreImageUrl(string name, ImageOptions options);
-
-        /// <summary>
-        /// Gets the music genre image URL.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetMusicGenreImageUrl(string name, ImageOptions options);
-
-        /// <summary>
-        /// Gets the game genre image URL.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetGameGenreImageUrl(string name, ImageOptions options);
-
-        /// <summary>
-        /// This is a helper to get a list of backdrop url's from a given ApiBaseItemWrapper. If the actual item does not have any backdrops it will return backdrops from the first parent that does.
-        /// </summary>
-        /// <param name="item">A given item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String[][].</returns>
-        /// <exception cref="ArgumentNullException">item</exception>
-        string[] GetBackdropImageUrls(BaseItemDto item, ImageOptions options);
-
-        /// <summary>
-        /// This is a helper to get the logo image url from a given ApiBaseItemWrapper. If the actual item does not have a logo, it will return the logo from the first parent that does, or null.
-        /// </summary>
-        /// <param name="item">A given item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        /// <exception cref="ArgumentNullException">item</exception>
-        string GetLogoImageUrl(BaseItemDto item, ImageOptions options);
-
-        /// <summary>
-        /// Gets the art image URL.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetArtImageUrl(BaseItemDto item, ImageOptions options);
-
-        /// <summary>
-        /// Gets the thumb image URL.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="options">The options.</param>
-        /// <returns>System.String.</returns>
-        string GetThumbImageUrl(BaseItemDto item, ImageOptions options);
-
-        /// <summary>
-        /// Gets the live tv information asynchronous.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{LiveTvInfo}.</returns>
-        Task<LiveTvInfo> GetLiveTvInfoAsync(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv channels asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{LiveTvInfo}.</returns>
-        Task<QueryResult<ChannelInfoDto>> GetLiveTvChannelsAsync(LiveTvChannelQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv channel asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ChannelInfoDto}.</returns>
-        Task<ChannelInfoDto> GetLiveTvChannelAsync(string id, string userId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv recordings asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{RecordingInfoDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetLiveTvRecordingsAsync(RecordingQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv recording asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{RecordingInfoDto}.</returns>
-        Task<BaseItemDto> GetLiveTvRecordingAsync(string id, string userId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv recording groups asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{RecordingGroupDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetLiveTvRecordingGroupsAsync(RecordingGroupQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv recording group asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{RecordingGroupDto}.</returns>
-        Task<BaseItemDto> GetLiveTvRecordingGroupAsync(string id, string userId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv timers asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{TimerInfoDto}}.</returns>
-        Task<QueryResult<TimerInfoDto>> GetLiveTvTimersAsync(TimerQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv programs asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{ProgramInfoDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetLiveTvProgramsAsync(ProgramQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv program asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ProgramInfoDto}.</returns>
-        Task<BaseItemDto> GetLiveTvProgramAsync(string id, string userId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the recommended live tv programs asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{ProgramInfoDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetRecommendedLiveTvProgramsAsync(RecommendedProgramQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Creates the live tv timer asynchronous.
-        /// </summary>
-        /// <param name="timer">The timer.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task CreateLiveTvTimerAsync(BaseTimerInfoDto timer, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Updates the live tv timer asynchronous.
-        /// </summary>
-        /// <param name="timer">The timer.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UpdateLiveTvTimerAsync(TimerInfoDto timer, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Creates the live tv series timer asynchronous.
-        /// </summary>
-        /// <param name="timer">The timer.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task CreateLiveTvSeriesTimerAsync(SeriesTimerInfoDto timer, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Updates the live tv series timer asynchronous.
-        /// </summary>
-        /// <param name="timer">The timer.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UpdateLiveTvSeriesTimerAsync(SeriesTimerInfoDto timer, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv timer asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{TimerInfoDto}.</returns>
-        Task<TimerInfoDto> GetLiveTvTimerAsync(string id, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv series timers asynchronous.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{SeriesTimerInfoDto}}.</returns>
-        Task<QueryResult<SeriesTimerInfoDto>> GetLiveTvSeriesTimersAsync(SeriesTimerQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv series timer asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{SeriesTimerInfoDto}.</returns>
-        Task<SeriesTimerInfoDto> GetLiveTvSeriesTimerAsync(string id, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Cancels the live tv timer asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task CancelLiveTvTimerAsync(string id, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Cancels the live tv series timer asynchronous.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task CancelLiveTvSeriesTimerAsync(string id, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the default timer information.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{SeriesTimerInfoDto}.</returns>
-        Task<SeriesTimerInfoDto> GetDefaultLiveTvTimerInfo(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the live tv guide information.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{GuideInfo}.</returns>
-        Task<GuideInfo> GetLiveTvGuideInfo(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the default timer information.
-        /// </summary>
-        /// <param name="programId">The program identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{SeriesTimerInfoDto}.</returns>
-        Task<SeriesTimerInfoDto> GetDefaultLiveTvTimerInfo(string programId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the channel features.
-        /// </summary>
-        /// <param name="channelId">The channel identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{ChannelFeatures}.</returns>
-        Task<ChannelFeatures> GetChannelFeatures(string channelId, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the channel items.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{BaseItemDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the channels.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{BaseItemDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetChannels(ChannelQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the latest channel items.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{BaseItemDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetLatestChannelItems(AllChannelMediaQuery query, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Creates the playlist.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        /// <returns>Task&lt;PlaylistCreationResult&gt;.</returns>
-        Task<PlaylistCreationResult> CreatePlaylist(PlaylistCreationRequest request);
-
-        /// <summary>
-        /// Adds to playlist.
-        /// </summary>
-        /// <param name="playlistId">The playlist identifier.</param>
-        /// <param name="itemIds">The item ids.</param>
-        /// <param name="userId">The user identifier.</param>
-        /// <returns>Task.</returns>
-        Task AddToPlaylist(string playlistId, IEnumerable<string> itemIds, string userId);
-
-        /// <summary>
-        /// Removes from playlist.
-        /// </summary>
-        /// <param name="playlistId">The playlist identifier.</param>
-        /// <param name="entryIds">The entry ids.</param>
-        /// <returns>Task.</returns>
-        Task RemoveFromPlaylist(string playlistId, IEnumerable<string> entryIds);
-
-        /// <summary>
-        /// Gets the playlist items.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task&lt;QueryResult&lt;BaseItemDto&gt;&gt;.</returns>
-        Task<QueryResult<BaseItemDto>> GetPlaylistItems(PlaylistItemQuery query);
-
-        /// <summary>
-        /// Sends the context message asynchronous.
-        /// </summary>
-        /// <param name="itemType">Type of the item.</param>
-        /// <param name="itemId">The item identifier.</param>
-        /// <param name="itemName">Name of the item.</param>
-        /// <param name="context">The context.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task SendContextMessageAsync(string itemType, string itemId, string itemName, string context,
-            CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the content upload history.
-        /// </summary>
-        /// <param name="deviceId">The device identifier.</param>
-        /// <returns>Task&lt;ContentUploadHistory&gt;.</returns>
-        Task<ContentUploadHistory> GetContentUploadHistory(string deviceId);
-
-        /// <summary>
-        /// Uploads the file.
-        /// </summary>
-        /// <param name="stream">The stream.</param>
-        /// <param name="file">The file.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UploadFile(Stream stream,
-            LocalFileInfo file,
-            CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Gets the devices options options.
-        /// </summary>
-        /// <returns>Task&lt;DevicesOptions&gt;.</returns>
-        Task<DevicesOptions> GetDevicesOptions();
-
-        /// <summary>
-        /// Updates the item.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <returns>Task.</returns>
-        Task UpdateItem(BaseItemDto item);
-
-        /// <summary>
-        /// Creates the synchronize job.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        /// <returns>Task&lt;SyncJob&gt;.</returns>
-        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>
-        /// <returns>Task&lt;QueryResult&lt;SyncJob&gt;&gt;.</returns>
-        Task<QueryResult<SyncJob>> GetSyncJobs(SyncJobQuery query);
-
-        /// <summary>
-        /// Gets the synchronize job items.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task&lt;QueryResult&lt;SyncJobItem&gt;&gt;.</returns>
-        Task<QueryResult<SyncJobItem>> GetSyncJobItems(SyncJobItemQuery query);
-
-        /// <summary>
-        /// Reports the synchronize job item transferred.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task.</returns>
-        Task ReportSyncJobItemTransferred(string id);
-
-        /// <summary>
-        /// Gets the synchronize job item file.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;Stream&gt;.</returns>
-        Task<Stream> GetSyncJobItemFile(string id, CancellationToken cancellationToken = default(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>
-        /// <param name="keepAliveTimerMs">The keep alive timer ms.</param>
-        void OpenWebSocket(Func<IClientWebSocket> webSocketFactory, int keepAliveTimerMs = 60000);
-
-        /// <summary>
-        /// Reports the offline actions.
-        /// </summary>
-        /// <param name="actions">The actions.</param>
-        /// <returns>Task.</returns>
-        Task ReportOfflineActions(List<UserAction> actions);
-
-        /// <summary>
-        /// Gets the ready synchronize items.
-        /// </summary>
-        /// <param name="targetId">The target identifier.</param>
-        /// <returns>List&lt;SyncedItem&gt;.</returns>
-        Task<List<SyncedItem>> GetReadySyncItems(string targetId);
-
-        /// <summary>
-        /// Synchronizes the data.
-        /// </summary>
-        /// <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="jobInfo">The job information.</param>
-        /// <returns>Task&lt;SyncOptions&gt;.</returns>
-        Task<SyncDialogOptions> GetSyncOptions(SyncJobRequest jobInfo);
-        /// <summary>
-        /// Gets the synchronize options.
-        /// </summary>
-        /// <param name="jobInfo">The job information.</param>
-        /// <returns>Task&lt;SyncDialogOptions&gt;.</returns>
-        Task<SyncDialogOptions> GetSyncOptions(SyncJob jobInfo);
-        /// <summary>
-        /// Gets the movie recommendations.
-        /// </summary>
-        /// <param name="query">The query.</param>
-        /// <returns>Task&lt;List&lt;RecommendationDto&gt;&gt;.</returns>
-        Task<List<RecommendationDto>> GetMovieRecommendations(MovieRecommendationQuery query);
-        /// <summary>
-        /// Opens the live stream.
-        /// </summary>
-        /// <param name="request">The request.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;LiveStreamResponse&gt;.</returns>
-        Task<LiveStreamResponse> OpenLiveStream(LiveStreamRequest request, CancellationToken cancellationToken);
-        /// <summary>
-        /// Cancels the synchronize library items.
-        /// </summary>
-        /// <param name="targetId">The target identifier.</param>
-        /// <param name="itemIds">The item ids.</param>
-        /// <returns>Task.</returns>
-        Task CancelSyncLibraryItems(string targetId, IEnumerable<string> itemIds);
-        /// <summary>
-        /// Gets the supported bitrate.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;System.Int32&gt;.</returns>
-        Task<int> DetectMaxBitrate(CancellationToken cancellationToken);
-
-        /// <summary>
-        /// Gets the end point information.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>System.Threading.Tasks.Task&lt;MediaBrowser.Model.Net.EndPointInfo&gt;.</returns>
-        Task<EndPointInfo> GetEndPointInfo(CancellationToken cancellationToken);
-    }
-}

+ 0 - 54
MediaBrowser.Model/ApiClient/IClientWebSocket.cs

@@ -1,54 +0,0 @@
-using MediaBrowser.Model.Net;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    /// <summary>
-    /// Interface IClientWebSocket
-    /// </summary>
-    public interface IClientWebSocket : IDisposable
-    {
-        /// <summary>
-        /// Occurs when [closed].
-        /// </summary>
-        event EventHandler Closed;
-
-        /// <summary>
-        /// Gets or sets the state.
-        /// </summary>
-        /// <value>The state.</value>
-        WebSocketState State { get; }
-
-        /// <summary>
-        /// Connects the async.
-        /// </summary>
-        /// <param name="url">The URL.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task ConnectAsync(string url, CancellationToken cancellationToken);
-
-        /// <summary>
-        /// Gets or sets the receive action.
-        /// </summary>
-        /// <value>The receive action.</value>
-        Action<byte[]> OnReceiveBytes { get; set; }
-
-        /// <summary>
-        /// Gets or sets the on receive.
-        /// </summary>
-        /// <value>The on receive.</value>
-        Action<string> OnReceive { get; set; }
-
-        /// <summary>
-        /// Sends the async.
-        /// </summary>
-        /// <param name="bytes">The bytes.</param>
-        /// <param name="type">The type.</param>
-        /// <param name="endOfMessage">if set to <c>true</c> [end of message].</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task SendAsync(byte[] bytes, WebSocketMessageType type, bool endOfMessage, CancellationToken cancellationToken);
-    }
-}

+ 0 - 192
MediaBrowser.Model/ApiClient/IConnectionManager.cs

@@ -1,192 +0,0 @@
-using MediaBrowser.Model.Connect;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Events;
-using MediaBrowser.Model.Session;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public interface IConnectionManager
-    {
-        /// <summary>
-        /// Occurs when [connected].
-        /// </summary>
-        event EventHandler<GenericEventArgs<ConnectionResult>> Connected;
-        /// <summary>
-        /// Occurs when [local user sign in].
-        /// </summary>
-        event EventHandler<GenericEventArgs<UserDto>> LocalUserSignIn;
-        /// <summary>
-        /// Occurs when [connect user sign in].
-        /// </summary>
-        event EventHandler<GenericEventArgs<ConnectUser>> ConnectUserSignIn;
-        /// <summary>
-        /// Occurs when [local user sign out].
-        /// </summary>
-        event EventHandler<GenericEventArgs<IApiClient>> LocalUserSignOut;
-        /// <summary>
-        /// Occurs when [connect user sign out].
-        /// </summary>
-        event EventHandler<EventArgs> ConnectUserSignOut;
-        /// <summary>
-        /// Occurs when [remote logged out].
-        /// </summary>
-        event EventHandler<EventArgs> RemoteLoggedOut;
-
-        /// <summary>
-        /// Gets the device.
-        /// </summary>
-        /// <value>The device.</value>
-        IDevice Device { get; }
-
-        /// <summary>
-        /// Gets the connect user.
-        /// </summary>
-        /// <value>The connect user.</value>
-        ConnectUser ConnectUser { get; }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether [save local credentials].
-        /// </summary>
-        /// <value><c>true</c> if [save local credentials]; otherwise, <c>false</c>.</value>
-        bool SaveLocalCredentials { get; set; }
-
-        /// <summary>
-        /// Gets the client capabilities.
-        /// </summary>
-        /// <value>The client capabilities.</value>
-        ClientCapabilities ClientCapabilities { get; }
-
-        /// <summary>
-        /// Gets the API client.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <returns>IApiClient.</returns>
-        IApiClient GetApiClient(IHasServerId item);
-
-        /// <summary>
-        /// Gets the API client.
-        /// </summary>
-        /// <param name="serverId">The server identifier.</param>
-        /// <returns>IApiClient.</returns>
-        IApiClient GetApiClient(string serverId);
-        
-        /// <summary>
-        /// Connects the specified cancellation token.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task<ConnectionResult> Connect(CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Connects the specified API client.
-        /// </summary>
-        /// <param name="apiClient">The API client.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task<ConnectionResult> Connect(IApiClient apiClient, CancellationToken cancellationToken = default(CancellationToken));
-        
-        /// <summary>
-        /// Connects the specified server.
-        /// </summary>
-        /// <param name="server">The server.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task<ConnectionResult> Connect(ServerInfo server, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Connects the specified server.
-        /// </summary>
-        /// <param name="server">The server.</param>
-        /// <param name="options">The options.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task<ConnectionResult> Connect(ServerInfo server, ConnectionOptions options, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Connects the specified server.
-        /// </summary>
-        /// <param name="address">The address.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task<ConnectionResult> Connect(string address, CancellationToken cancellationToken = default(CancellationToken));
-
-        /// <summary>
-        /// Logouts this instance.
-        /// </summary>
-        /// <returns>Task&lt;ConnectionResult&gt;.</returns>
-        Task Logout();
-
-        /// <summary>
-        /// Logins to connect.
-        /// </summary>
-        /// <returns>Task.</returns>
-        Task LoginToConnect(string username, string password);
-
-        /// <summary>
-        /// Gets the active api client instance
-        /// </summary>
-        IApiClient CurrentApiClient { get; }
-
-        /// <summary>
-        /// Creates the pin.
-        /// </summary>
-        /// <returns>Task&lt;PinCreationResult&gt;.</returns>
-        Task<PinCreationResult> CreatePin();
-
-        /// <summary>
-        /// Gets the pin status.
-        /// </summary>
-        /// <param name="pin">The pin.</param>
-        /// <returns>Task&lt;PinStatusResult&gt;.</returns>
-        Task<PinStatusResult> GetPinStatus(PinCreationResult pin);
-
-        /// <summary>
-        /// Exchanges the pin.
-        /// </summary>
-        /// <param name="pin">The pin.</param>
-        /// <returns>Task.</returns>
-        Task ExchangePin(PinCreationResult pin);
-
-        /// <summary>
-        /// Gets the server information.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task&lt;ServerInfo&gt;.</returns>
-        Task<ServerInfo> GetServerInfo(string id);
-
-        /// <summary>
-        /// Gets the available servers.
-        /// </summary>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        Task<List<ServerInfo>> GetAvailableServers(CancellationToken cancellationToken = default(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);
-
-        /// <summary>
-        /// Gets the offline users.
-        /// </summary>
-        /// <returns>Task&lt;List&lt;UserDto&gt;&gt;.</returns>
-        Task<List<UserDto>> GetOfflineUsers();
-
-        /// <summary>
-        /// Signups for connect.
-        /// </summary>
-        /// <param name="email">The email.</param>
-        /// <param name="username">The username.</param>
-        /// <param name="password">The password.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task<ConnectSignupResponse> SignupForConnect(string email, string username, string password, CancellationToken cancellationToken = default(CancellationToken));
-    }
-}

+ 0 - 44
MediaBrowser.Model/ApiClient/IDevice.cs

@@ -1,44 +0,0 @@
-using MediaBrowser.Model.Devices;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public interface IDevice
-    {
-        /// <summary>
-        /// Occurs when [resume from sleep].
-        /// </summary>
-        event EventHandler<EventArgs> ResumeFromSleep;
-        /// <summary>
-        /// Gets the name of the device.
-        /// </summary>
-        /// <value>The name of the device.</value>
-        string DeviceName { get; }
-        /// <summary>
-        /// Gets the device identifier.
-        /// </summary>
-        /// <value>The device identifier.</value>
-        string DeviceId { get; }
-        /// <summary>
-        /// Gets the local images.
-        /// </summary>
-        /// <returns>IEnumerable&lt;LocalFileInfo&gt;.</returns>
-        Task<IEnumerable<LocalFileInfo>> GetLocalPhotos();
-        /// <summary>
-        /// Gets the local videos.
-        /// </summary>
-        /// <returns>IEnumerable&lt;LocalFileInfo&gt;.</returns>
-        Task<IEnumerable<LocalFileInfo>> GetLocalVideos();
-        /// <summary>
-        /// Uploads the file.
-        /// </summary>
-        /// <param name="file">The file.</param>
-        /// <param name="apiClient">The API client.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UploadFile(LocalFileInfo file, IApiClient apiClient, CancellationToken cancellationToken = default(CancellationToken));
-    }
-}

+ 0 - 152
MediaBrowser.Model/ApiClient/IServerEvents.cs

@@ -1,152 +0,0 @@
-using MediaBrowser.Model.Dto;
-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
-{
-    /// <summary>
-    /// Interface IServerEvents
-    /// </summary>
-    public interface IServerEvents
-    {
-        /// <summary>
-        /// Occurs when [user deleted].
-        /// </summary>
-        event EventHandler<GenericEventArgs<string>> UserDeleted;
-        /// <summary>
-        /// Occurs when [scheduled task ended].
-        /// </summary>
-        event EventHandler<GenericEventArgs<TaskResult>> ScheduledTaskEnded;
-        /// <summary>
-        /// Occurs when [package installing].
-        /// </summary>
-        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstalling;
-        /// <summary>
-        /// Occurs when [package installation failed].
-        /// </summary>
-        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationFailed;
-        /// <summary>
-        /// Occurs when [package installation completed].
-        /// </summary>
-        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationCompleted;
-        /// <summary>
-        /// Occurs when [package installation cancelled].
-        /// </summary>
-        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationCancelled;
-        /// <summary>
-        /// Occurs when [user updated].
-        /// </summary>
-        event EventHandler<GenericEventArgs<UserDto>> UserUpdated;
-        /// <summary>
-        /// Occurs when [plugin uninstalled].
-        /// </summary>
-        event EventHandler<GenericEventArgs<PluginInfo>> PluginUninstalled;
-        /// <summary>
-        /// Occurs when [library changed].
-        /// </summary>
-        event EventHandler<GenericEventArgs<LibraryUpdateInfo>> LibraryChanged;
-        /// <summary>
-        /// Occurs when [browse command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<BrowseRequest>> BrowseCommand;
-        /// <summary>
-        /// Occurs when [play command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<PlayRequest>> PlayCommand;
-        /// <summary>
-        /// Occurs when [playstate command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<PlaystateRequest>> PlaystateCommand;
-        /// <summary>
-        /// Occurs when [message command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<MessageCommand>> MessageCommand;
-        /// <summary>
-        /// Occurs when [system command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<GeneralCommandEventArgs>> GeneralCommand;
-        /// <summary>
-        /// Occurs when [notification added].
-        /// </summary>
-        event EventHandler<EventArgs> NotificationAdded;
-        /// <summary>
-        /// Occurs when [notification updated].
-        /// </summary>
-        event EventHandler<EventArgs> NotificationUpdated;
-        /// <summary>
-        /// Occurs when [notifications marked read].
-        /// </summary>
-        event EventHandler<EventArgs> NotificationsMarkedRead;
-        /// <summary>
-        /// Occurs when [server restarting].
-        /// </summary>
-        event EventHandler<EventArgs> ServerRestarting;
-        /// <summary>
-        /// Occurs when [server shutting down].
-        /// </summary>
-        event EventHandler<EventArgs> ServerShuttingDown;
-        /// <summary>
-        /// Occurs when [send text command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<string>> SendStringCommand;
-        /// <summary>
-        /// Occurs when [set volume command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<int>> SetVolumeCommand;
-        /// <summary>
-        /// Occurs when [set audio stream index command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<int>> SetAudioStreamIndexCommand;
-        /// <summary>
-        /// Occurs when [set video stream index command].
-        /// </summary>
-        event EventHandler<GenericEventArgs<int>> SetSubtitleStreamIndexCommand;
-        /// <summary>
-        /// Occurs when [sessions updated].
-        /// </summary>
-        event EventHandler<GenericEventArgs<SessionUpdatesEventArgs>> SessionsUpdated;
-        /// <summary>
-        /// Occurs when [restart required].
-        /// </summary>
-        event EventHandler<EventArgs> RestartRequired;
-        /// <summary>
-        /// Occurs when [user data changed].
-        /// </summary>
-        event EventHandler<GenericEventArgs<UserDataChangeInfo>> UserDataChanged;
-        /// <summary>
-        /// Occurs when [playback start].
-        /// </summary>
-        event EventHandler<GenericEventArgs<SessionInfoDto>> PlaybackStart;
-        /// <summary>
-        /// Occurs when [playback stopped].
-        /// </summary>
-        event EventHandler<GenericEventArgs<SessionInfoDto>> PlaybackStopped;
-        /// <summary>
-        /// 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;
-    }
-}

+ 0 - 30
MediaBrowser.Model/ApiClient/NetworkStatus.cs

@@ -1,30 +0,0 @@
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public class NetworkStatus
-    {
-        /// <summary>
-        /// Gets or sets a value indicating whether this instance is network available.
-        /// </summary>
-        /// <value><c>true</c> if this instance is network available; otherwise, <c>false</c>.</value>
-        public bool IsNetworkAvailable { get; set; }
-        /// <summary>
-        /// Gets or sets a value indicating whether this instance is local network available.
-        /// </summary>
-        /// <value><c>null</c> if [is local network available] contains no value, <c>true</c> if [is local network available]; otherwise, <c>false</c>.</value>
-        public bool? IsLocalNetworkAvailable { get; set; }
-        /// <summary>
-        /// Gets the is any local network available.
-        /// </summary>
-        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
-        public bool GetIsAnyLocalNetworkAvailable()
-        {
-            if (!IsLocalNetworkAvailable.HasValue)
-            {
-                return IsNetworkAvailable;
-            }
-
-            return IsLocalNetworkAvailable.Value;
-        }
-    }
-}

+ 0 - 9
MediaBrowser.Model/ApiClient/RemoteLogoutReason.cs

@@ -1,9 +0,0 @@
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public enum RemoteLogoutReason
-    {
-        GeneralAccesError = 0,
-        ParentalControlRestriction = 1
-    }
-}

+ 0 - 131
MediaBrowser.Model/ApiClient/ServerCredentials.cs

@@ -1,131 +0,0 @@
-using MediaBrowser.Model.Extensions;
-using System;
-using System.Collections.Generic;
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public class ServerCredentials
-    {
-        public List<ServerInfo> Servers { get; set; }
-
-        public string ConnectUserId { get; set; }
-        public string ConnectAccessToken { get; set; }
-
-        public ServerCredentials()
-        {
-            Servers = new List<ServerInfo>();
-        }
-
-        public void AddOrUpdateServer(ServerInfo server)
-        {
-            if (server == null)
-            {
-                throw new ArgumentNullException("server");
-            }
-
-            // Clone the existing list of servers
-            var list = new List<ServerInfo>();
-            foreach (ServerInfo serverInfo in Servers)
-            {
-                list.Add(serverInfo);
-            }
-
-            var index = FindIndex(list, server.Id);
-
-            if (index != -1)
-            {
-                var existing = list[index];
-
-                // Take the most recent DateLastAccessed
-                if (server.DateLastAccessed > existing.DateLastAccessed)
-                {
-                    existing.DateLastAccessed = server.DateLastAccessed;
-                }
-                
-                existing.UserLinkType = server.UserLinkType;
-
-                if (!string.IsNullOrEmpty(server.AccessToken))
-                {
-                    existing.AccessToken = server.AccessToken;
-                    existing.UserId = server.UserId;
-                }
-                if (!string.IsNullOrEmpty(server.ExchangeToken))
-                {
-                    existing.ExchangeToken = server.ExchangeToken;
-                }
-                if (!string.IsNullOrEmpty(server.RemoteAddress))
-                {
-                    existing.RemoteAddress = server.RemoteAddress;
-                }
-                if (!string.IsNullOrEmpty(server.ConnectServerId))
-                {
-                    existing.ConnectServerId = server.ConnectServerId;
-                }
-                if (!string.IsNullOrEmpty(server.LocalAddress))
-                {
-                    existing.LocalAddress = server.LocalAddress;
-                }
-                if (!string.IsNullOrEmpty(server.ManualAddress))
-                {
-                    existing.ManualAddress = server.ManualAddress;
-                }
-                if (!string.IsNullOrEmpty(server.Name))
-                {
-                    existing.Name = server.Name;
-                }
-                if (server.WakeOnLanInfos != null && server.WakeOnLanInfos.Count > 0)
-                {
-                    existing.WakeOnLanInfos = new List<WakeOnLanInfo>();
-                    foreach (WakeOnLanInfo info in server.WakeOnLanInfos)
-                    {
-                        existing.WakeOnLanInfos.Add(info);
-                    }
-                }
-                if (server.LastConnectionMode.HasValue)
-                {
-                    existing.LastConnectionMode = server.LastConnectionMode;
-                }
-                foreach (ServerUserInfo user in server.Users)
-                {
-                    existing.AddOrUpdate(user);
-                }
-            }
-            else
-            {
-                list.Add(server);
-            }
-
-            Servers = list;
-        }
-
-        private int FindIndex(List<ServerInfo> servers, string id)
-        {
-            var index = 0;
-
-            foreach (ServerInfo server in servers)
-            {
-                if (StringHelper.EqualsIgnoreCase(id, server.Id))
-                {
-                    return index;
-                }
-
-                index++;
-            }
-
-            return -1;
-        }
-
-        public ServerInfo GetServer(string id)
-        {
-            foreach (ServerInfo server in Servers)
-            {
-                if (StringHelper.EqualsIgnoreCase(id, server.Id))
-                {
-                    return server;
-                }
-            }
-
-            return null;
-        }
-    }
-}

+ 0 - 127
MediaBrowser.Model/ApiClient/ServerInfo.cs

@@ -1,127 +0,0 @@
-using MediaBrowser.Model.Connect;
-using MediaBrowser.Model.Extensions;
-using MediaBrowser.Model.System;
-using System;
-using System.Collections.Generic;
-
-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 ConnectServerId { get; set; }
-        public String LocalAddress { get; set; }
-        public String RemoteAddress { get; set; }
-        public String ManualAddress { get; set; }
-        public String UserId { get; set; }
-        public String AccessToken { get; set; }
-        public List<WakeOnLanInfo> WakeOnLanInfos { get; set; }
-        public DateTime DateLastAccessed { get; set; }
-        public String ExchangeToken { get; set; }
-        public UserLinkType? UserLinkType { get; set; }
-        public ConnectionMode? LastConnectionMode { get; set; }
-
-        public ServerInfo()
-        {
-            WakeOnLanInfos = new List<WakeOnLanInfo>();
-            Users = new List<ServerUserInfo>();
-        }
-
-        public void ImportInfo(PublicSystemInfo systemInfo)
-        {
-            Name = systemInfo.ServerName;
-            Id = systemInfo.Id;
-
-            if (!string.IsNullOrEmpty(systemInfo.LocalAddress))
-            {
-                LocalAddress = systemInfo.LocalAddress;
-            }
-
-            if (!string.IsNullOrEmpty(systemInfo.WanAddress))
-            {
-                RemoteAddress = systemInfo.WanAddress;
-            }
-
-            var fullSystemInfo = systemInfo as SystemInfo;
-
-            if (fullSystemInfo != null)
-            {
-                WakeOnLanInfos = new List<WakeOnLanInfo>();
-
-                if (!string.IsNullOrEmpty(fullSystemInfo.MacAddress))
-                {
-                    WakeOnLanInfos.Add(new WakeOnLanInfo
-                    {
-                        MacAddress = fullSystemInfo.MacAddress
-                    });
-                }
-            }
-        }
-
-        public string GetAddress(ConnectionMode mode)
-        {
-            switch (mode)
-            {
-                case ConnectionMode.Local:
-                    return LocalAddress;
-                case ConnectionMode.Manual:
-                    return ManualAddress;
-                case ConnectionMode.Remote:
-                    return RemoteAddress;
-                default:
-                    throw new ArgumentException("Unexpected ConnectionMode");
-            }
-        }
-
-        public void AddOrUpdate(ServerUserInfo user)
-        {
-            if (user == null)
-            {
-                throw new ArgumentNullException("user");
-            }
-
-            // Clone the existing list of users
-            var list = new List<ServerUserInfo>();
-            foreach (ServerUserInfo serverUserInfo in Users)
-            {
-                list.Add(serverUserInfo);
-            }
-
-            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;
-        }
-    }
-}

+ 0 - 9
MediaBrowser.Model/ApiClient/ServerUserInfo.cs

@@ -1,9 +0,0 @@
-
-namespace MediaBrowser.Model.ApiClient
-{
-    public class ServerUserInfo
-    {
-        public string Id { get; set; }
-        public bool IsSignedInOffline { get; set; }
-    }
-}

+ 0 - 12
MediaBrowser.Model/Dto/BaseItemDto.cs

@@ -221,12 +221,6 @@ namespace MediaBrowser.Model.Dto
         /// <value>The cumulative run time ticks.</value>
         public long? CumulativeRunTimeTicks { get; set; }
 
-        /// <summary>
-        /// Gets or sets the original run time ticks.
-        /// </summary>
-        /// <value>The original run time ticks.</value>
-        public long? OriginalRunTimeTicks { get; set; }
-
         /// <summary>
         /// Gets or sets the run time ticks.
         /// </summary>
@@ -410,12 +404,6 @@ namespace MediaBrowser.Model.Dto
         /// <value>The status.</value>
         public string Status { get; set; }
 
-        /// <summary>
-        /// Gets or sets the air time.
-        /// </summary>
-        /// <value>The air time.</value>
-        public string AirTime { get; set; }
-
         /// <summary>
         /// Gets or sets the air days.
         /// </summary>

+ 0 - 16
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -40,25 +40,10 @@
     <Compile Include="Activity\ActivityLogEntry.cs" />
     <Compile Include="Activity\IActivityManager.cs" />
     <Compile Include="Activity\IActivityRepository.cs" />
-    <Compile Include="ApiClient\ApiHelpers.cs" />
-    <Compile Include="ApiClient\ConnectionMode.cs" />
-    <Compile Include="ApiClient\ConnectionResult.cs" />
-    <Compile Include="ApiClient\ConnectionState.cs" />
     <Compile Include="ApiClient\ConnectSignupResponse.cs" />
     <Compile Include="ApiClient\HttpResponseEventArgs.cs" />
-    <Compile Include="ApiClient\IApiClient.cs" />
-    <Compile Include="ApiClient\ApiClientExtensions.cs" />
-    <Compile Include="ApiClient\IClientWebSocket.cs" />
-    <Compile Include="ApiClient\IConnectionManager.cs" />
-    <Compile Include="ApiClient\IDevice.cs" />
-    <Compile Include="ApiClient\IServerEvents.cs" />
     <Compile Include="ApiClient\GeneralCommandEventArgs.cs" />
-    <Compile Include="ApiClient\NetworkStatus.cs" />
-    <Compile Include="ApiClient\RemoteLogoutReason.cs" />
-    <Compile Include="ApiClient\ServerCredentials.cs" />
     <Compile Include="ApiClient\ServerDiscoveryInfo.cs" />
-    <Compile Include="ApiClient\ServerInfo.cs" />
-    <Compile Include="ApiClient\ServerUserInfo.cs" />
     <Compile Include="ApiClient\SessionUpdatesEventArgs.cs" />
     <Compile Include="ApiClient\WakeOnLanInfo.cs" />
     <Compile Include="Branding\BrandingOptions.cs" />
@@ -85,7 +70,6 @@
     <Compile Include="Connect\ConnectAuthenticationResult.cs" />
     <Compile Include="Connect\ConnectAuthorization.cs" />
     <Compile Include="Connect\ConnectAuthorizationRequest.cs" />
-    <Compile Include="ApiClient\ConnectionOptions.cs" />
     <Compile Include="Connect\ConnectPassword.cs" />
     <Compile Include="Connect\ConnectUser.cs" />
     <Compile Include="Connect\ConnectUserQuery.cs" />

+ 0 - 5
MediaBrowser.Model/Sync/SyncJobItem.cs

@@ -92,11 +92,6 @@ namespace MediaBrowser.Model.Sync
         /// <value>The additional files.</value>
         public List<ItemFileInfo> AdditionalFiles { get; set; }
         /// <summary>
-        /// Gets or sets a value indicating whether this instance is marked for removal.
-        /// </summary>
-        /// <value><c>true</c> if this instance is marked for removal; otherwise, <c>false</c>.</value>
-        public bool IsMarkedForRemoval { get; set; }
-        /// <summary>
         /// Gets or sets the index of the job item.
         /// </summary>
         /// <value>The index of the job item.</value>

+ 1 - 3
MediaBrowser.Model/Sync/SyncJobItemStatus.cs

@@ -8,8 +8,6 @@ namespace MediaBrowser.Model.Sync
         ReadyToTransfer = 2,
         Transferring = 3,
         Synced = 4,
-        RemovedFromDevice = 5,
-        Failed = 6,
-        Cancelled = 7
+        Failed = 5
     }
 }

+ 1 - 2
MediaBrowser.Model/Sync/SyncJobStatus.cs

@@ -9,7 +9,6 @@ namespace MediaBrowser.Model.Sync
         Transferring = 3,
         Completed = 4,
         CompletedWithError = 5,
-        Failed = 6,
-        Cancelled = 7
+        Failed = 6
     }
 }

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.720</version>
+        <version>3.0.726</version>
         <title>Emby.Common</title>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.720</version>
+        <version>3.0.726</version>
         <title>Emby.Server.Core</title>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Emby Server.</description>
         <copyright>Copyright © Emby 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.720" />
+            <dependency id="MediaBrowser.Common" version="3.0.726" />
         </dependencies>
     </metadata>
     <files>

+ 1 - 1
SharedVersion.cs

@@ -1,3 +1,3 @@
 using System.Reflection;
 
-[assembly: AssemblyVersion("3.2.26.21")]
+[assembly: AssemblyVersion("3.2.26.22")]