fix(playback): play next not working

This commit is contained in:
Kingkor Roy Tirtho 2025-09-20 20:25:51 +06:00
parent 7d849b1430
commit 973ca20c8e
7 changed files with 44 additions and 26 deletions

View File

@ -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,
);

View File

@ -259,11 +259,14 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
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<AudioPlayerState> {
}
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;
}

View File

@ -166,7 +166,7 @@ class TrackOptionsActions {
}
break;
case TrackOptionValue.playNext:
playback.addTracksAtFirst([track]);
await playback.addTracksAtFirst([track]);
if (context.mounted) {
showToast(

View File

@ -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) {

View File

@ -121,9 +121,23 @@ class CustomPlayer extends Player {
NativePlayer get nativePlayer => platform as NativePlayer;
Future<void> insert(int index, Media media) async {
final addedMediaCompleter = Completer<int>();
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);
await Future.delayed(const Duration(milliseconds: 100));
await move(state.playlist.medias.length - 1, index);
final mediaAddedIndex = await addedMediaCompleter.future;
await move(mediaAddedIndex, index);
} finally {
playlistStream.cancel();
}
}
Future<void> setAudioNormalization(bool normalize) async {

View File

@ -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:

View File

@ -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