using System.Threading.Tasks; using ZonyLrcTools.Cli.Infrastructure.DependencyInject; using ZonyLrcTools.Cli.Infrastructure.Exceptions; namespace ZonyLrcTools.Cli.Infrastructure.Lyric { /// /// 歌词下载器的基类,定义了歌词下载器的常规逻辑。 /// public abstract class LyricDownloader : ILyricDownloader, ITransientDependency { public abstract string DownloaderName { get; } /// /// 歌词数据下载的核心逻辑。 /// /// 歌曲名称。 /// 歌曲作者/艺术家。 /// 下载完成的歌曲数据。 public virtual async ValueTask DownloadAsync(string songName, string artist) { var args = new LyricDownloaderArgs(songName, artist); await ValidateAsync(args); var downloadDataBytes = await DownloadDataAsync(args); return await GenerateLyricAsync(downloadDataBytes, args); } /// /// 通用的验证逻辑,验证基本参数是否正确。 /// /// 歌词下载时需要的参数信息。 protected virtual ValueTask ValidateAsync(LyricDownloaderArgs args) { if (string.IsNullOrEmpty(args.SongName)) { throw new ErrorCodeException(ErrorCodes.SongNameIsNull, attachObj: args); } if (string.IsNullOrEmpty(args.SongName) && string.IsNullOrEmpty(args.Artist)) { throw new ErrorCodeException(ErrorCodes.SongNameAndArtistIsNull, attachObj: args); } return ValueTask.CompletedTask; } /// /// 根据指定的歌曲参数,下载歌词数据。 /// protected abstract ValueTask DownloadDataAsync(LyricDownloaderArgs args); /// /// 根据指定的歌词二进制数据,生成歌词数据。 /// /// 歌词的原始二进制数据。 protected abstract ValueTask GenerateLyricAsync(byte[] data, LyricDownloaderArgs args); } }