diff --git a/CloudConvert.API/CloudConvert.API.csproj b/CloudConvert.API/CloudConvert.API.csproj
index fde5168..74b45a5 100644
--- a/CloudConvert.API/CloudConvert.API.csproj
+++ b/CloudConvert.API/CloudConvert.API.csproj
@@ -18,6 +18,8 @@
+
+
diff --git a/CloudConvert.API/CloudConvertAPI.cs b/CloudConvert.API/CloudConvertAPI.cs
index b329c9a..f6287ba 100644
--- a/CloudConvert.API/CloudConvertAPI.cs
+++ b/CloudConvert.API/CloudConvertAPI.cs
@@ -5,290 +5,295 @@
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
-using System.Threading.Tasks;
using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using CloudConvert.API.Models;
using CloudConvert.API.Models.JobModels;
using CloudConvert.API.Models.TaskModels;
-using CloudConvert.API.Models;
-using System.Threading;
-namespace CloudConvert.API
+namespace CloudConvert.API;
+
+public interface ICloudConvertAPI
{
- public interface ICloudConvertAPI
+ #region Jobs
+ Task> GetAllJobsAsync(JobListFilter jobFilter, CancellationToken cancellationToken = default);
+ Task> CreateJobAsync(JobCreateRequest request, CancellationToken cancellationToken = default);
+ Task> GetJobAsync(string id, CancellationToken cancellationToken = default);
+ Task> WaitJobAsync(string id, CancellationToken cancellationToken = default);
+ Task DeleteJobAsync(string id, CancellationToken cancellationToken = default);
+ #endregion
+
+ #region Tasks
+ Task> GetAllTasksAsync(TaskListFilter jobFilter, CancellationToken cancellationToken = default);
+ Task> CreateTaskAsync(string operation, T request, CancellationToken cancellationToken = default);
+ Task> GetTaskAsync(string id, string include = null, CancellationToken cancellationToken = default);
+ Task> WaitTaskAsync(string id, CancellationToken cancellationToken = default);
+ Task DeleteTaskAsync(string id, CancellationToken cancellationToken = default);
+ #endregion
+
+ Task UploadAsync(string url, byte[] file, string fileName, object parameters, CancellationToken cancellationToken = default);
+ Task UploadAsync(string url, Stream file, string fileName, object parameters, CancellationToken cancellationToken = default);
+ bool ValidateWebhookSignatures(string payloadString, string signature, string signingSecret);
+ string CreateSignedUrl(string baseUrl, string signingSecret, JobCreateRequest job, string cacheKey = null);
+}
+
+public class CloudConvertAPI : ICloudConvertAPI
+{
+ readonly string _apiUrl;
+ readonly string _apiSyncUrl;
+
+ readonly RestHelper _restHelper;
+ readonly string _api_key = "Bearer ";
+ private const string SandboxUrlApi = "https://api.sandbox.cloudconvert.com/v2";
+ private const string PublicUrlApi = "https://api.cloudconvert.com/v2";
+ private const string SandboxUrlSyncApi = "https://sync.api.sandbox.cloudconvert.com/v2";
+ private const string PublicUrlSyncApi = "https://sync.api.cloudconvert.com/v2";
+ static readonly char[] base64Padding = { '=' };
+
+ internal CloudConvertAPI(RestHelper restHelper, string api_key, bool isSandbox = false)
{
- #region Jobs
- Task> GetAllJobsAsync(JobListFilter jobFilter, CancellationToken cancellationToken = default);
- Task> CreateJobAsync(JobCreateRequest request, CancellationToken cancellationToken = default);
- Task> GetJobAsync(string id, CancellationToken cancellationToken = default);
- Task> WaitJobAsync(string id, CancellationToken cancellationToken = default);
- Task DeleteJobAsync(string id, CancellationToken cancellationToken = default);
- #endregion
-
- #region Tasks
- Task> GetAllTasksAsync(TaskListFilter jobFilter, CancellationToken cancellationToken = default);
- Task> CreateTaskAsync(string operation, T request, CancellationToken cancellationToken = default);
- Task> GetTaskAsync(string id, string include = null, CancellationToken cancellationToken = default);
- Task> WaitTaskAsync(string id, CancellationToken cancellationToken = default);
- Task DeleteTaskAsync(string id, CancellationToken cancellationToken = default);
- #endregion
-
- Task UploadAsync(string url, byte[] file, string fileName, object parameters, CancellationToken cancellationToken = default);
- Task UploadAsync(string url, Stream file, string fileName, object parameters, CancellationToken cancellationToken = default);
- bool ValidateWebhookSignatures(string payloadString, string signature, string signingSecret);
- string CreateSignedUrl(string baseUrl, string signingSecret, JobCreateRequest job, string cacheKey = null);
+ _apiUrl = isSandbox ? SandboxUrlApi : PublicUrlApi;
+ _apiSyncUrl = isSandbox ? SandboxUrlSyncApi : PublicUrlSyncApi;
+ _api_key = $"Bearer {api_key}";
+ _restHelper = restHelper;
}
- public class CloudConvertAPI : ICloudConvertAPI
+ public CloudConvertAPI(string api_key, bool isSandbox = false)
+ : this(new RestHelper(), api_key, isSandbox)
{
- readonly string _apiUrl;
- readonly string _apiSyncUrl;
-
- readonly RestHelper _restHelper;
- readonly string _api_key = "Bearer ";
- const string sandboxUrlApi = "https://api.sandbox.cloudconvert.com/v2";
- const string publicUrlApi = "https://api.cloudconvert.com/v2";
- const string sandboxUrlSyncApi = "https://sync.api.sandbox.cloudconvert.com/v2";
- const string publicUrlSyncApi = "https://sync.api.cloudconvert.com/v2";
- static readonly char[] base64Padding = { '=' };
-
- internal CloudConvertAPI(RestHelper restHelper, string api_key, bool isSandbox = false)
- {
- _apiUrl = isSandbox ? sandboxUrlApi : publicUrlApi;
- _apiSyncUrl = isSandbox ? sandboxUrlSyncApi : publicUrlSyncApi;
- _api_key += api_key;
- _restHelper = restHelper;
- }
+ }
- public CloudConvertAPI(string api_key, bool isSandbox = false)
- : this(new RestHelper(), api_key, isSandbox)
- {
- }
+ public CloudConvertAPI(string url, string api_key)
+ {
+ _apiUrl = url;
+ _api_key = $"Bearer {api_key}";
+ _restHelper = new RestHelper();
+ }
- public CloudConvertAPI(string url, string api_key)
- {
- _apiUrl = url;
- _api_key += api_key;
- _restHelper = new RestHelper();
- }
+ private HttpRequestMessage GetRequest(string endpoint, HttpMethod method, object model = null)
+ {
+ var request = new HttpRequestMessage { RequestUri = new Uri(endpoint), Method = method };
- private HttpRequestMessage GetRequest(string endpoint, HttpMethod method, object model = null)
+ if (model is not null)
{
- var request = new HttpRequestMessage { RequestUri = new Uri(endpoint), Method = method };
+ var content = new StringContent(JsonSerializer.Serialize(model, DefaultJsonSerializerOptions.SerializerOptions), Encoding.UTF8, "application/json");
+ request.Content = content;
+ }
- if (model != null)
- {
- var content = new StringContent(JsonSerializer.Serialize(model, DefaultJsonSerializerOptions.SerializerOptions), Encoding.UTF8, "application/json");
- request.Content = content;
- }
+ request.Headers.Add("Authorization", _api_key);
+ request.Headers.Add("User-Agent", "cloudconvert-dotnet/v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + " (https://github.com/cloudconvert/cloudconvert-dotnet)");
- request.Headers.Add("Authorization", _api_key);
- request.Headers.Add("User-Agent", "cloudconvert-dotnet/v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + " (https://github.com/cloudconvert/cloudconvert-dotnet)");
+ return request;
+ }
- return request;
- }
+ private HttpRequestMessage GetMultipartFormDataRequest(string endpoint, HttpMethod method, HttpContent fileContent, string fileName, Dictionary parameters = null)
+ {
+ var content = new MultipartFormDataContent();
+ var request = new HttpRequestMessage { RequestUri = new Uri(endpoint), Method = method, };
- private HttpRequestMessage GetMultipartFormDataRequest(string endpoint, HttpMethod method, HttpContent fileContent, string fileName, Dictionary parameters = null)
+ if (parameters is not null)
{
- var content = new MultipartFormDataContent();
- var request = new HttpRequestMessage { RequestUri = new Uri(endpoint), Method = method, };
-
- if (parameters != null)
+ foreach (var param in parameters)
{
- foreach (var param in parameters)
- {
- content.Add(new StringContent(param.Value), param.Key);
- }
+ content.Add(new StringContent(param.Value), param.Key);
}
+ }
- fileContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{new string(Encoding.UTF8.GetBytes(fileName).Select(b => (char)b).ToArray())}\"");
- content.Add(fileContent);
+ fileContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{new string(Encoding.UTF8.GetBytes(fileName).Select(b => (char)b).ToArray())}\"");
+ content.Add(fileContent);
- request.Content = content;
+ request.Content = content;
- return request;
- }
+ return request;
+ }
- #region Jobs
-
- ///
- /// List all jobs. Requires the task.read scope.
- ///
- ///
- ///
- ///
- /// The list of jobs. You can find details about the job model response in the documentation about the show jobs endpoint.
- ///
- public Task> GetAllJobsAsync(JobListFilter jobFilter, CancellationToken cancellationToken = default)
- => _restHelper.RequestAsync>(GetRequest($"{_apiUrl}/jobs?filter[status]={jobFilter.Status}&filter[tag]={jobFilter.Tag}&include={jobFilter.Include}&per_page={jobFilter.PerPage}&page={jobFilter.Page}", HttpMethod.Get), cancellationToken);
-
- ///
- /// Create a job with one ore more tasks. Requires the task.write scope.
- ///
- ///
- ///
- ///
- /// The created job. You can find details about the job model response in the documentation about the show jobs endpoint.
- ///
- public Task> CreateJobAsync(JobCreateRequest model, CancellationToken cancellationToken = default)
- => _restHelper.RequestAsync>(GetRequest($"{_apiUrl}/jobs", HttpMethod.Post, model), cancellationToken);
-
- ///
- /// Show a job. Requires the task.read scope.
- ///
- ///
- ///
- ///
- public Task> GetJobAsync(string id, CancellationToken cancellationToken = default)
- => _restHelper.RequestAsync>(GetRequest($"{_apiUrl}/jobs/{id}", HttpMethod.Get), cancellationToken);
-
- ///
- /// Wait until the job status is finished or error. This makes the request block until the job has been completed. Requires the task.read scope.
- ///
- /// We do not recommend using this for long running jobs (e.g. video encodings).
- /// Your system might automatically time out requests if there is not data transferred for a longer time.
- /// In general, please avoid to block your application until a CloudConvert job completes.
- /// There might be cases in which we need to queue your job which results in longer processing times than usual.
- /// Using an asynchronous approach with webhooks is beneficial in such cases.
- ///
- ///
- ///
- ///
- /// The finished or failed job, including tasks. You can find details about the job model response in the documentation about the show job endpoint.
- ///
- public Task> WaitJobAsync(string id, CancellationToken cancellationToken = default)
- => _restHelper.RequestAsync>(GetRequest($"{_apiSyncUrl}/jobs/{id}", HttpMethod.Get), cancellationToken);
-
- ///
- /// Delete a job, including all tasks and data. Requires the task.write scope.
- /// Jobs are deleted automatically 24 hours after they have ended.
- ///
- ///
- ///
- ///
- /// An empty response with HTTP Code 204.
- ///
- public Task DeleteJobAsync(string id, CancellationToken cancellationToken = default)
- => _restHelper.RequestAsync