refactor: remove legacy API clients, Yoinkify fallback, and unused lyrics provider

- Delete dead metadata client and extract shared types to metadata_types.go
- Remove Yoinkify download fallback from Deezer, use MusicDL only
- Clean up retired settings fields and metadataSource
- Remove dead l10n keys for retired provider
- Add migration to strip retired provider from existing users' lyrics config
This commit is contained in:
zarzet committed 2026-04-13 23:32:13 +07:00
1 parent 8c576ac7e4
commit 5e833c1f75
27 files changed
+198 -1679

No files matched your search

+1 -2
View File
@@ -662,9 +662,8 @@ class ExtensionNotifier extends Notifier<ExtensionState> {
if (settings.searchProvider == extensionId) {
ref.read(settingsProvider.notifier).setSearchProvider(null);
ref.read(settingsProvider.notifier).setMetadataSource('deezer');
_log.d(
'Cleared search provider and reset to Deezer because extension $extensionId was disabled',
'Cleared search provider because extension $extensionId was disabled',
);
}
+17 -51
View File
@@ -12,7 +12,7 @@ import 'package:spotiflac_android/utils/logger.dart';
const _settingsKey = 'app_settings';
const _migrationVersionKey = 'settings_migration_version';
const _currentMigrationVersion = 7;
const _currentMigrationVersion = 9;
const _spotifyClientSecretKey = 'spotify_client_secret';
final _log = AppLogger('SettingsProvider');
@@ -44,7 +44,7 @@ class SettingsNotifier extends Notifier<AppSettings> {
await _normalizeSongLinkRegionIfNeeded();
}
await _retireBuiltInSpotifyProvider();
await _cleanupRetiredSpotifySettings();
LogBuffer.loggingEnabled = state.enableLogging;
@@ -86,13 +86,6 @@ class SettingsNotifier extends Notifier<AppSettings> {
Future<void> _runMigrations(SharedPreferences prefs) async {
final lastMigration = prefs.getInt(_migrationVersionKey) ?? 0;
if (lastMigration < 1) {
if (!state.useCustomSpotifyCredentials) {
state = state.copyWith(metadataSource: 'deezer');
await _saveSettings();
}
}
if (lastMigration < _currentMigrationVersion) {
if (state.downloadTreeUri.isNotEmpty && state.storageMode != 'saf') {
state = state.copyWith(storageMode: 'saf');
@@ -101,26 +94,20 @@ class SettingsNotifier extends Notifier<AppSettings> {
if (!state.isFirstLaunch && !state.hasCompletedTutorial) {
state = state.copyWith(hasCompletedTutorial: true);
}
// Migration 4: include Spotify Lyrics API in provider order for existing users
if (!state.lyricsProviders.contains('spotify_api')) {
final updatedProviders = List<String>.from(state.lyricsProviders);
final lrclibIndex = updatedProviders.indexOf('lrclib');
if (lrclibIndex >= 0) {
updatedProviders.insert(lrclibIndex + 1, 'spotify_api');
} else {
updatedProviders.add('spotify_api');
}
state = state.copyWith(lyricsProviders: updatedProviders);
}
if (state.metadataSource != 'deezer' ||
state.spotifyClientId.isNotEmpty ||
state.spotifyClientSecret.isNotEmpty ||
state.useCustomSpotifyCredentials) {
if (state.lyricsProviders.contains('spotify_api')) {
final updatedProviders = state.lyricsProviders
.where((provider) => provider != 'spotify_api')
.toList();
state = state.copyWith(
metadataSource: 'deezer',
spotifyClientId: '',
spotifyClientSecret: '',
useCustomSpotifyCredentials: false,
lyricsProviders: updatedProviders.isEmpty
? const [
'lrclib',
'musixmatch',
'netease',
'apple_music',
'qqmusic',
]
: updatedProviders,
);
}
state = state.copyWith(lastSeenVersion: AppInfo.version);
@@ -134,8 +121,7 @@ class SettingsNotifier extends Notifier<AppSettings> {
}
Future<void> _saveSettings() async {
final settingsToSave = state.copyWith(spotifyClientSecret: '');
_pendingSettingsJson = jsonEncode(settingsToSave.toJson());
_pendingSettingsJson = jsonEncode(state.toJson());
if (_isSavingSettings) {
_saveQueued = true;
@@ -186,28 +172,13 @@ class SettingsNotifier extends Notifier<AppSettings> {
await _saveSettings();
}
Future<void> _retireBuiltInSpotifyProvider() async {
Future<void> _cleanupRetiredSpotifySettings() async {
final storedSecret = await _secureStorage.read(
key: _spotifyClientSecretKey,
);
if (storedSecret != null && storedSecret.isNotEmpty) {
await _secureStorage.delete(key: _spotifyClientSecretKey);
}
if (state.metadataSource == 'deezer' &&
state.spotifyClientId.isEmpty &&
state.spotifyClientSecret.isEmpty &&
!state.useCustomSpotifyCredentials) {
return;
}
state = state.copyWith(
metadataSource: 'deezer',
spotifyClientId: '',
spotifyClientSecret: '',
useCustomSpotifyCredentials: false,
);
await _saveSettings();
}
void setDefaultService(String service) {
@@ -380,11 +351,6 @@ class SettingsNotifier extends Notifier<AppSettings> {
_saveSettings();
}
void setMetadataSource(String source) {
state = state.copyWith(metadataSource: source);
_saveSettings();
}
void setSearchProvider(String? provider) {
if (provider == null || provider.isEmpty) {
state = state.copyWith(clearSearchProvider: true);