feat: add 5 new lyrics providers

New lyrics providers using Paxsenix API:
- Spotify: Synced lyrics from Spotify
- Deezer: Synced lyrics from Deezer
- YouTube: Lyrics from YouTube
- Kugou: Lyrics from Kugou (Chinese service)
- Genius: Plain text lyrics from Genius

Implementation:
- Add lyrics client implementations for all providers
- Smart search result scoring based on track name, artist, and duration
- Support for both synced (LRC) and unsynced lyrics formats
- Fallback search with simplified track names and primary artist

UI updates:
- Add provider entries to lyrics priority settings page
- Add display names for new providers in settings
This commit is contained in:
zarzet
2026-05-14 20:42:14 +07:00
parent 3e3e87e73e
commit 4336e6dc78
39 changed files with 778 additions and 42 deletions
+1 -1
View File
@@ -837,7 +837,7 @@ abstract class AppLocalizations {
/// App description in header card
///
/// In en, this message translates to:
/// **'Download Spotify tracks in lossless quality from Tidal and Qobuz.'**
/// **'Search music metadata, manage extensions, and organize your library.'**
String get aboutAppDescription;
/// Section header for artist albums
+1 -1
View File
@@ -405,7 +405,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get aboutAppDescription =>
'Lade Spotify-Titel in verlustfreier Qualität von Tidal und Qobuz herunter.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Alben';
+1 -1
View File
@@ -397,7 +397,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
+2 -2
View File
@@ -397,7 +397,7 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
@@ -4585,7 +4585,7 @@ class AppLocalizationsEsEs extends AppLocalizationsEs {
@override
String get aboutAppDescription =>
'Descargar pistas de Spotify en alta calidad (sin pérdida) de Tidal y Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Álbumes';
+1 -1
View File
@@ -399,7 +399,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
+1 -1
View File
@@ -397,7 +397,7 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
+1 -1
View File
@@ -400,7 +400,7 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get aboutAppDescription =>
'Unduh lagu-lagu Spotify dalam kualitas lossless dari Tidal dan Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Album';
+1 -1
View File
@@ -393,7 +393,7 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'アルバム';
+1 -1
View File
@@ -385,7 +385,7 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => '앨범';
+1 -1
View File
@@ -397,7 +397,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
+2 -2
View File
@@ -397,7 +397,7 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
@@ -4584,7 +4584,7 @@ class AppLocalizationsPtPt extends AppLocalizationsPt {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Álbuns';
+1 -1
View File
@@ -403,7 +403,7 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get aboutAppDescription =>
'Скачивайте треки Spotify в lossless качестве с Tidal и Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Альбомы';
+1 -1
View File
@@ -405,7 +405,7 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get aboutAppDescription =>
'Spotify parçalarını Tidal ve Qobuz aracılığıyla kayıpsız kalitede indirin.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albümler';
+1 -1
View File
@@ -407,7 +407,7 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get aboutAppDescription =>
'Кінцеві точки потокового передавання Tidal Hi-Res FLAC. Ключовий елемент пазлу музики без втрат.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Альбоми';
+3 -3
View File
@@ -397,7 +397,7 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
@@ -4565,7 +4565,7 @@ class AppLocalizationsZhCn extends AppLocalizationsZh {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
@@ -8046,7 +8046,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get aboutAppDescription =>
'Download Spotify tracks in lossless quality from Tidal and Qobuz.';
'Search music metadata, manage extensions, and organize your library.';
@override
String get artistAlbums => 'Albums';
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Lade Spotify-Titel in verlustfreier Qualität von Tidal und Qobuz herunter.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -398,7 +398,7 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Descargar pistas de Spotify en alta calidad (sin pérdida) de Tidal y Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -458,7 +458,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Unduh lagu-lagu Spotify dalam kualitas lossless dari Tidal dan Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -438,7 +438,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -398,7 +398,7 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Скачивайте треки Spotify в lossless качестве с Tidal и Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -438,7 +438,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Spotify parçalarını Tidal ve Qobuz aracılığıyla kayıpsız kalitede indirin.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Кінцеві точки потокового передавання Tidal Hi-Res FLAC. Ключовий елемент пазлу музики без втрат.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -398,7 +398,7 @@
"@aboutSachinsenalDesc": {
"description": "Credit description for sachinsenal0x64"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+1 -1
View File
@@ -498,7 +498,7 @@
"@aboutSjdonadoDesc": {
"description": "Credit description for sjdonado"
},
"aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal and Qobuz.",
"aboutAppDescription": "Search music metadata, manage extensions, and organize your library.",
"@aboutAppDescription": {
"description": "App description in header card"
},
+2 -1
View File
@@ -141,7 +141,8 @@ class AboutPage extends StatelessWidget {
icon: Icons.lyrics_outlined,
title: 'Paxsenix',
subtitle:
'Partner lyrics proxy for Apple Music and QQ Music sources',
'Lyrics proxy for Musixmatch, Netease, Apple Music, '
'QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius',
onTap: () => _launchUrl('https://lyrics.paxsenix.org'),
showDivider: false,
),
@@ -21,6 +21,11 @@ class _LyricsProviderPriorityPageState
'musixmatch',
'apple_music',
'qqmusic',
'spotify',
'deezer',
'youtube',
'kugou',
'genius',
];
late List<String> _enabledProviders;
@@ -211,6 +216,36 @@ class _LyricsProviderPriorityPageState
description: context.l10n.lyricsProviderQqMusicDesc,
icon: Icons.queue_music,
);
case 'spotify':
return _LyricsProviderInfo(
name: 'Spotify',
description: context.l10n.lyricsProviderExtensionDesc,
icon: Icons.graphic_eq,
);
case 'deezer':
return _LyricsProviderInfo(
name: 'Deezer',
description: context.l10n.lyricsProviderExtensionDesc,
icon: Icons.album_outlined,
);
case 'youtube':
return _LyricsProviderInfo(
name: 'YouTube',
description: context.l10n.lyricsProviderExtensionDesc,
icon: Icons.smart_display_outlined,
);
case 'kugou':
return _LyricsProviderInfo(
name: 'Kugou',
description: context.l10n.lyricsProviderExtensionDesc,
icon: Icons.library_music_outlined,
);
case 'genius':
return _LyricsProviderInfo(
name: 'Genius',
description: context.l10n.lyricsProviderExtensionDesc,
icon: Icons.auto_awesome_outlined,
);
default:
return _LyricsProviderInfo(
name: id,
@@ -216,6 +216,11 @@ class LyricsSettingsPage extends ConsumerWidget {
'musixmatch': 'Musixmatch',
'apple_music': 'Apple Music',
'qqmusic': 'QQ Music',
'spotify': 'Spotify',
'deezer': 'Deezer',
'youtube': 'YouTube',
'kugou': 'Kugou',
'genius': 'Genius',
};
String _getLyricsProvidersSubtitle(