feat: Support multiple downloaders.

支持多个下载器。
This commit is contained in:
real-zony 2021-05-11 00:41:53 +08:00
parent 172453b83f
commit 6300acf4bf

View File

@ -111,23 +111,38 @@ namespace ZonyLrcTools.Cli.Commands
return result.ToImmutableList(); return result.ToImmutableList();
} }
private IEnumerable<ILyricDownloader> GetLyricDownloaderList()
{
var downloader = _options.LyricDownloaderOptions
.Where(op => op.Priority != -1)
.OrderBy(op => op.Priority)
.Join(_lyricDownloaderList,
op => op.Name,
loader => loader.DownloaderName,
(op, loader) => loader);
return downloader;
}
#region > < #region > <
private async ValueTask DownloadLyricFilesAsync(ImmutableList<MusicInfo> musicInfos) private async ValueTask DownloadLyricFilesAsync(ImmutableList<MusicInfo> musicInfos)
{ {
_logger.LogInformation("开始下载歌词文件数据..."); _logger.LogInformation("开始下载歌词文件数据...");
var downloader = _lyricDownloaderList.FirstOrDefault(d => d.DownloaderName == InternalLyricDownloaderNames.NetEase); var downloaderList = GetLyricDownloaderList();
var warpTask = new WarpTask(ParallelNumber); var warpTask = new WarpTask(ParallelNumber);
var warpTaskList = musicInfos.Select(info => var warpTaskList = musicInfos.Select(info =>
warpTask.RunAsync(() => Task.Run(async () => await DownloadLyricTaskLogicAsync(downloader, info)))); warpTask.RunAsync(() => Task.Run(async () => await DownloadLyricTaskLogicAsync(downloaderList, info))));
await Task.WhenAll(warpTaskList); await Task.WhenAll(warpTaskList);
_logger.LogInformation($"歌词数据下载完成,成功: {musicInfos.Count} 失败{0}。"); _logger.LogInformation($"歌词数据下载完成,成功: {musicInfos.Count} 失败{0}。");
} }
private async Task DownloadLyricTaskLogicAsync(ILyricDownloader downloader, MusicInfo info) private async Task DownloadLyricTaskLogicAsync(IEnumerable<ILyricDownloader> downloaderList, MusicInfo info)
{
async Task<bool> InternalDownloadLogicAsync(ILyricDownloader downloader)
{ {
try try
{ {
@ -135,12 +150,12 @@ namespace ZonyLrcTools.Cli.Commands
var filePath = Path.Combine(Path.GetDirectoryName(info.FilePath)!, $"{Path.GetFileNameWithoutExtension(info.FilePath)}.lrc"); var filePath = Path.Combine(Path.GetDirectoryName(info.FilePath)!, $"{Path.GetFileNameWithoutExtension(info.FilePath)}.lrc");
if (File.Exists(filePath)) if (File.Exists(filePath))
{ {
return; return true;
} }
if (lyric.IsPruneMusic) if (lyric.IsPruneMusic)
{ {
return; return true;
} }
await using var stream = new FileStream(filePath, FileMode.Create); await using var stream = new FileStream(filePath, FileMode.Create);
@ -150,8 +165,24 @@ namespace ZonyLrcTools.Cli.Commands
} }
catch (ErrorCodeException ex) catch (ErrorCodeException ex)
{ {
if (ex.ErrorCode == ErrorCodes.NoMatchingSong)
{
return false;
}
_logger.LogWarningInfo(ex); _logger.LogWarningInfo(ex);
} }
return true;
}
foreach (var downloader in downloaderList)
{
if (await InternalDownloadLogicAsync(downloader))
{
break;
}
}
} }
#endregion #endregion