diff --git a/src/ZonyLrcTools.Cli/Config/ToolOptions.cs b/src/ZonyLrcTools.Cli/Config/ToolOptions.cs index b256f97..22857ea 100644 --- a/src/ZonyLrcTools.Cli/Config/ToolOptions.cs +++ b/src/ZonyLrcTools.Cli/Config/ToolOptions.cs @@ -1,4 +1,3 @@ -using System.Collections; using System.Collections.Generic; using ZonyLrcTools.Cli.Infrastructure.Lyric; using ZonyLrcTools.Cli.Infrastructure.Network; @@ -19,9 +18,9 @@ namespace ZonyLrcTools.Cli.Config public LyricItemCollectionOption LyricOption { get; set; } /// - /// 标签加载器的加载配置项。 + /// 标签加载器相关的配置属性。 /// - public TagInfoProviderOptions TagInfoProviderOptions { get; set; } + public IEnumerable TagInfoProviderOptions { get; set; } /// /// 网络代理相关的配置信息。 diff --git a/src/ZonyLrcTools.Cli/Infrastructure/Tag/DefaultTagLoader.cs b/src/ZonyLrcTools.Cli/Infrastructure/Tag/DefaultTagLoader.cs index bf3ce61..7403448 100644 --- a/src/ZonyLrcTools.Cli/Infrastructure/Tag/DefaultTagLoader.cs +++ b/src/ZonyLrcTools.Cli/Infrastructure/Tag/DefaultTagLoader.cs @@ -11,7 +11,7 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag /// /// 默认的标签加载器 实现。 /// - public class DefaultTagLoader : ITagLoader, ITransientDependency + public class DefaultTagLoader : ITagLoader, ISingletonDependency { protected readonly IEnumerable TagInfoProviders; protected readonly IBlockWordDictionary BlockWordDictionary; @@ -33,7 +33,7 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag throw new ErrorCodeException(ErrorCodes.LoadTagInfoProviderError); } - foreach (var provider in TagInfoProviders.OrderBy(p => p.Priority)) + foreach (var provider in TagInfoProviders) { var info = await provider.LoadAsync(filePath); if (info != null) diff --git a/src/ZonyLrcTools.Cli/Infrastructure/Tag/FileNameTagInfoProvider.cs b/src/ZonyLrcTools.Cli/Infrastructure/Tag/FileNameTagInfoProvider.cs index fc55ebb..efe9e69 100644 --- a/src/ZonyLrcTools.Cli/Infrastructure/Tag/FileNameTagInfoProvider.cs +++ b/src/ZonyLrcTools.Cli/Infrastructure/Tag/FileNameTagInfoProvider.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.Extensions.Options; @@ -10,25 +11,28 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag /// /// 基于正则表达式的标签解析器,从文件名当中解析歌曲的标签信息。 /// - public class FileNameTagInfoProvider : ITagInfoProvider, ITransientDependency + public class FileNameTagInfoProvider : ITagInfoProvider, ISingletonDependency { - public int Priority => 2; - public string Name => ConstantName; public const string ConstantName = "FileName"; + public const string RegularExpressionsOption = "RegularExpressions"; - private readonly ToolOptions Options; + private readonly ToolOptions _options; public FileNameTagInfoProvider(IOptions options) { - Options = options.Value; + _options = options.Value; } public async ValueTask LoadAsync(string filePath) { await ValueTask.CompletedTask; + + var regex = _options.TagInfoProviderOptions + .First(t => t.Name == ConstantName) + .Extensions[RegularExpressionsOption]; - var match = Regex.Match(Path.GetFileNameWithoutExtension(filePath), Options.TagInfoProviderOptions.FileNameRegularExpressions); + var match = Regex.Match(Path.GetFileNameWithoutExtension(filePath), regex); if (match.Groups.Count != 3) { diff --git a/src/ZonyLrcTools.Cli/Infrastructure/Tag/ITagInfoProvider.cs b/src/ZonyLrcTools.Cli/Infrastructure/Tag/ITagInfoProvider.cs index 85614be..e479196 100644 --- a/src/ZonyLrcTools.Cli/Infrastructure/Tag/ITagInfoProvider.cs +++ b/src/ZonyLrcTools.Cli/Infrastructure/Tag/ITagInfoProvider.cs @@ -7,11 +7,6 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag /// public interface ITagInfoProvider { - /// - /// 解析时的优先级。 - /// - int Priority { get; } - /// /// 标签解析器的唯一标识。 /// diff --git a/src/ZonyLrcTools.Cli/Infrastructure/Tag/TagInfoProviderOptions.cs b/src/ZonyLrcTools.Cli/Infrastructure/Tag/TagInfoProviderOptions.cs index 4876b1a..3d16cb0 100644 --- a/src/ZonyLrcTools.Cli/Infrastructure/Tag/TagInfoProviderOptions.cs +++ b/src/ZonyLrcTools.Cli/Infrastructure/Tag/TagInfoProviderOptions.cs @@ -1,10 +1,13 @@ +using System.Collections.Generic; + namespace ZonyLrcTools.Cli.Infrastructure.Tag { - public class TagInfoProviderOptions + public class TagInfoProviderInstance { - /// - /// 用于从文件名当中提取歌曲名、歌手名。 - /// - public string FileNameRegularExpressions { get; set; } + public string Name { get; set; } + + public int Priority { get; set; } + + public Dictionary Extensions { get; set; } } } \ No newline at end of file diff --git a/src/ZonyLrcTools.Cli/Infrastructure/Tag/TaglibTagInfoProvider.cs b/src/ZonyLrcTools.Cli/Infrastructure/Tag/TaglibTagInfoProvider.cs index 8ceacd6..c3d18a6 100644 --- a/src/ZonyLrcTools.Cli/Infrastructure/Tag/TaglibTagInfoProvider.cs +++ b/src/ZonyLrcTools.Cli/Infrastructure/Tag/TaglibTagInfoProvider.cs @@ -8,10 +8,8 @@ namespace ZonyLrcTools.Cli.Infrastructure.Tag /// /// 基于 TagLib 的标签信息解析器。 /// - public class TaglibTagInfoProvider : ITagInfoProvider, ITransientDependency + public class TaglibTagInfoProvider : ITagInfoProvider, ISingletonDependency { - public int Priority => 1; - public string Name => ConstantName; public const string ConstantName = "Taglib"; diff --git a/src/ZonyLrcTools.Cli/appsettings.json b/src/ZonyLrcTools.Cli/appsettings.json index 0f38432..c7a2db7 100644 --- a/src/ZonyLrcTools.Cli/appsettings.json +++ b/src/ZonyLrcTools.Cli/appsettings.json @@ -13,9 +13,19 @@ "ProxyIp": "127.0.0.1", "ProxyPort": 4780 }, - "TagInfoProviderOptions": { - "FileNameRegularExpressions": "(?'artist'.+)\\s-\\s(?'name'.+)" - }, + "TagInfoProviderOptions": [ + { + "Name": "Taglib", + "Priority": 1 + }, + { + "Name": "FileName", + "Priority": 2, + "Extensions": { + "RegularExpressions": "(?'artist'.+)\\s-\\s(?'name'.+)" + } + } + ], "LyricDownloaderOptions": [ { "Name": "NetEase",