diff --git a/OF DL/Helpers/APIHelper.cs b/OF DL/Helpers/APIHelper.cs index 802ea3a..8acf0e2 100644 --- a/OF DL/Helpers/APIHelper.cs +++ b/OF DL/Helpers/APIHelper.cs @@ -26,6 +26,9 @@ namespace OF_DL.Helpers; public class APIHelper : IAPIHelper { + private const int MAX_RETRIES = 10; + private const int DELAY_BEFORE_RETRY = 1000; + private static readonly JsonSerializerSettings m_JsonSerializerSettings; private readonly IDBHelper m_DBHelper; private readonly IDownloadConfig downloadConfig; @@ -119,18 +122,31 @@ public class APIHelper : IAPIHelper } - private async Task BuildHeaderAndExecuteRequests(Dictionary getParams, string endpoint, HttpClient client, HttpMethod? method = null) + private async Task BuildHeaderAndExecuteRequests(Dictionary getParams, string endpoint, HttpClient client, HttpMethod? method = null, int retryCount = 0) { - Log.Debug("Calling BuildHeaderAndExecuteRequests"); + Log.Debug("Calling BuildHeaderAndExecuteRequests -- Attempt number: {AttemptNumber}", retryCount + 1); - HttpRequestMessage request = await BuildHttpRequestMessage(getParams, endpoint, method); - using var response = await client.SendAsync(request); - response.EnsureSuccessStatusCode(); - string body = await response.Content.ReadAsStringAsync(); + try + { + HttpRequestMessage request = await BuildHttpRequestMessage(getParams, endpoint, method); + using var response = await client.SendAsync(request); + response.EnsureSuccessStatusCode(); + string body = await response.Content.ReadAsStringAsync(); - Log.Debug(body); + Log.Debug(body); - return body; + return body; + } + catch (HttpRequestException ex) + { + if (ex.StatusCode == System.Net.HttpStatusCode.TooManyRequests && retryCount < MAX_RETRIES) + { + await Task.Delay(DELAY_BEFORE_RETRY); + return await BuildHeaderAndExecuteRequests(getParams, endpoint, client, method, ++retryCount); + } + + throw; + } } @@ -299,13 +315,16 @@ public class APIHelper : IAPIHelper } - public async Task?> GetAllSubscriptions(Dictionary getParams, string endpoint, bool includeRestricted, IDownloadConfig config) + public async Task?> GetAllSubscriptions(Dictionary getParams, int limit, string endpoint, bool includeRestricted, IDownloadConfig config) { try { Dictionary users = new(); Subscriptions subscriptions = new(); + int offset = 0; + getParams["offset"] = offset.ToString(); + Log.Debug("Calling GetAllSubscrptions"); string? body = await BuildHeaderAndExecuteRequests(getParams, endpoint, httpClient); @@ -313,7 +332,8 @@ public class APIHelper : IAPIHelper subscriptions = JsonConvert.DeserializeObject(body); if (subscriptions != null && subscriptions.hasMore) { - getParams["offset"] = subscriptions.list.Count.ToString(); + offset += limit; + getParams["offset"] = offset.ToString(); while (true) { @@ -334,7 +354,9 @@ public class APIHelper : IAPIHelper { break; } - getParams["offset"] = subscriptions.list.Count.ToString(); + + offset += limit; + getParams["offset"] = offset.ToString(); } } @@ -368,46 +390,51 @@ public class APIHelper : IAPIHelper public async Task?> GetActiveSubscriptions(string endpoint, bool includeRestricted, IDownloadConfig config) { + int limit = 50; Dictionary getParams = new() { - { "offset", "0" }, - { "limit", "50" }, + { "limit", $"{limit}" }, { "type", "active" }, { "format", "infinite"} }; - return await GetAllSubscriptions(getParams, endpoint, includeRestricted, config); + Log.Debug("Calling GetActiveSubscriptions"); + AnsiConsole.Markup($"[red]Getting Active Subscriptions (Include Restricted: {includeRestricted})\n[/]"); + + return await GetAllSubscriptions(getParams, limit, endpoint, includeRestricted, config); } public async Task?> GetExpiredSubscriptions(string endpoint, bool includeRestricted, IDownloadConfig config) { + int limit = 50; Dictionary getParams = new() { - { "offset", "0" }, - { "limit", "50" }, + { "limit", $"{limit}" }, { "type", "expired" }, { "format", "infinite"} }; Log.Debug("Calling GetExpiredSubscriptions"); + AnsiConsole.Markup($"[red]Getting Expired Subscriptions (Include Restricted: {includeRestricted})\n[/]"); - return await GetAllSubscriptions(getParams, endpoint, includeRestricted, config); + return await GetAllSubscriptions(getParams, limit, endpoint, includeRestricted, config); } public async Task?> GetBlockedUsers(string endpoint, IDownloadConfig config) { + int limit = 50; Dictionary getParams = new() { - { "offset", "0" }, - { "limit", "50" }, + { "limit", $"{limit}" }, { "type", "expired" }, { "format", "infinite"} }; Log.Debug("Calling GetBlockedUsers"); + AnsiConsole.Markup($"[red]Getting Blocked Users\n[/]"); - return await GetAllSubscriptions(getParams, endpoint, true, config); + return await GetAllSubscriptions(getParams, limit, endpoint, true, config); } public async Task> GetLists(string endpoint, IDownloadConfig config) @@ -1172,7 +1199,7 @@ public class APIHelper : IAPIHelper } break; case VideoResolution._240: - if(medium.videoSources != null) + if (medium.videoSources != null) { if (!string.IsNullOrEmpty(medium.videoSources._240)) { @@ -1199,7 +1226,7 @@ public class APIHelper : IAPIHelper } } break; - + } } else if (medium.canView && medium.files != null && medium.files.drm != null) diff --git a/OF DL/Program.cs b/OF DL/Program.cs index 2930d7f..b694ee2 100644 --- a/OF DL/Program.cs +++ b/OF DL/Program.cs @@ -893,10 +893,6 @@ public class Program { const string OUTPUT_FILE = "blocked-users.json"; - Log.Debug($"Calling GetBlockedUsers"); - - AnsiConsole.Markup($"[red]Getting Blocked Users\n[/]"); - Dictionary? blockedUsers = await m_ApiHelper.GetBlockedUsers("/users/blocked", Config); if (blockedUsers is null || blockedUsers.Count == 0)