Compare commits

...

4 Commits

Author SHA1 Message Date
Zhe Fang
efc175668e chores: remove unused files 2026-01-07 21:03:16 -05:00
Zhe Fang
3bf0fbef5f chores: code cleanup 2026-01-07 20:49:20 -05:00
Zhe Fang
96b7835e8f chores: re-structure Models folder 2026-01-07 20:47:08 -05:00
Zhe Fang
a0b6511a53 chores: extra data update algo from draw method to update method 2026-01-07 20:08:28 -05:00
122 changed files with 355 additions and 541 deletions

View File

@@ -12,7 +12,7 @@
<Identity <Identity
Name="37412.BetterLyrics" Name="37412.BetterLyrics"
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9" Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
Version="1.2.245.0" /> Version="1.2.246.0" />
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

View File

@@ -1,6 +1,6 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models.Db; using BetterLyrics.WinUI3.Models.DbContext;
using BetterLyrics.WinUI3.Services.AlbumArtSearchService; using BetterLyrics.WinUI3.Services.AlbumArtSearchService;
using BetterLyrics.WinUI3.Services.DiscordService; using BetterLyrics.WinUI3.Services.DiscordService;
using BetterLyrics.WinUI3.Services.FileSystemService; using BetterLyrics.WinUI3.Services.FileSystemService;
@@ -18,7 +18,6 @@ using BetterLyrics.WinUI3.Services.TransliterationService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -26,7 +25,6 @@ using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle; // 关键App生命周期管理 using Microsoft.Windows.AppLifecycle; // 关键App生命周期管理
using Serilog; using Serilog;
using System; using System;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;

View File

@@ -1,8 +1,6 @@
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using System.Threading.Tasks;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -1,5 +1,5 @@
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;

View File

@@ -5,9 +5,9 @@ using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Logic; using BetterLyrics.WinUI3.Logic;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Renderer; using BetterLyrics.WinUI3.Renderer;
using BetterLyrics.WinUI3.Services.LastFMService;
using BetterLyrics.WinUI3.Services.GSMTCService; using BetterLyrics.WinUI3.Services.GSMTCService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
@@ -25,7 +25,6 @@ using System.Threading.Tasks;
using Windows.Foundation; using Windows.Foundation;
using Windows.Storage.Streams; using Windows.Storage.Streams;
using Windows.UI; using Windows.UI;
using System.Numerics;
namespace BetterLyrics.WinUI3.Controls namespace BetterLyrics.WinUI3.Controls
{ {

View File

@@ -8,6 +8,7 @@
xmlns:dev="using:DevWinUI" xmlns:dev="using:DevWinUI"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:local="using:BetterLyrics.WinUI3.Controls" xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:lyricsmodels="using:BetterLyrics.WinUI3.Models.Lyrics"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:BetterLyrics.WinUI3.Models" xmlns:models="using:BetterLyrics.WinUI3.Models"
xmlns:ui="using:CommunityToolkit.WinUI" xmlns:ui="using:CommunityToolkit.WinUI"
@@ -242,7 +243,7 @@
</interactivity:DataTriggerBehavior> </interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors> </interactivity:Interaction.Behaviors>
<Pivot.HeaderTemplate> <Pivot.HeaderTemplate>
<DataTemplate x:DataType="models:LyricsData"> <DataTemplate x:DataType="lyricsmodels:LyricsData">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{x:Bind LanguageCode, Mode=OneWay, Converter={StaticResource LanguageCodeToDisplayedNameConverter}}" /> <TextBlock Style="{StaticResource BodyTextBlockStyle}" Text="{x:Bind LanguageCode, Mode=OneWay, Converter={StaticResource LanguageCodeToDisplayedNameConverter}}" />
<InfoBadge <InfoBadge
@@ -254,13 +255,13 @@
</DataTemplate> </DataTemplate>
</Pivot.HeaderTemplate> </Pivot.HeaderTemplate>
<Pivot.ItemTemplate> <Pivot.ItemTemplate>
<DataTemplate x:DataType="models:LyricsData"> <DataTemplate x:DataType="lyricsmodels:LyricsData">
<ListView <ListView
ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}" ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}"
ItemsSource="{x:Bind LyricsLines, Mode=OneWay}" ItemsSource="{x:Bind LyricsLines, Mode=OneWay}"
SelectionMode="None"> SelectionMode="None">
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:LyricsLine"> <DataTemplate x:DataType="lyricsmodels:LyricsLine">
<Grid Margin="0,6" ColumnSpacing="6"> <Grid Margin="0,6" ColumnSpacing="6">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />

View File

@@ -1,4 +1,4 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;

View File

@@ -1,6 +1,6 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Serialization; using BetterLyrics.WinUI3.Serialization;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;

View File

@@ -10,6 +10,7 @@
xmlns:local="using:BetterLyrics.WinUI3.Controls" xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:BetterLyrics.WinUI3.Models" xmlns:models="using:BetterLyrics.WinUI3.Models"
xmlns:settingsmodels="using:BetterLyrics.WinUI3.Models.Settings"
xmlns:ui="using:CommunityToolkit.WinUI" xmlns:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d"> mc:Ignorable="d">
@@ -50,7 +51,7 @@
ItemsSource="{x:Bind ViewModel.AppSettings.LocalMediaFolders, Mode=OneWay}" ItemsSource="{x:Bind ViewModel.AppSettings.LocalMediaFolders, Mode=OneWay}"
SelectionMode="None"> SelectionMode="None">
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:MediaFolder"> <DataTemplate x:DataType="settingsmodels:MediaFolder">
<dev:SettingsExpander IsExpanded="True"> <dev:SettingsExpander IsExpanded="True">
<dev:SettingsExpander.HeaderIcon> <dev:SettingsExpander.HeaderIcon>

View File

@@ -1,11 +1,8 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System;
using System.Threading.Tasks;
using Windows.System;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -1,20 +1,14 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.GSMTCService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.Numerics; using System.Numerics;
using BetterLyrics.WinUI3.Extensions;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -1,17 +1,5 @@
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; 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 Windows.Foundation;
using Windows.Foundation.Collections;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -6,18 +6,9 @@ using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.Mvvm.Messaging.Messages;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; 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.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using System; using System;
using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -13,6 +13,7 @@
xmlns:local="using:BetterLyrics.WinUI3.Controls" xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:BetterLyrics.WinUI3.Models" xmlns:models="using:BetterLyrics.WinUI3.Models"
xmlns:settingsmodels="using:BetterLyrics.WinUI3.Models.Settings"
xmlns:ui="using:CommunityToolkit.WinUI" xmlns:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d"> mc:Ignorable="d">
@@ -60,7 +61,7 @@
ItemsSource="{x:Bind ViewModel.AppSettings.MediaSourceProvidersInfo, Mode=OneWay}" ItemsSource="{x:Bind ViewModel.AppSettings.MediaSourceProvidersInfo, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.SelectedMediaSourceProvider, Mode=TwoWay}"> SelectedItem="{x:Bind ViewModel.SelectedMediaSourceProvider, Mode=TwoWay}">
<ComboBox.ItemTemplate> <ComboBox.ItemTemplate>
<DataTemplate x:DataType="models:MediaSourceProviderInfo"> <DataTemplate x:DataType="settingsmodels:MediaSourceProviderInfo">
<Grid Padding="2,4" ColumnSpacing="12"> <Grid Padding="2,4" ColumnSpacing="12">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
@@ -172,7 +173,7 @@
<ScalarTransition /> <ScalarTransition />
</ListView.OpacityTransition> </ListView.OpacityTransition>
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:AlbumArtSearchProviderInfo"> <DataTemplate x:DataType="settingsmodels:AlbumArtSearchProviderInfo">
<dev:SettingsCard Header="{Binding Provider, Converter={StaticResource AlbumArtSearchProviderToDisplayNameConverter}, Mode=OneWay}"> <dev:SettingsCard Header="{Binding Provider, Converter={StaticResource AlbumArtSearchProviderToDisplayNameConverter}, Mode=OneWay}">
<dev:SettingsCard.HeaderIcon> <dev:SettingsCard.HeaderIcon>
<FontIcon FontFamily="Segoe UI Symbol" Glyph="&#x283F;" /> <FontIcon FontFamily="Segoe UI Symbol" Glyph="&#x283F;" />
@@ -219,7 +220,7 @@
</Style> </Style>
</ListView.ItemContainerStyle> </ListView.ItemContainerStyle>
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:LyricsSearchProviderInfo"> <DataTemplate x:DataType="settingsmodels:LyricsSearchProviderInfo">
<Grid> <Grid>
<dev:SettingsExpander Header="{Binding Provider, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}, Mode=OneWay}" IsExpanded="{Binding IsMatchingThresholdOverwritten, Mode=OneWay}"> <dev:SettingsExpander Header="{Binding Provider, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}, Mode=OneWay}" IsExpanded="{Binding IsMatchingThresholdOverwritten, Mode=OneWay}">
<dev:SettingsExpander.HeaderIcon> <dev:SettingsExpander.HeaderIcon>

View File

@@ -1,6 +1,6 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;

View File

@@ -1,20 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
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 BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using BetterLyrics.WinUI3.Enums; using Microsoft.UI.Xaml.Controls;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.

View File

@@ -1,5 +1,4 @@
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;

View File

@@ -1,7 +1,5 @@
using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Data;
using System; using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Converter namespace BetterLyrics.WinUI3.Converter
{ {

View File

@@ -2,9 +2,7 @@
using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text;
namespace BetterLyrics.WinUI3.Converter namespace BetterLyrics.WinUI3.Converter
{ {

View File

@@ -1,8 +1,6 @@
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Data;
using System; using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Converter namespace BetterLyrics.WinUI3.Converter
{ {

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Enums
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Enums
{ {
public enum AutoScanInterval public enum AutoScanInterval
{ {

View File

@@ -1,14 +0,0 @@
// 2025/6/23 by Zhe Fang
namespace BetterLyrics.WinUI3.Enums
{
public enum Language
{
FollowSystem,
English,
SimplifiedChinese,
TraditionalChinese,
Japanese,
Korean,
}
}

View File

@@ -1,10 +0,0 @@
// 2025/6/23 by Zhe Fang
namespace BetterLyrics.WinUI3.Enums
{
public enum LocalSearchTargetProps
{
LyricsOnly,
LyricsAndAlbumArt,
}
}

View File

@@ -1,8 +0,0 @@
namespace BetterLyrics.WinUI3.Enums
{
public enum SettingsStoreType
{
Container,
JSON
}
}

View File

@@ -1,6 +1,6 @@
namespace BetterLyrics.WinUI3.Enums namespace BetterLyrics.WinUI3.Enums
{ {
public enum ShortcutID public enum ShortcutId
{ {
LyricsWindowShowOrHide, LyricsWindowShowOrHide,
LyricsWindowSwitch, LyricsWindowSwitch,

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Enums
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Enums
{ {
public enum StatsRange public enum StatsRange
{ {

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using Windows.Graphics.Imaging;
using Windows.UI;
namespace BetterLyrics.WinUI3.Events
{
public class AlbumArtChangedEventArgs(SoftwareBitmap? albumArtSwBitmap, List<Color> albumArtLightAccentColors, List<Color> albumArtDarkAccentColors) : EventArgs
{
public SoftwareBitmap? AlbumArtSwBitmap { get; set; } = albumArtSwBitmap;
public List<Color> AlbumArtLightAccentColors { get; set; } = albumArtLightAccentColors;
public List<Color> AlbumArtDarkAccentColors { get; set; } = albumArtDarkAccentColors;
}
}

View File

@@ -1,14 +0,0 @@
// 2025/6/23 by Zhe Fang
using System;
using System.IO;
namespace BetterLyrics.WinUI3.Events
{
public class LibChangedEventArgs(string folder, string filePath, WatcherChangeTypes changeType) : EventArgs
{
public WatcherChangeTypes ChangeType { get; } = changeType;
public string FilePath { get; } = filePath;
public string Folder { get; } = folder;
}
}

View File

@@ -1,10 +0,0 @@
using BetterLyrics.WinUI3.Models;
using System;
namespace BetterLyrics.WinUI3.Events
{
public class LyricsChangedEventArgs(LyricsData? lyricsData) : EventArgs
{
public LyricsData? LyricsData { get; } = lyricsData;
}
}

View File

@@ -1,11 +0,0 @@
using BetterLyrics.WinUI3.Models;
using System;
using System.Collections.Generic;
namespace BetterLyrics.WinUI3.Events
{
public class MediaSourceProvidersInfoEventArgs(List<MediaSourceProviderInfo> sessionIds) : EventArgs
{
public List<MediaSourceProviderInfo> MediaSourceProviersInfo { get; set; } = sessionIds;
}
}

View File

@@ -1,9 +1,8 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
namespace BetterLyrics.WinUI3.Extensions namespace BetterLyrics.WinUI3.Extensions
{ {

View File

@@ -1,6 +1,4 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using System;
namespace BetterLyrics.WinUI3.Extensions namespace BetterLyrics.WinUI3.Extensions
{ {

View File

@@ -1,6 +1,5 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;

View File

@@ -1,4 +1,5 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Entities;
using System; using System;
using System.Globalization; using System.Globalization;
using System.Security.Cryptography; using System.Security.Cryptography;

View File

@@ -4,7 +4,6 @@ using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using Microsoft.UI; using Microsoft.UI;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using SkiaSharp;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing.Imaging; using System.Drawing.Imaging;

View File

@@ -3,7 +3,6 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Serialization;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;

View File

@@ -1,8 +1,9 @@
using System; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using BetterLyrics.WinUI3.Models; using System.Linq;
public static class FolderTreeBuilder public static class FolderTreeBuilder
{ {

View File

@@ -3,7 +3,6 @@ using BetterLyrics.WinUI3.Services.LocalizationService;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using NTextCat; using NTextCat;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using Windows.Globalization; using Windows.Globalization;

View File

@@ -1,8 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Helper namespace BetterLyrics.WinUI3.Helper

View File

@@ -20,7 +20,7 @@ namespace BetterLyrics.WinUI3.Hooks
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="keys"></param> /// <param name="keys"></param>
/// <param name="action"></param> /// <param name="action"></param>
private static void RegisterHotKey(Window window, ShortcutID id, List<string> keys, Action action) private static void RegisterHotKey(Window window, ShortcutId id, List<string> keys, Action action)
{ {
if (keys.Count == 0) return; if (keys.Count == 0) return;
@@ -58,7 +58,7 @@ namespace BetterLyrics.WinUI3.Hooks
} }
} }
private static void UnregisterHotKey(Window window, ShortcutID id) private static void UnregisterHotKey(Window window, ShortcutId id)
{ {
HWND hwnd = WindowNative.GetWindowHandle(window); HWND hwnd = WindowNative.GetWindowHandle(window);
User32.UnregisterHotKey(hwnd, (int)id); User32.UnregisterHotKey(hwnd, (int)id);
@@ -66,13 +66,13 @@ namespace BetterLyrics.WinUI3.Hooks
_keys.Remove((int)id); _keys.Remove((int)id);
} }
public static void UpdateHotKey(Window window, ShortcutID id, List<string> keys, Action action) public static void UpdateHotKey(Window window, ShortcutId id, List<string> keys, Action action)
{ {
UnregisterHotKey(window, id); UnregisterHotKey(window, id);
RegisterHotKey(window, id, keys, action); RegisterHotKey(window, id, keys, action);
} }
public static bool IsHotKeyRegistered(ShortcutID id) public static bool IsHotKeyRegistered(ShortcutId id)
{ {
return _actions.ContainsKey((int)id); return _actions.ContainsKey((int)id);
} }
@@ -82,7 +82,7 @@ namespace BetterLyrics.WinUI3.Hooks
return _keys.ContainsValue(keys); return _keys.ContainsValue(keys);
} }
public static bool TryInvokeAction(ShortcutID id) public static bool TryInvokeAction(ShortcutId id)
{ {
return TryInvokeAction((int)id); return TryInvokeAction((int)id);
} }

View File

@@ -7,7 +7,6 @@ using FlaUI.Core.EventHandlers;
using FlaUI.UIA3; using FlaUI.UIA3;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;
using System; using System;
using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Threading; using System.Threading;

View File

@@ -1,7 +1,7 @@
// 2025/6/23 by Zhe Fang // 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.WinUI; using CommunityToolkit.WinUI;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;

View File

@@ -1,6 +1,7 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using DevWinUI;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -31,7 +32,7 @@ namespace BetterLyrics.WinUI3.Logic
bool isLayoutChanged, bool isLayoutChanged,
bool isPrimaryPlayingLineChanged, bool isPrimaryPlayingLineChanged,
bool isMouseScrollingChanged, bool isMouseScrollingChanged,
double currentProgressMs double currentPositionMs
) )
{ {
if (lines == null) return; if (lines == null) return;
@@ -48,7 +49,7 @@ namespace BetterLyrics.WinUI3.Logic
var line = lines.ElementAtOrDefault(i); var line = lines.ElementAtOrDefault(i);
if (line == null) continue; if (line == null) continue;
bool isSecondaryLinePlaying = currentProgressMs >= line.StartMs && currentProgressMs <= line.EndMs; bool isSecondaryLinePlaying = line.StartMs <= currentPositionMs && currentPositionMs <= line.EndMs;
if (i == primaryPlayingLineIndex) isSecondaryLinePlaying = true; if (i == primaryPlayingLineIndex) isSecondaryLinePlaying = true;
bool isSecondaryLinePlayingChanged = line.IsPlayingLastFrame != isSecondaryLinePlaying; bool isSecondaryLinePlayingChanged = line.IsPlayingLastFrame != isSecondaryLinePlaying;
line.IsPlayingLastFrame = isSecondaryLinePlaying; line.IsPlayingLastFrame = isSecondaryLinePlaying;
@@ -150,6 +151,93 @@ namespace BetterLyrics.WinUI3.Logic
line.YOffsetTransition.StartTransition(targetYScrollOffset); line.YOffsetTransition.StartTransition(targetYScrollOffset);
} }
if (line.RenderLyricsOriginalChars != null)
{
foreach (var renderChar in line.RenderLyricsOriginalChars)
{
var syllable = line.LyricsSyllables.FirstOrDefault(x => x.StartIndex <= renderChar.Index && renderChar.Index <= x.EndIndex);
if (syllable == null) continue;
var avgCharDuration = syllable.DurationMs / syllable.Length;
if (avgCharDuration == null || avgCharDuration == 0) continue;
var charStartMs = syllable.StartMs + (renderChar.Index - syllable.StartIndex) * avgCharDuration.Value;
var charEndMs = charStartMs + avgCharDuration;
var progressPlayed = (currentPositionMs - charStartMs) / avgCharDuration.Value;
progressPlayed = Math.Clamp(progressPlayed, 0, 1);
renderChar.ProgressPlayed = progressPlayed;
bool isCharPlaying = charStartMs <= currentPositionMs && currentPositionMs <= charEndMs;
bool isCharPlayingChanged = renderChar.IsPlayingLastFrame != isCharPlaying;
if (isSecondaryLinePlayingChanged || isCharPlayingChanged)
{
if (lyricsEffect.IsLyricsScaleEffectEnabled)
{
double targetScale =
lyricsEffect.IsLyricsScaleEffectAmountAutoAdjust ? 1.15 : lyricsEffect.LyricsScaleEffectAmount / 100.0;
if (isCharPlayingChanged)
{
if (syllable.DurationMs >= lyricsEffect.LyricsScaleEffectLongSyllableDuration)
{
renderChar.ScaleTransition.SetDuration((syllable.DurationMs ?? 0) / 1000.0 / 2);
renderChar.ScaleTransition.StartTransition(isCharPlaying ? targetScale : 1);
}
}
}
if (lyricsEffect.IsLyricsGlowEffectEnabled)
{
double targetGlow = lyricsEffect.IsLyricsGlowEffectAmountAutoAdjust ? renderChar.LayoutRect.Height * 0.2 : lyricsEffect.LyricsGlowEffectAmount;
switch (lyricsEffect.LyricsGlowEffectScope)
{
case Enums.LyricsEffectScope.LongDurationSyllable:
if (isCharPlayingChanged)
{
if (syllable.DurationMs >= lyricsEffect.LyricsGlowEffectLongSyllableDuration)
{
renderChar.GlowTransition.SetDuration((syllable.DurationMs ?? 0) / 1000.0 / 2);
renderChar.GlowTransition.StartTransition(isCharPlaying ? targetGlow : 0);
}
}
break;
case Enums.LyricsEffectScope.LineStartToCurrentChar:
if (isSecondaryLinePlayingChanged)
{
renderChar.GlowTransition.SetDuration(renderChar.AnimationDuration);
renderChar.GlowTransition.StartTransition(isSecondaryLinePlaying ? targetGlow : 0);
}
break;
default:
break;
}
}
if (lyricsEffect.IsLyricsFloatAnimationEnabled)
{
double targetFloat =
lyricsEffect.IsLyricsFloatAnimationAmountAutoAdjust ? renderChar.LayoutRect.Height * 0.1 : lyricsEffect.LyricsFloatAnimationAmount;
if (isSecondaryLinePlayingChanged)
{
renderChar.FloatTransition.StartTransition(isSecondaryLinePlaying ? targetFloat : 0);
}
if (isCharPlayingChanged)
{
renderChar.FloatTransition.StartTransition(0);
}
}
renderChar.IsPlayingLastFrame = isCharPlaying;
}
renderChar.ScaleTransition.Update(elapsedTime);
renderChar.GlowTransition.Update(elapsedTime);
renderChar.FloatTransition.Update(elapsedTime);
}
}
line.AngleTransition.Update(elapsedTime); line.AngleTransition.Update(elapsedTime);
line.ScaleTransition.Update(elapsedTime); line.ScaleTransition.Update(elapsedTime);
line.BlurAmountTransition.Update(elapsedTime); line.BlurAmountTransition.Update(elapsedTime);

View File

@@ -1,5 +1,5 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.Graphics.Canvas.UI.Xaml;
using System; using System;
@@ -123,6 +123,8 @@ namespace BetterLyrics.WinUI3.Logic
// 更新中心点 // 更新中心点
line.UpdateCenterPosition(lyricsWidth, style.LyricsAlignmentType); line.UpdateCenterPosition(lyricsWidth, style.LyricsAlignmentType);
line.RecalculateCharacterGeometries();
} }
} }

View File

@@ -1,4 +1,5 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@@ -1,14 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db
{
public partial class FilesIndexDbContext : DbContext
{
public FilesIndexDbContext(DbContextOptions<FilesIndexDbContext> options) : base(options) { }
public DbSet<FilesIndexItem> FilesIndex { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db
{
public partial class LyricsCacheDbContext : DbContext
{
public LyricsCacheDbContext(DbContextOptions<LyricsCacheDbContext> options) : base(options) { }
public DbSet<LyricsCacheItem> LyricsCache { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db
{
public partial class PlayHistoryDbContext : DbContext
{
public PlayHistoryDbContext(DbContextOptions<PlayHistoryDbContext> options) : base(options) { }
public DbSet<PlayHistoryItem> PlayHistory { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
using BetterLyrics.WinUI3.Models.Entities;
using Microsoft.EntityFrameworkCore;
namespace BetterLyrics.WinUI3.Models.DbContext
{
public partial class FilesIndexDbContext : Microsoft.EntityFrameworkCore.DbContext
{
public FilesIndexDbContext(DbContextOptions<FilesIndexDbContext> options) : base(options) { }
public DbSet<FilesIndexItem> FilesIndex { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using Microsoft.EntityFrameworkCore;
namespace BetterLyrics.WinUI3.Models.DbContext
{
public partial class LyricsCacheDbContext : Microsoft.EntityFrameworkCore.DbContext
{
public LyricsCacheDbContext(DbContextOptions<LyricsCacheDbContext> options) : base(options) { }
public DbSet<LyricsCacheItem> LyricsCache { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
using BetterLyrics.WinUI3.Models.Entities;
using Microsoft.EntityFrameworkCore;
namespace BetterLyrics.WinUI3.Models.DbContext
{
public partial class PlayHistoryDbContext : Microsoft.EntityFrameworkCore.DbContext
{
public PlayHistoryDbContext(DbContextOptions<PlayHistoryDbContext> options) : base(options) { }
public DbSet<PlayHistoryItem> PlayHistory { get; set; }
}
}

View File

@@ -1,11 +1,8 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db namespace BetterLyrics.WinUI3.Models.DbContext
{ {
public partial class SongSearchMapDbContext : DbContext public partial class SongSearchMapDbContext : Microsoft.EntityFrameworkCore.DbContext
{ {
public DbSet<MappedSongSearchQuery> SongSearchMap { get; set; } public DbSet<MappedSongSearchQuery> SongSearchMap { get; set; }

View File

@@ -3,7 +3,7 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Entities
{ {
[Index(nameof(MediaFolderId))] // 普通索引 [Index(nameof(MediaFolderId))] // 普通索引
[Index(nameof(ParentUri))] // 普通索引 [Index(nameof(ParentUri))] // 普通索引

View File

@@ -1,8 +1,6 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Extensions;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using NTextCat.Commons;
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;

View File

@@ -3,7 +3,7 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Entities
{ {
[Index(nameof(Title))] [Index(nameof(Title))]
[Index(nameof(Artist))] [Index(nameof(Artist))]

View File

@@ -1,5 +1,6 @@
using ATL; using ATL;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models.Entities;
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;

View File

@@ -1,9 +1,6 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models
{ {

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Http
{ {
public class CutletDockerRequest public class CutletDockerRequest
{ {

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Http
{ {
public class CutletDockerResponse public class CutletDockerResponse
{ {

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Http
{ {
public class LibreTranslateResponse public class LibreTranslateResponse
{ {

View File

@@ -0,0 +1,12 @@
namespace BetterLyrics.WinUI3.Models.Lyrics
{
public class LyricsChar
{
public int StartMs { get; set; }
public int EndMs { get; set; }
public int DurationMs => EndMs - StartMs;
public string Text { get; set; } = "";
public int Index { get; set; }
}
}

View File

@@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Lyrics
{ {
public class LyricsData public class LyricsData
{ {

View File

@@ -2,7 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Lyrics
{ {
public class LyricsLine public class LyricsLine
{ {

View File

@@ -1,13 +1,18 @@
// 2025/6/23 by Zhe Fang // 2025/6/23 by Zhe Fang
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Lyrics
{ {
public class LyricsSyllable public class LyricsSyllable
{ {
public int? EndMs { get; set; }
public int StartIndex { get; set; }
public int StartMs { get; set; }
public string Text { get; set; } = string.Empty; public string Text { get; set; } = string.Empty;
public int Length => Text.Length;
public int StartIndex { get; set; }
public int EndIndex => StartIndex + Length - 1;
public int StartMs { get; set; }
public int? EndMs { get; set; }
public int? DurationMs => EndMs - StartMs; public int? DurationMs => EndMs - StartMs;
public bool IsLongDuration => DurationMs >= 700; public bool IsLongDuration => DurationMs >= 700;
} }

View File

@@ -0,0 +1,40 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using Windows.Foundation;
namespace BetterLyrics.WinUI3.Models.Lyrics
{
public class RenderLyricsChar : LyricsChar
{
public Rect LayoutRect { get; set; }
public double AnimationDuration { get; set; } = 0.3;
public ValueTransition<double> ScaleTransition { get; set; }
public ValueTransition<double> GlowTransition { get; set; }
public ValueTransition<double> FloatTransition { get; set; }
public double ProgressPlayed { get; set; } = 0; // 0~1
public bool IsPlayingLastFrame { get; set; } = false;
public RenderLyricsChar()
{
ScaleTransition = new(
initialValue: 1.0,
durationSeconds: AnimationDuration,
easingType: EasingType.EaseInOutSine
);
GlowTransition = new(
initialValue: 0,
durationSeconds: AnimationDuration,
easingType: EasingType.EaseInOutSine
);
FloatTransition = new(
initialValue: 0,
durationSeconds: AnimationDuration,
easingType: EasingType.EaseInOutSine
);
}
}
}

View File

@@ -5,14 +5,19 @@ using Microsoft.Graphics.Canvas.Geometry;
using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.Text;
using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.Graphics.Canvas.UI.Xaml;
using Microsoft.UI; using Microsoft.UI;
using System.Collections.Generic;
using System.Linq;
using System.Numerics; using System.Numerics;
using Windows.UI; using Windows.UI;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Lyrics
{ {
public class RenderLyricsLine : LyricsLine public class RenderLyricsLine : LyricsLine
{ {
public List<RenderLyricsChar> RenderLyricsOriginalChars { get; set; } = [];
public double AnimationDuration { get; set; } = 0.3; public double AnimationDuration { get; set; } = 0.3;
public ValueTransition<double> AngleTransition { get; set; } public ValueTransition<double> AngleTransition { get; set; }
public ValueTransition<double> BlurAmountTransition { get; set; } public ValueTransition<double> BlurAmountTransition { get; set; }
public ValueTransition<double> PhoneticOpacityTransition { get; set; } public ValueTransition<double> PhoneticOpacityTransition { get; set; }
@@ -231,5 +236,26 @@ namespace BetterLyrics.WinUI3.Models
} }
} }
public void RecalculateCharacterGeometries()
{
RenderLyricsOriginalChars.Clear();
if (OriginalCanvasTextLayout == null) return;
var textLength = OriginalText.Length;
for (int i = 0; i < textLength; i++)
{
var region = OriginalCanvasTextLayout.GetCharacterRegions(i, 1).FirstOrDefault();
var bounds = region.LayoutBounds;
RenderLyricsOriginalChars.Add(new RenderLyricsChar()
{
Index = i,
LayoutRect = bounds,
Text = OriginalText[i].ToString()
});
}
}
} }
} }

View File

@@ -1,15 +0,0 @@
using BetterLyrics.WinUI3.Helper;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models
{
public class PlayerStatDisplayItem
{
public string PlayerId { get; set; }
public int PlayCount { get; set; }
public string PlayerName => PlayerIdHelper.GetDisplayName(PlayerId);
}
}

View File

@@ -3,7 +3,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class AlbumArtSearchProviderInfo : ObservableRecipient public partial class AlbumArtSearchProviderInfo : ObservableRecipient
{ {

View File

@@ -3,7 +3,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class LyricsSearchProviderInfo : ObservableRecipient public partial class LyricsSearchProviderInfo : ObservableRecipient
{ {

View File

@@ -1,6 +1,5 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;
@@ -10,7 +9,7 @@ using System.Linq;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Windows.Foundation; using Windows.Foundation;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class LyricsWindowStatus : ObservableRecipient, ICloneable public partial class LyricsWindowStatus : ObservableRecipient, ICloneable
{ {

View File

@@ -6,9 +6,8 @@ using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Threading;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class MediaFolder : ObservableRecipient public partial class MediaFolder : ObservableRecipient
{ {

View File

@@ -8,7 +8,7 @@ using System;
using System.Linq; using System.Linq;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class MediaSourceProviderInfo : ObservableRecipient public partial class MediaSourceProviderInfo : ObservableRecipient
{ {

View File

@@ -1,6 +1,5 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
namespace BetterLyrics.WinUI3.Models.Settings namespace BetterLyrics.WinUI3.Models.Settings

View File

@@ -1,8 +1,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.ComponentModel;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models.Settings
{ {
public partial class SongsTabInfo : BaseViewModel public partial class SongsTabInfo : BaseViewModel
{ {

View File

@@ -1,7 +1,6 @@
// 2025/6/23 by Zhe Fang // 2025/6/23 by Zhe Fang
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using NTextCat.Commons;
using System; using System;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Models.Stats
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{ {
public class ArtistPlayCount public class ArtistPlayCount
{ {

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Models.Stats
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{ {
public class HourlyStatBar public class HourlyStatBar
{ {

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Models.Stats
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{ {
public class PlayerStats public class PlayerStats
{ {

View File

@@ -1,8 +1,4 @@
using System; namespace BetterLyrics.WinUI3.Models.Stats
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{ {
public class SongPlayCount public class SongPlayCount
{ {

View File

@@ -1,4 +1,4 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;

View File

@@ -1,4 +1,4 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;

View File

@@ -1,8 +1,7 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using System.Xml.Linq; using System.Xml.Linq;
namespace BetterLyrics.WinUI3.Parsers.LyricsParser namespace BetterLyrics.WinUI3.Parsers.LyricsParser

View File

@@ -4,6 +4,7 @@ using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.TranslationService; using BetterLyrics.WinUI3.Services.TranslationService;
using BetterLyrics.WinUI3.Services.TransliterationService; using BetterLyrics.WinUI3.Services.TransliterationService;

View File

@@ -1,5 +1,6 @@
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects; using Microsoft.Graphics.Canvas.Effects;

View File

@@ -1,5 +1,6 @@
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Brushes; using Microsoft.Graphics.Canvas.Brushes;
@@ -7,7 +8,6 @@ using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.Text;
using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.Graphics.Canvas.UI.Xaml;
using System; using System;
using System.Linq;
using System.Numerics; using System.Numerics;
using Windows.Foundation; using Windows.Foundation;
using Windows.UI; using Windows.UI;
@@ -118,7 +118,7 @@ namespace BetterLyrics.WinUI3.Renderer
foreach (var subLineRegion in lineRegions) foreach (var subLineRegion in lineRegions)
{ {
DrawSubLineRegion(resourceCreator, ds, source, line, subLineRegion, curCharIndex, fadeWidth, bgColor, fgColor, state, settings); DrawSubLineRegion(resourceCreator, ds, source, line, subLineRegion, curCharIndex, fadeWidth, bgColor, fgColor, settings);
} }
} }
@@ -132,7 +132,6 @@ namespace BetterLyrics.WinUI3.Renderer
float fadeWidth, float fadeWidth,
Color bgColor, Color bgColor,
Color fgColor, Color fgColor,
LinePlaybackState state,
LyricsEffectSettings settings) LyricsEffectSettings settings)
{ {
var playedOpacity = line.PlayedOriginalOpacityTransition.Value; var playedOpacity = line.PlayedOriginalOpacityTransition.Value;
@@ -187,7 +186,7 @@ namespace BetterLyrics.WinUI3.Renderer
int endCharIndex = subLineRegion.CharacterIndex + subLineRegion.CharacterCount; int endCharIndex = subLineRegion.CharacterIndex + subLineRegion.CharacterCount;
for (int i = subLineRegion.CharacterIndex; i < endCharIndex; i++) for (int i = subLineRegion.CharacterIndex; i < endCharIndex; i++)
{ {
DrawSingleCharacter(ds, line, i, curCharIndex, textWithOpacityLayer, state, settings); DrawSingleCharacter(ds, line, i, textWithOpacityLayer);
} }
} }
} }
@@ -199,161 +198,43 @@ namespace BetterLyrics.WinUI3.Renderer
/// </summary> /// </summary>
/// <param name="ds"></param> /// <param name="ds"></param>
/// <param name="line"></param> /// <param name="line"></param>
/// <param name="charIndex">遍历的字符索引</param> /// <param name="charIndex">遍历的字符索引(相对于整行)</param>
/// <param name="exactProgressIndex">当前播放字符相对于整行的索引</param> /// <param name="exactProgressIndex">当前播放字符的索引(相对于整行</param>
/// <param name="source"></param> /// <param name="source"></param>
/// <param name="state"></param> /// <param name="state"></param>
/// <param name="settings"></param>
private void DrawSingleCharacter( private void DrawSingleCharacter(
CanvasDrawingSession ds, CanvasDrawingSession ds,
RenderLyricsLine line, RenderLyricsLine line,
int charIndex, int charIndex,
double exactProgressIndex, ICanvasImage source)
ICanvasImage source,
LinePlaybackState state,
LyricsEffectSettings settings)
{ {
var curCharIndexInt = (int)Math.Floor(exactProgressIndex); if (charIndex >= line.RenderLyricsOriginalChars.Count) return;
if (line.OriginalCanvasTextLayout == null) return;
var charRegions = line.OriginalCanvasTextLayout.GetCharacterRegions(charIndex, 1); RenderLyricsChar renderChar = line.RenderLyricsOriginalChars[charIndex];
if (charRegions.Length == 0) return;
var charRegion = charRegions[0];
var charLayoutBounds = charRegion.LayoutBounds;
var rect = renderChar.LayoutRect;
var sourceCharRect = new Rect( var sourceCharRect = new Rect(
charLayoutBounds.X + line.OriginalPosition.X, rect.X + line.OriginalPosition.X,
charLayoutBounds.Y + line.OriginalPosition.Y, rect.Y + line.OriginalPosition.Y,
charLayoutBounds.Width, rect.Width,
charLayoutBounds.Height rect.Height
); );
double floatOffset = 0; double scale = renderChar.ScaleTransition.Value;
double scale = 1; double glow = renderChar.GlowTransition.Value;
double glow = 0; double floatOffset = renderChar.FloatTransition.Value;
bool drawGlow = false; var destCharRect = sourceCharRect.Scale(scale).AddY(floatOffset);
if (settings.IsLyricsFloatAnimationEnabled) // Draw glow
{ if (glow > 0)
double targetFloatOffset;
if (settings.IsLyricsFloatAnimationAmountAutoAdjust)
{
targetFloatOffset = sourceCharRect.Height * 0.1;
}
else
{
targetFloatOffset = settings.LyricsFloatAnimationAmount;
}
// 已经浮完了的
if (charIndex < curCharIndexInt)
{
floatOffset = 0;
}
// 正在浮的
else if (charIndex == curCharIndexInt)
{
var p = exactProgressIndex - curCharIndexInt;
floatOffset = -targetFloatOffset + p * targetFloatOffset;
}
// 还没浮的
else
{
floatOffset = -targetFloatOffset;
}
// 制造句间上浮过度动画,这里用任何一个 Transition 都行,主要是获取当前行的进入视野的 Progress
floatOffset *= line.YOffsetTransition.Progress;
}
var parentSyllable = line.LyricsSyllables.FirstOrDefault(x => x.StartIndex <= charIndex && charIndex < x.StartIndex + x.Text.Length);
if (settings.IsLyricsScaleEffectEnabled)
{
if (parentSyllable != null && parentSyllable.StartIndex == state.SyllableStartIndex)
{
if (parentSyllable.DurationMs >= settings.LyricsScaleEffectLongSyllableDuration)
{
if (settings.IsLyricsScaleEffectAmountAutoAdjust)
{
scale += Math.Sin(state.SyllableProgress * Math.PI) * 0.15;
}
else
{
scale += Math.Sin(state.SyllableProgress * Math.PI) * (settings.LyricsScaleEffectAmount / 100.0 - 1);
}
}
}
}
if (settings.IsLyricsGlowEffectEnabled)
{
double maxGlow;
if (settings.IsLyricsGlowEffectAmountAutoAdjust)
{
maxGlow = sourceCharRect.Height * 0.2;
}
else
{
maxGlow = settings.LyricsGlowEffectAmount;
}
switch (settings.LyricsGlowEffectScope)
{
case Enums.LyricsEffectScope.LongDurationSyllable:
if (parentSyllable != null && parentSyllable.StartIndex == state.SyllableStartIndex)
{
if (parentSyllable.DurationMs >= settings.LyricsGlowEffectLongSyllableDuration)
{
glow = maxGlow * Math.Sin(state.SyllableProgress * Math.PI);
drawGlow = true;
}
}
break;
case Enums.LyricsEffectScope.LineStartToCurrentChar:
// 已经唱了的
if (charIndex < curCharIndexInt)
{
glow = maxGlow;
drawGlow = true;
}
// 正在唱的
else if (charIndex == curCharIndexInt)
{
var p = exactProgressIndex - curCharIndexInt;
glow = p * maxGlow;
drawGlow = true;
}
// 还没唱的
else { }
glow *= Math.Clamp(line.OriginalText.Length - exactProgressIndex, 0, 1);
break;
default:
break;
}
}
var destCharRect = sourceCharRect.Scale(scale).AddY(-floatOffset);
if (drawGlow)
{ {
var sourcePlayedCharRect = new Rect( var sourcePlayedCharRect = new Rect(
sourceCharRect.X, sourceCharRect.X,
sourceCharRect.Y, sourceCharRect.Y,
sourceCharRect.Width, sourceCharRect.Width * renderChar.ProgressPlayed,
sourceCharRect.Height sourceCharRect.Height
); );
if (charIndex == curCharIndexInt)
{
var p = exactProgressIndex - curCharIndexInt;
sourcePlayedCharRect.Width *= p;
}
else if (charIndex > curCharIndexInt)
{
sourcePlayedCharRect.Width = 0;
}
using (var glowEffect = new GaussianBlurEffect using (var glowEffect = new GaussianBlurEffect
{ {
Source = new CropEffect Source = new CropEffect
@@ -366,10 +247,11 @@ namespace BetterLyrics.WinUI3.Renderer
BorderMode = EffectBorderMode.Soft BorderMode = EffectBorderMode.Soft
}) })
{ {
ds.DrawImage(glowEffect, destCharRect.Extend(sourceCharRect.Height), sourceCharRect.Extend(sourceCharRect.Height)); ds.DrawImage(glowEffect, destCharRect.Extend(destCharRect.Height), sourceCharRect.Extend(sourceCharRect.Height));
} }
} }
// Draw the top layer
ds.DrawImage(source, destCharRect, sourceCharRect); ds.DrawImage(source, destCharRect, sourceCharRect);
} }
} }

View File

@@ -1,4 +1,4 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Lyrics;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects; using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.Text;

View File

@@ -1,6 +1,7 @@
// 2025/6/23 by Zhe Fang // 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Http;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;

View File

@@ -1,6 +1,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Services.FileSystemService; using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;

View File

@@ -1,8 +1,9 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Db; using BetterLyrics.WinUI3.Models.DbContext;
using BetterLyrics.WinUI3.Services.FileSystemService.Providers; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;

View File

@@ -1,5 +1,5 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Services.FileSystemService.Providers; using BetterLyrics.WinUI3.Models.Settings;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;

View File

@@ -1,4 +1,4 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;

View File

@@ -1,11 +1,11 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Models.Settings;
using FluentFTP; using FluentFTP;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net; // 用于 WebUtility.UrlDecode using System.Net; // 用于 WebUtility.UrlDecode
using System.Text; // ★ 修复 Encoding 报错的关键
using System.Threading.Tasks; using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers

View File

@@ -1,5 +1,6 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Models.Settings;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;

View File

@@ -1,5 +1,6 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Models.Settings;
using SMBLibrary; using SMBLibrary;
using SMBLibrary.Client; using SMBLibrary.Client;
using System; using System;

View File

@@ -1,5 +1,6 @@
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models.Entities;
using BetterLyrics.WinUI3.Models.Settings;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;

View File

@@ -2,6 +2,7 @@
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.UI; using Microsoft.UI;
@@ -9,7 +10,6 @@ using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@@ -1,11 +1,10 @@
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Parsers.LyricsParser; using BetterLyrics.WinUI3.Parsers.LyricsParser;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.WinUI;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.UI.Dispatching;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@@ -3,7 +3,6 @@
using BetterLyrics.WinUI3.Collections; using BetterLyrics.WinUI3.Collections;
using BetterLyrics.WinUI3.Constants; using BetterLyrics.WinUI3.Constants;
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Events;
using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
@@ -29,7 +28,6 @@ using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime; using System.Runtime.InteropServices.WindowsRuntime;
using System.Text.Json; using System.Text.Json;

View File

@@ -1,6 +1,8 @@
// 2025/6/23 by Zhe Fang // 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Lyrics;
using BetterLyrics.WinUI3.Models.Settings;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.ComponentModel; using System.ComponentModel;

Some files were not shown because too many files have changed in this diff Show More