From 4838656dcc518896792ee0c6c24e2c05bd756808 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 14 Nov 2025 16:17:37 +0600 Subject: [PATCH] chore: fix alternative sources not persisting --- .../plugin.smplug | Bin 20876 -> 20906 bytes lib/modules/home/sections/new_releases.dart | 2 +- lib/modules/home/sections/sections.dart | 2 +- lib/pages/library/user_albums.dart | 2 +- lib/pages/library/user_artists.dart | 2 +- lib/pages/library/user_playlists.dart | 2 +- lib/pages/search/search.dart | 2 +- lib/provider/audio_player/audio_player.dart | 66 +++++++----------- lib/provider/metadata_plugin/album/album.dart | 2 +- .../metadata_plugin/artist/artist.dart | 2 +- .../audio_source/quality_presets.dart | 5 +- .../metadata_plugin/library/playlists.dart | 2 +- .../metadata_plugin/playlist/playlist.dart | 2 +- lib/provider/metadata_plugin/search/all.dart | 4 +- .../metadata_plugin/tracks/track.dart | 2 +- .../metadata_plugin/utils/common.dart | 2 +- .../track_options/track_options_provider.dart | 2 +- lib/services/metadata/errors/exceptions.dart | 12 +++- lib/services/sourced_track/sourced_track.dart | 23 ++++-- 19 files changed, 70 insertions(+), 66 deletions(-) diff --git a/assets/plugins/spotube-plugin-youtube-audio/plugin.smplug b/assets/plugins/spotube-plugin-youtube-audio/plugin.smplug index f8dedd0c268be48959b60ec91d95d73854e9a4d0..55aa2895d668dad6e69184fbf8d67f957cd3d7bd 100644 GIT binary patch delta 3548 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 T@`Ui;5JNi|a)L_@{+av>?d-ra delta 3564 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 { }), audioPlayer.playlistStream.listen((playlist) async { try { - // Playlist and state has to be in sync. This is only meant for - // the shuffle/re-ordering indices to be in sync - if (playlist.medias.length != state.tracks.length) { - AppLogger.log.w( - "Playlist length does not match state tracks length. Ignoring... " - "Playlist length: ${playlist.medias.length}, " - "State tracks length: ${state.tracks.length}", - ); - return; - } - - final trackGroupedById = groupBy( - state.tracks, - (query) => query.id, - ); - - final tracks = []; - - for (final media in playlist.medias) { - final track = trackGroupedById[SpotubeMedia.media(media).track.id] - ?.firstOrNull; - if (track != null) { - tracks.add(track); - } - } - - if (tracks.length != state.tracks.length) { - AppLogger.log.w("Mismatch in tracks after reordering/shuffling."); - final missingTracks = - state.tracks.where((track) => !tracks.contains(track)).toList(); - AppLogger.log.w( - "Missing tracks: ${missingTracks.map((e) => e.id).join(", ")}", - ); - } + final tracks = + playlist.medias.map((e) => SpotubeMedia.media(e).track).toList(); state = state.copyWith( tracks: tracks, @@ -434,13 +402,31 @@ class AudioPlayerNotifier extends Notifier { return; } - final currentIndex = state.currentIndex; - final currentTrack = state.activeTrack as SpotubeFullTrackObject; - final swappedMedia = SpotubeMedia(currentTrack); + final oldState = state; + await audioPlayer.stop(); - await audioPlayer.addTrackAt(swappedMedia, currentIndex + 1); - await audioPlayer.skipToNext(); - await audioPlayer.removeTrack(currentIndex); + await load( + oldState.tracks, + initialIndex: oldState.currentIndex, + autoPlay: true, + ); + state = state.copyWith( + collections: oldState.collections, + loopMode: oldState.loopMode, + playing: oldState.playing, + shuffled: false, + ); + await audioPlayer.setLoopMode(oldState.loopMode); + await _updatePlayerState( + AudioPlayerStateTableCompanion( + tracks: Value(state.tracks), + currentIndex: Value(state.currentIndex), + collections: Value(state.collections), + loopMode: Value(state.loopMode), + playing: Value(state.playing), + shuffled: Value(state.shuffled), + ), + ); } Future jumpToTrack(SpotubeTrackObject track) async { diff --git a/lib/provider/metadata_plugin/album/album.dart b/lib/provider/metadata_plugin/album/album.dart index 3a386236..394f6eb0 100644 --- a/lib/provider/metadata_plugin/album/album.dart +++ b/lib/provider/metadata_plugin/album/album.dart @@ -12,7 +12,7 @@ final metadataPluginAlbumProvider = final metadataPlugin = await ref.watch(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin.album.getAlbum(id); diff --git a/lib/provider/metadata_plugin/artist/artist.dart b/lib/provider/metadata_plugin/artist/artist.dart index f1691657..e66309d4 100644 --- a/lib/provider/metadata_plugin/artist/artist.dart +++ b/lib/provider/metadata_plugin/artist/artist.dart @@ -12,7 +12,7 @@ final metadataPluginArtistProvider = final metadataPlugin = await ref.watch(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin.artist.getArtist(artistId); diff --git a/lib/provider/metadata_plugin/audio_source/quality_presets.dart b/lib/provider/metadata_plugin/audio_source/quality_presets.dart index 0a8b00fe..ba88fed6 100644 --- a/lib/provider/metadata_plugin/audio_source/quality_presets.dart +++ b/lib/provider/metadata_plugin/audio_source/quality_presets.dart @@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; +import 'package:spotube/services/metadata/errors/exceptions.dart'; import 'package:spotube/services/metadata/metadata.dart'; part 'quality_presets.g.dart'; @@ -61,7 +62,7 @@ class AudioSourceAvailableQualityPresetsNotifier audioSourceConfigSnapshot.whenData((audioSourceConfig) { audioSourceSnapshot.whenData((audioSource) async { if (audioSource == null || audioSourceConfig == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } final preferences = await SharedPreferences.getInstance(); final persistedStateStr = @@ -114,7 +115,7 @@ class AudioSourceAvailableQualityPresetsNotifier final audioSourceConfig = await ref.read(metadataPluginsProvider .selectAsync((data) => data.defaultAudioSourcePluginConfig)); if (audioSourceConfig == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } final preferences = await SharedPreferences.getInstance(); diff --git a/lib/provider/metadata_plugin/library/playlists.dart b/lib/provider/metadata_plugin/library/playlists.dart index 6350d610..5793eb57 100644 --- a/lib/provider/metadata_plugin/library/playlists.dart +++ b/lib/provider/metadata_plugin/library/playlists.dart @@ -131,7 +131,7 @@ final metadataPluginIsSavedPlaylistProvider = final plugin = await ref.watch(metadataPluginProvider.future); if (plugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } final savedPlaylists = diff --git a/lib/provider/metadata_plugin/playlist/playlist.dart b/lib/provider/metadata_plugin/playlist/playlist.dart index 71062b95..9a41340d 100644 --- a/lib/provider/metadata_plugin/playlist/playlist.dart +++ b/lib/provider/metadata_plugin/playlist/playlist.dart @@ -13,7 +13,7 @@ class MetadataPluginPlaylistNotifier final metadataPlugin = await ref.read(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin; diff --git a/lib/provider/metadata_plugin/search/all.dart b/lib/provider/metadata_plugin/search/all.dart index b40ee78a..4b051e58 100644 --- a/lib/provider/metadata_plugin/search/all.dart +++ b/lib/provider/metadata_plugin/search/all.dart @@ -9,7 +9,7 @@ final metadataPluginSearchAllProvider = final metadataPlugin = await ref.watch(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin.search.all(query); @@ -20,7 +20,7 @@ final metadataPluginSearchChipsProvider = FutureProvider((ref) async { final metadataPlugin = await ref.watch(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin.search.chips; }); diff --git a/lib/provider/metadata_plugin/tracks/track.dart b/lib/provider/metadata_plugin/tracks/track.dart index 502780e1..1beac43a 100644 --- a/lib/provider/metadata_plugin/tracks/track.dart +++ b/lib/provider/metadata_plugin/tracks/track.dart @@ -8,7 +8,7 @@ final metadataPluginTrackProvider = final metadataPlugin = await ref.watch(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return metadataPlugin.track.getTrack(trackId); diff --git a/lib/provider/metadata_plugin/utils/common.dart b/lib/provider/metadata_plugin/utils/common.dart index 087b8a1b..dc56e494 100644 --- a/lib/provider/metadata_plugin/utils/common.dart +++ b/lib/provider/metadata_plugin/utils/common.dart @@ -20,7 +20,7 @@ mixin MetadataPluginMixin final plugin = await ref.read(metadataPluginProvider.future); if (plugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } return plugin; diff --git a/lib/provider/track_options/track_options_provider.dart b/lib/provider/track_options/track_options_provider.dart index d31aba73..5aebf39c 100644 --- a/lib/provider/track_options/track_options_provider.dart +++ b/lib/provider/track_options/track_options_provider.dart @@ -95,7 +95,7 @@ class TrackOptionsActions { final metadataPlugin = await ref.read(metadataPluginProvider.future); if (metadataPlugin == null) { - throw MetadataPluginException.noDefaultPlugin(); + throw MetadataPluginException.noDefaultMetadataPlugin(); } final tracks = await metadataPlugin.track.radio(track.id); diff --git a/lib/services/metadata/errors/exceptions.dart b/lib/services/metadata/errors/exceptions.dart index 62cc3779..5bb5ac57 100644 --- a/lib/services/metadata/errors/exceptions.dart +++ b/lib/services/metadata/errors/exceptions.dart @@ -9,7 +9,8 @@ enum MetadataPluginErrorCode { pluginDownloadFailed, duplicatePlugin, pluginByteCodeFileNotFound, - noDefaultPlugin, + noDefaultMetadataPlugin, + noDefaultAudiSourcePlugin, } class MetadataPluginException implements Exception { @@ -68,10 +69,15 @@ class MetadataPluginException implements Exception { 'Plugin byte code file, plugin.out not found. Please ensure the plugin is correctly packaged.', errorCode: MetadataPluginErrorCode.pluginByteCodeFileNotFound, ); - MetadataPluginException.noDefaultPlugin() + MetadataPluginException.noDefaultMetadataPlugin() : this._( 'No default metadata plugin is set. Please set a default plugin in the settings.', - errorCode: MetadataPluginErrorCode.noDefaultPlugin, + errorCode: MetadataPluginErrorCode.noDefaultMetadataPlugin, + ); + MetadataPluginException.noDefaultAudioSourcePlugin() + : this._( + 'No default audio source plugin is set. Please set a default plugin in the settings.', + errorCode: MetadataPluginErrorCode.noDefaultAudiSourcePlugin, ); @override diff --git a/lib/services/sourced_track/sourced_track.dart b/lib/services/sourced_track/sourced_track.dart index 5da54fc8..385e5be6 100644 --- a/lib/services/sourced_track/sourced_track.dart +++ b/lib/services/sourced_track/sourced_track.dart @@ -12,6 +12,7 @@ import 'package:spotube/provider/metadata_plugin/audio_source/quality_presets.da import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/services/dio/dio.dart'; import 'package:spotube/services/logger/logger.dart'; +import 'package:spotube/services/metadata/errors/exceptions.dart'; import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/utils/service_utils.dart'; @@ -41,7 +42,7 @@ class SourcedTrack extends BasicSourcedTrack { final audioSourceConfig = await ref.read(metadataPluginsProvider .selectAsync((data) => data.defaultAudioSourcePluginConfig)); if (audioSource == null || audioSourceConfig == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } final database = ref.read(databaseProvider); @@ -157,7 +158,7 @@ class SourcedTrack extends BasicSourcedTrack { final audioSource = await ref.read(audioSourcePluginProvider.future); if (audioSource == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } final videoResults = []; @@ -190,7 +191,8 @@ class SourcedTrack extends BasicSourcedTrack { } Future swapWithSibling( - SpotubeAudioSourceMatchObject sibling) async { + SpotubeAudioSourceMatchObject sibling, + ) async { if (sibling.id == info.id) { return null; } @@ -199,7 +201,7 @@ class SourcedTrack extends BasicSourcedTrack { final audioSourceConfig = await ref.read(metadataPluginsProvider .selectAsync((data) => data.defaultAudioSourcePluginConfig)); if (audioSource == null || audioSourceConfig == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } // a sibling source that was fetched from the search results @@ -216,10 +218,19 @@ class SourcedTrack extends BasicSourcedTrack { final database = ref.read(databaseProvider); + // Delete the old Entry + await (database.sourceMatchTable.delete() + ..where( + (table) => + table.trackId.equals(query.id) & + table.sourceType.equals(audioSourceConfig.slug), + )) + .go(); + await database.into(database.sourceMatchTable).insert( SourceMatchTableCompanion.insert( trackId: query.id, - sourceInfo: Value(jsonEncode(siblings.first)), + sourceInfo: Value(jsonEncode(sibling)), sourceType: audioSourceConfig.slug, createdAt: Value(DateTime.now()), ), @@ -245,7 +256,7 @@ class SourcedTrack extends BasicSourcedTrack { final audioSourceConfig = await ref.read(metadataPluginsProvider .selectAsync((data) => data.defaultAudioSourcePluginConfig)); if (audioSource == null || audioSourceConfig == null) { - throw Exception("Dude wat?"); + throw MetadataPluginException.noDefaultAudioSourcePlugin(); } List validStreams = [];