From 80444b69e0be7e1b6e4a27b149a765b47f14e109 Mon Sep 17 00:00:00 2001 From: Raspberry-Monster Date: Wed, 22 Oct 2025 13:03:21 +0800 Subject: [PATCH] chores: Improve identification of NeteaseFamily and fix Lrc Parser unexpected behavior when parsing [Min:Sec:MillSec] --- .../Helper/LyricsParser.cs | 46 +++++++++++++++---- .../Helper/PlayerIdMatcher.cs | 25 ++++++++++ .../MediaSessionsService.cs | 6 +-- 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/PlayerIdMatcher.cs diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs index 6af38a0..506d10c 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/LyricsParser.cs @@ -4,6 +4,7 @@ using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Services; using Lyricify.Lyrics.Models; +using Lyricify.Lyrics.Parsers; using System; using System.Collections.Generic; using System.Linq; @@ -13,7 +14,7 @@ using LyricsData = BetterLyrics.WinUI3.Models.LyricsData; namespace BetterLyrics.WinUI3.Helper { - public class LyricsParser + public partial class LyricsParser { private List _lyricsDataArr = []; @@ -34,10 +35,10 @@ namespace BetterLyrics.WinUI3.Helper ParseLrc(raw); break; case LyricsFormat.Qrc: - ParseQQNeteaseKugou(Lyricify.Lyrics.Parsers.QrcParser.Parse(raw).Lines); + ParseQQNeteaseKugou(QrcParser.Parse(raw).Lines); break; case LyricsFormat.Krc: - ParseQQNeteaseKugou(Lyricify.Lyrics.Parsers.KrcParser.Parse(raw).Lines); + ParseQQNeteaseKugou(KrcParser.Parse(raw).Lines); break; case LyricsFormat.Ttml: ParseTtml(raw); @@ -153,18 +154,41 @@ namespace BetterLyrics.WinUI3.Helper else { // 普通LRC行 - var bracketRegex = new Regex(@"\[(\d{2}):(\d{2})\.(\d{2,3})\]"); - var bracketMatches = bracketRegex.Matches(line); + MatchCollection? bracketMatches = null; + Regex? bracketRegex = null; + var hasMatched = false; + + var bracketRegex1 = LrcRegex1(); + var bracketMatches1 = bracketRegex1.Matches(line); + if(bracketMatches1.Count > 0) + { + bracketMatches = bracketMatches1; + bracketRegex = bracketRegex1; + hasMatched = true; + } + + if (!hasMatched) + { + var bracketRegex2 = LrcRegex2(); + var bracketMatches2 = bracketRegex2.Matches(line); + if (bracketMatches2.Count > 0) + { + bracketMatches = bracketMatches2; + bracketRegex = bracketRegex2; + hasMatched = true; + } + } + string content = line; int? lineStartTime = null; - if (bracketMatches.Count > 0) + if (hasMatched) { - var m = bracketMatches[0]; + var m = bracketMatches![0]; int min = int.Parse(m.Groups[1].Value); int sec = int.Parse(m.Groups[2].Value); int ms = int.Parse(m.Groups[3].Value.PadRight(3, '0')); lineStartTime = min * 60_000 + sec * 1000 + ms; - content = bracketRegex.Replace(line, ""); + content = bracketRegex!.Replace(line, ""); lrcLines.Add((lineStartTime.Value, content, new List<(int, string)>())); } } @@ -450,5 +474,11 @@ namespace BetterLyrics.WinUI3.Helper _lyricsDataArr.Add(new LyricsData(lyricsLines)); } + + [GeneratedRegex(@"\[(\d{2}):(\d{2})\.(\d{2,3})\]")] + private static partial Regex LrcRegex1(); + + [GeneratedRegex(@"\[(\d{2}):(\d{2})\:(\d{2,3})\]")] + private static partial Regex LrcRegex2(); } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/PlayerIdMatcher.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/PlayerIdMatcher.cs new file mode 100644 index 0000000..09bb0e3 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/PlayerIdMatcher.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace BetterLyrics.WinUI3.Helper +{ + public static class PlayerIdMatcher + { + private static readonly List neteaseFamilyRegex = + [ + "cloudmusic.exe", //NetEaseCloudMusic + "^17588BrandonWong\\.LyricEase_", //LyricEase + "^48848aaaaaaccd\\.HyPlayer_" //HyPlayer + ]; + + public static bool IsNeteaseFamily(string player) + { + foreach (var regex in neteaseFamilyRegex) + { + var isMatch = Regex.IsMatch(player, regex); + if (isMatch) return true; + } + return false; + } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.cs index f516345..377314f 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/MediaSessionsService/MediaSessionsService.cs @@ -322,13 +322,9 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService fixedArtist = mediaProperties.Artist.Split(" — ").FirstOrDefault() ?? mediaProperties.Artist; fixedAlbum = mediaProperties.Artist.Split(" — ").LastOrDefault() ?? mediaProperties.AlbumTitle; } - else if (sessionId == Constants.PlayerID.NetEaseCloudMusic) + else if (PlayerIdMatcher.IsNeteaseFamily(sessionId)) { songId = mediaProperties.Genres.FirstOrDefault()?.Replace("NCM-", ""); - if (songId != null && songId.Length != 10) - { - songId = null; - } } _cachedSongInfo = new SongInfo