diff --git a/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj b/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj deleted file mode 100644 index 22b1a030e..000000000 --- a/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - - - 10.0 - Debug - AnyCPU - {52E0C440-85C0-4A99-ACFE-07C87B2600BE} - Library - Properties - MediaBrowser.ApiInteraction.Portable - MediaBrowser.ApiInteraction.Portable - v4.0 - Profile104 - 512 - {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - ..\ - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - AsyncHttpClient.cs - - - NewtonsoftJsonSerializer.cs - - - SerializationFormats.cs - - - Properties\SharedVersion.cs - - - - BaseApiClient.cs - - - ApiClient.cs - - - IAsyncHttpClient.cs - - - - - ..\packages\Microsoft.Bcl.Async.1.0.14-rc\lib\portable-net40+sl4+win8+wp71\Microsoft.Threading.Tasks.dll - - - ..\packages\Microsoft.Bcl.Async.1.0.14-rc\lib\portable-net40+sl4+win8+wp71\Microsoft.Threading.Tasks.Extensions.dll - - - ..\packages\Newtonsoft.Json.4.5.11\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll - - - ..\packages\Microsoft.Net.Http.2.1.3-beta\lib\portable-net40+sl4+win8+wp71\System.Net.Http.dll - - - ..\packages\Microsoft.Net.Http.2.1.3-beta\lib\portable-net40+sl4+win8+wp71\System.Net.Http.Extensions.dll - - - ..\packages\Microsoft.Net.Http.2.1.3-beta\lib\portable-net40+sl4+win8+wp71\System.Net.Http.Primitives.dll - - - ..\packages\Microsoft.Bcl.1.0.16-rc\lib\portable-net40+sl4+win8+wp71\System.Runtime.dll - - - ..\packages\Microsoft.Bcl.1.0.16-rc\lib\portable-net40+sl4+win8+wp71\System.Threading.Tasks.dll - - - - - {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} - MediaBrowser.Model - - - - - - - - - - - if $(ConfigurationName) == Release ( -xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i -) - - - \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction.Portable/Properties/AssemblyInfo.cs b/MediaBrowser.ApiInteraction.Portable/Properties/AssemblyInfo.cs deleted file mode 100644 index e14673826..000000000 --- a/MediaBrowser.ApiInteraction.Portable/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Reflection; -using System.Resources; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MediaBrowser.ApiInteraction.Portable")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MediaBrowser.ApiInteraction.Portable")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction.Portable/app.config b/MediaBrowser.ApiInteraction.Portable/app.config deleted file mode 100644 index f356f9b87..000000000 --- a/MediaBrowser.ApiInteraction.Portable/app.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction.Portable/packages.config b/MediaBrowser.ApiInteraction.Portable/packages.config deleted file mode 100644 index 795bf139c..000000000 --- a/MediaBrowser.ApiInteraction.Portable/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction/ApiClient.cs b/MediaBrowser.ApiInteraction/ApiClient.cs deleted file mode 100644 index 5268c7e1f..000000000 --- a/MediaBrowser.ApiInteraction/ApiClient.cs +++ /dev/null @@ -1,1029 +0,0 @@ -using MediaBrowser.Model.Configuration; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Globalization; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Plugins; -using MediaBrowser.Model.System; -using MediaBrowser.Model.Tasks; -using MediaBrowser.Model.Weather; -using MediaBrowser.Model.Web; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Provides api methods centered around an HttpClient - /// - public class ApiClient : BaseApiClient - { - /// - /// Gets the HTTP client. - /// - /// The HTTP client. - protected IAsyncHttpClient HttpClient { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - /// The logger. - /// The HTTP client. - /// httpClient - public ApiClient(ILogger logger, IAsyncHttpClient httpClient) - : base(logger) - { - if (httpClient == null) - { - throw new ArgumentNullException("httpClient"); - } - - HttpClient = httpClient; - } - - /// - /// Initializes a new instance of the class. - /// - /// The logger. - public ApiClient(ILogger logger) - : this(logger, new AsyncHttpClient()) - { - } - - /// - /// Sets the authorization header. - /// - /// The header. - protected override void SetAuthorizationHeader(string header) - { - HttpClient.SetAuthorizationHeader(header); - } - - /// - /// Gets an image stream based on a url - /// - /// The URL. - /// Task{Stream}. - /// url - public Task GetImageStreamAsync(string url) - { - if (string.IsNullOrEmpty(url)) - { - throw new ArgumentNullException("url"); - } - - return HttpClient.GetAsync(url, Logger, CancellationToken.None); - } - - /// - /// Gets a BaseItem - /// - /// The id. - /// The user id. - /// Task{BaseItemDto}. - /// id - public async Task GetItemAsync(string id, Guid userId) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentNullException("id"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + id); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the intros async. - /// - /// The item id. - /// The user id. - /// Task{System.String[]}. - /// id - public async Task GetIntrosAsync(string itemId, Guid userId) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Intros"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a BaseItem - /// - /// The user id. - /// Task{BaseItemDto}. - /// userId - public async Task GetRootFolderAsync(Guid userId) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/Root"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets all Users - /// - /// Task{UserDto[]}. - public async Task GetAllUsersAsync() - { - var url = GetApiUrl("Users"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Queries for items - /// - /// The query. - /// Task{ItemsResult}. - /// query - public async Task GetItemsAsync(ItemQuery query) - { - if (query == null) - { - throw new ArgumentNullException("query"); - } - - var url = GetItemListUrl(query); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets all People - /// - /// The user id. - /// Optional itemId, to localize the search to a specific item or folder - /// Use this to limit results to specific person types - /// Used to skip over a given number of items. Use if paging. - /// The maximum number of items to return - /// The sort order - /// if set to true items will be searched recursively. - /// Task{IbnItemsResult}. - /// userId - public async Task GetAllPeopleAsync( - Guid userId, - string itemId = null, - IEnumerable personTypes = null, - int? startIndex = null, - int? limit = null, - SortOrder? sortOrder = null, - bool recursive = false) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var dict = new QueryStringDictionary(); - - dict.AddIfNotNull("startIndex", startIndex); - dict.AddIfNotNull("limit", limit); - - dict.Add("recursive", recursive); - - if (sortOrder.HasValue) - { - dict["sortOrder"] = sortOrder.Value.ToString(); - } - - dict.AddIfNotNull("personTypes", personTypes); - - var url = string.IsNullOrEmpty(itemId) ? "Users/" + userId + "/Items/Root/Persons" : "Users/" + userId + "/Items/" + itemId + "/Persons"; - url = GetApiUrl(url, dict); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a studio - /// - /// The name. - /// Task{BaseItemDto}. - /// userId - public async Task GetStudioAsync(string name) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = GetApiUrl("Library/Studios/" + name); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a genre - /// - /// The name. - /// Task{BaseItemDto}. - /// userId - public async Task GetGenreAsync(string name) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = GetApiUrl("Library/Genres/" + name); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Restarts the kernel or the entire server if necessary - /// If the server application is restarting this request will fail to return, even if - /// the operation is successful. - /// - /// Task. - public Task PerformPendingRestartAsync() - { - var url = GetApiUrl("System/Restart"); - - return PostAsync(url, new QueryStringDictionary()); - } - - /// - /// Gets the system status async. - /// - /// Task{SystemInfo}. - public async Task GetSystemInfoAsync() - { - var url = GetApiUrl("System/Info"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a person - /// - /// The name. - /// Task{BaseItemDto}. - /// userId - public async Task GetPersonAsync(string name) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = GetApiUrl("Library/Persons/" + name); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a year - /// - /// The year. - /// Task{BaseItemDto}. - /// userId - public async Task GetYearAsync(int year) - { - var url = GetApiUrl("Library/Years/" + year); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a list of plugins installed on the server - /// - /// Task{PluginInfo[]}. - public async Task GetInstalledPluginsAsync() - { - var url = GetApiUrl("Plugins"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets a list of plugins installed on the server - /// - /// The plugin. - /// Task{Stream}. - /// plugin - public Task GetPluginAssemblyAsync(PluginInfo plugin) - { - if (plugin == null) - { - throw new ArgumentNullException("plugin"); - } - - var url = GetApiUrl("Plugins/" + plugin.Id + "/Assembly"); - - return HttpClient.GetAsync(url, Logger, CancellationToken.None); - } - - /// - /// Gets the current server configuration - /// - /// Task{ServerConfiguration}. - public async Task GetServerConfigurationAsync() - { - var url = GetApiUrl("System/Configuration"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the scheduled tasks. - /// - /// Task{TaskInfo[]}. - public async Task GetScheduledTasksAsync() - { - var url = GetApiUrl("ScheduledTasks"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the scheduled task async. - /// - /// The id. - /// Task{TaskInfo}. - /// id - public async Task GetScheduledTaskAsync(Guid id) - { - if (id == Guid.Empty) - { - throw new ArgumentNullException("id"); - } - - var url = GetApiUrl("ScheduledTasks/" + id); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the plugin configuration file in plain text. - /// - /// The plugin id. - /// Task{Stream}. - /// assemblyFileName - public async Task GetPluginConfigurationFileAsync(Guid pluginId) - { - if (pluginId == Guid.Empty) - { - throw new ArgumentNullException("pluginId"); - } - - var url = GetApiUrl("Plugins/" + pluginId + "/ConfigurationFile"); - - return await HttpClient.GetAsync(url, Logger, CancellationToken.None).ConfigureAwait(false); - } - - /// - /// Gets a user by id - /// - /// The id. - /// Task{UserDto}. - /// id - public async Task GetUserAsync(Guid id) - { - if (id == Guid.Empty) - { - throw new ArgumentNullException("id"); - } - - var url = GetApiUrl("Users/" + id); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the parental ratings async. - /// - /// Task{List{ParentalRating}}. - public async Task> GetParentalRatingsAsync() - { - var url = GetApiUrl("Localization/ParentalRatings"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream>(stream); - } - } - - /// - /// Gets weather information for the default location as set in configuration - /// - /// Task{WeatherInfo}. - public async Task GetWeatherInfoAsync() - { - var url = GetApiUrl("Weather"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets weather information for a specific location - /// Location can be a US zipcode, or "city,state", "city,state,country", "city,country" - /// It can also be an ip address, or "latitude,longitude" - /// - /// The location. - /// Task{WeatherInfo}. - /// location - public async Task GetWeatherInfoAsync(string location) - { - if (string.IsNullOrEmpty(location)) - { - throw new ArgumentNullException("location"); - } - - var dict = new QueryStringDictionary(); - - dict.Add("location", location); - - var url = GetApiUrl("Weather", dict); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets local trailers for an item - /// - /// The user id. - /// The item id. - /// Task{ItemsResult}. - /// query - public async Task GetLocalTrailersAsync(Guid userId, string itemId) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/LocalTrailers"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets special features for an item - /// - /// The user id. - /// The item id. - /// Task{BaseItemDto[]}. - /// userId - public async Task GetSpecialFeaturesAsync(Guid userId, string itemId) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/SpecialFeatures"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the cultures async. - /// - /// Task{CultureDto[]}. - public async Task GetCulturesAsync() - { - var url = GetApiUrl("Localization/Cultures"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Gets the countries async. - /// - /// Task{CountryInfo[]}. - public async Task GetCountriesAsync() - { - var url = GetApiUrl("Localization/Countries"); - - using (var stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Marks an item as played or unplayed. - /// This should not be used to update playstate following playback. - /// There are separate playstate check-in methods for that. This should be used for a - /// separate option to reset playstate. - /// - /// The item id. - /// The user id. - /// if set to true [was played]. - /// Task. - /// itemId - public Task UpdatePlayedStatusAsync(string itemId, Guid userId, bool wasPlayed) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/PlayedItems/" + itemId); - - if (wasPlayed) - { - return PostAsync(url, new Dictionary()); - } - - return HttpClient.DeleteAsync(url, Logger, CancellationToken.None); - } - - /// - /// Updates the favorite status async. - /// - /// The item id. - /// The user id. - /// if set to true [is favorite]. - /// Task. - /// itemId - public Task UpdateFavoriteStatusAsync(string itemId, Guid userId, bool isFavorite) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/FavoriteItems/" + itemId); - - if (isFavorite) - { - return PostAsync(url, new Dictionary()); - } - - return HttpClient.DeleteAsync(url, Logger, CancellationToken.None); - } - - /// - /// Reports to the server that the user has begun playing an item - /// - /// The item id. - /// The user id. - /// Task{UserItemDataDto}. - /// itemId - public Task ReportPlaybackStartAsync(string itemId, Guid userId) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/PlayingItems/" + itemId); - - return PostAsync(url, new Dictionary()); - } - - /// - /// Reports playback progress to the server - /// - /// The item id. - /// The user id. - /// The position ticks. - /// Task{UserItemDataDto}. - /// itemId - public Task ReportPlaybackProgressAsync(string itemId, Guid userId, long? positionTicks) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var dict = new QueryStringDictionary(); - dict.AddIfNotNull("positionTicks", positionTicks); - - var url = GetApiUrl("Users/" + userId + "/PlayingItems/" + itemId + "/Progress", dict); - - return PostAsync(url, new Dictionary()); - } - - /// - /// Reports to the server that the user has stopped playing an item - /// - /// The item id. - /// The user id. - /// The position ticks. - /// Task{UserItemDataDto}. - /// itemId - public Task ReportPlaybackStoppedAsync(string itemId, Guid userId, long? positionTicks) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var dict = new QueryStringDictionary(); - dict.AddIfNotNull("positionTicks", positionTicks); - - var url = GetApiUrl("Users/" + userId + "/PlayingItems/" + itemId, dict); - - return HttpClient.DeleteAsync(url, Logger, CancellationToken.None); - } - - /// - /// Clears a user's rating for an item - /// - /// The item id. - /// The user id. - /// Task{UserItemDataDto}. - /// itemId - public Task ClearUserItemRatingAsync(string itemId, Guid userId) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Rating"); - - return HttpClient.DeleteAsync(url, Logger, CancellationToken.None); - } - - /// - /// Updates a user's rating for an item, based on likes or dislikes - /// - /// The item id. - /// The user id. - /// if set to true [likes]. - /// Task{UserItemDataDto}. - /// itemId - public Task UpdateUserItemRatingAsync(string itemId, Guid userId, bool likes) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var dict = new QueryStringDictionary { }; - - dict.Add("likes", likes); - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/Rating", dict); - - return PostAsync(url, new Dictionary()); - } - - /// - /// Authenticates a user and returns the result - /// - /// The user id. - /// The password. - /// userId - public Task AuthenticateUserAsync(Guid userId, string password) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = GetApiUrl("Users/" + userId + "/Authenticate"); - - var args = new Dictionary(); - - if (!string.IsNullOrEmpty(password)) - { - args["password"] = password; - } - - return PostAsync(url, args); - } - - /// - /// Uploads the user image async. - /// - /// The user id. - /// Type of the image. - /// The image. - /// Task{RequestResult}. - /// - public Task UploadUserImageAsync(Guid userId, ImageType imageType, Stream image) - { - // Implement when needed - throw new NotImplementedException(); - } - - /// - /// Updates the server configuration async. - /// - /// The configuration. - /// Task. - /// configuration - public Task UpdateServerConfigurationAsync(ServerConfiguration configuration) - { - if (configuration == null) - { - throw new ArgumentNullException("configuration"); - } - - var url = GetApiUrl("System/Configuration"); - - return PostAsync(url, configuration); - } - - /// - /// Updates the scheduled task triggers. - /// - /// The id. - /// The triggers. - /// Task{RequestResult}. - /// id - public Task UpdateScheduledTaskTriggersAsync(Guid id, TaskTriggerInfo[] triggers) - { - if (id == Guid.Empty) - { - throw new ArgumentNullException("id"); - } - - if (triggers == null) - { - throw new ArgumentNullException("triggers"); - } - - var url = GetApiUrl("ScheduledTasks/" + id + "/Triggers"); - - return PostAsync(url, triggers); - } - - /// - /// Updates display preferences for a user - /// - /// The user id. - /// The item id. - /// The display preferences. - /// Task{DisplayPreferences}. - /// userId - public Task UpdateDisplayPreferencesAsync(Guid userId, string itemId, DisplayPreferences displayPreferences) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - if (displayPreferences == null) - { - throw new ArgumentNullException("displayPreferences"); - } - - var url = GetApiUrl("Users/" + userId + "/Items/" + itemId + "/DisplayPreferences"); - - return PostAsync(url, displayPreferences); - } - - /// - /// Posts a set of data to a url, and deserializes the return stream into T - /// - /// - /// The URL. - /// The args. - /// Task{``0}. - private Task PostAsync(string url, Dictionary args) - where T : class - { - return PostAsync(url, args, SerializationFormat); - } - - /// - /// Posts a set of data to a url, and deserializes the return stream into T - /// - /// - /// The URL. - /// The args. - /// The serialization format. - /// Task{``0}. - private async Task PostAsync(string url, Dictionary args, SerializationFormats serializationFormat) - where T : class - { - url = AddDataFormat(url, serializationFormat); - - // Create the post body - var strings = args.Keys.Select(key => string.Format("{0}={1}", key, args[key])); - var postContent = string.Join("&", strings.ToArray()); - - const string contentType = "application/x-www-form-urlencoded"; - - using (var stream = await HttpClient.PostAsync(url, contentType, postContent, Logger, CancellationToken.None).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// Posts an object of type TInputType to a given url, and deserializes the response into an object of type TOutputType - /// - /// The type of the T input type. - /// The type of the T output type. - /// The URL. - /// The obj. - /// Task{``1}. - private Task PostAsync(string url, TInputType obj) - where TOutputType : class - { - return PostAsync(url, obj, SerializationFormat); - } - - /// - /// Posts an object of type TInputType to a given url, and deserializes the response into an object of type TOutputType - /// - /// The type of the T input type. - /// The type of the T output type. - /// The URL. - /// The obj. - /// The serialization format. - /// Task{``1}. - private async Task PostAsync(string url, TInputType obj, SerializationFormats serializationFormat) - where TOutputType : class - { - url = AddDataFormat(url, serializationFormat); - - const string contentType = "application/x-www-form-urlencoded"; - - var postContent = SerializeToJson(obj); - - using (var stream = await HttpClient.PostAsync(url, contentType, postContent, Logger, CancellationToken.None).ConfigureAwait(false)) - { - return DeserializeFromStream(stream); - } - } - - /// - /// This is a helper around getting a stream from the server that contains serialized data - /// - /// The URL. - /// Task{Stream}. - public Task GetSerializedStreamAsync(string url) - { - return GetSerializedStreamAsync(url, SerializationFormat); - } - - /// - /// This is a helper around getting a stream from the server that contains serialized data - /// - /// The URL. - /// The serialization format. - /// Task{Stream}. - public Task GetSerializedStreamAsync(string url, SerializationFormats serializationFormat) - { - url = AddDataFormat(url, serializationFormat); - - return HttpClient.GetAsync(url, Logger, CancellationToken.None); - } - - - /// - /// Adds the data format. - /// - /// The URL. - /// The serialization format. - /// System.String. - private string AddDataFormat(string url, SerializationFormats serializationFormat) - { - var format = serializationFormat == SerializationFormats.Protobuf ? "x-protobuf" : serializationFormat.ToString(); - - if (url.IndexOf('?') == -1) - { - url += "?format=" + format; - } - else - { - url += "&format=" + format; - } - - return url; - } - } -} diff --git a/MediaBrowser.ApiInteraction/AsyncHttpClient.cs b/MediaBrowser.ApiInteraction/AsyncHttpClient.cs deleted file mode 100644 index c6701cac0..000000000 --- a/MediaBrowser.ApiInteraction/AsyncHttpClient.cs +++ /dev/null @@ -1,234 +0,0 @@ -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Net; -using System; -using System.IO; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Class AsyncHttpClient - /// - public class AsyncHttpClient : IAsyncHttpClient - { - /// - /// Gets or sets the HTTP client. - /// - /// The HTTP client. - private HttpClient HttpClient { get; set; } - - /// - /// Initializes a new instance of the class. - /// - public AsyncHttpClient(HttpMessageHandler handler) - { - HttpClient = new HttpClient(handler); - } - - /// - /// Initializes a new instance of the class. - /// - public AsyncHttpClient() - { - HttpClient = new HttpClient(); - } - - /// - /// Gets the stream async. - /// - /// The URL. - /// The logger. - /// The cancellation token. - /// Task{Stream}. - /// - public async Task GetAsync(string url, ILogger logger, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - logger.Debug("Sending Http Get to {0}", url); - - try - { - var msg = await HttpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); - - EnsureSuccessStatusCode(msg); - - return await msg.Content.ReadAsStreamAsync().ConfigureAwait(false); - } - catch (HttpRequestException ex) - { - logger.ErrorException("Error getting response from " + url, ex); - - throw new HttpException(ex.Message, ex); - } - catch (OperationCanceledException ex) - { - throw GetCancellationException(url, cancellationToken, ex, logger); - } - catch (Exception ex) - { - logger.ErrorException("Error requesting {0}", ex, url); - - throw; - } - } - - /// - /// Posts the async. - /// - /// The URL. - /// Type of the content. - /// Content of the post. - /// The logger. - /// The cancellation token. - /// Task{Stream}. - /// - public async Task PostAsync(string url, string contentType, string postContent, ILogger logger, CancellationToken cancellationToken) - { - logger.Debug("Sending Http Post to {0}", url); - - var content = new StringContent(postContent, Encoding.UTF8, contentType); - - try - { - var msg = await HttpClient.PostAsync(url, content).ConfigureAwait(false); - - EnsureSuccessStatusCode(msg); - - return await msg.Content.ReadAsStreamAsync().ConfigureAwait(false); - } - catch (HttpRequestException ex) - { - logger.ErrorException("Error getting response from " + url, ex); - - throw new HttpException(ex.Message, ex); - } - catch (OperationCanceledException ex) - { - throw GetCancellationException(url, cancellationToken, ex, logger); - } - catch (Exception ex) - { - logger.ErrorException("Error posting {0}", ex, url); - - throw; - } - } - - /// - /// Deletes the async. - /// - /// The URL. - /// The logger. - /// The cancellation token. - /// Task. - public async Task DeleteAsync(string url, ILogger logger, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - logger.Debug("Sending Http Delete to {0}", url); - - try - { - using (var msg = await HttpClient.DeleteAsync(url, cancellationToken).ConfigureAwait(false)) - { - EnsureSuccessStatusCode(msg); - } - } - catch (HttpRequestException ex) - { - logger.ErrorException("Error getting response from " + url, ex); - - throw new HttpException(ex.Message, ex); - } - catch (OperationCanceledException ex) - { - throw GetCancellationException(url, cancellationToken, ex, logger); - } - catch (Exception ex) - { - logger.ErrorException("Error requesting {0}", ex, url); - - throw; - } - } - - /// - /// Throws the cancellation exception. - /// - /// The URL. - /// The cancellation token. - /// The exception. - /// The logger. - /// Exception. - private Exception GetCancellationException(string url, CancellationToken cancellationToken, OperationCanceledException exception, ILogger logger) - { - // If the HttpClient's timeout is reached, it will cancel the Task internally - if (!cancellationToken.IsCancellationRequested) - { - var msg = string.Format("Connection to {0} timed out", url); - - logger.Error(msg); - - // Throw an HttpException so that the caller doesn't think it was cancelled by user code - return new HttpException(msg, exception) { IsTimedOut = true }; - } - - return exception; - } - - /// - /// Ensures the success status code. - /// - /// The response. - /// - private void EnsureSuccessStatusCode(HttpResponseMessage response) - { - if (!response.IsSuccessStatusCode) - { - throw new HttpException(response.ReasonPhrase) { StatusCode = response.StatusCode }; - } - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - HttpClient.Dispose(); - } - } - - /// - /// Sets the authorization header that should be supplied on every request - /// - /// The header. - /// - public void SetAuthorizationHeader(string header) - { - if (string.IsNullOrEmpty(header)) - { - HttpClient.DefaultRequestHeaders.Remove("Authorization"); - } - else - { - HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("MediaBrowser", header); - } - } - } -} diff --git a/MediaBrowser.ApiInteraction/BaseApiClient.cs b/MediaBrowser.ApiInteraction/BaseApiClient.cs deleted file mode 100644 index 6d5a5e7cb..000000000 --- a/MediaBrowser.ApiInteraction/BaseApiClient.cs +++ /dev/null @@ -1,857 +0,0 @@ -using MediaBrowser.Model.Connectivity; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using MediaBrowser.Model.Web; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Provides api methods that are usable on all platforms - /// - public abstract class BaseApiClient : IDisposable - { - /// - /// Gets the logger. - /// - /// The logger. - protected ILogger Logger { get; private set; } - - /// - /// Gets the protobuf serializer. - /// - /// The protobuf serializer. - public IProtobufSerializer ProtobufSerializer { get; set; } - - /// - /// Gets the json serializer. - /// - /// The json serializer. - public IJsonSerializer JsonSerializer { get; set; } - - /// - /// Initializes a new instance of the class. - /// - /// The logger. - /// The json serializer. - /// logger - protected BaseApiClient(ILogger logger) - { - if (logger == null) - { - throw new ArgumentNullException("logger"); - } - - JsonSerializer = new NewtonsoftJsonSerializer(); - Logger = logger; - SerializationFormat = SerializationFormats.Json; - } - - /// - /// Gets or sets the server host name (myserver or 192.168.x.x) - /// - /// The name of the server host. - public string ServerHostName { get; set; } - - /// - /// Gets or sets the port number used by the API - /// - /// The server API port. - public int ServerApiPort { get; set; } - - /// - /// Gets or sets the type of the client. - /// - /// The type of the client. - public ClientType ClientType { get; set; } - - /// - /// Gets or sets the name of the device. - /// - /// The name of the device. - public string DeviceName { get; set; } - - private Guid? _currentUserId; - - /// - /// Gets or sets the current user id. - /// - /// The current user id. - public virtual Guid? CurrentUserId - { - get { return _currentUserId; } - set - { - _currentUserId = value; - ResetAuthorizationHeader(); - } - } - - /// - /// Gets the current api url based on hostname and port. - /// - /// The API URL. - protected string ApiUrl - { - get - { - return string.Format("http://{0}:{1}/mediabrowser", ServerHostName, ServerApiPort); - } - } - - /// - /// Gets the default data format to request from the server - /// - /// The serialization format. - public SerializationFormats SerializationFormat { get; set; } - - /// - /// Resets the authorization header. - /// - private void ResetAuthorizationHeader() - { - if (!CurrentUserId.HasValue) - { - SetAuthorizationHeader(null); - return; - } - - var header = string.Format("UserId=\"{0}\", Client=\"{1}\"", CurrentUserId.Value, ClientType); - - if (!string.IsNullOrEmpty(DeviceName)) - { - header += string.Format(", Device=\"{0}\"", DeviceName); - } - - SetAuthorizationHeader(header); - } - - /// - /// Sets the authorization header. - /// - /// The header. - protected abstract void SetAuthorizationHeader(string header); - - /// - /// Gets the API URL. - /// - /// The handler. - /// System.String. - /// handler - protected string GetApiUrl(string handler) - { - return GetApiUrl(handler, new QueryStringDictionary()); - } - - /// - /// Gets the API URL. - /// - /// The handler. - /// The query string. - /// System.String. - /// handler - protected string GetApiUrl(string handler, QueryStringDictionary queryString) - { - if (string.IsNullOrEmpty(handler)) - { - throw new ArgumentNullException("handler"); - } - - if (queryString == null) - { - throw new ArgumentNullException("queryString"); - } - - return queryString.GetUrl(ApiUrl + "/" + handler); - } - - /// - /// Creates a url to return a list of items - /// - /// The query. - /// The type of list to retrieve. - /// System.String. - /// query - protected string GetItemListUrl(ItemQuery query, string listType = null) - { - if (query == null) - { - throw new ArgumentNullException("query"); - } - - var dict = new QueryStringDictionary { }; - - dict.AddIfNotNullOrEmpty("listtype", listType); - dict.AddIfNotNullOrEmpty("ParentId", query.ParentId); - - dict.AddIfNotNull("startindex", query.StartIndex); - - dict.AddIfNotNull("limit", query.Limit); - - if (query.SortBy != null) - { - dict["sortBy"] = string.Join(",", query.SortBy.Select(s => s.ToString())); - } - - if (query.SortOrder.HasValue) - { - dict["sortOrder"] = query.SortOrder.ToString(); - } - - if (query.Fields != null) - { - dict.Add("fields", query.Fields.Select(f => f.ToString())); - } - if (query.Filters != null) - { - dict.Add("Filters", query.Filters.Select(f => f.ToString())); - } - if (query.ImageTypes != null) - { - dict.Add("ImageTypes", query.ImageTypes.Select(f => f.ToString())); - } - - dict.Add("recursive", query.Recursive); - - dict.AddIfNotNull("genres", query.Genres); - dict.AddIfNotNull("studios", query.Studios); - dict.AddIfNotNull("ExcludeItemTypes", query.ExcludeItemTypes); - dict.AddIfNotNull("IncludeItemTypes", query.IncludeItemTypes); - - dict.AddIfNotNullOrEmpty("person", query.Person); - dict.AddIfNotNullOrEmpty("personType", query.PersonType); - - dict.AddIfNotNull("years", query.Years); - - dict.AddIfNotNullOrEmpty("indexBy", query.IndexBy); - dict.AddIfNotNullOrEmpty("dynamicSortBy", query.DynamicSortBy); - dict.AddIfNotNullOrEmpty("SearchTerm", query.SearchTerm); - - return GetApiUrl("Users/" + query.UserId + "/Items", dict); - } - - /// - /// Gets the image URL. - /// - /// The base URL. - /// The options. - /// The query params. - /// System.String. - /// options - private string GetImageUrl(string baseUrl, ImageOptions options, QueryStringDictionary queryParams) - { - if (options == null) - { - throw new ArgumentNullException("options"); - } - - if (queryParams == null) - { - throw new ArgumentNullException("queryParams"); - } - - if (options.ImageIndex.HasValue) - { - baseUrl += "/" + options.ImageIndex.Value; - } - - queryParams.AddIfNotNull("width", options.Width); - queryParams.AddIfNotNull("height", options.Height); - queryParams.AddIfNotNull("maxWidth", options.MaxWidth); - queryParams.AddIfNotNull("maxHeight", options.MaxHeight); - queryParams.AddIfNotNull("Quality", options.Quality); - - queryParams.AddIfNotNull("tag", options.Tag); - - return GetApiUrl(baseUrl, queryParams); - } - - /// - /// Gets the image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - var index = options.ImageIndex ?? 0; - - if (options.ImageType == ImageType.Backdrop) - { - options.Tag = item.BackdropImageTags[index]; - } - else if (options.ImageType == ImageType.ChapterImage) - { - options.Tag = item.Chapters[index].ImageTag; - } - else - { - options.Tag = item.ImageTags[options.ImageType]; - } - - return GetImageUrl(item.Id, options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The Id of the item - /// The options. - /// System.String. - /// itemId - public string GetImageUrl(string itemId, ImageOptions options) - { - if (string.IsNullOrEmpty(itemId)) - { - throw new ArgumentNullException("itemId"); - } - - var url = "Items/" + itemId + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// Gets the user image URL. - /// - /// The user. - /// The options. - /// System.String. - /// user - public string GetUserImageUrl(UserDto user, ImageOptions options) - { - if (user == null) - { - throw new ArgumentNullException("user"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = user.PrimaryImageTag; - - return GetUserImageUrl(user.Id, options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The Id of the user - /// The options. - /// System.String. - /// userId - public string GetUserImageUrl(Guid userId, ImageOptions options) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - - var url = "Users/" + userId + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// Gets the person image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetPersonImageUrl(BaseItemPerson item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = item.PrimaryImageTag; - - return GetPersonImageUrl(item.Name, options); - } - - /// - /// Gets the person image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetPersonImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = item.ImageTags[ImageType.Primary]; - - return GetPersonImageUrl(item.Name, options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The name of the person - /// The options. - /// System.String. - /// name - public string GetPersonImageUrl(string name, ImageOptions options) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = "Persons/" + name + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// Gets the year image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetYearImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = item.ImageTags[ImageType.Primary]; - - return GetYearImageUrl(int.Parse(item.Name), options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The year. - /// The options. - /// System.String. - public string GetYearImageUrl(int year, ImageOptions options) - { - var url = "Years/" + year + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// Gets the genre image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetGenreImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = item.ImageTags[ImageType.Primary]; - - return GetGenreImageUrl(item.Name, options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The name. - /// The options. - /// System.String. - /// name - public string GetGenreImageUrl(string name, ImageOptions options) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = "Genres/" + name + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// Gets the studio image URL. - /// - /// The item. - /// The options. - /// System.String. - /// item - public string GetStudioImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.Tag = item.ImageTags[ImageType.Primary]; - - return GetStudioImageUrl(item.Name, options); - } - - /// - /// Gets an image url that can be used to download an image from the api - /// - /// The name. - /// The options. - /// System.String. - /// name - public string GetStudioImageUrl(string name, ImageOptions options) - { - if (string.IsNullOrEmpty(name)) - { - throw new ArgumentNullException("name"); - } - - var url = "Studios/" + name + "/Images/" + options.ImageType; - - return GetImageUrl(url, options, new QueryStringDictionary()); - } - - /// - /// 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. - /// - /// A given item. - /// The options. - /// System.String[][]. - /// item - public string[] GetBackdropImageUrls(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.ImageType = ImageType.Backdrop; - - string backdropItemId; - List backdropImageTags; - - if (item.BackdropCount == 0) - { - backdropItemId = item.ParentBackdropItemId; - backdropImageTags = item.ParentBackdropImageTags; - } - else - { - backdropItemId = item.Id; - backdropImageTags = item.BackdropImageTags; - } - - if (string.IsNullOrEmpty(backdropItemId)) - { - return new string[] { }; - } - - var files = new string[backdropImageTags.Count]; - - for (var i = 0; i < backdropImageTags.Count; i++) - { - options.ImageIndex = i; - options.Tag = backdropImageTags[i]; - - files[i] = GetImageUrl(backdropItemId, options); - } - - return files; - } - - /// - /// 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. - /// - /// A given item. - /// The options. - /// System.String. - /// item - public string GetLogoImageUrl(BaseItemDto item, ImageOptions options) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - options.ImageType = ImageType.Logo; - - var logoItemId = item.HasLogo ? item.Id : item.ParentLogoItemId; - var imageTag = item.HasLogo ? item.ImageTags[ImageType.Logo] : item.ParentLogoImageTag; - - if (!string.IsNullOrEmpty(logoItemId)) - { - options.Tag = imageTag; - - return GetImageUrl(logoItemId, options); - } - - return null; - } - - /// - /// Gets the url needed to stream an audio file - /// - /// The options. - /// System.String. - /// options - public string GetAudioStreamUrl(StreamOptions options) - { - if (options == null) - { - throw new ArgumentNullException("options"); - } - - var handler = "Audio/" + options.ItemId + "/stream"; - - if (!string.IsNullOrEmpty(options.OutputFileExtension)) - { - handler += "." + options.OutputFileExtension.TrimStart('.'); - } - - return GetMediaStreamUrl(handler, options, new QueryStringDictionary()); - } - - /// - /// Gets the url needed to stream a video file - /// - /// The options. - /// System.String. - /// options - public string GetVideoStreamUrl(VideoStreamOptions options) - { - if (options == null) - { - throw new ArgumentNullException("options"); - } - - var handler = "Videos/" + options.ItemId + "/stream"; - - if (!string.IsNullOrEmpty(options.OutputFileExtension)) - { - handler += "." + options.OutputFileExtension.TrimStart('.'); - } - - return GetVideoStreamUrl(handler, options); - } - - /// - /// Formulates a url for streaming audio using the HLS protocol - /// - /// The options. - /// System.String. - /// options - public string GetHlsAudioStreamUrl(StreamOptions options) - { - if (options == null) - { - throw new ArgumentNullException("options"); - } - - return GetMediaStreamUrl("audio.m3u8", options, new QueryStringDictionary()); - } - - /// - /// Formulates a url for streaming video using the HLS protocol - /// - /// The options. - /// System.String. - /// options - public string GetHlsVideoStreamUrl(VideoStreamOptions options) - { - if (options == null) - { - throw new ArgumentNullException("options"); - } - - return GetVideoStreamUrl("video.m3u8", options); - } - - /// - /// Gets the video stream URL. - /// - /// The handler. - /// The options. - /// System.String. - private string GetVideoStreamUrl(string handler, VideoStreamOptions options) - { - var queryParams = new QueryStringDictionary(); - - if (options.VideoCodec.HasValue) - { - queryParams["VideoCodec"] = options.VideoCodec.Value.ToString(); - } - - queryParams.AddIfNotNull("VideoBitRate", options.VideoBitRate); - queryParams.AddIfNotNull("Width", options.Width); - queryParams.AddIfNotNull("Height", options.Height); - queryParams.AddIfNotNull("MaxWidth", options.MaxWidth); - queryParams.AddIfNotNull("MaxHeight", options.MaxHeight); - queryParams.AddIfNotNull("FrameRate", options.FrameRate); - queryParams.AddIfNotNull("AudioStreamIndex", options.AudioStreamIndex); - queryParams.AddIfNotNull("VideoStreamIndex", options.VideoStreamIndex); - queryParams.AddIfNotNull("SubtitleStreamIndex", options.SubtitleStreamIndex); - - return GetMediaStreamUrl(handler, options, queryParams); - } - - /// - /// Gets the media stream URL. - /// - /// The handler. - /// The options. - /// The query params. - /// System.String. - /// handler - private string GetMediaStreamUrl(string handler, StreamOptions options, QueryStringDictionary queryParams) - { - if (string.IsNullOrEmpty(handler)) - { - throw new ArgumentNullException("handler"); - } - - if (options == null) - { - throw new ArgumentNullException("options"); - } - - if (queryParams == null) - { - throw new ArgumentNullException("queryParams"); - } - - if (options.AudioCodec.HasValue) - { - queryParams["audioCodec"] = options.AudioCodec.Value.ToString(); - } - - queryParams.AddIfNotNull("audiochannels", options.MaxAudioChannels); - queryParams.AddIfNotNull("audiosamplerate", options.MaxAudioSampleRate); - queryParams.AddIfNotNull("AudioBitRate", options.AudioBitRate); - queryParams.AddIfNotNull("StartTimeTicks", options.StartTimeTicks); - queryParams.AddIfNotNull("Static", options.Static); - - return GetApiUrl(handler, queryParams); - } - - /// - /// Deserializes from stream. - /// - /// - /// The stream. - /// ``0. - protected T DeserializeFromStream(Stream stream) - where T : class - { - return (T)DeserializeFromStream(stream, typeof(T), SerializationFormat); - } - - /// - /// Deserializes from stream. - /// - /// The stream. - /// The type. - /// The format. - /// System.Object. - /// - protected object DeserializeFromStream(Stream stream, Type type, SerializationFormats format) - { - if (format == SerializationFormats.Protobuf) - { - return ProtobufSerializer.DeserializeFromStream(stream, type); - } - if (format == SerializationFormats.Json) - { - return JsonSerializer.DeserializeFromStream(stream, type); - } - - throw new NotImplementedException(); - } - - /// - /// Serializers to json. - /// - /// The obj. - /// System.String. - protected string SerializeToJson(object obj) - { - return JsonSerializer.SerializeToString(obj); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool disposing) - { - - } - } -} diff --git a/MediaBrowser.ApiInteraction/IAsyncHttpClient.cs b/MediaBrowser.ApiInteraction/IAsyncHttpClient.cs deleted file mode 100644 index 0837f150f..000000000 --- a/MediaBrowser.ApiInteraction/IAsyncHttpClient.cs +++ /dev/null @@ -1,49 +0,0 @@ -using MediaBrowser.Model.Logging; -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Interface IHttpClient - /// - public interface IAsyncHttpClient : IDisposable - { - /// - /// Sets the authorization header that should be supplied on every request - /// - /// - void SetAuthorizationHeader(string header); - - /// - /// Gets the stream async. - /// - /// The URL. - /// The logger. - /// The cancellation token. - /// Task{Stream}. - Task GetAsync(string url, ILogger logger, CancellationToken cancellationToken); - - /// - /// Deletes the async. - /// - /// The URL. - /// The logger. - /// The cancellation token. - /// Task. - Task DeleteAsync(string url, ILogger logger, CancellationToken cancellationToken); - - /// - /// Posts the async. - /// - /// The URL. - /// Type of the content. - /// Content of the post. - /// The logger. - /// The cancellation token. - /// Task{Stream}. - Task PostAsync(string url, string contentType, string postContent, ILogger logger, CancellationToken cancellationToken); - } -} diff --git a/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj b/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj deleted file mode 100644 index ceb8aaece..000000000 --- a/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Debug - AnyCPU - {921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422} - Library - Properties - MediaBrowser.ApiInteraction - MediaBrowser.ApiInteraction - v4.5 - 512 - ..\ - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll - - - - - - - - - - - - - - Properties\SharedVersion.cs - - - - - - - - - - - - {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} - MediaBrowser.Model - - - - - - - - - if $(ConfigurationName) == Release ( -xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i -) - - - \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction/NewtonsoftJsonSerializer.cs b/MediaBrowser.ApiInteraction/NewtonsoftJsonSerializer.cs deleted file mode 100644 index f5b43669e..000000000 --- a/MediaBrowser.ApiInteraction/NewtonsoftJsonSerializer.cs +++ /dev/null @@ -1,141 +0,0 @@ -using MediaBrowser.Model.Serialization; -using Newtonsoft.Json; -using System; -using System.IO; - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Class NewtonsoftJsonSerializer - /// - public class NewtonsoftJsonSerializer : IJsonSerializer - { - /// - /// Serializes to stream. - /// - /// The obj. - /// The stream. - /// - /// obj - public void SerializeToStream(object obj, Stream stream) - { - throw new NotImplementedException(); - } - - /// - /// Deserializes from stream. - /// - /// The stream. - /// The type. - /// System.Object. - public object DeserializeFromStream(Stream stream, Type type) - { - using (var streamReader = new StreamReader(stream)) - { - using (var jsonReader = new JsonTextReader(streamReader)) - { - return JsonSerializer.Create(new JsonSerializerSettings()).Deserialize(jsonReader, type); - } - } - } - - /// - /// Deserializes from stream. - /// - /// - /// The stream. - /// ``0. - public T DeserializeFromStream(Stream stream) - { - return (T)DeserializeFromStream(stream, typeof(T)); - } - - /// - /// Deserializes from string. - /// - /// - /// The text. - /// ``0. - /// - public T DeserializeFromString(string text) - { - throw new NotImplementedException(); - } - - /// - /// Deserializes from string. - /// - /// The json. - /// The type. - /// System.Object. - /// - public object DeserializeFromString(string json, Type type) - { - throw new NotImplementedException(); - } - - /// - /// Serializes to string. - /// - /// The obj. - /// System.String. - public string SerializeToString(object obj) - { - using (var streamWriter = new StringWriter()) - { - using (var jsonWriter = new JsonTextWriter((streamWriter))) - { - JsonSerializer.Create(new JsonSerializerSettings()).Serialize(jsonWriter, obj); - } - return streamWriter.ToString(); - } - } - - /// - /// Serializes to bytes. - /// - /// The obj. - /// System.Byte[][]. - /// - public byte[] SerializeToBytes(object obj) - { - throw new NotImplementedException(); - } - - /// - /// Serializes to file. - /// - /// The obj. - /// The file. - /// - /// obj - public void SerializeToFile(object obj, string file) - { - throw new NotImplementedException(); - } - - /// - /// Deserializes from file. - /// - /// The type. - /// The file. - /// System.Object. - /// - public object DeserializeFromFile(Type type, string file) - { - throw new NotImplementedException(); - } - - /// - /// Deserializes from file. - /// - /// - /// The file. - /// ``0. - /// - public T DeserializeFromFile(string file) where T : class - { - throw new NotImplementedException(); - } - } -} diff --git a/MediaBrowser.ApiInteraction/Properties/AssemblyInfo.cs b/MediaBrowser.ApiInteraction/Properties/AssemblyInfo.cs deleted file mode 100644 index e4ed8a6ad..000000000 --- a/MediaBrowser.ApiInteraction/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("MediaBrowser.ApiInteraction")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MediaBrowser.ApiInteraction")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("677618f2-de4b-44f4-8dfd-a90176297ee2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// \ No newline at end of file diff --git a/MediaBrowser.ApiInteraction/SerializationFormats.cs b/MediaBrowser.ApiInteraction/SerializationFormats.cs deleted file mode 100644 index 9bfba7c50..000000000 --- a/MediaBrowser.ApiInteraction/SerializationFormats.cs +++ /dev/null @@ -1,18 +0,0 @@ - -namespace MediaBrowser.ApiInteraction -{ - /// - /// Enum SerializationFormats - /// - public enum SerializationFormats - { - /// - /// The json - /// - Json, - /// - /// The protobuf - /// - Protobuf - } -} diff --git a/MediaBrowser.ApiInteraction/packages.config b/MediaBrowser.ApiInteraction/packages.config deleted file mode 100644 index b82a8b0dd..000000000 --- a/MediaBrowser.ApiInteraction/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index 4adff8380..831b111ec 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -149,20 +149,48 @@ - - - - - - - - - - - - - - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/MediaBrowser.Common.Implementations/swagger-ui/index.html b/MediaBrowser.Common.Implementations/swagger-ui/index.html index 5d2a8d88d..0b2b02b10 100644 --- a/MediaBrowser.Common.Implementations/swagger-ui/index.html +++ b/MediaBrowser.Common.Implementations/swagger-ui/index.html @@ -42,7 +42,7 @@