diff --git a/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs b/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs index 5085801..4cc5ad6 100644 --- a/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs +++ b/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs @@ -10,7 +10,7 @@ namespace ZonyLrcTools.Common.Lyrics /// /// 原始歌词数据。 /// 构建完成的 对象。 - LyricsItemCollection Build(string sourceLyric); + LyricsItemCollection Build(string? sourceLyric); /// /// 根据指定的歌曲数据构建新的 实例。 diff --git a/src/ZonyLrcTools.Common/Lyrics/ILyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/ILyricsProvider.cs index b9d16b3..5594e49 100644 --- a/src/ZonyLrcTools.Common/Lyrics/ILyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/ILyricsProvider.cs @@ -12,7 +12,7 @@ namespace ZonyLrcTools.Common.Lyrics /// 歌曲的作者。 /// 歌曲的时长。 /// 歌曲的歌词数据对象。 - ValueTask DownloadAsync(string songName, string artist, long? duration = null); + ValueTask DownloadAsync(string? songName, string? artist, long? duration = null); /// /// 下载器的名称。 diff --git a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollection.cs b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollection.cs index 5ffe206..08ce8fa 100644 --- a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollection.cs +++ b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollection.cs @@ -14,9 +14,9 @@ namespace ZonyLrcTools.Common.Lyrics /// public bool IsPruneMusic => Count == 0; - public GlobalLyricsConfigOptions Options { get; private set; } + public GlobalLyricsConfigOptions? Options { get; private set; } - public LyricsItemCollection(GlobalLyricsConfigOptions options) + public LyricsItemCollection(GlobalLyricsConfigOptions? options) { Options = options; } diff --git a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs index 874adf4..64b0836 100644 --- a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs +++ b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs @@ -17,7 +17,7 @@ namespace ZonyLrcTools.Common.Lyrics _options = options.Value; } - public LyricsItemCollection Build(string sourceLyric) + public LyricsItemCollection Build(string? sourceLyric) { var lyric = new LyricsItemCollection(_options.Provider.Lyric.Config); if (string.IsNullOrEmpty(sourceLyric)) diff --git a/src/ZonyLrcTools.Common/Lyrics/LyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/LyricsProvider.cs index e335f1b..f59425f 100644 --- a/src/ZonyLrcTools.Common/Lyrics/LyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/LyricsProvider.cs @@ -21,8 +21,8 @@ namespace ZonyLrcTools.Common.Lyrics { var args = new LyricsProviderArgs(songName, artist, duration ?? 0); await ValidateAsync(args); - var downloadDataBytes = await DownloadDataAsync(args); - return await GenerateLyricAsync(downloadDataBytes, args); + var downloadDataObject = await DownloadDataAsync(args); + return await GenerateLyricAsync(downloadDataObject, args); } /// @@ -47,12 +47,13 @@ namespace ZonyLrcTools.Common.Lyrics /// /// 根据指定的歌曲参数,下载歌词数据。 /// - protected abstract ValueTask DownloadDataAsync(LyricsProviderArgs args); + protected abstract ValueTask DownloadDataAsync(LyricsProviderArgs args); /// - /// 根据指定的歌词二进制数据,生成歌词数据。 + /// 根据指定的歌词对象,生成歌词数据,常用于处理不同格式的歌词数据。 /// - /// 歌词的原始二进制数据。 - protected abstract ValueTask GenerateLyricAsync(byte[] data, LyricsProviderArgs args); + /// 完成后,传递的歌词数据对象。 + /// 生成歌词时,提供的歌曲信息参数。 + protected abstract ValueTask GenerateLyricAsync(object lyricsObject, LyricsProviderArgs args); } } \ No newline at end of file diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs index 6ef2114..38497c5 100644 --- a/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs @@ -29,7 +29,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.KuGou _options = options.Value; } - protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) + protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) { var searchResult = await _warpHttpClient.GetAsync(KuGouSearchMusicUrl, new SongSearchRequest(args.SongName, args.Artist, _options.Provider.Lyric.GetLyricProviderOption(DownloaderName).Depth)); @@ -41,16 +41,14 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.KuGou new GetLyricAccessKeyRequest(searchResult.Data.List[0].FileHash)); var accessKeyObject = accessKeyResponse.AccessKeyDataObjects[0]; - var lyricResponse = await _warpHttpClient.GetAsync(KuGouGetLyricUrl, + return await _warpHttpClient.GetAsync(KuGouGetLyricUrl, new GetLyricRequest(accessKeyObject.Id, accessKeyObject.AccessKey)); - - return Encoding.UTF8.GetBytes(lyricResponse); } - protected override async ValueTask GenerateLyricAsync(byte[] data, LyricsProviderArgs args) + protected override async ValueTask GenerateLyricAsync(object data, LyricsProviderArgs args) { await ValueTask.CompletedTask; - var lyricJsonObj = JObject.Parse(Encoding.UTF8.GetString(data)); + var lyricJsonObj = JObject.Parse((data as string)!); if (lyricJsonObj.SelectToken("$.status").Value() != 200) { throw new ErrorCodeException(ErrorCodes.NoMatchingSong, attachObj: args); diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs index 13c582a..302e9a4 100644 --- a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs @@ -32,7 +32,7 @@ public class KuWoLyricsProvider : LyricsProvider _options = options.Value; } - protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) + protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) { var songSearchResponse = await _warpHttpClient.GetAsync(KuWoSearchMusicUrl, new SongSearchRequest(args.SongName, args.Artist, pageSize: _options.Provider.Lyric.GetLyricProviderOption(DownloaderName).Depth), @@ -46,18 +46,16 @@ public class KuWoLyricsProvider : LyricsProvider ValidateSongSearchResponse(songSearchResponse, args); - var songLyricsResponse = await _warpHttpClient.GetAsync(KuWoSearchLyricsUrl, + return await _warpHttpClient.GetAsync(KuWoSearchLyricsUrl, new GetLyricsRequest(songSearchResponse.GetMatchedMusicId(args.SongName, args.Artist, args.Duration)), op => { op.Headers.UserAgent.Add(UserAgent); op.Headers.Referrer = new Uri("https://m.kuwo.cn/yinyue/"); }); - - return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(songLyricsResponse.Lyrics)); } - protected override ValueTask GenerateLyricAsync(byte[] data, LyricsProviderArgs args) + protected override ValueTask GenerateLyricAsync(object lyricsObject, LyricsProviderArgs args) { throw new NotImplementedException(); } diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs index 39db86c..56f10d8 100644 --- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs @@ -1,5 +1,4 @@ using System.Net.Http.Headers; -using System.Text; using Microsoft.Extensions.Options; using Newtonsoft.Json; using ZonyLrcTools.Common.Configuration; @@ -32,7 +31,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase _options = options.Value; } - protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) + protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) { var searchResult = await _warpHttpClient.PostAsync( NetEaseSearchMusicUrl, @@ -49,19 +48,17 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase ValidateSongSearchResponse(searchResult, args); - var lyricResponse = await _warpHttpClient.GetAsync( + return await _warpHttpClient.GetAsync( NetEaseGetLyricUrl, new GetLyricRequest(searchResult.GetFirstMatchSongId(args.SongName, args.Duration)), msg => msg.Headers.Referrer = new Uri(NetEaseRequestReferer)); - - return Encoding.UTF8.GetBytes(lyricResponse); } - protected override async ValueTask GenerateLyricAsync(byte[] data, LyricsProviderArgs args) + protected override async ValueTask GenerateLyricAsync(object lyricsObject, LyricsProviderArgs args) { await ValueTask.CompletedTask; - var json = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data)); + var json = JsonConvert.DeserializeObject((lyricsObject as string)!); if (json?.OriginalLyric == null || string.IsNullOrEmpty(json.OriginalLyric.Text)) { return new LyricsItemCollection(null); @@ -73,8 +70,8 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase } return _lyricsItemCollectionFactory.Build( - json.OriginalLyric?.Text, - json.TranslationLyric?.Text); + json.OriginalLyric.Text, + json.TranslationLyric.Text); } protected virtual void ValidateSongSearchResponse(SongSearchResponse response, LyricsProviderArgs args) diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/JsonModel/GetLyricRequest.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/JsonModel/GetLyricRequest.cs index 5c9f10e..a60cdf7 100644 --- a/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/JsonModel/GetLyricRequest.cs +++ b/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/JsonModel/GetLyricRequest.cs @@ -6,7 +6,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.QQMusic.JsonModel { [JsonProperty("nobase64")] public int IsNoBase64Encoding { get; set; } - [JsonProperty("songmid")] public string SongId { get; set; } + [JsonProperty("songmid")] public string? SongId { get; set; } [JsonProperty("platform")] public string ClientPlatform { get; set; } @@ -20,7 +20,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.QQMusic.JsonModel { } - public GetLyricRequest(string songId) + public GetLyricRequest(string? songId) { IsNoBase64Encoding = 1; SongId = songId; diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/QQLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/QQLyricsProvider.cs index 5fe5388..ef74c66 100644 --- a/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/QQLyricsProvider.cs +++ b/src/ZonyLrcTools.Common/Lyrics/Providers/QQMusic/QQLyricsProvider.cs @@ -1,4 +1,3 @@ -using System.Text; using System.Web; using Newtonsoft.Json.Linq; using ZonyLrcTools.Common.Infrastructure.Exceptions; @@ -27,7 +26,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.QQMusic _lyricsItemCollectionFactory = lyricsItemCollectionFactory; } - protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) + protected override async ValueTask DownloadDataAsync(LyricsProviderArgs args) { var searchResult = await _warpHttpClient.GetAsync( QQSearchMusicUrl, @@ -35,18 +34,16 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.QQMusic ValidateSongSearchResponse(searchResult, args); - var lyricJsonString = await _warpHttpClient.GetAsync(QQGetLyricUrl, + return await _warpHttpClient.GetAsync(QQGetLyricUrl, new GetLyricRequest(searchResult.Data.Song.SongItems.FirstOrDefault()?.SongId), op => op.Headers.Referrer = new Uri(QQMusicRequestReferer)); - - return Encoding.UTF8.GetBytes(lyricJsonString); } - protected override async ValueTask GenerateLyricAsync(byte[] data, LyricsProviderArgs args) + protected override async ValueTask GenerateLyricAsync(object lyricsObject, LyricsProviderArgs args) { await ValueTask.CompletedTask; - var lyricJsonString = Encoding.UTF8.GetString(data); + var lyricJsonString = (lyricsObject as string)!; lyricJsonString = lyricJsonString.Replace(@"MusicJsonCallback(", string.Empty).TrimEnd(')'); if (lyricJsonString.Contains("\"code\":-1901")) diff --git a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuGouLyricProviderTests.cs b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuGouLyricProviderTests.cs index e302cee..ea36905 100644 --- a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuGouLyricProviderTests.cs +++ b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuGouLyricProviderTests.cs @@ -18,6 +18,7 @@ namespace ZonyLrcTools.Tests.Infrastructure.Lyrics } [Fact] + [Trait("LyricsProvider", "KuGou")] public async Task DownloadAsync_Test() { var lyric = await _lyricsProvider.DownloadAsync("东方红", null); diff --git a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuWoLyricsProviderTests.cs b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuWoLyricsProviderTests.cs index d734897..258234a 100644 --- a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuWoLyricsProviderTests.cs +++ b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/KuWoLyricsProviderTests.cs @@ -18,6 +18,7 @@ public class KuWoLyricsProviderTests : TestBase } [Fact] + [Trait("LyricsProvider ", "KuGou")] public async Task DownloadAsync_Test() { var lyric = await _kuwoLyricsProvider.DownloadAsync("告白气球", "周杰伦"); diff --git a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/NetEaseLyricsProviderTests.cs b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/NetEaseLyricsProviderTests.cs index 83402b6..ef8673a 100644 --- a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/NetEaseLyricsProviderTests.cs +++ b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/NetEaseLyricsProviderTests.cs @@ -21,6 +21,7 @@ namespace ZonyLrcTools.Tests.Infrastructure.Lyrics } [Fact] + [Trait("LyricsProvider ", "NetEase")] public async Task DownloadAsync_Test() { var lyric = await _lyricsProvider.DownloadAsync("Hollow", "Janet Leon"); @@ -93,7 +94,7 @@ namespace ZonyLrcTools.Tests.Infrastructure.Lyrics { var options = ServiceProvider.GetRequiredService>(); options.Value.Provider.Lyric.Config.IsOnlyOutputTranslation = true; - + var lyric = await _lyricsProvider.DownloadAsync("Bones", "Image Dragons"); lyric.ToString().ShouldNotContain("Gimme, gimme, gimme some time to think"); } diff --git a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/QQLyricsProviderTests.cs b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/QQLyricsProviderTests.cs index d482404..c9076d3 100644 --- a/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/QQLyricsProviderTests.cs +++ b/tests/ZonyLrcTools.Tests/Infrastructure/Lyrics/QQLyricsProviderTests.cs @@ -18,13 +18,14 @@ namespace ZonyLrcTools.Tests.Infrastructure.Lyrics } [Fact] + [Trait("LyricsProvider", "QQ")] public async Task DownloadAsync_Test() { var lyric = await _lyricsProvider.DownloadAsync("东风破", "周杰伦"); lyric.ShouldNotBeNull(); lyric.IsPruneMusic.ShouldBe(false); } - + // About the new feature mentioned in issue #87. // Github Issue: https://github.com/real-zony/ZonyLrcToolsX/issues/87 [Fact]