🐛 Fix lyrics fetch

This commit is contained in:
2025-12-16 22:02:59 +08:00
parent 9f44786d6d
commit ac78ac002b
5 changed files with 119 additions and 26 deletions

View File

@@ -295,7 +295,7 @@ class _PlayerLyrics extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
// Watch for track data (including lyrics) by path
final trackAsync = trackPath != null
? ref.watch(_trackByPathProvider(trackPath!))
? ref.watch(trackByPathProvider(trackPath!))
: const AsyncValue<db.Track?>.data(null);
final metadataAsync = trackPath != null
@@ -497,7 +497,7 @@ class _LyricsRefreshButton extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final trackAsync = ref.watch(_trackByPathProvider(trackPath));
final trackAsync = ref.watch(trackByPathProvider(trackPath));
final metadataAsync = ref.watch(trackMetadataProvider(trackPath));
final musixmatchProviderInstance = ref.watch(musixmatchProvider);
final neteaseProviderInstance = ref.watch(neteaseProvider);
@@ -522,6 +522,76 @@ class _LyricsRefreshButton extends HookConsumerWidget {
);
}
void _showFetchLyricsDialog(
BuildContext context,
WidgetRef ref,
db.Track track,
String trackPath,
dynamic metadataObj,
musixmatchProvider,
neteaseProvider,
) {
final metadata = metadataObj as TrackMetadata?;
final searchTerm =
'${metadata?.title ?? track.title} ${metadata?.artist ?? track.artist}'
.trim();
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Fetch Lyrics'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Search term: $searchTerm'),
const SizedBox(height: 16),
Text('Choose a provider:'),
const SizedBox(height: 8),
Row(
children: [
_ProviderButton(
name: 'Musixmatch',
onPressed: () async {
Navigator.of(context).pop();
await ref
.read(lyricsFetcherProvider.notifier)
.fetchLyricsForTrack(
trackId: track.id,
searchTerm: searchTerm,
provider: musixmatchProvider,
trackPath: trackPath,
);
},
),
const SizedBox(width: 8),
_ProviderButton(
name: 'NetEase',
onPressed: () async {
Navigator.of(context).pop();
await ref
.read(lyricsFetcherProvider.notifier)
.fetchLyricsForTrack(
trackId: track.id,
searchTerm: searchTerm,
provider: neteaseProvider,
trackPath: trackPath,
);
},
),
],
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Cancel'),
),
],
),
);
}
void _showLyricsRefreshDialog(
BuildContext context,
WidgetRef ref,
@@ -547,21 +617,18 @@ class _LyricsRefreshButton extends HookConsumerWidget {
label: const Text('Re-fetch'),
onPressed: trackAsync.maybeWhen(
data: (track) => track != null
? () async {
? () {
Navigator.of(context).pop();
final metadata = metadataAsync.value;
final searchTerm =
'${metadata?.title ?? track.title} ${metadata?.artist ?? track.artist}'
.trim();
await ref
.read(lyricsFetcherProvider.notifier)
.fetchLyricsForTrack(
trackId: track.id,
searchTerm: searchTerm,
provider:
musixmatchProvider, // Default to Musixmatch
trackPath: trackPath,
);
_showFetchLyricsDialog(
context,
ref,
track,
trackPath,
metadata,
musixmatchProvider,
neteaseProvider,
);
}
: null,
orElse: () => null,
@@ -581,6 +648,9 @@ class _LyricsRefreshButton extends HookConsumerWidget {
data: (track) => track != null
? () async {
Navigator.of(context).pop();
debugPrint(
'Clearing lyrics for track ${track.id}',
);
final database = ref.read(databaseProvider);
await (database.update(
database.tracks,
@@ -589,6 +659,12 @@ class _LyricsRefreshButton extends HookConsumerWidget {
lyrics: const drift.Value.absent(),
),
);
debugPrint('Cleared lyrics from database');
// Invalidate the track provider to refresh the UI
ref.invalidate(trackByPathProvider(trackPath));
debugPrint(
'Invalidated track provider for $trackPath',
);
}
: null,
orElse: () => null,
@@ -611,7 +687,7 @@ class _LyricsRefreshButton extends HookConsumerWidget {
}
// Provider to fetch a single track by path
final _trackByPathProvider = FutureProvider.family<db.Track?, String>((
final trackByPathProvider = FutureProvider.family<db.Track?, String>((
ref,
trackPath,
) async {