From 3f63043150ada477fcde289d992c33cc7e430e29 Mon Sep 17 00:00:00 2001 From: Zhe Fang Date: Fri, 25 Jul 2025 09:51:43 -0400 Subject: [PATCH] update readme enhance music gallery --- .../BetterLyrics.WinUI3/App.xaml | 6 + ...ArtSearchProviderToDisplayNameConverter.cs | 2 +- .../CornerRadiusToDoubleConverter.cs | 2 +- .../Converter/EnumToIntConverter.cs | 2 +- .../SecondsToFormattedTimeConverter.cs | 2 +- .../Enums/PlaybackOrder.cs | 15 + .../LyricsRendererViewModel.Draw.cs | 1 + .../ViewModels/LyricsRendererViewModel.cs | 1 - .../ViewModels/MusicGalleryViewModel.cs | 41 +- .../Views/LyricsWindow.xaml | 11 +- .../Views/LyricsWindow.xaml.cs | 11 +- .../Views/MusicGalleryPage.xaml | 405 +++++++++++------- .../Views/MusicGalleryPage.xaml.cs | 20 +- .../Views/SettingsPage.xaml | 8 +- README.CN.md | 78 ++-- README.md | 48 +-- 16 files changed, 404 insertions(+), 249 deletions(-) create mode 100644 BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/PlaybackOrder.cs diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml index 7d260d4..df0c427 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml @@ -469,6 +469,12 @@ + + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/AlbumArtSearchProviderToDisplayNameConverter.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/AlbumArtSearchProviderToDisplayNameConverter.cs index 041795f..dde0a44 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/AlbumArtSearchProviderToDisplayNameConverter.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/AlbumArtSearchProviderToDisplayNameConverter.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace BetterLyrics.WinUI3.Converter { - public class AlbumArtSearchProviderToDisplayNameConverter : IValueConverter + public partial class AlbumArtSearchProviderToDisplayNameConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/CornerRadiusToDoubleConverter.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/CornerRadiusToDoubleConverter.cs index 6fbdb8b..16c8aca 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/CornerRadiusToDoubleConverter.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/CornerRadiusToDoubleConverter.cs @@ -3,7 +3,7 @@ using Microsoft.UI.Xaml.Data; namespace BetterLyrics.WinUI3.Converter { - internal partial class CornerRadiusToDoubleConverter : IValueConverter + public partial class CornerRadiusToDoubleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/EnumToIntConverter.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/EnumToIntConverter.cs index 6692595..8998b9e 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/EnumToIntConverter.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/EnumToIntConverter.cs @@ -5,7 +5,7 @@ using Microsoft.UI.Xaml.Data; namespace BetterLyrics.WinUI3.Converter { - internal partial class EnumToIntConverter : IValueConverter + public partial class EnumToIntConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/SecondsToFormattedTimeConverter.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/SecondsToFormattedTimeConverter.cs index d1c868f..540d024 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/SecondsToFormattedTimeConverter.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Converter/SecondsToFormattedTimeConverter.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace BetterLyrics.WinUI3.Converter { - public class SecondsToFormattedTimeConverter : IValueConverter + public partial class SecondsToFormattedTimeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/PlaybackOrder.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/PlaybackOrder.cs new file mode 100644 index 0000000..483dcd1 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Enums/PlaybackOrder.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BetterLyrics.WinUI3.Enums +{ + public enum PlaybackOrder + { + RepeatAll, + RepeatOne, + Shuffle, + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Draw.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Draw.cs index 9c59ab3..328567b 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Draw.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Draw.cs @@ -7,6 +7,7 @@ using Microsoft.Graphics.Canvas.Geometry; using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.UI; +using Microsoft.UI.Xaml.Media; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.cs index 73e04be..64927ae 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.cs @@ -365,7 +365,6 @@ namespace BetterLyrics.WinUI3.ViewModels _songInfoOpacityTransition.StartTransition(1f); _logger.LogInformation("Song info changed: Title={Title}, Artist={Artist}, refreshing lyrics...", _songTitle, _songArtist); - Debug.WriteLine($"Song info changed: Title={_songTitle}, Artist={_songArtist}"); _ = _refreshLyricsRunner.RunAsync(async token => { await RefreshLyricsAsync(token); diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs index 6b8078a..512571f 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/MusicGalleryViewModel.cs @@ -40,7 +40,11 @@ namespace BetterLyrics.WinUI3.ViewModels public partial ObservableCollection GroupedTracks { get; set; } = []; [ObservableProperty] - public partial ObservableCollection TrackSearchSuggestions { get; set; } = []; + public partial ObservableCollection TrackPlayingQueue { get; set; } = []; + + public Track? PlayingTrack => TrackPlayingQueue.ElementAtOrDefault(PlayingSongIndex); + + [ObservableProperty] public partial SongOrderType SongOrderType { get; set; } = SongOrderType.Title; @@ -52,7 +56,10 @@ namespace BetterLyrics.WinUI3.ViewModels public partial Track TrackRightTapped { get; set; } = new(); [ObservableProperty] - public partial int SelectedSongIndex { get; set; } = -1; + public partial int PlayingSongIndex { get; set; } = -1; + + [ObservableProperty] + public partial int DisplayedPlayingSongIndex { get; set; } = 0; [ObservableProperty] public partial string SongSearchQuery { get; set; } = string.Empty; @@ -108,9 +115,22 @@ namespace BetterLyrics.WinUI3.ViewModels _timelineController.Pause(); break; case SystemMediaTransportControlsButton.Next: + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => + { + if (PlayingSongIndex < TrackPlayingQueue.Count - 1) + { + PlayingSongIndex++; + } + }); break; case SystemMediaTransportControlsButton.Previous: - //Previous + _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () => + { + if (PlayingSongIndex > 0) + { + PlayingSongIndex--; + } + }); break; } } @@ -191,10 +211,15 @@ namespace BetterLyrics.WinUI3.ViewModels ); break; } - SelectedSongIndex = -1; } - public void PlayTrack(Track? track) + public void InitPlayingQueue(Track? track) + { + TrackPlayingQueue = [.. GroupedTracks.SelectMany(g => g.Cast())]; + PlayingSongIndex = track == null ? -1 : TrackPlayingQueue.IndexOf(track); + } + + private void PlayTrack(Track? track) { if (track == null) return; @@ -226,6 +251,12 @@ namespace BetterLyrics.WinUI3.ViewModels ApplySongOrderType(); } + partial void OnPlayingSongIndexChanged(int value) + { + DisplayedPlayingSongIndex = value + 1; + PlayTrack(TrackPlayingQueue.ElementAtOrDefault(value)); + } + public void Receive(PropertyChangedMessage> message) { if (message.Sender is SettingsPageViewModel) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml index 7a2affb..f2994fd 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/LyricsWindow.xaml @@ -22,11 +22,14 @@ - - + + - - + + - + @@ -64,12 +63,12 @@ TextWrapping="Wrap" /> - + TextWrapping="Wrap" />--> - + @@ -127,12 +126,12 @@ TextWrapping="Wrap" /> - + TextWrapping="Wrap" />--> - + @@ -190,12 +189,12 @@ TextWrapping="Wrap" /> - + TextWrapping="Wrap" />--> + + + - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/MusicGalleryPage.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/MusicGalleryPage.xaml.cs index 555e8f5..2cb027d 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/MusicGalleryPage.xaml.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/MusicGalleryPage.xaml.cs @@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.ViewModels; using CommunityToolkit.Mvvm.DependencyInjection; +using CommunityToolkit.WinUI; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; @@ -42,9 +43,10 @@ namespace BetterLyrics.WinUI3.Views ViewModel.RefreshSongs(); } - private void SongListVireItemGrid_RightTapped(object sender, RightTappedRoutedEventArgs e) + private void SongListViewItemGrid_RightTapped(object sender, RightTappedRoutedEventArgs e) { ViewModel.TrackRightTapped = (Track)((FrameworkElement)sender).DataContext; + SongFileInfoFlyout.ShowAt(sender as FrameworkElement); } private async void SongPathHyperlinkButton_Click(object sender, RoutedEventArgs e) @@ -54,7 +56,21 @@ namespace BetterLyrics.WinUI3.Views private void SongListVireItemGrid_Tapped(object sender, TappedRoutedEventArgs e) { - ViewModel.PlayTrack((Track)((FrameworkElement)sender).DataContext); + var track = (Track)((FrameworkElement)sender).DataContext; + ViewModel.InitPlayingQueue(track); + PlayingQueueListView.ScrollIntoView(track, ScrollIntoViewAlignment.Leading); + } + + private void EmptyPlayingQueueButton_Click(object sender, RoutedEventArgs e) + { + ViewModel.TrackPlayingQueue.Clear(); + ViewModel.PlayingSongIndex = -1; + } + + private void ScrollToPlayingItemButton_Click(object sender, RoutedEventArgs e) + { + if (ViewModel.PlayingTrack == null) return; + PlayingQueueListView.ScrollIntoView(ViewModel.PlayingTrack, ScrollIntoViewAlignment.Leading); } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml index 24e3867..e855a83 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml @@ -351,18 +351,12 @@ CanDragItems="True" CanReorderItems="True" DragItemsCompleted="AlbumArtSearchProvidersListView_DragItemsCompleted" + ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}" ItemsSource="{x:Bind ViewModel.AlbumArtSearchProvidersInfo, Mode=OneWay}" SelectionMode="None"> - - - diff --git a/README.CN.md b/README.CN.md index 5d94a0d..bd7767e 100644 --- a/README.CN.md +++ b/README.CN.md @@ -1,4 +1,4 @@ -> 注:以下内容使用 https://claude.ai/ 依照英文原文翻译 +> 注:以下内容含有大语言模型翻译内容 _**🌐 Click here to see the English version**_ @@ -16,40 +16,44 @@ BetterLyrics ## 🎉 本项目已获得少数派推荐! + 查看文章:[BetterLyrics – 专为 Windows 设计的沉浸式流畅歌词显示工具](https://sspai.com/post/101028) ## 反馈交流群 -- [「BetterLyrics」反馈交流群(简体中文)](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) (1054700388) QQ群 -- [「BetterLyrics」反馈交流群(繁体中文/英语)](https://discord.gg/5yAQPnyCKv) Discord服务器 +- [「BetterLyrics」反馈交流群(简体中文)](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) (1054700388) QQ 群 +- [「BetterLyrics」反馈交流群(繁体中文/英语)](https://discord.gg/5yAQPnyCKv) Discord 服务器 -## 核心特色功能 +🌟 核心亮点功能 -- 动态模糊专辑封面作为背景 -- 流畅的歌词淡入淡出、缩放效果 -- 切换歌曲时界面平滑过渡 -- 逐字渐变卡拉OK效果(带光晕) -- 沉浸式桌面歌词(悬浮模式) -- 本地翻译(支持30种语言) +- 🌠 美观的用户界面 + - 流畅的动画与视觉特效,打造赏心悦目的歌词体验 +- ↔️ 强大的歌词翻译功能 + - 支持离线机器翻译,涵盖 30 种语言 + - 自动读取本地歌词文件中的嵌入翻译 +- 🧩 多种歌词来源 + - 本地存储 + - 音乐文件(支持嵌入歌词) + - [.lrc]() 歌词文件(兼容标准格式和增强格式) + - [.eslrc](https://github.com/ESLyric/release) 格式 + - [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) 格式 + - 在线歌词服务 + - QQ 音乐 + - 网易云音乐 + - 酷狗音乐 + - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) + - [LRCLIB](https://lrclib.net/) +- 🪟 多种歌词显示模式 + - 标准模式 + - 沉浸式歌词体验,搭配丰富动画与动态背景,听歌更享受 + - 停靠模式 + - 智能歌词栏固定在屏幕边缘,简洁美观、互不打扰 + - 桌面模式 + - 歌词悬浮于其他窗口之上,边听歌边工作两不误 +- 🧠 智能行为支持 + - 音乐播放器关闭后自动隐藏歌词窗口,干净整洁不打扰 -> 本项目仍在开发中,最新版本可能存在bug和意外行为。 - -## 支持的歌词来源 - -- 本地存储 - - 音乐文件(内嵌歌词) - - [.lrc]() 文件(支持标准格式和增强格式) - - [.eslrc](https://github.com/ESLyric/release) 文件 - - [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) 文件 - -(如需下载歌词,可使用 [LDDC](https://github.com/chenmozhijin/LDDC)) - -- 在线歌词提供商 - - QQ音乐 - - 网易云音乐 - - 酷狗音乐 - - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) - - [LRCLIB](https://lrclib.net/) +> 本项目仍在开发中,最新版本可能存在 bug 和意外行为。 ## 应用截图 @@ -79,7 +83,7 @@ BetterLyrics ## 演示视频 -观看我们的介绍视频(2025年7月7日上传):[B站链接](https://www.bilibili.com/video/BV1zjGjzfEXh) +观看我们的介绍视频(2025 年 7 月 7 日上传):[B 站链接](https://www.bilibili.com/video/BV1zjGjzfEXh) ## 已测试的音乐播放器 @@ -88,13 +92,13 @@ BetterLyrics - 之后请在 PluginMarket 内安装 InfLink 插件,安装完成后请重启网易云音乐。至此,所有预备操作均已完成,尽情享用吧! - 酷狗音乐 - 请确保酷狗音乐设置项 “支持系统播放控件,如锁屏界面” 已开启 - - 不会广播时间线信息,这意味着当您在酷狗音乐中更改播放进度时,BetterLyrics无法检测到此更改。 + - 不会广播时间线信息,这意味着当您在酷狗音乐中更改播放进度时,BetterLyrics 无法检测到此更改。 - Apple Music - - 确保您在设置中将时间线阈值设置为约600毫秒(进入"设置"-"高级选项"进行更改),否则歌词会不断前后跳动。 + - 确保您在设置中将时间线阈值设置为约 600 毫秒(进入"设置"-"高级选项"进行更改),否则歌词会不断前后跳动。 - foobar2000 - 确保您安装了 https://github.com/dumbie/foo_mediacontrol 插件 - Spotify -- QQ音乐 +- QQ 音乐 - PotPlayer - 媒体播放器(系统自带) - LX 音乐 @@ -130,17 +134,17 @@ BetterLyrics ## 特别感谢 - [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) - - 提供QQ、网易、酷狗音源的歌词获取、解密和解析 + - 提供 QQ、网易、酷狗音源的歌词获取、解密和解析 - [LRCLIB](https://lrclib.net/) - - LRCLIB歌词API提供商 + - LRCLIB 歌词 API 提供商 - [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) - 用于提取音乐文件中的图片 - [WinUIEx](https://github.com/dotMorten/WinUIEx) - - 提供便捷的Win32 API窗口操作方式 + - 提供便捷的 Win32 API 窗口操作方式 - [TagLib#](https://github.com/mono/taglib-sharp) - 用于读取原始歌词内容 - [Vanara](https://github.com/dahall/Vanara) - - Win32 API包装器 + - Win32 API 包装器 - [Stackoverflow - How to animate Margin property in WPF](https://stackoverflow.com/a/21542882/11048731) - [DevWinUI](https://github.com/ghost1372/DevWinUI) - [Bilibili -【WinUI3】SystemBackdropController:定义云母、亚克力效果](https://www.bilibili.com/video/BV1PY4FevEkS) @@ -168,4 +172,4 @@ BetterLyrics ## 欢迎提交问题和拉取请求 -如果您发现bug,请在issues中提交;如果您有任何想法,也欢迎在这里分享。 \ No newline at end of file +如果您发现 bug,请在 issues 中提交;如果您有任何想法,也欢迎在这里分享。 diff --git a/README.md b/README.md index 7b753e8..fe63805 100644 --- a/README.md +++ b/README.md @@ -21,34 +21,34 @@ Check out the article: [BetterLyrics – An immersive and smooth lyrics display - [「BetterLyrics」反馈交流群(简体中文)](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) (1054700388) on QQ - [「BetterLyrics」Feedback Chat Group (Traditional Chinese / English)](https://discord.gg/5yAQPnyCKv) on Discord -## Highlighted features +## 🌟 Highlighted features -- Dynamic blur album art as background -- Smooth lyrics fade in/out, zoom in/out effects -- Smooth user interface change from song to song -- Gradient Karaoke (with glow) effect on every single character -- Immersive desktop lyrics (dock mode) -- Local translation (supporting 30 languages) +- 🌠 **Pleasing User Interface** + - Fluent animations and effects +- ↔️ **Strong Lyrics Translation** + - Offline machine translation (supporting 30 languages) + - Auto reading local lyrics files for embedded translation +- 🧩 **Various Lyrics Source** + - Local storage + - Music files (with embedded lyrics) + - [.lrc]() files (with both core format and enhanced format) + - [.eslrc](https://github.com/ESLyric/release) files + - [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) files + - Online lyrics providers + - QQ Music + - 网易云音乐 NetEase Cloud Music + - 酷狗音乐 Kugou Music + - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) + - [LRCLIB](https://lrclib.net/) +- 🪟 **Multiple Display Modes** + - **Standard Mode** Enjoy an immersive listening journey with rich lyrics animations and beautifully dynamic backgrounds + - **Dock Mode** A smart animated lyrics bar docked to your screen edge + - **Desktop Mode** Enjoy immersive lyrics floating above your apps +- 🧠 **Smart Behaviors** + - Auto hide when music player closed > This project is still under development, bugs and unexpected behaviors may be existed in the latest branch. -## Supported lyrics source - -- From your local storage - - Music files (with embedded lyrics) - - [.lrc]() files (with both core format and enhanced format) - - [.eslrc](https://github.com/ESLyric/release) files - - [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) files - -(For lyrics downloading, you can use [LDDC](https://github.com/chenmozhijin/LDDC)) - -- From online lyrics providers - - QQ Music - - 网易云音乐 NetEase Cloud Music - - 酷狗音乐 Kugou Music - - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) - - [LRCLIB](https://lrclib.net/) - ## Screenshots ### Standard mode