@ -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 < string , string > _pathMap = new Dictionary < string , string > ( ) ;
public MediaDownloader ( string workingDirPath )
{
_workingDirPath = workingDirPath ;
_httpRequestPolicy = Policy
. Handle < IOException > ( )
. WaitAndRetryAsync ( 8 , i = > TimeSpan . FromSeconds ( 0.5 * i ) ) ;
}
public async ValueTask < string > 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 ;
} ) ;
}
}