diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
index 89f7eb7..488e8f1 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj
@@ -34,6 +34,7 @@
+
@@ -333,6 +334,11 @@
+
+
+ MSBuild:Compile
+
+
MSBuild:Compile
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml
index 9c8910f..a99b5ff 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml
@@ -136,66 +136,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml
new file mode 100644
index 0000000..3353386
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs
new file mode 100644
index 0000000..0eb5ef5
--- /dev/null
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs
@@ -0,0 +1,125 @@
+using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Services.MediaSessionsService;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Navigation;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using Windows.ApplicationModel.DataTransfer;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace BetterLyrics.WinUI3.Controls
+{
+ public sealed partial class PropertyRow : UserControl
+ {
+ public PropertyRow()
+ {
+ this.InitializeComponent();
+ }
+
+ public string Header
+ {
+ get => (string)GetValue(HeaderProperty);
+ set => SetValue(HeaderProperty, value);
+ }
+ public static readonly DependencyProperty HeaderProperty =
+ DependencyProperty.Register(nameof(Header), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty));
+
+ public string Value
+ {
+ get => (string)GetValue(ValueProperty);
+ set => SetValue(ValueProperty, value);
+ }
+ public static readonly DependencyProperty ValueProperty =
+ DependencyProperty.Register(nameof(Value), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty));
+
+ public string Link
+ {
+ get => (string)GetValue(LinkProperty);
+ set => SetValue(LinkProperty, value);
+ }
+ public static readonly DependencyProperty LinkProperty =
+ DependencyProperty.Register(nameof(Link), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty));
+
+ public string Unit
+ {
+ get => (string)GetValue(UnitProperty);
+ set => SetValue(UnitProperty, value);
+ }
+ public static readonly DependencyProperty UnitProperty =
+ DependencyProperty.Register(nameof(Unit), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty));
+
+ private Visibility TextVisibility => Link == string.Empty ? Visibility.Visible : Visibility.Collapsed;
+ private Visibility LinkVisibility => Link != string.Empty ? Visibility.Visible : Visibility.Collapsed;
+
+ private void OnPointerEntered(object sender, PointerRoutedEventArgs e)
+ {
+ if (!string.IsNullOrEmpty(Value))
+ {
+ CopyButton.Opacity = 1;
+ }
+ }
+
+ private void OnPointerExited(object sender, PointerRoutedEventArgs e)
+ {
+ CopyButton.Opacity = 0;
+ }
+
+ private void OnCopyClicked(object sender, RoutedEventArgs e)
+ {
+ if (string.IsNullOrEmpty(Value)) return;
+
+ try
+ {
+ DataPackage dataPackage = new DataPackage();
+ dataPackage.SetText(Value);
+ Clipboard.SetContent(dataPackage);
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"Copy failed: {ex.Message}");
+ return;
+ }
+
+ CheckIcon.Opacity = 1;
+ CopyIcon.Opacity = 0;
+
+ this.DispatcherQueue.TryEnqueue(async () =>
+ {
+ await Task.Delay(1500);
+
+ CheckIcon.Opacity = 0;
+ CopyIcon.Opacity = 1;
+ });
+ }
+
+ private async void OnLinkClicked(object sender, RoutedEventArgs e)
+ {
+ Uri.TryCreate(Link, UriKind.Absolute, out var uri);
+ if (uri != null)
+ {
+ if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
+ {
+ await Windows.System.Launcher.LaunchUriAsync(uri);
+ }
+ else if (uri.Scheme == Uri.UriSchemeFile)
+ {
+ await LauncherHelper.SelectAndShowFile(uri.LocalPath);
+ }
+ }
+ }
+ }
+}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs
index e04b908..b5f6eef 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs
@@ -2,42 +2,32 @@
using F23.StringSimilarity;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Text;
+using System.Text.RegularExpressions;
namespace BetterLyrics.WinUI3.Helper
{
- public static class MetadataComparer
+ public static partial class MetadataComparer
{
- // 权重配置 (总和 1.0)
private const double WeightTitle = 0.40;
private const double WeightArtist = 0.40;
private const double WeightAlbum = 0.10;
private const double WeightDuration = 0.10;
- // 实例化算法 (JaroWinkler 适合短字符串匹配)
+ // JaroWinkler 适合短字符串匹配
private static readonly JaroWinkler _algo = new JaroWinkler();
- ///
- /// 计算 SongInfo 和 LyricsSearchResult 的相似度 (0-100)
- ///
public static int CalculateScore(SongInfo local, LyricsSearchResult remote)
{
if (local == null || remote == null) return 0;
- // 1. 标题相似度
double titleScore = GetStringSimilarity(local.Title, remote.Title);
-
- // 2. 艺术家相似度 (需要处理数组顺序)
double artistScore = GetArtistSimilarity(local.Artists, remote.Artists);
-
- // 3. 专辑相似度
double albumScore = GetStringSimilarity(local.Album, remote.Album);
-
- // 4. 时长相似度 (基于毫秒 vs 秒的转换和容差)
double durationScore = GetDurationSimilarity(local.DurationMs, remote.Duration);
- // 5. 加权汇总
double totalScore = (titleScore * WeightTitle) +
(artistScore * WeightArtist) +
(albumScore * WeightAlbum) +
@@ -46,9 +36,31 @@ namespace BetterLyrics.WinUI3.Helper
return (int)Math.Round(totalScore * 100);
}
+ public static int CalculateScore(SongInfo songInfo, string filePathOrName)
+ {
+ if (songInfo == null || string.IsNullOrWhiteSpace(filePathOrName)) return 0;
+
+ string fileName = Path.GetFileNameWithoutExtension(filePathOrName);
+ string fileFingerprint = CreateSortedFingerprint(fileName);
+
+ var infoParts = new List();
+
+ if (!string.IsNullOrEmpty(songInfo.Title))
+ infoParts.Add(songInfo.Title);
+
+ if (songInfo.Artists != null)
+ infoParts.AddRange(songInfo.Artists);
+
+ string infoRaw = string.Join(" ", infoParts);
+ string infoFingerprint = CreateSortedFingerprint(infoRaw);
+
+ double score = _algo.Similarity(infoFingerprint, fileFingerprint);
+
+ return (int)Math.Round(score * 100);
+ }
+
private static double GetStringSimilarity(string? s1, string? s2)
{
- // 归一化:转小写,去空白
s1 = s1?.Trim().ToLowerInvariant() ?? "";
s2 = s2?.Trim().ToLowerInvariant() ?? "";
@@ -63,8 +75,7 @@ namespace BetterLyrics.WinUI3.Helper
if (localArtists == null || localArtists.Length == 0) return 0.0;
if (remoteArtists == null || remoteArtists.Length == 0) return 0.0;
- // 技巧:将艺术家数组排序并连接,避免顺序不同导致的不匹配
- // 例如: ["Jay-Z", "Linkin Park"] 和 ["Linkin Park", "Jay-Z"] 应该是一样的
+ // 将艺术家数组排序并连接,避免顺序不同导致的不匹配
var s1 = string.Join(" ", localArtists.OrderBy(a => a).Select(a => a.Trim().ToLowerInvariant()));
var s2 = string.Join(" ", remoteArtists.OrderBy(a => a).Select(a => a.Trim().ToLowerInvariant()));
@@ -78,7 +89,6 @@ namespace BetterLyrics.WinUI3.Helper
double localSeconds = localMs / 1000.0;
double diff = Math.Abs(localSeconds - remoteSeconds.Value);
- // 容差逻辑:
// 差距 <= 3秒:100% 相似
// 差距 >= 20秒:0% 相似
// 中间线性插值
@@ -89,8 +99,24 @@ namespace BetterLyrics.WinUI3.Helper
if (diff <= PerfectTolerance) return 1.0;
if (diff >= MaxTolerance) return 0.0;
- // 线性递减公式
return 1.0 - ((diff - PerfectTolerance) / (MaxTolerance - PerfectTolerance));
}
+
+ private static string CreateSortedFingerprint(string input)
+ {
+ if (string.IsNullOrWhiteSpace(input)) return "";
+
+ input = input.ToLowerInvariant();
+
+ string cleaned = NonWordCharactersRegex().Replace(input, " ");
+
+ var tokens = cleaned.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
+ .OrderBy(t => t); // 排序
+
+ return string.Join(" ", tokens);
+ }
+
+ [GeneratedRegex(@"[\p{P}\p{S}]")]
+ private static partial Regex NonWordCharactersRegex();
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs
index 8e51f05..4d4a34a 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs
@@ -1,4 +1,7 @@
-using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Extensions;
+using BetterLyrics.WinUI3.Helper;
+using BetterLyrics.WinUI3.Models;
+using Lyricify.Lyrics.Providers.Web.QQMusic;
using System;
using System.Net;
using System.Net.Http;
@@ -67,7 +70,7 @@ namespace BetterLyrics.WinUI3.Providers
_client.DefaultRequestHeaders.Add("Accept-Language", $"{_language},en;q=0.9");
}
- public async Task GetLyricsAsync(string id)
+ private async Task GetLyricsAsync(string id)
{
var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/songs/{id}";
var url = apiUrl + $"?include[songs]=lyrics,syllable-lyrics&l={_language}";
@@ -109,9 +112,14 @@ namespace BetterLyrics.WinUI3.Providers
return null;
}
- public async Task SearchSongInfoAsync(string artist, string title)
+ public async Task SearchSongInfoAsync(Models.SongInfo songInfo)
{
- var query = $"{artist} {title}";
+ LyricsSearchResult lyricsSearchResult = new()
+ {
+ Provider = Enums.LyricsSearchProvider.AppleMusic
+ };
+
+ var query = $"{songInfo.DisplayArtists} {songInfo.Title}";
var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/search";
var url = apiUrl + $"?term={WebUtility.UrlEncode(query)}&types=songs&limit=1&l={_language}";
var resp = await _client.GetStringAsync(url);
@@ -120,9 +128,26 @@ namespace BetterLyrics.WinUI3.Providers
if (results.TryGetProperty("songs", out var songs) && songs.GetProperty("data").GetArrayLength() > 0)
{
var song = songs.GetProperty("data")[0];
- return song.GetProperty("id").ToString();
+
+ var id = song.GetProperty("id").ToString();
+
+ var attr = song.GetProperty("attributes");
+
+ lyricsSearchResult.Title = attr.GetProperty("name").ToString();
+ lyricsSearchResult.Artists = attr.GetProperty("artistName").ToString().SplitByCommonSplitter();
+ lyricsSearchResult.Album = attr.GetProperty("albumName").ToString();
+ lyricsSearchResult.Duration = attr.GetProperty("durationInMillis").GetInt32() / 1000.0;
+
+ lyricsSearchResult.Reference = $"https://music.apple.com/song/{id}";
+ lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
+
+ if (id != null)
+ {
+ lyricsSearchResult.Raw = await GetLyricsAsync(id);
+ }
}
- return string.Empty;
+
+ return lyricsSearchResult;
}
}
}
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs
index 0e3cefc..7821142 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs
@@ -205,8 +205,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
try
{
- LyricsFormat lyricsFormat = provider.GetLyricsFormat();
-
// Check cache first if allowed
if (checkCache && provider.IsRemote())
{
@@ -226,7 +224,7 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
}
else
{
- lyricsSearchResult = await SearchFile(songInfo, lyricsFormat);
+ lyricsSearchResult = await SearchFile(songInfo, provider.GetLyricsFormat());
}
}
else
@@ -258,7 +256,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
if (token.IsCancellationRequested)
{
- lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
return lyricsSearchResult;
}
@@ -267,8 +264,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
{
}
- lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
-
if (lyricsSearchResult.IsFound)
{
if (provider.IsRemote())
@@ -282,6 +277,9 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
private async Task SearchFile(SongInfo songInfo, LyricsFormat format)
{
+ int maxScore = 0;
+ string? bestFile = null;
+
var lyricsSearchResult = new LyricsSearchResult();
if (format.ToLyricsSearchProvider() is LyricsSearchProvider lyricsSearchProvider)
@@ -297,18 +295,11 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
{
foreach (var file in DirectoryHelper.GetAllFiles(folder.Path, $"*{format.ToFileExtension()}"))
{
- var fileName = Path.GetFileNameWithoutExtension(file);
- if (StringHelper.IsSwitchableNormalizedMatch(fileName, songInfo.Title, songInfo.DisplayArtists) || songInfo.LinkedFileName == fileName)
+ int score = MetadataComparer.CalculateScore(songInfo, file);
+ if (score > maxScore)
{
- string? raw = await File.ReadAllTextAsync(file, FileHelper.GetEncoding(file));
- if (raw != null)
- {
- lyricsSearchResult.Raw = raw;
- lyricsSearchResult.CopyFromSongInfo(songInfo);
- lyricsSearchResult.Reference = file;
-
- return lyricsSearchResult;
- }
+ bestFile = file;
+ maxScore = score;
}
}
}
@@ -317,11 +308,27 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
}
}
}
+
+ if (bestFile != null)
+ {
+ lyricsSearchResult.Reference = bestFile;
+ lyricsSearchResult.MatchPercentage = maxScore;
+
+ string? raw = await File.ReadAllTextAsync(bestFile, FileHelper.GetEncoding(bestFile));
+ if (raw != null)
+ {
+ lyricsSearchResult.Raw = raw;
+ }
+ }
+
return lyricsSearchResult;
}
private LyricsSearchResult SearchEmbedded(SongInfo songInfo)
{
+ int maxScore = 0;
+ string? bestFile = null;
+
var lyricsSearchResult = new LyricsSearchResult
{
Provider = LyricsSearchProvider.LocalMusicFile,
@@ -336,24 +343,39 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
if (FileHelper.MusicExtensions.Contains(Path.GetExtension(file)))
{
var track = new Track(file);
- if ((songInfo.Album != "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists && track.Album == songInfo.Album)
- || (songInfo.Album == "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists)
- || (songInfo.Album == "" && StringHelper.IsSwitchableNormalizedMatch(Path.GetFileNameWithoutExtension(file), songInfo.Title, songInfo.DisplayArtists)))
+ int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult
{
- var plain = track.GetRawLyrics();
- if (!plain.IsNullOrEmpty())
- {
- lyricsSearchResult.Raw = plain;
- lyricsSearchResult.CopyFromSongInfo(songInfo);
- lyricsSearchResult.Reference = file;
+ Title = track.Title,
+ Artists = track.Artist.Split(ATL.Settings.DisplayValueSeparator),
+ Album = track.Album,
+ Duration = track.Duration
+ });
- return lyricsSearchResult;
- }
+ if (score > maxScore)
+ {
+ maxScore = score;
+ bestFile = file;
}
}
}
}
}
+
+ if (bestFile != null)
+ {
+ var track = new Track(bestFile);
+
+ lyricsSearchResult.Title = track.Title;
+ lyricsSearchResult.Artists = track.Artist.Split(ATL.Settings.DisplayValueSeparator);
+ lyricsSearchResult.Album = track.Album;
+ lyricsSearchResult.Duration = track.Duration;
+
+ lyricsSearchResult.Raw = track.GetRawLyrics();
+
+ lyricsSearchResult.Reference = bestFile;
+ lyricsSearchResult.MatchPercentage = maxScore;
+ }
+
return lyricsSearchResult;
}
@@ -425,6 +447,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
catch { }
}
+ lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
+
if (string.IsNullOrWhiteSpace(rawLyricFile))
{
return lyricsSearchResult;
@@ -503,6 +527,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
lyricsSearchResult.Reference = url;
+ lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
+
return lyricsSearchResult;
}
@@ -602,26 +628,23 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
lyricsSearchResult.Album = result?.Album;
lyricsSearchResult.Duration = result?.DurationMs / 1000;
+ lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
+
return lyricsSearchResult;
}
private async Task SearchAppleMusicAsync(SongInfo songInfo)
{
- var lyricsSearchResult = new LyricsSearchResult
+ LyricsSearchResult lyricsSearchResult = new()
{
- Provider = LyricsSearchProvider.AppleMusic,
+ Provider = LyricsSearchProvider.AppleMusic
};
+ _logger.LogInformation("SearchAppleMusicAsync");
+
if (await _appleMusic.InitAsync())
{
- string id = await _appleMusic.SearchSongInfoAsync(songInfo.DisplayArtists, songInfo.Title);
- string? raw = await _appleMusic.GetLyricsAsync(id);
- _logger.LogInformation("SearchAppleMusicAsync");
- lyricsSearchResult.Raw = raw;
- lyricsSearchResult.Title = songInfo.Title;
- lyricsSearchResult.Artists = songInfo.Artists;
- lyricsSearchResult.Album = "";
- lyricsSearchResult.Reference = $"https://music.apple.com/song/{id}";
+ lyricsSearchResult = await _appleMusic.SearchSongInfoAsync(songInfo);
}
return lyricsSearchResult;
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
index 9557d5a..650df9a 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw
@@ -144,6 +144,9 @@
Cancel
+
+ Copy
+
Playlist was created successfully
@@ -228,7 +231,7 @@
Lyrics not found
-
+
Lyrics provider
@@ -237,7 +240,7 @@
Lyrics Window Management Shortcut Settings
-
+
Match percentage
@@ -264,7 +267,7 @@
Show translation only
-
+
Translation provider
@@ -273,7 +276,7 @@
Artist
-
+
Duration
@@ -306,9 +309,6 @@
Target lyrics search provider
-
- Title
-
Lyrics search - BetterLyrics
@@ -565,6 +565,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Advanced options
+
+ Album
+
Album art
@@ -610,6 +613,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Apply
+
+ Artist
+
Automatic adjustment
@@ -1189,12 +1195,15 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Play
-
+
Playback source
-
+
Playback source ID
+
+ Current playback source
+
Play "Cut To The Feeling" on "soundcloud.com"
@@ -1219,6 +1228,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Recorded window status
+
+ Reference link
+
Original files and folders in this path will not be deleted when removing it from this app
@@ -1258,6 +1270,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
The duration of the first line
+
+ Current lyrics search result
+
Test server
@@ -1321,6 +1336,12 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
Right
+
+ Current song
+
+
+ Title
+
[Experimental] Spectrum Layer
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
index 59435b9..a0f46a2 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw
@@ -144,6 +144,9 @@
キャンセル
+
+ コピー
+
正常に作成されました
@@ -228,7 +231,7 @@
歌詞が見つかりません
-
+
歌詞プロバイダー
@@ -237,7 +240,7 @@
歌詞ウィンドウ管理ショートカット設定
-
+
マッチ率
@@ -264,7 +267,7 @@
翻訳のみを表示します
-
+
翻訳プロバイダー
@@ -273,7 +276,7 @@
アーティスト
-
+
間隔
@@ -306,9 +309,6 @@
ターゲット歌詞検索プロバイダー
-
- タイトル
-
歌詞検索 - BetterLyrics
@@ -565,6 +565,9 @@
高度なオプション
+
+ アルバム
+
アルバムアート
@@ -610,6 +613,9 @@
適用する
+
+ アーティスト
+
自動調整
@@ -1189,12 +1195,15 @@
遊ぶ
-
+
再生ソース
-
+
再生ソースID
+
+ 現在の再生ソース
+
「SoundCloud.com」で「Cut to the Feeling」を再生する
@@ -1219,6 +1228,9 @@
記録されたウィンドウステータス
+
+ 参照リンク
+
このパスの元のファイルとフォルダーは、このアプリから削除するときに削除されません
@@ -1258,6 +1270,9 @@
最初の行の期間
+
+ 現在の歌詞検索結果
+
テストサーバー
@@ -1321,6 +1336,12 @@
右
+
+ 現在の曲です
+
+
+ タイトル
+
[実験的] スペクトラムレイヤー
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
index ed4ee66..2350090 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw
@@ -144,6 +144,9 @@
취소
+
+ 접수
+
재생 목록이 성공적으로 생성되었습니다
@@ -228,7 +231,7 @@
가사를 찾을 수 없습니다
-
+
가사 제공자
@@ -237,7 +240,7 @@
가사 창 관리 바로 가기 설정
-
+
매치 퍼센트
@@ -264,7 +267,7 @@
번역 만 표시하십시오
-
+
번역 제공자
@@ -273,7 +276,7 @@
아티스트
-
+
지속
@@ -306,9 +309,6 @@
가사 검색 공급자를 타겟팅하십시오
-
- 제목
-
가사 검색 - BetterLyrics
@@ -565,6 +565,9 @@
고급 옵션
+
+ 앨범
+
앨범 아트
@@ -610,6 +613,9 @@
적용하다
+
+ 아티스트
+
자동 조정
@@ -1189,12 +1195,15 @@
놀다
-
+
재생 소스
-
+
재생 소스 ID
+
+ 현재 재생 소스
+
"soundcloud.com"에서 "Fut to the Feeling"을 재생하십시오.
@@ -1219,6 +1228,9 @@
기록 된 창 상태
+
+ 참고문헌
+
이 경로의 원본 파일과 폴더는이 앱에서 제거 할 때 삭제되지 않습니다.
@@ -1258,6 +1270,9 @@
첫 번째 줄의 기간
+
+ 현재 가사 검색 결과
+
테스트 서버
@@ -1321,6 +1336,12 @@
오른쪽
+
+ 현재 노래
+
+
+ 제목
+
[실험] 스펙트럼 레이어
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
index 1d0da53..fab3668 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw
@@ -144,6 +144,9 @@
取消
+
+ 拷贝
+
播放列表创建成功
@@ -228,7 +231,7 @@
未找到歌词
-
+
歌词来源
@@ -237,7 +240,7 @@
歌词窗口管理快捷设置
-
+
匹配百分比
@@ -264,7 +267,7 @@
仅显示翻译
-
+
翻译来源
@@ -273,7 +276,7 @@
艺术家
-
+
时长
@@ -306,9 +309,6 @@
目标歌词搜索提供商
-
- 标题
-
歌词搜索 - BetterLyrics
@@ -565,6 +565,9 @@
高级选项
+
+ 专辑
+
专辑
@@ -610,6 +613,9 @@
应用
+
+ 艺术家
+
自动调整
@@ -1189,12 +1195,15 @@
播放
-
+
播放源
-
+
播放源 ID
+
+ 当前播放源
+
在 “soundcloud.com” 上播放 “Cut to the Feeling”
@@ -1219,6 +1228,9 @@
记录的窗口状态
+
+ 参考链接
+
路径中的原始文件和文件夹不会被删除
@@ -1258,6 +1270,9 @@
首行持续时间
+
+ 当前歌词搜索结果
+
测试服务器
@@ -1321,6 +1336,12 @@
靠右
+
+ 当前歌曲
+
+
+ 标题
+
[实验性] 频谱层
diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
index b5a698d..0fa3dc6 100644
--- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
+++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw
@@ -144,6 +144,9 @@
取消
+
+ 複製
+
已成功建立播放清單
@@ -228,7 +231,7 @@
找不到歌詞
-
+
歌詞來源
@@ -237,7 +240,7 @@
歌詞視窗管理快捷設定
-
+
匹配百分比
@@ -264,7 +267,7 @@
僅顯示翻譯
-
+
翻譯來源
@@ -273,7 +276,7 @@
藝術家
-
+
時長
@@ -306,9 +309,6 @@
目標歌詞搜尋提供者
-
- 標題
-
歌詞搜尋 - BetterLyrics
@@ -565,6 +565,9 @@
高級選項
+
+ 專輯
+
專輯
@@ -610,6 +613,9 @@
應用
+
+ 藝術家
+
自動調整
@@ -1189,12 +1195,15 @@
播放
-
+
播放源
-
+
播放源 ID
+
+ 當前播放源
+
在 “soundcloud.com” 上播放 “Cut to the Feeling”
@@ -1219,6 +1228,9 @@
記錄的窗口狀態
+
+ 參考數據
+
路徑中的原始檔案和資料夾不會被刪除
@@ -1258,6 +1270,9 @@
首行持續時間
+
+ 目前歌詞搜尋結果
+
測試服務器
@@ -1321,6 +1336,12 @@
靠右
+
+ 當前歌曲
+
+
+ 標題
+
[實驗性] 頻譜層