diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest index 75beb19..e1a27ad 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.0.31.0" /> diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml.cs index 702922f..f09add5 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml.cs @@ -75,8 +75,6 @@ namespace BetterLyrics.WinUI3 protected override void OnLaunched(LaunchActivatedEventArgs args) { - Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; - WindowHelper.OpenWindow(); var lyricsWindow = WindowHelper.GetWindowByWindowType(); if (lyricsWindow == null) return; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/ISettingsService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/ISettingsService.cs index 92a92f3..e04372b 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/ISettingsService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/ISettingsService.cs @@ -61,7 +61,9 @@ namespace BetterLyrics.WinUI3.Services LyricsFontColorType LyricsFgFontColorType { get; set; } LyricsFontColorType LyricsStrokeFontColorType { get; set; } - int LyricsFontSize { get; set; } + int LyricsStandardFontSize { get; set; } + int LyricsDockFontSize { get; set; } + int LyricsDesktopFontSize { get; set; } ElementTheme LyricsBackgroundTheme { get; set; } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/SettingsService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/SettingsService.cs index a549b57..344cea4 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/SettingsService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/SettingsService.cs @@ -62,7 +62,11 @@ namespace BetterLyrics.WinUI3.Services private const string LyricsFontStrokeWidthKey = "LyricsFontStrokeWidth"; - private const string LyricsFontSizeKey = "LyricsFontSize"; + // Lyrics font size + private const string LyricsStandardFontSizeKey = "LyricsStandardFontSize"; + private const string LyricsDockFontSizeKey = "LyricsDockFontSize"; + private const string LyricsDesktopFontSizeKey = "LyricsDesktopFontSize"; + private const string LyricsFontWeightKey = "LyricsFontWeightKey"; private const string LyricsGlowEffectScopeKey = "LyricsGlowEffectScope"; private const string LyricsHighlightSopeKey = "LyricsHighlightSope"; @@ -204,7 +208,10 @@ namespace BetterLyrics.WinUI3.Services SetDefault(LyricsCustomFgFontColorKey, Colors.White.ToInt()); SetDefault(LyricsCustomStrokeFontColorKey, Colors.White.ToInt()); - SetDefault(LyricsFontSizeKey, 28); + SetDefault(LyricsStandardFontSizeKey, 28); + SetDefault(LyricsDockFontSizeKey, 20); + SetDefault(LyricsDesktopFontSizeKey, 28); + SetDefault(LyricsLineSpacingFactorKey, 0.5f); SetDefault(LyricsVerticalEdgeOpacityKey, 0); SetDefault(IsLyricsGlowEffectEnabledKey, true); @@ -511,10 +518,22 @@ namespace BetterLyrics.WinUI3.Services set => SetValue(LyricsFontStrokeWidthKey, value); } - public int LyricsFontSize + public int LyricsStandardFontSize { - get => GetValue(LyricsFontSizeKey); - set => SetValue(LyricsFontSizeKey, value); + get => GetValue(LyricsStandardFontSizeKey); + set => SetValue(LyricsStandardFontSizeKey, value); + } + + public int LyricsDockFontSize + { + get => GetValue(LyricsDockFontSizeKey); + set => SetValue(LyricsDockFontSizeKey, value); + } + + public int LyricsDesktopFontSize + { + get => GetValue(LyricsDesktopFontSizeKey); + set => SetValue(LyricsDesktopFontSizeKey, value); } public LyricsFontWeight LyricsFontWeight diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs index 938d7f6..4761238 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsPageViewModel.cs @@ -37,7 +37,9 @@ namespace BetterLyrics.WinUI3.ViewModels PositionOffset = _settingsService.PositionOffset; IsImmersiveMode = _settingsService.IsImmersiveMode; ShowTranslationOnly = _settingsService.ShowTranslationOnly; - LyricsFontSize = _settingsService.LyricsFontSize; + + LyricsStandardFontSize = _settingsService.LyricsStandardFontSize; + LyricsFontFamily = _settingsService.LyricsFontFamily; OnIsImmersiveModeChanged(IsImmersiveMode); @@ -91,7 +93,7 @@ namespace BetterLyrics.WinUI3.ViewModels public partial string LyricsFontFamily { get; set; } [ObservableProperty] - public partial int LyricsFontSize { get; set; } + public partial int LyricsStandardFontSize { get; set; } [ObservableProperty] public partial bool IsImmersiveMode { get; set; } @@ -236,9 +238,9 @@ namespace BetterLyrics.WinUI3.ViewModels { if (message.Sender is SettingsPageViewModel) { - if (message.PropertyName == nameof(SettingsPageViewModel.LyricsFontSize)) + if (message.PropertyName == nameof(SettingsPageViewModel.LyricsStandardFontSize)) { - LyricsFontSize = message.NewValue; + LyricsStandardFontSize = message.NewValue; } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs index f7757f8..6f9f56d 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel.Messages.cs @@ -205,7 +205,7 @@ namespace BetterLyrics.WinUI3.ViewModels _lyricsBlurAmount = message.NewValue; _isLayoutChanged = true; } - else if (message.PropertyName == nameof(SettingsPageViewModel.LyricsFontSize)) + else if (message.PropertyName == nameof(SettingsPageViewModel.LyricsStandardFontSize)) { _lyricsFontSize = message.NewValue; _isLayoutChanged = true; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Ctor.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Ctor.cs new file mode 100644 index 0000000..3b169e8 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Ctor.cs @@ -0,0 +1,91 @@ +using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BetterLyrics.WinUI3.ViewModels +{ + public partial class SettingsPageViewModel + { + public SettingsPageViewModel(ISettingsService settingsService, ILibWatcherService libWatcherService, IPlaybackService playbackService, ITranslateService libreTranslateService) : base(settingsService) + { + _libWatcherService = libWatcherService; + _playbackService = playbackService; + _libreTranslateService = libreTranslateService; + + IsLibreTranslateEnabled = _settingsService.IsLibreTranslateEnabled; + LibreTranslateServer = _settingsService.LibreTranslateServer; + SelectedTargetLanguageIndex = _settingsService.SelectedTargetLanguageIndex; + + LocalMediaFolders = [.. _settingsService.LocalMediaFolders]; + LyricsSearchProvidersInfo = [.. _settingsService.LyricsSearchProvidersInfo]; + AlbumArtSearchProvidersInfo = [.. _settingsService.AlbumArtSearchProvidersInfo]; + + Language = _settingsService.Language; + CoverImageRadius = _settingsService.CoverImageRadius; + + AutoStartWindowType = _settingsService.AutoStartWindowType; + AutoLockOnDesktopMode = _settingsService.AutoLockOnDesktopMode; + + IsDynamicCoverOverlayEnabled = _settingsService.IsDynamicCoverOverlayEnabled; + CoverOverlayOpacity = _settingsService.CoverOverlayOpacity; + CoverOverlayBlurAmount = _settingsService.CoverOverlayBlurAmount; + + CoverAcrylicEffectAmount = _settingsService.CoverAcrylicEffectAmount; + + LyricsAlignmentType = _settingsService.LyricsAlignmentType; + SongInfoAlignmentType = _settingsService.SongInfoAlignmentType; + LyricsFontWeight = _settingsService.LyricsFontWeight; + LyricsBlurAmount = _settingsService.LyricsBlurAmount; + LyricsVerticalEdgeOpacity = _settingsService.LyricsVerticalEdgeOpacity; + LyricsLineSpacingFactor = _settingsService.LyricsLineSpacingFactor; + + // Font size + LyricsStandardFontSize = _settingsService.LyricsStandardFontSize; + LyricsDockFontSize = _settingsService.LyricsDockFontSize; + LyricsDesktopFontSize = _settingsService.LyricsDesktopFontSize; + + IsLyricsGlowEffectEnabled = _settingsService.IsLyricsGlowEffectEnabled; + LyricsGlowEffectScope = _settingsService.LyricsGlowEffectScope; + LyricsHighlightScope = _settingsService.LyricsHighlightScope; + IsFanLyricsEnabled = _settingsService.IsFanLyricsEnabled; + + LyricsBgFontColorType = _settingsService.LyricsBgFontColorType; + LyricsFgFontColorType = _settingsService.LyricsFgFontColorType; + LyricsStrokeFontColorType = _settingsService.LyricsStrokeFontColorType; + + LyricsCustomBgFontColor = _settingsService.LyricsCustomBgFontColor; + LyricsCustomFgFontColor = _settingsService.LyricsCustomFgFontColor; + LyricsCustomStrokeFontColor = _settingsService.LyricsCustomStrokeFontColor; + + LyricsFontStrokeWidth = _settingsService.LyricsFontStrokeWidth; + LyricsBackgroundTheme = _settingsService.LyricsBackgroundTheme; + MediaSourceProvidersInfo = [.. _settingsService.MediaSourceProvidersInfo]; + IgnoreFullscreenWindow = _settingsService.IgnoreFullscreenWindow; + + LyricsScrollEasingType = _settingsService.LyricsScrollEasingType; + LyricsScrollDuration = _settingsService.LyricsScrollDuration; + TimelineSyncThreshold = _settingsService.TimelineSyncThreshold; + + IsLyricsFloatAnimationEnabled = _settingsService.IsLyricsFloatAnimationEnabled; + ResetPositionOffsetOnSongChanged = _settingsService.ResetPositionOffsetOnSongChanged; + LockHotKeyIndex = _settingsService.LockHotKeyIndex; + + LXMusicServer = _settingsService.LXMusicServer; + DockPlacement = _settingsService.DockPlacement; + LyricsBgFontOpacity = _settingsService.LyricsBgFontOpacity; + HideWindowWhenNotPlaying = _settingsService.HideWindowWhenNotPlaying; + DockWindowHeight = _settingsService.DockWindowHeight; + + SystemFontNames = [.. FontHelper.SystemFontFamilies]; + SelectedFontFamilyIndex = _settingsService.SelectedFontFamilyIndex; + LyricsFontFamily = _settingsService.LyricsFontFamily; + IsDragEverywhereEnabled = _settingsService.IsDragEverywhereEnabled; + + _playbackService.MediaSourceProvidersInfoChanged += PlaybackService_SessionIdsChanged; + } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.OnPropsChanged.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.OnPropsChanged.cs new file mode 100644 index 0000000..f68571c --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.OnPropsChanged.cs @@ -0,0 +1,227 @@ +using BetterLyrics.WinUI3.Enums; +using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Views; +using Microsoft.UI.Xaml; +using Windows.Globalization; +using Windows.UI; + +namespace BetterLyrics.WinUI3.ViewModels +{ + public partial class SettingsPageViewModel + { + partial void OnDockPlacementChanged(DockPlacement value) + { + _settingsService.DockPlacement = value; + } + partial void OnLyricsScrollEasingTypeChanged(EasingType value) + { + _settingsService.LyricsScrollEasingType = value; + } + partial void OnLyricsScrollDurationChanged(int value) + { + _settingsService.LyricsScrollDuration = value; + } + partial void OnLyricsBackgroundThemeChanged(ElementTheme value) + { + _settingsService.LyricsBackgroundTheme = value; + } + partial void OnLyricsFontStrokeWidthChanged(int value) + { + _settingsService.LyricsFontStrokeWidth = value; + } + partial void OnIgnoreFullscreenWindowChanged(bool value) + { + _settingsService.IgnoreFullscreenWindow = value; + } + partial void OnSelectedTargetLanguageIndexChanged(int value) + { + _settingsService.SelectedTargetLanguageIndex = value; + } + partial void OnLibreTranslateServerChanged(string value) + { + _settingsService.LibreTranslateServer = value; + } + partial void OnLXMusicServerChanged(string value) + { + _settingsService.LXMusicServer = value; + } + partial void OnAutoStartWindowTypeChanged(AutoStartWindowType value) + { + _settingsService.AutoStartWindowType = value; + } + partial void OnAutoLockOnDesktopModeChanged(bool value) + { + _settingsService.AutoLockOnDesktopMode = value; + } + partial void OnCoverImageRadiusChanged(int value) + { + _settingsService.CoverImageRadius = value; + } + partial void OnCoverOverlayBlurAmountChanged(int value) + { + _settingsService.CoverOverlayBlurAmount = value; + } + partial void OnCoverAcrylicEffectAmountChanged(int value) + { + _settingsService.CoverAcrylicEffectAmount = value; + } + partial void OnCoverOverlayOpacityChanged(int value) + { + _settingsService.CoverOverlayOpacity = value; + } + partial void OnIsDynamicCoverOverlayEnabledChanged(bool value) + { + _settingsService.IsDynamicCoverOverlayEnabled = value; + } + partial void OnLanguageChanged(Enums.Language value) + { + switch (value) + { + case Enums.Language.FollowSystem: + ApplicationLanguages.PrimaryLanguageOverride = ""; + break; + case Enums.Language.English: + ApplicationLanguages.PrimaryLanguageOverride = "en-US"; + break; + case Enums.Language.SimplifiedChinese: + ApplicationLanguages.PrimaryLanguageOverride = "zh-CN"; + break; + case Enums.Language.TraditionalChinese: + ApplicationLanguages.PrimaryLanguageOverride = "zh-TW"; + break; + case Enums.Language.Japanese: + ApplicationLanguages.PrimaryLanguageOverride = "ja-JP"; + break; + case Enums.Language.Korean: + ApplicationLanguages.PrimaryLanguageOverride = "ko-KR"; + break; + default: + break; + } + _settingsService.Language = Language; + } + partial void OnIsFanLyricsEnabledChanged(bool value) + { + _settingsService.IsFanLyricsEnabled = value; + } + partial void OnIsLyricsGlowEffectEnabledChanged(bool value) + { + _settingsService.IsLyricsGlowEffectEnabled = value; + } + partial void OnLyricsAlignmentTypeChanged(TextAlignmentType value) + { + _settingsService.LyricsAlignmentType = value; + } + partial void OnSongInfoAlignmentTypeChanged(TextAlignmentType value) + { + _settingsService.SongInfoAlignmentType = value; + } + partial void OnLyricsBlurAmountChanged(int value) + { + _settingsService.LyricsBlurAmount = value; + } + partial void OnLyricsCustomBgFontColorChanged(Color value) + { + _settingsService.LyricsCustomBgFontColor = value; + } + partial void OnLyricsCustomFgFontColorChanged(Color value) + { + _settingsService.LyricsCustomFgFontColor = value; + } + partial void OnLyricsCustomStrokeFontColorChanged(Color value) + { + _settingsService.LyricsCustomStrokeFontColor = value; + } + partial void OnLyricsBgFontColorTypeChanged(LyricsFontColorType value) + { + _settingsService.LyricsBgFontColorType = value; + } + partial void OnLyricsFgFontColorTypeChanged(LyricsFontColorType value) + { + _settingsService.LyricsFgFontColorType = value; + } + partial void OnLyricsStrokeFontColorTypeChanged(LyricsFontColorType value) + { + _settingsService.LyricsStrokeFontColorType = value; + } + partial void OnLyricsStandardFontSizeChanged(int value) + { + _settingsService.LyricsStandardFontSize = value; + } + partial void OnLyricsDockFontSizeChanged(int value) + { + _settingsService.LyricsDockFontSize = value; + } + partial void OnLyricsDesktopFontSizeChanged(int value) + { + _settingsService.LyricsDesktopFontSize = value; + } + partial void OnLyricsFontWeightChanged(LyricsFontWeight value) + { + _settingsService.LyricsFontWeight = value; + } + partial void OnLyricsGlowEffectScopeChanged(LineRenderingType value) + { + _settingsService.LyricsGlowEffectScope = value; + } + partial void OnLyricsHighlightScopeChanged(LineRenderingType value) + { + _settingsService.LyricsHighlightScope = value; + } + partial void OnLyricsLineSpacingFactorChanged(float value) + { + _settingsService.LyricsLineSpacingFactor = value; + } + partial void OnLyricsVerticalEdgeOpacityChanged(int value) + { + _settingsService.LyricsVerticalEdgeOpacity = value; + } + partial void OnTimelineSyncThresholdChanged(int value) + { + _settingsService.TimelineSyncThreshold = value; + } + partial void OnIsLyricsFloatAnimationEnabledChanged(bool value) + { + _settingsService.IsLyricsFloatAnimationEnabled = value; + } + partial void OnResetPositionOffsetOnSongChangedChanged(bool value) + { + _settingsService.ResetPositionOffsetOnSongChanged = value; + } + partial void OnLyricsBgFontOpacityChanged(int value) + { + _settingsService.LyricsBgFontOpacity = value; + } + partial void OnHideWindowWhenNotPlayingChanged(bool value) + { + _settingsService.HideWindowWhenNotPlaying = value; + } + partial void OnDockWindowHeightChanged(int value) + { + _settingsService.DockWindowHeight = value; + } + partial void OnSelectedFontFamilyIndexChanged(int value) + { + _settingsService.SelectedFontFamilyIndex = value; + LyricsFontFamily = SystemFontNames[value]; + } + partial void OnLyricsFontFamilyChanged(string value) + { + _settingsService.LyricsFontFamily = value; + } + partial void OnIsDragEverywhereEnabledChanged(bool value) + { + _settingsService.IsDragEverywhereEnabled = value; + + LyricsWindow? lyricsWindow = WindowHelper.GetWindowByWindowType(); + if (lyricsWindow != null) + { + lyricsWindow.UpdateTitleBarArea(); + } + } + partial void OnIsLibreTranslateEnabledChanged(bool value) + { + _settingsService.IsLibreTranslateEnabled = value; + } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Props.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Props.cs new file mode 100644 index 0000000..f648e74 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.Props.cs @@ -0,0 +1,237 @@ +using BetterLyrics.WinUI3.Enums; +using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Models; +using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.UI.Xaml; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.UI; + +namespace BetterLyrics.WinUI3.ViewModels +{ + public partial class SettingsPageViewModel + { + public string Version { get; set; } = MetadataHelper.AppVersion; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsLibreTranslateEnabled { get; set; } + + [ObservableProperty] + public partial bool IsDragEverywhereEnabled { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial string LyricsFontFamily { get; set; } + + [ObservableProperty] + public partial ObservableCollection SystemFontNames { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int SelectedFontFamilyIndex { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial DockPlacement DockPlacement { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LockHotKeyIndex { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial ElementTheme LyricsBackgroundTheme { get; set; } + + [ObservableProperty] + public partial AutoStartWindowType AutoStartWindowType { get; set; } + + [ObservableProperty] + public partial bool AutoLockOnDesktopMode { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int CoverImageRadius { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int CoverOverlayBlurAmount { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int CoverOverlayOpacity { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsDebugOverlayEnabled { get; set; } = false; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsLogEnabled { get; set; } = false; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsDynamicCoverOverlayEnabled { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int CoverAcrylicEffectAmount { get; set; } + + [ObservableProperty] + public partial Enums.Language Language { get; set; } + + [ObservableProperty] + public partial ObservableCollection LocalMediaFolders { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial ObservableCollection LyricsSearchProvidersInfo { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial ObservableCollection AlbumArtSearchProvidersInfo { get; set; } + + [ObservableProperty] + public partial ObservableCollection MediaSourceProvidersInfo { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsFanLyricsEnabled { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsLyricsGlowEffectEnabled { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial TextAlignmentType LyricsAlignmentType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial TextAlignmentType SongInfoAlignmentType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsBlurAmount { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial Color LyricsCustomBgFontColor { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial Color LyricsCustomFgFontColor { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial Color LyricsCustomStrokeFontColor { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsBgFontOpacity { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LyricsFontColorType LyricsBgFontColorType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LyricsFontColorType LyricsFgFontColorType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LyricsFontColorType LyricsStrokeFontColorType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsStandardFontSize { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsDockFontSize { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsDesktopFontSize { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LyricsFontWeight LyricsFontWeight { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LineRenderingType LyricsGlowEffectScope { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial LineRenderingType LyricsHighlightScope { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial float LyricsLineSpacingFactor { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsVerticalEdgeOpacity { get; set; } + + [ObservableProperty] + public partial object NavViewSelectedItemTag { get; set; } = "App"; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool ResetPositionOffsetOnSongChanged { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IsLyricsFloatAnimationEnabled { get; set; } + + [ObservableProperty] + public partial string LibreTranslateServer { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int SelectedTargetLanguageIndex { get; set; } = 0; + + [ObservableProperty] + public partial bool IsLibreTranslateServerTesting { get; set; } = false; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsFontStrokeWidth { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool IgnoreFullscreenWindow { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial EasingType LyricsScrollEasingType { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int LyricsScrollDuration { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int TimelineSyncThreshold { get; set; } + + [ObservableProperty] + public partial bool IsLXMusicServerTesting { get; set; } = false; + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial string LXMusicServer { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial bool HideWindowWhenNotPlaying { get; set; } + + [ObservableProperty] + [NotifyPropertyChangedRecipients] + public partial int DockWindowHeight { get; set; } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs index e6a9e66..6ba689d 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/SettingsPageViewModel.cs @@ -31,296 +31,11 @@ namespace BetterLyrics.WinUI3.ViewModels private readonly string _autoStartupTaskId = "AutoStartup"; - public SettingsPageViewModel(ISettingsService settingsService, ILibWatcherService libWatcherService, IPlaybackService playbackService, ITranslateService libreTranslateService) : base(settingsService) - { - _libWatcherService = libWatcherService; - _playbackService = playbackService; - _libreTranslateService = libreTranslateService; - - IsLibreTranslateEnabled = _settingsService.IsLibreTranslateEnabled; - LibreTranslateServer = _settingsService.LibreTranslateServer; - SelectedTargetLanguageIndex = _settingsService.SelectedTargetLanguageIndex; - - LocalMediaFolders = [.. _settingsService.LocalMediaFolders]; - LyricsSearchProvidersInfo = [.. _settingsService.LyricsSearchProvidersInfo]; - AlbumArtSearchProvidersInfo = [.. _settingsService.AlbumArtSearchProvidersInfo]; - - Language = _settingsService.Language; - CoverImageRadius = _settingsService.CoverImageRadius; - - AutoStartWindowType = _settingsService.AutoStartWindowType; - AutoLockOnDesktopMode = _settingsService.AutoLockOnDesktopMode; - - IsDynamicCoverOverlayEnabled = _settingsService.IsDynamicCoverOverlayEnabled; - CoverOverlayOpacity = _settingsService.CoverOverlayOpacity; - CoverOverlayBlurAmount = _settingsService.CoverOverlayBlurAmount; - - CoverAcrylicEffectAmount = _settingsService.CoverAcrylicEffectAmount; - - LyricsAlignmentType = _settingsService.LyricsAlignmentType; - SongInfoAlignmentType = _settingsService.SongInfoAlignmentType; - LyricsFontWeight = _settingsService.LyricsFontWeight; - LyricsBlurAmount = _settingsService.LyricsBlurAmount; - LyricsVerticalEdgeOpacity = _settingsService.LyricsVerticalEdgeOpacity; - LyricsLineSpacingFactor = _settingsService.LyricsLineSpacingFactor; - LyricsFontSize = _settingsService.LyricsFontSize; - IsLyricsGlowEffectEnabled = _settingsService.IsLyricsGlowEffectEnabled; - LyricsGlowEffectScope = _settingsService.LyricsGlowEffectScope; - LyricsHighlightScope = _settingsService.LyricsHighlightScope; - IsFanLyricsEnabled = _settingsService.IsFanLyricsEnabled; - - LyricsBgFontColorType = _settingsService.LyricsBgFontColorType; - LyricsFgFontColorType = _settingsService.LyricsFgFontColorType; - LyricsStrokeFontColorType = _settingsService.LyricsStrokeFontColorType; - - LyricsCustomBgFontColor = _settingsService.LyricsCustomBgFontColor; - LyricsCustomFgFontColor = _settingsService.LyricsCustomFgFontColor; - LyricsCustomStrokeFontColor = _settingsService.LyricsCustomStrokeFontColor; - - LyricsFontStrokeWidth = _settingsService.LyricsFontStrokeWidth; - LyricsBackgroundTheme = _settingsService.LyricsBackgroundTheme; - MediaSourceProvidersInfo = [.. _settingsService.MediaSourceProvidersInfo]; - IgnoreFullscreenWindow = _settingsService.IgnoreFullscreenWindow; - - LyricsScrollEasingType = _settingsService.LyricsScrollEasingType; - LyricsScrollDuration = _settingsService.LyricsScrollDuration; - TimelineSyncThreshold = _settingsService.TimelineSyncThreshold; - - IsLyricsFloatAnimationEnabled = _settingsService.IsLyricsFloatAnimationEnabled; - ResetPositionOffsetOnSongChanged = _settingsService.ResetPositionOffsetOnSongChanged; - LockHotKeyIndex = _settingsService.LockHotKeyIndex; - - LXMusicServer = _settingsService.LXMusicServer; - DockPlacement = _settingsService.DockPlacement; - LyricsBgFontOpacity = _settingsService.LyricsBgFontOpacity; - HideWindowWhenNotPlaying = _settingsService.HideWindowWhenNotPlaying; - DockWindowHeight = _settingsService.DockWindowHeight; - - SystemFontNames = [.. FontHelper.SystemFontFamilies]; - SelectedFontFamilyIndex = _settingsService.SelectedFontFamilyIndex; - LyricsFontFamily = _settingsService.LyricsFontFamily; - IsDragEverywhereEnabled = _settingsService.IsDragEverywhereEnabled; - - _playbackService.MediaSourceProvidersInfoChanged += PlaybackService_SessionIdsChanged; - } - private void PlaybackService_SessionIdsChanged(object? sender, Events.MediaSourceProvidersInfoEventArgs e) { MediaSourceProvidersInfo = [.. e.MediaSourceProviersInfo]; } - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsLibreTranslateEnabled { get; set; } - - [ObservableProperty] - public partial bool IsDragEverywhereEnabled { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial string LyricsFontFamily { get; set; } - - - [ObservableProperty] - public partial ObservableCollection SystemFontNames { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int SelectedFontFamilyIndex { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial DockPlacement DockPlacement { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LockHotKeyIndex { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial ElementTheme LyricsBackgroundTheme { get; set; } - - [ObservableProperty] - public partial AutoStartWindowType AutoStartWindowType { get; set; } - - [ObservableProperty] - public partial bool AutoLockOnDesktopMode { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int CoverImageRadius { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int CoverOverlayBlurAmount { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int CoverOverlayOpacity { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsDebugOverlayEnabled { get; set; } = false; - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsLogEnabled { get; set; } = false; - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsDynamicCoverOverlayEnabled { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int CoverAcrylicEffectAmount { get; set; } - - [ObservableProperty] - public partial Enums.Language Language { get; set; } - - [ObservableProperty] - public partial ObservableCollection LocalMediaFolders { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial ObservableCollection LyricsSearchProvidersInfo { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial ObservableCollection AlbumArtSearchProvidersInfo { get; set; } - - [ObservableProperty] - public partial ObservableCollection MediaSourceProvidersInfo { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsFanLyricsEnabled { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsLyricsGlowEffectEnabled { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial TextAlignmentType LyricsAlignmentType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial TextAlignmentType SongInfoAlignmentType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsBlurAmount { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial Color LyricsCustomBgFontColor { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial Color LyricsCustomFgFontColor { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial Color LyricsCustomStrokeFontColor { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsBgFontOpacity { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LyricsFontColorType LyricsBgFontColorType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LyricsFontColorType LyricsFgFontColorType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LyricsFontColorType LyricsStrokeFontColorType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsFontSize { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LyricsFontWeight LyricsFontWeight { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LineRenderingType LyricsGlowEffectScope { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial LineRenderingType LyricsHighlightScope { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial float LyricsLineSpacingFactor { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsVerticalEdgeOpacity { get; set; } - - [ObservableProperty] - public partial object NavViewSelectedItemTag { get; set; } = "App"; - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool ResetPositionOffsetOnSongChanged { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IsLyricsFloatAnimationEnabled { get; set; } - - public string Version { get; set; } = MetadataHelper.AppVersion; - - [ObservableProperty] - public partial string LibreTranslateServer { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int SelectedTargetLanguageIndex { get; set; } = 0; - - [ObservableProperty] - public partial bool IsLibreTranslateServerTesting { get; set; } = false; - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsFontStrokeWidth { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool IgnoreFullscreenWindow { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial EasingType LyricsScrollEasingType { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int LyricsScrollDuration { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int TimelineSyncThreshold { get; set; } - - [ObservableProperty] - public partial bool IsLXMusicServerTesting { get; set; } = false; - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial string LXMusicServer { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial bool HideWindowWhenNotPlaying { get; set; } - - [ObservableProperty] - [NotifyPropertyChangedRecipients] - public partial int DockWindowHeight { get; set; } - public void OnLyricsSearchProvidersReordered() { _settingsService.LyricsSearchProvidersInfo = [.. LyricsSearchProvidersInfo]; @@ -525,212 +240,5 @@ namespace BetterLyrics.WinUI3.ViewModels } return result; } - - partial void OnDockPlacementChanged(DockPlacement value) - { - _settingsService.DockPlacement = value; - } - partial void OnLyricsScrollEasingTypeChanged(EasingType value) - { - _settingsService.LyricsScrollEasingType = value; - } - partial void OnLyricsScrollDurationChanged(int value) - { - _settingsService.LyricsScrollDuration = value; - } - partial void OnLyricsBackgroundThemeChanged(ElementTheme value) - { - _settingsService.LyricsBackgroundTheme = value; - } - partial void OnLyricsFontStrokeWidthChanged(int value) - { - _settingsService.LyricsFontStrokeWidth = value; - } - partial void OnIgnoreFullscreenWindowChanged(bool value) - { - _settingsService.IgnoreFullscreenWindow = value; - } - partial void OnSelectedTargetLanguageIndexChanged(int value) - { - _settingsService.SelectedTargetLanguageIndex = value; - } - partial void OnLibreTranslateServerChanged(string value) - { - _settingsService.LibreTranslateServer = value; - } - partial void OnLXMusicServerChanged(string value) - { - _settingsService.LXMusicServer = value; - } - partial void OnAutoStartWindowTypeChanged(AutoStartWindowType value) - { - _settingsService.AutoStartWindowType = value; - } - partial void OnAutoLockOnDesktopModeChanged(bool value) - { - _settingsService.AutoLockOnDesktopMode = value; - } - partial void OnCoverImageRadiusChanged(int value) - { - _settingsService.CoverImageRadius = value; - } - partial void OnCoverOverlayBlurAmountChanged(int value) - { - _settingsService.CoverOverlayBlurAmount = value; - } - partial void OnCoverAcrylicEffectAmountChanged(int value) - { - _settingsService.CoverAcrylicEffectAmount = value; - } - partial void OnCoverOverlayOpacityChanged(int value) - { - _settingsService.CoverOverlayOpacity = value; - } - partial void OnIsDynamicCoverOverlayEnabledChanged(bool value) - { - _settingsService.IsDynamicCoverOverlayEnabled = value; - } - partial void OnLanguageChanged(Enums.Language value) - { - switch (value) - { - case Enums.Language.FollowSystem: - ApplicationLanguages.PrimaryLanguageOverride = ""; - break; - case Enums.Language.English: - ApplicationLanguages.PrimaryLanguageOverride = "en-US"; - break; - case Enums.Language.SimplifiedChinese: - ApplicationLanguages.PrimaryLanguageOverride = "zh-CN"; - break; - case Enums.Language.TraditionalChinese: - ApplicationLanguages.PrimaryLanguageOverride = "zh-TW"; - break; - case Enums.Language.Japanese: - ApplicationLanguages.PrimaryLanguageOverride = "ja-JP"; - break; - case Enums.Language.Korean: - ApplicationLanguages.PrimaryLanguageOverride = "ko-KR"; - break; - default: - break; - } - _settingsService.Language = Language; - } - partial void OnIsFanLyricsEnabledChanged(bool value) - { - _settingsService.IsFanLyricsEnabled = value; - } - partial void OnIsLyricsGlowEffectEnabledChanged(bool value) - { - _settingsService.IsLyricsGlowEffectEnabled = value; - } - partial void OnLyricsAlignmentTypeChanged(TextAlignmentType value) - { - _settingsService.LyricsAlignmentType = value; - } - partial void OnSongInfoAlignmentTypeChanged(TextAlignmentType value) - { - _settingsService.SongInfoAlignmentType = value; - } - partial void OnLyricsBlurAmountChanged(int value) - { - _settingsService.LyricsBlurAmount = value; - } - partial void OnLyricsCustomBgFontColorChanged(Color value) - { - _settingsService.LyricsCustomBgFontColor = value; - } - partial void OnLyricsCustomFgFontColorChanged(Color value) - { - _settingsService.LyricsCustomFgFontColor = value; - } - partial void OnLyricsCustomStrokeFontColorChanged(Color value) - { - _settingsService.LyricsCustomStrokeFontColor = value; - } - partial void OnLyricsBgFontColorTypeChanged(LyricsFontColorType value) - { - _settingsService.LyricsBgFontColorType = value; - } - partial void OnLyricsFgFontColorTypeChanged(LyricsFontColorType value) - { - _settingsService.LyricsFgFontColorType = value; - } - partial void OnLyricsStrokeFontColorTypeChanged(LyricsFontColorType value) - { - _settingsService.LyricsStrokeFontColorType = value; - } - partial void OnLyricsFontSizeChanged(int value) - { - _settingsService.LyricsFontSize = value; - } - partial void OnLyricsFontWeightChanged(LyricsFontWeight value) - { - _settingsService.LyricsFontWeight = value; - } - partial void OnLyricsGlowEffectScopeChanged(LineRenderingType value) - { - _settingsService.LyricsGlowEffectScope = value; - } - partial void OnLyricsHighlightScopeChanged(LineRenderingType value) - { - _settingsService.LyricsHighlightScope = value; - } - partial void OnLyricsLineSpacingFactorChanged(float value) - { - _settingsService.LyricsLineSpacingFactor = value; - } - partial void OnLyricsVerticalEdgeOpacityChanged(int value) - { - _settingsService.LyricsVerticalEdgeOpacity = value; - } - partial void OnTimelineSyncThresholdChanged(int value) - { - _settingsService.TimelineSyncThreshold = value; - } - partial void OnIsLyricsFloatAnimationEnabledChanged(bool value) - { - _settingsService.IsLyricsFloatAnimationEnabled = value; - } - partial void OnResetPositionOffsetOnSongChangedChanged(bool value) - { - _settingsService.ResetPositionOffsetOnSongChanged = value; - } - partial void OnLyricsBgFontOpacityChanged(int value) - { - _settingsService.LyricsBgFontOpacity = value; - } - partial void OnHideWindowWhenNotPlayingChanged(bool value) - { - _settingsService.HideWindowWhenNotPlaying = value; - } - partial void OnDockWindowHeightChanged(int value) - { - _settingsService.DockWindowHeight = value; - } - partial void OnSelectedFontFamilyIndexChanged(int value) - { - _settingsService.SelectedFontFamilyIndex = value; - LyricsFontFamily = SystemFontNames[value]; - } - partial void OnLyricsFontFamilyChanged(string value) - { - _settingsService.LyricsFontFamily = value; - } - partial void OnIsDragEverywhereEnabledChanged(bool value) - { - _settingsService.IsDragEverywhereEnabled = value; - - LyricsWindow? lyricsWindow = WindowHelper.GetWindowByWindowType(); - if (lyricsWindow != null) - { - lyricsWindow.UpdateTitleBarArea(); - } - } - partial void OnIsLibreTranslateEnabledChanged(bool value) - { - _settingsService.IsLibreTranslateEnabled = value; - } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml index f550d34..20c3399 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Views/SettingsPage.xaml @@ -694,16 +694,16 @@ + Text="{Binding ElementName=LyricsStandardFontSizeSlider, Path=Value, Mode=OneWay}" /> + Value="{x:Bind ViewModel.LyricsStandardFontSize, Mode=TwoWay}" /> diff --git a/README.CN.md b/README.CN.md index 0a6cf7d..0ef29cc 100644 --- a/README.CN.md +++ b/README.CN.md @@ -2,59 +2,118 @@ _**🌐 Click here to see the English version**_ -_**❓ 点击查看常见问题(FAQ)**_ +_**❓ 点此查看常见问题(FAQ)**_
- +

BetterLyrics

-基于 WinUI 3 构建的流畅动态歌词显示工具 -

+一个基于 WinUI 3 和 Win2D 构建的动态歌词显示工具 —— 支持本地播放,并可监听多种播放器 + -## 🎉 本项目已获得少数派推荐! +## 🎉 本项目已被少数派推荐! -查看文章:[BetterLyrics – 专为 Windows 设计的沉浸式流畅歌词显示工具](https://sspai.com/post/101028) +查看文章:[BetterLyrics - 一款专为 Windows 打造的沉浸式流畅歌词显示软件](https://sspai.com/post/101028) -## 🔈 反馈交流群 +## 🔈 反馈与交流群 -- [QQ](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) | [Discord](https://discord.gg/5yAQPnyCKv) | [Telegram](https://t.me/+svhSLZ7awPsxNGY1) +- [ QQ 群](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) +- [ Discord](https://discord.gg/5yAQPnyCKv) +- [ Telegram](https://t.me/+svhSLZ7awPsxNGY1) -## 🌟 核心亮点功能 +## 🌟 核心特色 -- 🌠 美观的用户界面 - - 流畅的动画与视觉特效,打造赏心悦目的歌词体验 -- ↔️ 强大的歌词翻译功能 - - 支持离线机器翻译,涵盖 30 种语言 - - 自动读取本地歌词文件中的嵌入翻译 -- 🧩 多种歌词来源 +- 🌠 **优雅的用户界面** + - 丰富流畅的动画与特效 +- ↔️ **强大的歌词翻译功能** + - 支持离线翻译(支持 30 种语言) + - 自动读取本地歌词文件中的双语翻译内容 +- 🧩 **多种歌词来源支持** - 本地存储 - - 音乐文件(支持嵌入歌词) - - [.lrc]() 歌词文件(兼容标准格式和增强格式) - - [.eslrc](https://github.com/ESLyric/release) 格式 - - [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) 格式 - - 在线歌词服务 + - 音乐文件(嵌入式歌词) + - [.lrc](https://zh.wikipedia.org/wiki/LRC) 文件(支持标准与增强格式) + - [.eslrc](https://github.com/ESLyric/release) 文件 + - [.ttml](https://zh.wikipedia.org/wiki/Timed_Text_Markup_Language) 文件 + - 在线歌词源 - QQ 音乐 - 网易云音乐 - 酷狗音乐 - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) - [LRCLIB](https://lrclib.net/) -- 🪟 多种歌词显示模式 - - 标准模式 - - 沉浸式歌词体验,搭配丰富动画与动态背景,听歌更享受 - - 停靠模式 - - 智能歌词栏固定在屏幕边缘,简洁美观、互不打扰 - - 桌面模式 - - 歌词悬浮于其他窗口之上,边听歌边工作两不误 -- 🧠 智能行为支持 - - 音乐播放器关闭后自动隐藏歌词窗口,干净整洁不打扰 -> 本项目仍在开发中,最新版本可能存在 bug 和意外行为。 +- 🎶 **支持多种播放器** -## 应用截图 + -
网易云音乐 + + - 请先安装 [BetterNCM 插件](https://microblock.cc/betterncm)。若安装后出现降级提示,请按提示将网易云降级至 2.10.13; + - 然后在插件市场安装 InfLink 插件,安装完成后重启网易云即可! + +
+ + -
酷狗音乐 + + - 请确保酷狗设置中已开启“支持系统播放控制,如锁屏界面控制” + - 当前版本无法获取时间轴信息,意味着无法检测进度条的跳转 + +
+ + -
Apple Music + + - 建议在设置中将“时间轴同步容差”调至 600ms 左右(设置 → 高级选项),否则歌词会前后晃动 + +
+ + -
foobar2000 + + - 请安装插件:https://github.com/dumbie/foo_mediacontrol + +
+ + - Spotify + - QQ 音乐 + - PotPlayer + - Windows 自带媒体播放器 + + -
LX Music + + - 请在 LX Music 设置中开启“开放 API” + - 然后在 BetterLyrics 设置中填写 LX 服务器地址(通常是 http://127.0.0.1:23330) + +
+ + -
MusicBee + + - 请安装插件:https://github.com/HenryPDT/mb_MediaControl + +
+ + -
iTunes + + - 请安装插件:https://github.com/thewizrd/iTunes-SMTC + +
+ + -
AIMP + + - 请安装插件:https://www.aimp.ru/?do=catalog&rec_id=1097 + +
+ +- 🪟 **多种展示模式** + - **标准模式**:沉浸式动画歌词 + 动态背景 + - **吸附模式**:屏幕边缘浮动歌词条 + - **桌面模式**:歌词悬浮在所有窗口之上 + +- 🧠 **智能行为** + - 检测播放器关闭自动隐藏歌词 + +> 本项目仍在开发中,开发分支可能存在 bug 或异常行为。 + +## 软件截图 ### 标准模式 @@ -68,7 +127,7 @@ BetterLyrics ![alt text](Screenshots/album-art-only.png) -### 悬浮模式 +### 吸附模式 ![alt text](Screenshots/dock-1.png) @@ -80,95 +139,69 @@ BetterLyrics ![alt text](Screenshots/desktop-2.png) -## 演示视频 +## 使用演示 -观看我们的介绍视频(2025 年 7 月 7 日上传):[B 站链接](https://www.bilibili.com/video/BV1zjGjzfEXh) +观看我们于 2025 年 7 月 7 日上传的哔哩哔哩介绍视频:[点击这里](https://www.bilibili.com/video/BV1zjGjzfEXh) -## 已测试的音乐播放器 +## 立即下载试用 -- 网易云音乐 - - 请先安装 [BetterNCM 插件](https://microblock.cc/betterncm) 安装完成后如若弹出降级指引,请根据指引完成网易云音乐的降级操作(降级至 2.10.13); - - 之后请在 PluginMarket 内安装 InfLink 插件,安装完成后请重启网易云音乐。至此,所有预备操作均已完成,尽情享用吧! -- 酷狗音乐 - - 请确保酷狗音乐设置项 “支持系统播放控件,如锁屏界面” 已开启 - - 不会广播时间线信息,这意味着当您在酷狗音乐中更改播放进度时,BetterLyrics 无法检测到此更改。 -- Apple Music - - 确保您在设置中将时间线阈值设置为约 600 毫秒(进入"设置"-"高级选项"进行更改),否则歌词会不断前后跳动。 -- foobar2000 - - 确保您安装了 https://github.com/dumbie/foo_mediacontrol 插件 -- Spotify -- QQ 音乐 -- PotPlayer -- 媒体播放器(系统自带) -- LX 音乐 - - 请确保您已在 LX 音乐设置页面启用“开放 API” - - 然后打开 BetterLyrics,进入设置,点击“高级选项”,输入您的 LX 音乐服务器地址(例如 http://127.0.0.1:23330)即可 -- MusicBee - - 请先安装 https://github.com/HenryPDT/mb_MediaControl -- iTunes - - 请先安装 https://github.com/thewizrd/iTunes-SMTC -- AIMP - - 请先安装 https://www.aimp.ru/?do=catalog&rec_id=1097 - -## 立即下载体验 - -### Microsoft Store +### Microsoft Store 推荐安装方式 -**最简单**的获取方式,**无限制**免费试用或购买(免费版与付费版**功能完全相同**) +**最方便**的获取方式,支持**永久免费试用**与购买(免费版与付费版**无功能差异**) -☕ 如果您觉得本软件好用,请考虑在 **Microsoft Store** 中购买支持开发者 🧧,非常感谢您的支持!🥰 +☕ 如果你觉得本软件对你有帮助,欢迎在 Microsoft Store **支持我一杯奶茶** 🧧🥰 -> 稳定版本发布时,Microsoft Store 将永远是第一个收到更新的渠道。 +> 一旦有稳定版发布,Microsoft Store 将是第一更新渠道。 -### Google Drive +### 备用下载方式:Google Drive -或从 Google Drive 获取(请查看[发布页面](https://github.com/jayfunc/BetterLyrics/releases)获取链接) +你也可以在 [发布页](https://github.com/jayfunc/BetterLyrics/releases) 找到 Google Drive 下载链接 -> 请注意您下载的是".zip"文件,安装指南请参考[此文档](How2Install/How2Install.md)。 +> 下载为 `.zip` 压缩包,安装方法请参阅:[安装指南](How2Install/How2Install.md) -## 特别感谢 +## 致谢 -- [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) - - 提供 QQ、网易、酷狗音源的歌词获取、解密和解析 -- [LRCLIB](https://lrclib.net/) - - LRCLIB 歌词 API 提供商 -- [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) - - 用于提取音乐文件中的图片 -- [WinUIEx](https://github.com/dotMorten/WinUIEx) - - 提供便捷的 Win32 API 窗口操作方式 -- [TagLib#](https://github.com/mono/taglib-sharp) - - 用于读取原始歌词内容 -- [Vanara](https://github.com/dahall/Vanara) - - 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) -- [cnblogs - .NET App 与 Windows 系统媒体控制(SMTC)交互](https://www.cnblogs.com/TwilightLemon/p/18279496) -- [Win2D 中的游戏循环:CanvasAnimatedControl](https://www.cnblogs.com/walterlv/p/10236395.html) -- [r2d2rigo/Win2D-Samples](https://github.com/r2d2rigo/Win2D-Samples/blob/master/IrisBlurWin2D/IrisBlurWin2D/MainPage.xaml.cs) -- [CommunityToolkit - 从入门到精通](https://mvvm.coldwind.top/) +- [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) + - 提供 QQ、网易、酷狗歌词解析与解密支持 +- [LRCLIB](https://lrclib.net/) + - 歌词 API 提供方 +- [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) + - 用于提取音乐封面图像 +- [WinUIEx](https://github.com/dotMorten/WinUIEx) + - 提供窗口相关 Win32 API 简化访问方式 +- [TagLib#](https://github.com/mono/taglib-sharp) + - 用于读取音频文件中的歌词内容 +- [Vanara](https://github.com/dahall/Vanara) + - Win32 API 封装库 +- [StackOverflow - 如何为 WPF 动画 Margin 属性](https://stackoverflow.com/a/21542882/11048731) +- [DevWinUI](https://github.com/ghost1372/DevWinUI) +- [Bilibili -【WinUI3】SystemBackdropController 讲解](https://www.bilibili.com/video/BV1PY4FevEkS) +- [博客园 - .NET App 与 SMTC 控制](https://www.cnblogs.com/TwilightLemon/p/18279496) +- [Win2D 中的游戏循环介绍](https://www.cnblogs.com/walterlv/p/10236395.html) +- [Win2D 示例 - Iris Blur](https://github.com/r2d2rigo/Win2D-Samples/blob/master/IrisBlurWin2D/IrisBlurWin2D/MainPage.xaml.cs) +- [CommunityToolkit 教程](https://mvvm.coldwind.top/) -## 设计灵感来源 +## 灵感来源 - [refined-now-playing-netease](https://github.com/solstice23/refined-now-playing-netease) - [Lyricify-App](https://github.com/WXRIW/Lyricify-App) - [椒盐音乐 Salt Player](https://moriafly.com/program/salt-player) - [MyToolBar](https://github.com/TwilightLemon/MyToolBar) -## ✍️ 帮助我们翻译成您的语言 +## ✍️ 欢迎协助翻译! -找不到您的语言? -别担心!立即开始翻译,成为贡献者!😆 -点击[链接](https://crowdin.com/project/betterlyrics/invite?h=d767e4f2dbd832d8fcdb6f7e5a198b402502866),立即通过 Crowdin 将这款应用翻译成您的语言! +找不到你的语言? +没关系!快来成为贡献者的一员吧!😆 +点击此 [链接](https://crowdin.com/project/betterlyrics/invite?h=d767e4f2dbd832d8fcdb6f7e5a198b402502866) 使用 Crowdin 在线翻译! -## Star 历史 +## Star 增长趋势 [![Star History Chart](https://api.star-history.com/svg?repos=jayfunc/BetterLyrics&type=Date)](https://www.star-history.com/#jayfunc/BetterLyrics&Date) -## 欢迎提交问题和拉取请求 +## 欢迎反馈和 PR! -如果您发现 bug,请在 issues 中提交;如果您有任何想法,也欢迎在这里分享。 +发现 bug 请提交到 Issues,如有想法欢迎一起参与开发! diff --git a/README.md b/README.md index eaa243b..9baba22 100644 --- a/README.md +++ b/README.md @@ -3,22 +3,25 @@ _**❓ Click here to view frequently asked questions (FAQ)**_
- +

BetterLyrics

-Your smooth dynamic lyrics display tool built with WinUI 3 +Your dynamic lyrics display tool built with WinUI 3 and Win2D — works with local playback and other players

## 🎉 This project was featured by SSPAI! + Check out the article: [BetterLyrics – An immersive and smooth lyrics display tool designed for Windows](https://sspai.com/post/101028) ## 🔈 Feedback and chat group -- [QQ](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) | [Discord](https://discord.gg/5yAQPnyCKv) | [Telegram](https://t.me/+svhSLZ7awPsxNGY1) +- [ QQ](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) +- [ Discord](https://discord.gg/5yAQPnyCKv) +- [ Telegram](https://t.me/+svhSLZ7awPsxNGY1) ## 🌟 Highlighted features @@ -39,9 +42,67 @@ Check out the article: [BetterLyrics – An immersive and smooth lyrics display - 酷狗音乐 Kugou Music - [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db) - [LRCLIB](https://lrclib.net/) +- 🎶 **Multiple Music Players Supported** + + -
NetEase Cloud Music + + - Please install the [BetterNCM plugin](https://microblock.cc/betterncm) first. If a downgrade guide pops up after the installation, please follow the guide to complete the downgrade of NetEase Cloud Music (downgrade to 2.10.13); + - After that, please install the InfLink plugin in PluginMarket. After the installation is complete, please restart NetEase Cloud Music. At this point, all preparatory operations have been completed, enjoy it! + +
+ + -
Kugou Music + + - Please make sure that the Kugou Music setting "Support system playback controls, such as lock screen interface" is turned on + - No timeline information broadcasted, which means when you change timeline position in Kugou Music, BetterLyrics has no way to detect this change. + +
+ + -
Apple Music + + - Make sure you have set timeline threshold to around 600 ms in settings (Go to "Settings" - "Advanced option" to change), otherwise, the lyrics will be moving forward and afterward constantly. + +
+ + -
foobar2000 + + - Make sure you have https://github.com/dumbie/foo_mediacontrol installed with it + +
+ + - Spotify + - QQ Music + - PotPlayer + - Media Player (System) + + -
LX Music + + - Please make sure you have enabled "Open API" in LX Music settings page + - Then open BetterLyrics, go to settings, go to "Advanced options", input your LX Music server address (mostly like http://127.0.0.1:23330) and there you go! + +
+ + -
MusicBee + + - Please install https://github.com/HenryPDT/mb_MediaControl before using + +
+ + -
iTunes + + - Please install https://github.com/thewizrd/iTunes-SMTC before using + +
+ + -
AIMP + + - Please install https://www.aimp.ru/?do=catalog&rec_id=1097 before using + +
+ - 🪟 **Multiple Display Modes** - **Standard Mode** - - Enjoy an immersive listening journey with rich lyrics animations and beautifully dynamic backgrounds + - 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** @@ -81,32 +142,6 @@ Check out the article: [BetterLyrics – An immersive and smooth lyrics display Watch our introduction video (uploaded on 7 July 2025) on Bilibili [here](https://www.bilibili.com/video/BV1zjGjzfEXh). -## Tested music player - -- NetEase Cloud Music - - Please install the [BetterNCM plugin](https://microblock.cc/betterncm) first. If a downgrade guide pops up after the installation, please follow the guide to complete the downgrade of NetEase Cloud Music (downgrade to 2.10.13); - - After that, please install the InfLink plugin in PluginMarket. After the installation is complete, please restart NetEase Cloud Music. At this point, all preparatory operations have been completed, enjoy it! -- Kugou Music - - Please make sure that the Kugou Music setting "Support system playback controls, such as lock screen interface" is turned on - - No timeline information broadcasted, which means when you change timeline position in Kugou Music, BetterLyrics has no way to detect this change. -- Apple Music - - Make sure you have set timeline threshold to around 600 ms in settings (Go to "Settings" - "Advanced option" to change), otherwise, the lyrics will be moving forward and afterward constantly. -- foobar2000 - - Make sure you have https://github.com/dumbie/foo_mediacontrol installed with it -- Spotify -- QQ Music -- PotPlayer -- Media Player (System) -- LX Music - - Please make sure you have enabled "Open API" in LX Music settings page - - Then open BetterLyrics, go to settings, go to "Advanced options", input your LX Music server address (mostly like http://127.0.0.1:23330) and there you go! -- MusicBee - - Please install https://github.com/HenryPDT/mb_MediaControl before using -- iTunes - - Please install https://github.com/thewizrd/iTunes-SMTC before using -- AIMP - - Please install https://www.aimp.ru/?do=catalog&rec_id=1097 before using - ## Try it now ### Microsoft Store @@ -168,4 +203,4 @@ Click the [link](https://crowdin.com/project/betterlyrics/invite?h=d767e4f2dbd83 ## Any issues and PRs are welcomed -If you find a bug please file it in issues or if you have any ideas feel free to share it here. \ No newline at end of file +If you find a bug please file it in issues or if you have any ideas feel free to share it here.