Skip to content

Commit ad2de13

Browse files
committed
修复大量bug
更新数据库格式 匹配失败时支持用户自己输入ID 稳定性更好
1 parent df985bb commit ad2de13

21 files changed

+584
-515
lines changed

NLyric/Audio/Album.cs

+36-30
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,72 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
4+
using TagLib;
35

46
namespace NLyric.Audio {
7+
/// <summary>
8+
/// 专辑
9+
/// </summary>
510
public class Album : ITrackOrAlbum {
611
private readonly string _name;
712
private readonly string[] _artists;
8-
private readonly int? _trackCount;
9-
private readonly int? _year;
1013

14+
/// <summary>
15+
/// 名称
16+
/// </summary>
1117
public string Name => _name;
1218

13-
public string[] Artists => _artists;
14-
15-
public int? TrackCount => _trackCount;
16-
17-
public int? Year => _year;
19+
/// <summary>
20+
/// 艺术家
21+
/// </summary>
22+
public IReadOnlyList<string> Artists => _artists;
1823

19-
public Album(string name, string[] artists, int? trackCount, int? year) {
24+
public Album(string name, IEnumerable<string> artists) {
2025
if (name is null)
2126
throw new ArgumentNullException(nameof(name));
2227
if (artists is null)
2328
throw new ArgumentNullException(nameof(artists));
2429

2530
_name = name;
2631
_artists = artists.Select(t => t.Trim()).ToArray();
27-
_trackCount = trackCount;
28-
_year = year;
32+
Array.Sort(_artists, StringHelper.OrdinalComparer);
2933
}
3034

3135
/// <summary>
3236
/// 构造器
3337
/// </summary>
34-
/// <param name="track"></param>
38+
/// <param name="tag"></param>
3539
/// <param name="getArtistsFromTrack">当 <see cref="Track.AlbumArtist"/> 为空时,是否从 <see cref="Track.Artist"/> 获取艺术家</param>
36-
public Album(ATL.Track track, bool getArtistsFromTrack) {
37-
if (track is null)
38-
throw new ArgumentNullException(nameof(track));
39-
if (!HasAlbumInfo(track))
40-
throw new ArgumentException(nameof(track) + " 中不存在专辑信息");
40+
public Album(Tag tag, bool getArtistsFromTrack) {
41+
if (tag is null)
42+
throw new ArgumentNullException(nameof(tag));
43+
if (!HasAlbumInfo(tag))
44+
throw new ArgumentException(nameof(tag) + " 中不存在专辑信息");
4145

42-
string artists;
46+
string[] artists;
4347

44-
_name = track.Album.GetSafeString();
45-
artists = track.AlbumArtist.GetSafeString();
48+
_name = tag.Album.GetSafeString();
49+
artists = tag.AlbumArtists.SelectMany(t => t.GetSafeString().SplitEx()).ToArray();
4650
if (getArtistsFromTrack && artists.Length == 0)
47-
artists = track.Artist.GetSafeString();
48-
_artists = artists.Length == 0 ? Array.Empty<string>() : artists.SplitEx();
49-
if (track.TrackTotal != 0)
50-
_trackCount = track.TrackTotal;
51-
if (track.Year != 0)
52-
_year = track.Year;
51+
artists = tag.Performers.SelectMany(t => t.GetSafeString().SplitEx()).ToArray();
52+
Array.Sort(artists, StringHelper.OrdinalComparer);
53+
_artists = artists;
5354
}
5455

55-
public static bool HasAlbumInfo(ATL.Track track) {
56-
if (track is null)
57-
throw new ArgumentNullException(nameof(track));
56+
/// <summary>
57+
/// 是否存在专辑信息
58+
/// </summary>
59+
/// <param name="tag"></param>
60+
/// <returns></returns>
61+
public static bool HasAlbumInfo(Tag tag) {
62+
if (tag is null)
63+
throw new ArgumentNullException(nameof(tag));
5864

59-
return !string.IsNullOrWhiteSpace(track.Album);
65+
return !string.IsNullOrWhiteSpace(tag.Album);
6066
}
6167

6268
public override string ToString() {
63-
return "Name:" + _name + " | Artists:" + string.Join(",", _artists) + " | TrackCount:" + _trackCount.ToString() + " | Year:" + _year.ToString();
69+
return "Name:" + _name + " | Artists:" + string.Join(",", _artists);
6470
}
6571
}
6672
}

NLyric/Audio/ITrackOrAlbum.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
using System.Collections.Generic;
2+
13
namespace NLyric.Audio {
24
public interface ITrackOrAlbum {
35
string Name { get; }
46

5-
string[] Artists { get; }
7+
IReadOnlyList<string> Artists { get; }
68
}
79
}

NLyric/Audio/Track.cs

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,43 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
4+
using TagLib;
35

46
namespace NLyric.Audio {
7+
/// <summary>
8+
/// 单曲
9+
/// </summary>
510
public class Track : ITrackOrAlbum {
611
private readonly string _name;
712
private readonly string[] _artists;
813

14+
/// <summary>
15+
/// 名称
16+
/// </summary>
917
public string Name => _name;
1018

11-
public string[] Artists => _artists;
19+
/// <summary>
20+
/// 艺术家
21+
/// </summary>
22+
public IReadOnlyList<string> Artists => _artists;
1223

13-
public Track(string name, string[] artists) {
24+
public Track(string name, IEnumerable<string> artists) {
1425
if (name is null)
1526
throw new ArgumentNullException(nameof(name));
1627
if (artists is null)
1728
throw new ArgumentNullException(nameof(artists));
1829

1930
_name = name;
2031
_artists = artists.Select(t => t.Trim()).ToArray();
32+
Array.Sort(_artists, StringHelper.OrdinalComparer);
2133
}
2234

23-
public Track(ATL.Track track) {
24-
if (track is null)
25-
throw new ArgumentNullException(nameof(track));
35+
public Track(Tag tag) {
36+
if (tag is null)
37+
throw new ArgumentNullException(nameof(tag));
2638

27-
_name = track.Title.GetSafeString();
28-
_artists = track.Artist.GetSafeString().SplitEx();
39+
_name = tag.Title.GetSafeString();
40+
_artists = tag.Performers.SelectMany(s => s.GetSafeString().SplitEx()).ToArray();
2941
Array.Sort(_artists, StringHelper.OrdinalComparer);
3042
}
3143

NLyric/Caches/AlbumCache.cs

-27
This file was deleted.

NLyric/Caches/AllCaches.cs

-11
This file was deleted.

NLyric/Caches/Extensions.cs

-66
This file was deleted.

NLyric/Caches/TrackCache.cs

-43
This file was deleted.

NLyric/Database/AlbumInfo.cs

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using NLyric.Audio;
4+
5+
namespace NLyric.Database {
6+
/// <summary>
7+
/// 专辑信息
8+
/// </summary>
9+
public sealed class AlbumInfo {
10+
/// <summary>
11+
/// 名称
12+
/// </summary>
13+
public string Name { get; set; }
14+
15+
/// <summary>
16+
/// 网易云音乐ID
17+
/// </summary>
18+
public int Id { get; set; }
19+
20+
[JsonConstructor]
21+
[Obsolete("Deserialization only", true)]
22+
public AlbumInfo() {
23+
}
24+
25+
public AlbumInfo(Album album, int id) : this(album.Name, id) {
26+
}
27+
28+
public AlbumInfo(string name, int id) {
29+
if (name is null)
30+
throw new ArgumentNullException(nameof(name));
31+
32+
Name = name;
33+
Id = id;
34+
}
35+
}
36+
}

NLyric/Database/Extensions.cs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using NLyric.Audio;
5+
6+
namespace NLyric.Database {
7+
public static class Extensions {
8+
public static AlbumInfo Match(this IEnumerable<AlbumInfo> caches, Album album) {
9+
if (album is null)
10+
throw new ArgumentNullException(nameof(album));
11+
12+
return caches.FirstOrDefault(t => IsMatched(t, album));
13+
}
14+
15+
public static TrackInfo Match(this IEnumerable<TrackInfo> caches, Track track, Album album) {
16+
if (track is null)
17+
throw new ArgumentNullException(nameof(track));
18+
19+
return caches.FirstOrDefault(t => IsMatched(t, track, album));
20+
}
21+
22+
public static bool IsMatched(this AlbumInfo cache, Album album) {
23+
if (album is null)
24+
throw new ArgumentNullException(nameof(album));
25+
26+
return cache.Name == album.Name;
27+
}
28+
29+
public static bool IsMatched(this TrackInfo cache, Track track, Album album) {
30+
if (track is null)
31+
throw new ArgumentNullException(nameof(track));
32+
33+
return cache.Name == track.Name && (album is null ? cache.AlbumName is null : cache.AlbumName == album.Name) && cache.Artists.SequenceEqual(track.Artists);
34+
// 如果album为空,要求cache中AlbumName也为空,如果album不为空,要求cache中AlbumName匹配
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)