diff --git a/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs b/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs index 338814c..089788b 100644 --- a/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs +++ b/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Threading.Tasks; using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.Options; -using ZonyLrcTools.Cli.Infrastructure.Tag; using ZonyLrcTools.Common; using ZonyLrcTools.Common.Album; using ZonyLrcTools.Common.Configuration; @@ -14,7 +13,6 @@ using ZonyLrcTools.Common.Infrastructure.IO; using ZonyLrcTools.Common.Infrastructure.Logging; using ZonyLrcTools.Common.Infrastructure.Threading; using ZonyLrcTools.Common.Lyrics; -using File = System.IO.File; namespace ZonyLrcTools.Cli.Commands.SubCommand { @@ -22,24 +20,22 @@ namespace ZonyLrcTools.Cli.Commands.SubCommand public class DownloadCommand : ToolCommandBase { private readonly ILyricsDownloader _lyricsDownloader; - private readonly IFileScanner _fileScanner; + private readonly IMusicInfoLoader _musicInfoLoader; private readonly IEnumerable _albumDownloaderList; - private readonly ITagLoader _tagLoader; - private readonly IWarpLogger _logger; + private readonly IWarpLogger _logger; private readonly GlobalOptions _options; - public DownloadCommand(IFileScanner fileScanner, - IOptions options, + public DownloadCommand(IOptions options, IEnumerable albumDownloaderList, - ITagLoader tagLoader, - ILyricsDownloader lyricsDownloader, IWarpLogger logger) + ILyricsDownloader lyricsDownloader, + IWarpLogger logger, + IMusicInfoLoader musicInfoLoader) { - _fileScanner = fileScanner; _albumDownloaderList = albumDownloaderList; - _tagLoader = tagLoader; _lyricsDownloader = lyricsDownloader; _logger = logger; + _musicInfoLoader = musicInfoLoader; _options = options.Value; } @@ -64,39 +60,19 @@ namespace ZonyLrcTools.Cli.Commands.SubCommand { if (DownloadLyric) { - await _lyricsDownloader.DownloadAsync( - await LoadMusicInfoAsync( - RemoveExistLyricFiles( - await ScanMusicFilesAsync())), ParallelNumber); + await _lyricsDownloader.DownloadAsync(await _musicInfoLoader.LoadAsync(SongsDirectory, ParallelNumber), ParallelNumber); } if (DownloadAlbum) { - await DownloadAlbumAsync( - await LoadMusicInfoAsync( - await ScanMusicFilesAsync())); + // await DownloadAlbumAsync( + // await LoadMusicInfoAsync( + // await ScanMusicFilesAsync())); } return 0; } - private async Task> ScanMusicFilesAsync() - { - var files = (await _fileScanner.ScanAsync(SongsDirectory, _options.SupportFileExtensions)) - .SelectMany(t => t.FilePaths) - .ToList(); - - if (files.Count == 0) - { - await _logger.ErrorAsync("没有找到任何音乐文件。"); - throw new ErrorCodeException(ErrorCodes.NoFilesWereScanned); - } - - await _logger.InfoAsync($"已经扫描到了 {files.Count} 个音乐文件。"); - - return files; - } - private List RemoveExistLyricFiles(List filePaths) { if (!_options.Provider.Lyric.Config.IsSkipExistLyricFiles) @@ -118,21 +94,6 @@ namespace ZonyLrcTools.Cli.Commands.SubCommand .ToList(); } - private async Task> LoadMusicInfoAsync(IReadOnlyCollection files) - { - await _logger.InfoAsync("开始加载音乐文件的标签信息..."); - - var warpTask = new WarpTask(ParallelNumber); - var warpTaskList = files.Select(file => warpTask.RunAsync(() => Task.Run(async () => await _tagLoader.LoadTagAsync(file)))); - var result = (await Task.WhenAll(warpTaskList)) - .Where(m => m != null) - .Where(m => !string.IsNullOrEmpty(m.Name) || !string.IsNullOrEmpty(m.Artist)) - .ToList(); - - await _logger.InfoAsync($"已成功加载 {files.Count} 个音乐文件的标签信息。"); - return result; - } - #region > Ablum image download logic < private async ValueTask DownloadAlbumAsync(List musicInfos) diff --git a/src/ZonyLrcTools.Common/IMusicInfoLoader.cs b/src/ZonyLrcTools.Common/IMusicInfoLoader.cs new file mode 100644 index 0000000..66e42fc --- /dev/null +++ b/src/ZonyLrcTools.Common/IMusicInfoLoader.cs @@ -0,0 +1,12 @@ +namespace ZonyLrcTools.Common; + +public interface IMusicInfoLoader +{ + Task> LoadAsync(string dirPath, + int parallelCount = 2, + CancellationToken cancellationToken = default); + + Task> LoadAsync(IReadOnlyCollection filePaths, + int parallelCount = 2, + CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/ZonyLrcTools.Common/Infrastructure/IO/FileScannerExtensions.cs b/src/ZonyLrcTools.Common/Infrastructure/IO/FileScannerExtensions.cs new file mode 100644 index 0000000..a76b69b --- /dev/null +++ b/src/ZonyLrcTools.Common/Infrastructure/IO/FileScannerExtensions.cs @@ -0,0 +1,15 @@ +namespace ZonyLrcTools.Common.Infrastructure.IO; + +public static class FileScannerExtensions +{ + public static async Task> ScanMusicFilesAsync(this IFileScanner fileScanner, + string dirPath, + IEnumerable extensions) + { + var files = (await fileScanner.ScanAsync(dirPath, extensions)) + .SelectMany(t => t.FilePaths) + .ToList(); + + return files; + } +} \ No newline at end of file diff --git a/src/ZonyLrcTools.Common/Lyrics/DefaultLyricsDownloader.cs b/src/ZonyLrcTools.Common/Lyrics/DefaultLyricsDownloader.cs index 6580a99..ae466e5 100644 --- a/src/ZonyLrcTools.Common/Lyrics/DefaultLyricsDownloader.cs +++ b/src/ZonyLrcTools.Common/Lyrics/DefaultLyricsDownloader.cs @@ -40,7 +40,7 @@ public class DefaultLyricsDownloader : ILyricsDownloader, ISingletonDependency CancellationToken cancellationToken = default) { await _logger.InfoAsync("开始下载歌词文件数据..."); - + if (parallelCount <= 0) { parallelCount = 1; diff --git a/src/ZonyLrcTools.Common/MusicInfoLoader.cs b/src/ZonyLrcTools.Common/MusicInfoLoader.cs new file mode 100644 index 0000000..8ab92c9 --- /dev/null +++ b/src/ZonyLrcTools.Common/MusicInfoLoader.cs @@ -0,0 +1,69 @@ +using Microsoft.Extensions.Options; +using ZonyLrcTools.Common.Configuration; +using ZonyLrcTools.Common.Infrastructure.Exceptions; +using ZonyLrcTools.Common.Infrastructure.IO; +using ZonyLrcTools.Common.Infrastructure.Logging; +using ZonyLrcTools.Common.Infrastructure.Threading; +using ZonyLrcTools.Common.TagInfo; + +namespace ZonyLrcTools.Common; + +public class MusicInfoLoader : IMusicInfoLoader +{ + private readonly IWarpLogger _logger; + private readonly IFileScanner _fileScanner; + private readonly ITagLoader _tagLoader; + private readonly GlobalOptions _options; + + public MusicInfoLoader(IWarpLogger logger, + ITagLoader tagLoader, + IFileScanner fileScanner, + IOptions options) + { + _logger = logger; + _tagLoader = tagLoader; + _fileScanner = fileScanner; + _options = options.Value; + } + + public async Task> LoadAsync(string dirPath, + int parallelCount = 2, + CancellationToken cancellationToken = default) + { + var files = (await _fileScanner.ScanMusicFilesAsync(dirPath, _options.SupportFileExtensions)).ToList(); + + if (files.Count == 0) + { + await _logger.ErrorAsync("没有找到任何音乐文件。"); + throw new ErrorCodeException(ErrorCodes.NoFilesWereScanned); + } + + await _logger.InfoAsync($"已经扫描到了 {files.Count} 个音乐文件。"); + + return await LoadAsync(files, parallelCount, cancellationToken); + } + + public async Task> LoadAsync(IReadOnlyCollection filePaths, + int parallelCount = 2, + CancellationToken cancellationToken = default) + { + await _logger.InfoAsync("开始加载音乐文件的标签信息..."); + + var warpTask = new WarpTask(parallelCount); + var warpTaskList = filePaths.Select(file => + warpTask.RunAsync(() => + Task.Run(async () => + await _tagLoader.LoadTagAsync(file), + cancellationToken), + cancellationToken)); + + var result = (await Task.WhenAll(warpTaskList)) + .Where(m => m != null) + .Where(m => !string.IsNullOrEmpty(m?.Name) || !string.IsNullOrEmpty(m?.Artist)) + .ToList(); + + await _logger.InfoAsync($"已成功加载 {filePaths.Count} 个音乐文件的标签信息。"); + + return result; + } +} \ No newline at end of file diff --git a/src/ZonyLrcTools.Common/TagInfo/DefaultTagLoader.cs b/src/ZonyLrcTools.Common/TagInfo/DefaultTagLoader.cs index 3d1130c..7b9449c 100644 --- a/src/ZonyLrcTools.Common/TagInfo/DefaultTagLoader.cs +++ b/src/ZonyLrcTools.Common/TagInfo/DefaultTagLoader.cs @@ -1,15 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using ZonyLrcTools.Common; +using ZonyLrcTools.Cli.Infrastructure.Tag; using ZonyLrcTools.Common.Configuration; using ZonyLrcTools.Common.Infrastructure.DependencyInject; using ZonyLrcTools.Common.Infrastructure.Exceptions; -namespace ZonyLrcTools.Cli.Infrastructure.Tag +namespace ZonyLrcTools.Common.TagInfo { /// /// 默认的标签加载器 实现。 @@ -37,7 +33,7 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag _sortedTagInfoProviders = GetTagInfoProviders(); } - public virtual async ValueTask LoadTagAsync(string filePath) + public virtual async ValueTask LoadTagAsync(string filePath) { foreach (var provider in _sortedTagInfoProviders) { diff --git a/src/ZonyLrcTools.Common/TagInfo/ITagLoader.cs b/src/ZonyLrcTools.Common/TagInfo/ITagLoader.cs index cfa4f00..2bc287d 100644 --- a/src/ZonyLrcTools.Common/TagInfo/ITagLoader.cs +++ b/src/ZonyLrcTools.Common/TagInfo/ITagLoader.cs @@ -1,7 +1,4 @@ -using System.Threading.Tasks; -using ZonyLrcTools.Common; - -namespace ZonyLrcTools.Cli.Infrastructure.Tag +namespace ZonyLrcTools.Common.TagInfo { /// /// 标签加载器,用于加载文件的音乐标签信息。 @@ -13,6 +10,6 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag /// /// 歌曲文件的路径。 /// 加载完成的歌曲信息。 - ValueTask LoadTagAsync(string filePath); + ValueTask LoadTagAsync(string filePath); } } \ No newline at end of file diff --git a/tests/ZonyLrcTools.Tests/Infrastructure/Tag/TagLoaderTests.cs b/tests/ZonyLrcTools.Tests/Infrastructure/Tag/TagLoaderTests.cs index c42ea55..8ce6174 100644 --- a/tests/ZonyLrcTools.Tests/Infrastructure/Tag/TagLoaderTests.cs +++ b/tests/ZonyLrcTools.Tests/Infrastructure/Tag/TagLoaderTests.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Shouldly; using Xunit; using ZonyLrcTools.Cli.Infrastructure.Tag; +using ZonyLrcTools.Common.TagInfo; namespace ZonyLrcTools.Tests.Infrastructure.Tag {