diff --git a/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs b/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs
index cec3311..083aecb 100644
--- a/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs
+++ b/src/ZonyLrcTools.Cli/Commands/SubCommand/DownloadCommand.cs
@@ -47,7 +47,7 @@ namespace ZonyLrcTools.Cli.Commands.SubCommand
public bool DownloadAlbum { get; set; }
[Option("-n|--number", CommandOptionType.SingleValue, Description = "指定下载时候的线程数量。(默认值 2)")]
- public int ParallelNumber { get; set; } = 2;
+ public int ParallelNumber { get; set; } = 1;
#endregion
diff --git a/src/ZonyLrcTools.Common/Album/NetEase/NetEaseAlbumProvider.cs b/src/ZonyLrcTools.Common/Album/NetEase/NetEaseAlbumProvider.cs
index 2d08c5c..a849fbf 100644
--- a/src/ZonyLrcTools.Common/Album/NetEase/NetEaseAlbumProvider.cs
+++ b/src/ZonyLrcTools.Common/Album/NetEase/NetEaseAlbumProvider.cs
@@ -41,7 +41,7 @@ namespace ZonyLrcTools.Common.Album.NetEase
true,
_defaultOption);
- if (searchResult is not { StatusCode: 200 } || searchResult.Items?.SongCount <= 0)
+ if (searchResult is not { StatusCode: 200 } || searchResult.Items is not { SongCount: > 0 })
{
throw new ErrorCodeException(ErrorCodes.NoMatchingSong);
}
diff --git a/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs b/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs
index 4cc5ad6..f5877c2 100644
--- a/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/ILyricsItemCollectionFactory.cs
@@ -18,6 +18,6 @@ namespace ZonyLrcTools.Common.Lyrics
/// 原始歌词数据。
/// 翻译歌词数据。
/// 构建完成的 对象。
- LyricsItemCollection Build(string sourceLyric, string translationLyric);
+ LyricsItemCollection Build(string sourceLyric, string? translationLyric);
}
}
\ No newline at end of file
diff --git a/src/ZonyLrcTools.Common/Lyrics/LyricsDownloader.cs b/src/ZonyLrcTools.Common/Lyrics/LyricsDownloader.cs
index f3fbbf1..a78440f 100644
--- a/src/ZonyLrcTools.Common/Lyrics/LyricsDownloader.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/LyricsDownloader.cs
@@ -1,5 +1,6 @@
using System.Text;
using Microsoft.Extensions.Options;
+using Polly;
using ZonyLrcTools.Common.Configuration;
using ZonyLrcTools.Common.Infrastructure.DependencyInject;
using ZonyLrcTools.Common.Infrastructure.Exceptions;
@@ -36,7 +37,7 @@ public class LyricsDownloader : ILyricsDownloader, ISingletonDependency
}
public async Task DownloadAsync(List needDownloadMusicInfos,
- int parallelCount = 2,
+ int parallelCount = 1,
CancellationToken cancellationToken = default)
{
await _logger.InfoAsync("开始下载歌词文件数据...");
diff --git a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs
index 64b0836..a248322 100644
--- a/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/LyricsItemCollectionFactory.cs
@@ -30,7 +30,7 @@ namespace ZonyLrcTools.Common.Lyrics
return lyric;
}
- public LyricsItemCollection Build(string sourceLyric, string translationLyric)
+ public LyricsItemCollection Build(string sourceLyric, string? translationLyric)
{
var lyric = new LyricsItemCollection(_options.Provider.Lyric.Config);
if (string.IsNullOrEmpty(sourceLyric))
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs
index 38497c5..712ae4e 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/KuGou/KuGourLyricsProvider.cs
@@ -40,6 +40,11 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.KuGou
var accessKeyResponse = await _warpHttpClient.GetAsync(KuGouGetLyricAccessKeyUrl,
new GetLyricAccessKeyRequest(searchResult.Data.List[0].FileHash));
+ if (accessKeyResponse.AccessKeyDataObjects.Count == 0)
+ {
+ throw new ErrorCodeException(ErrorCodes.NoMatchingSong, attachObj: args);
+ }
+
var accessKeyObject = accessKeyResponse.AccessKeyDataObjects[0];
return await _warpHttpClient.GetAsync(KuGouGetLyricUrl,
new GetLyricRequest(accessKeyObject.Id, accessKeyObject.AccessKey));
@@ -60,7 +65,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.KuGou
protected virtual void ValidateSongSearchResponse(SongSearchResponse response, LyricsProviderArgs args)
{
- if (response.ErrorCode != 0 && response.Status != 1 || response.Data.List == null)
+ if ((response.ErrorCode != 0 && response.Status != 1) || response.Data.List.Count == 0)
{
throw new ErrorCodeException(ErrorCodes.NoMatchingSong, attachObj: args);
}
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/JsonModel/GetLyricsResponse.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/JsonModel/GetLyricsResponse.cs
index 03f4de6..1805174 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/JsonModel/GetLyricsResponse.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/JsonModel/GetLyricsResponse.cs
@@ -15,7 +15,7 @@ public class GetLyricsResponse
public class GetLyricsResponseInnerData
{
- [JsonProperty("lrclist")] public ICollection Lyrics { get; set; }
+ [JsonProperty("lrclist")] public ICollection? Lyrics { get; set; }
}
public class GetLyricsItem
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs
index e101b58..9d15c46 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/KuWo/KuWoLyricsProvider.cs
@@ -60,6 +60,11 @@ public class KuWoLyricsProvider : LyricsProvider
await ValueTask.CompletedTask;
var lyricsResponse = (GetLyricsResponse)lyricsObject;
+ if (lyricsResponse.Data.Lyrics == null)
+ {
+ return new LyricsItemCollection(null);
+ }
+
var items = lyricsResponse.Data.Lyrics.Select(l =>
{
var position = double.Parse(l.Position);
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricRequest.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricRequest.cs
index 98a5be8..acc04c5 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricRequest.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricRequest.cs
@@ -8,7 +8,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel
{
public GetLyricRequest(long songId)
{
- OS = "ios";
+ OS = "pc";
Id = songId;
Lv = Kv = Tv = Rv = -1;
}
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricResponse.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricResponse.cs
index 1461b5a..4bb851f 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricResponse.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/GetLyricResponse.cs
@@ -20,7 +20,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel
/// 如果存在翻译歌词,则本项内容为翻译歌词。
///
[JsonProperty("tlyric")]
- public InnerLyric TranslationLyric { get; set; }
+ public InnerLyric? TranslationLyric { get; set; }
///
/// 如果存在罗马音歌词,则本项内容为罗马音歌词。
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchRequest.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchRequest.cs
index 14df5e8..86072ce 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchRequest.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchRequest.cs
@@ -60,7 +60,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel
var regex = new Regex(@"\([^)]*\)");
musicName = regex.Replace(musicName, string.Empty);
- SearchKey = HttpUtility.UrlEncode($"{musicName}+{artistName}", Encoding.UTF8);
+ SearchKey = $"{musicName}+{artistName}";
Limit = limit;
}
}
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchResponse.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchResponse.cs
index 6955e70..314e810 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchResponse.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/JsonModel/SongSearchResponse.cs
@@ -4,7 +4,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel
{
public class SongSearchResponse
{
- [JsonProperty("result")] public InnerListItemModel Items { get; set; }
+ [JsonProperty("result")] public InnerListItemModel? Items { get; set; }
[JsonProperty("code")] public int StatusCode { get; set; }
@@ -27,7 +27,7 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel
public class InnerListItemModel
{
- [JsonProperty("songs")] public IList SongItems { get; set; }
+ [JsonProperty("songs")] public IList? SongItems { get; set; }
[JsonProperty("songCount")] public int SongCount { get; set; }
}
diff --git a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs
index 56f10d8..36f597f 100644
--- a/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs
+++ b/src/ZonyLrcTools.Common/Lyrics/Providers/NetEase/NetEaseLyricsProvider.cs
@@ -2,6 +2,7 @@ using System.Net.Http.Headers;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using ZonyLrcTools.Common.Configuration;
+using ZonyLrcTools.Common.Infrastructure.Encryption;
using ZonyLrcTools.Common.Infrastructure.Exceptions;
using ZonyLrcTools.Common.Infrastructure.Network;
using ZonyLrcTools.Common.Lyrics.Providers.NetEase.JsonModel;
@@ -16,11 +17,10 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase
private readonly ILyricsItemCollectionFactory _lyricsItemCollectionFactory;
private readonly GlobalOptions _options;
- private const string NetEaseSearchMusicUrl = @"https://music.163.com/api/search/get/web";
- private const string NetEaseGetLyricUrl = @"https://music.163.com/api/song/lyric";
+ private const string NetEaseSearchMusicUrl = @"https://music.163.com/weapi/cloudsearch/get/web";
+ private const string NetEaseGetLyricUrl = @"https://music.163.com/weapi/song/lyric?csrf_token=";
private const string NetEaseRequestReferer = @"https://music.163.com";
- private const string NetEaseRequestContentType = @"application/x-www-form-urlencoded";
public NetEaseLyricsProvider(IWarpHttpClient warpHttpClient,
ILyricsItemCollectionFactory lyricsItemCollectionFactory,
@@ -33,25 +33,30 @@ namespace ZonyLrcTools.Common.Lyrics.Providers.NetEase
protected override async ValueTask