From 973ca20c8e9f86891ac6c2e17a57a12a11e454ac Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 20 Sep 2025 20:25:51 +0600 Subject: [PATCH] fix(playback): play next not working --- lib/components/track_tile/track_options.dart | 29 ++++++++++--------- lib/provider/audio_player/audio_player.dart | 12 ++++---- .../track_options/track_options_provider.dart | 2 +- lib/services/audio_player/audio_player.dart | 1 + lib/services/audio_player/custom_player.dart | 20 +++++++++++-- pubspec.lock | 4 +-- pubspec.yaml | 2 +- 7 files changed, 44 insertions(+), 26 deletions(-) diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index 7943fe3d..6124abf0 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -5,6 +5,7 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/assets.gen.dart'; +import 'package:spotube/collections/routes.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/constrains.dart'; @@ -59,7 +60,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.delete, playlistId, ); @@ -73,7 +74,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.album, playlistId, ); @@ -97,7 +98,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.addToQueue, playlistId, ); @@ -110,7 +111,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.playNext, playlistId, ); @@ -124,7 +125,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.removeFromQueue, playlistId, ); @@ -139,7 +140,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.favorite, playlistId, ); @@ -162,7 +163,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.startRadio, playlistId, ); @@ -175,7 +176,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.addToPlaylist, playlistId, ); @@ -190,7 +191,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.removeFromPlaylist, playlistId, ); @@ -204,7 +205,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.download, playlistId, ); @@ -226,7 +227,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.blacklist, playlistId, ); @@ -250,7 +251,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.share, playlistId, ); @@ -264,7 +265,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.songlink, playlistId, ); @@ -282,7 +283,7 @@ class TrackOptions extends HookConsumerWidget { style: ButtonVariance.menu, onPressed: () async { await trackOptionActions.action( - context, + rootNavigatorKey.currentContext!, TrackOptionValue.details, playlistId, ); diff --git a/lib/provider/audio_player/audio_player.dart b/lib/provider/audio_player/audio_player.dart index cb53ca4f..5db28125 100644 --- a/lib/provider/audio_player/audio_player.dart +++ b/lib/provider/audio_player/audio_player.dart @@ -259,11 +259,14 @@ class AudioPlayerNotifier extends Notifier { return addTracks(tracks); } - final addableTracks = _blacklist.filter(tracks).where( + final addableTracks = _blacklist + .filter(tracks) + .where( (track) => allowDuplicates || !state.tracks.any((element) => _compareTracks(element, track)), - ); + ) + .toList(); state = state.copyWith( tracks: [...addableTracks, ...state.tracks], @@ -371,13 +374,12 @@ class AudioPlayerNotifier extends Notifier { } bool _compareTracks(SpotubeTrackObject a, SpotubeTrackObject b) { - if ((a is SpotubeLocalTrackObject && b is! SpotubeLocalTrackObject) || - (a is! SpotubeLocalTrackObject && b is SpotubeLocalTrackObject)) { + if (a.runtimeType != b.runtimeType) { return false; } return a is SpotubeLocalTrackObject && b is SpotubeLocalTrackObject - ? (a).path == (b).path + ? a.path == b.path : a.id == b.id; } diff --git a/lib/provider/track_options/track_options_provider.dart b/lib/provider/track_options/track_options_provider.dart index 7e6bc16e..42f363d9 100644 --- a/lib/provider/track_options/track_options_provider.dart +++ b/lib/provider/track_options/track_options_provider.dart @@ -166,7 +166,7 @@ class TrackOptionsActions { } break; case TrackOptionValue.playNext: - playback.addTracksAtFirst([track]); + await playback.addTracksAtFirst([track]); if (context.mounted) { showToast( diff --git a/lib/services/audio_player/audio_player.dart b/lib/services/audio_player/audio_player.dart index 925d0761..262b9d10 100644 --- a/lib/services/audio_player/audio_player.dart +++ b/lib/services/audio_player/audio_player.dart @@ -57,6 +57,7 @@ abstract class AudioPlayerInterface { title: "Spotube", logLevel: kDebugMode ? mk.MPVLogLevel.info : mk.MPVLogLevel.error, bufferSize: 4 * 1024 * 1024, // 4MB buffer + async: true, ), ) { _mkPlayer.stream.error.listen((event) { diff --git a/lib/services/audio_player/custom_player.dart b/lib/services/audio_player/custom_player.dart index 39866dcc..7cbd51a5 100644 --- a/lib/services/audio_player/custom_player.dart +++ b/lib/services/audio_player/custom_player.dart @@ -121,9 +121,23 @@ class CustomPlayer extends Player { NativePlayer get nativePlayer => platform as NativePlayer; Future insert(int index, Media media) async { - await add(media); - await Future.delayed(const Duration(milliseconds: 100)); - await move(state.playlist.medias.length - 1, index); + final addedMediaCompleter = Completer(); + final playlistStream = stream.playlist.listen( + (event) { + final mediaAddedIndex = + event.medias.indexWhere((m) => m.uri == media.uri); + if (mediaAddedIndex != -1 && !addedMediaCompleter.isCompleted) { + addedMediaCompleter.complete(mediaAddedIndex); + } + }, + ); + try { + await add(media); + final mediaAddedIndex = await addedMediaCompleter.future; + await move(mediaAddedIndex, index); + } finally { + playlistStream.cancel(); + } } Future setAudioNormalization(bool normalize) async { diff --git a/pubspec.lock b/pubspec.lock index 0ccd5c44..bb8bb234 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1412,10 +1412,10 @@ packages: dependency: "direct main" description: name: invidious - sha256: "27ef3a001df875665de15535dbc9099f44d12a59480018fb1e17377d4af0308d" + sha256: "0da8ebc4c4110057f03302bbd54514b10642154d7be569e7994172f2202dcfe8" url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.2" io: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0877d736..7ea73e04 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,7 +81,7 @@ dependencies: http: ^1.2.1 image_picker: ^1.1.0 intl: any - invidious: ^0.1.1 + invidious: ^0.1.2 jiosaavn: ^0.1.0 json_annotation: ^4.8.1 local_notifier: ^0.1.6