mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-12-06 07:29:42 +00:00
fix(playback): play next not working
This commit is contained in:
parent
7d849b1430
commit
973ca20c8e
@ -5,6 +5,7 @@ import 'package:shadcn_flutter/shadcn_flutter.dart';
|
|||||||
|
|
||||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||||
import 'package:spotube/collections/assets.gen.dart';
|
import 'package:spotube/collections/assets.gen.dart';
|
||||||
|
import 'package:spotube/collections/routes.dart';
|
||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/ui/button_tile.dart';
|
import 'package:spotube/components/ui/button_tile.dart';
|
||||||
import 'package:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
@ -59,7 +60,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.delete,
|
TrackOptionValue.delete,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -73,7 +74,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.album,
|
TrackOptionValue.album,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -97,7 +98,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.addToQueue,
|
TrackOptionValue.addToQueue,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -110,7 +111,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.playNext,
|
TrackOptionValue.playNext,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -124,7 +125,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.removeFromQueue,
|
TrackOptionValue.removeFromQueue,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -139,7 +140,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.favorite,
|
TrackOptionValue.favorite,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -162,7 +163,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.startRadio,
|
TrackOptionValue.startRadio,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -175,7 +176,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.addToPlaylist,
|
TrackOptionValue.addToPlaylist,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -190,7 +191,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.removeFromPlaylist,
|
TrackOptionValue.removeFromPlaylist,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -204,7 +205,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.download,
|
TrackOptionValue.download,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -226,7 +227,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.blacklist,
|
TrackOptionValue.blacklist,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -250,7 +251,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.share,
|
TrackOptionValue.share,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -264,7 +265,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.songlink,
|
TrackOptionValue.songlink,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
@ -282,7 +283,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
style: ButtonVariance.menu,
|
style: ButtonVariance.menu,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await trackOptionActions.action(
|
await trackOptionActions.action(
|
||||||
context,
|
rootNavigatorKey.currentContext!,
|
||||||
TrackOptionValue.details,
|
TrackOptionValue.details,
|
||||||
playlistId,
|
playlistId,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -259,11 +259,14 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
|
|||||||
return addTracks(tracks);
|
return addTracks(tracks);
|
||||||
}
|
}
|
||||||
|
|
||||||
final addableTracks = _blacklist.filter(tracks).where(
|
final addableTracks = _blacklist
|
||||||
|
.filter(tracks)
|
||||||
|
.where(
|
||||||
(track) =>
|
(track) =>
|
||||||
allowDuplicates ||
|
allowDuplicates ||
|
||||||
!state.tracks.any((element) => _compareTracks(element, track)),
|
!state.tracks.any((element) => _compareTracks(element, track)),
|
||||||
);
|
)
|
||||||
|
.toList();
|
||||||
|
|
||||||
state = state.copyWith(
|
state = state.copyWith(
|
||||||
tracks: [...addableTracks, ...state.tracks],
|
tracks: [...addableTracks, ...state.tracks],
|
||||||
@ -371,13 +374,12 @@ class AudioPlayerNotifier extends Notifier<AudioPlayerState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _compareTracks(SpotubeTrackObject a, SpotubeTrackObject b) {
|
bool _compareTracks(SpotubeTrackObject a, SpotubeTrackObject b) {
|
||||||
if ((a is SpotubeLocalTrackObject && b is! SpotubeLocalTrackObject) ||
|
if (a.runtimeType != b.runtimeType) {
|
||||||
(a is! SpotubeLocalTrackObject && b is SpotubeLocalTrackObject)) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return a is SpotubeLocalTrackObject && b is SpotubeLocalTrackObject
|
return a is SpotubeLocalTrackObject && b is SpotubeLocalTrackObject
|
||||||
? (a).path == (b).path
|
? a.path == b.path
|
||||||
: a.id == b.id;
|
: a.id == b.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -166,7 +166,7 @@ class TrackOptionsActions {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TrackOptionValue.playNext:
|
case TrackOptionValue.playNext:
|
||||||
playback.addTracksAtFirst([track]);
|
await playback.addTracksAtFirst([track]);
|
||||||
|
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
showToast(
|
showToast(
|
||||||
|
|||||||
@ -57,6 +57,7 @@ abstract class AudioPlayerInterface {
|
|||||||
title: "Spotube",
|
title: "Spotube",
|
||||||
logLevel: kDebugMode ? mk.MPVLogLevel.info : mk.MPVLogLevel.error,
|
logLevel: kDebugMode ? mk.MPVLogLevel.info : mk.MPVLogLevel.error,
|
||||||
bufferSize: 4 * 1024 * 1024, // 4MB buffer
|
bufferSize: 4 * 1024 * 1024, // 4MB buffer
|
||||||
|
async: true,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
_mkPlayer.stream.error.listen((event) {
|
_mkPlayer.stream.error.listen((event) {
|
||||||
|
|||||||
@ -121,9 +121,23 @@ class CustomPlayer extends Player {
|
|||||||
NativePlayer get nativePlayer => platform as NativePlayer;
|
NativePlayer get nativePlayer => platform as NativePlayer;
|
||||||
|
|
||||||
Future<void> insert(int index, Media media) async {
|
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 add(media);
|
||||||
await Future.delayed(const Duration(milliseconds: 100));
|
final mediaAddedIndex = await addedMediaCompleter.future;
|
||||||
await move(state.playlist.medias.length - 1, index);
|
await move(mediaAddedIndex, index);
|
||||||
|
} finally {
|
||||||
|
playlistStream.cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setAudioNormalization(bool normalize) async {
|
Future<void> setAudioNormalization(bool normalize) async {
|
||||||
|
|||||||
@ -1412,10 +1412,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: invidious
|
name: invidious
|
||||||
sha256: "27ef3a001df875665de15535dbc9099f44d12a59480018fb1e17377d4af0308d"
|
sha256: "0da8ebc4c4110057f03302bbd54514b10642154d7be569e7994172f2202dcfe8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.1"
|
version: "0.1.2"
|
||||||
io:
|
io:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
|||||||
@ -81,7 +81,7 @@ dependencies:
|
|||||||
http: ^1.2.1
|
http: ^1.2.1
|
||||||
image_picker: ^1.1.0
|
image_picker: ^1.1.0
|
||||||
intl: any
|
intl: any
|
||||||
invidious: ^0.1.1
|
invidious: ^0.1.2
|
||||||
jiosaavn: ^0.1.0
|
jiosaavn: ^0.1.0
|
||||||
json_annotation: ^4.8.1
|
json_annotation: ^4.8.1
|
||||||
local_notifier: ^0.1.6
|
local_notifier: ^0.1.6
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user