diff --git a/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs b/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs index 7cdb233..e8f1e7e 100644 --- a/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs +++ b/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net; using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; using DiscordChatExporter.Domain.Internal; using DiscordChatExporter.Domain.Internal.Extensions; +using Polly; +using Polly.Retry; namespace DiscordChatExporter.Domain.Exporting { @@ -13,27 +16,35 @@ namespace DiscordChatExporter.Domain.Exporting { private readonly HttpClient _httpClient = Singleton.HttpClient; private readonly string _workingDirPath; + private readonly AsyncRetryPolicy _httpRequestPolicy; private readonly Dictionary _pathMap = new Dictionary(); public MediaDownloader(string workingDirPath) { _workingDirPath = workingDirPath; + + _httpRequestPolicy = Policy + .Handle() + .WaitAndRetryAsync(8, i => TimeSpan.FromSeconds(0.5 * i)); } public async ValueTask DownloadAsync(string url) { - if (_pathMap.TryGetValue(url, out var cachedFilePath)) - return cachedFilePath; + return await _httpRequestPolicy.ExecuteAsync(async () => + { + if (_pathMap.TryGetValue(url, out var cachedFilePath)) + return cachedFilePath; - var fileName = GetFileNameFromUrl(url); - var filePath = PathEx.MakeUniqueFilePath(Path.Combine(_workingDirPath, fileName)); + var fileName = GetFileNameFromUrl(url); + var filePath = PathEx.MakeUniqueFilePath(Path.Combine(_workingDirPath, fileName)); - Directory.CreateDirectory(_workingDirPath); + Directory.CreateDirectory(_workingDirPath); - await _httpClient.DownloadAsync(url, filePath); + await _httpClient.DownloadAsync(url, filePath); - return _pathMap[url] = filePath; + return _pathMap[url] = filePath; + }); } }