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);
}
}