fix: playback not moving to next track after a track ends

This commit is contained in:
Kingkor Roy Tirtho 2023-06-01 09:02:44 +06:00
parent 19d0ddcdd9
commit 27e8acbfe7
3 changed files with 12 additions and 5 deletions

View File

@ -14,7 +14,7 @@ class ProxyPlaylist {
List.castFrom<dynamic, Map<String, dynamic>>( List.castFrom<dynamic, Map<String, dynamic>>(
json['tracks'] ?? <Map<String, dynamic>>[], json['tracks'] ?? <Map<String, dynamic>>[],
).map(_makeAppropriateTrack).toSet(), ).map(_makeAppropriateTrack).toSet(),
json['active'] as int, json['active'] as int?,
); );
} }

View File

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -214,7 +213,9 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
}) async { }) async {
tracks = blacklist.filter(tracks).toList() as List<Track>; tracks = blacklist.filter(tracks).toList() as List<Track>;
final addableTrack = await SpotubeTrack.fetchFromTrack( final addableTrack = await SpotubeTrack.fetchFromTrack(
tracks.elementAt(initialIndex), preferences); tracks.elementAt(initialIndex),
preferences,
);
state = state.copyWith( state = state.copyWith(
tracks: mergeTracks([addableTrack], tracks), tracks: mergeTracks([addableTrack], tracks),
@ -389,6 +390,8 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
@override @override
onInit() { onInit() {
if (state.tracks.isEmpty) return null;
return load( return load(
state.tracks, state.tracks,
initialIndex: state.active ?? 0, initialIndex: state.active ?? 0,

View File

@ -40,9 +40,13 @@ class MkPlayerWithState extends Player {
_playerStateStream.add(AudioPlaybackState.paused); _playerStateStream.add(AudioPlaybackState.paused);
} }
}), }),
streams.completed.listen((event) async { streams.position.listen((position) async {
final isComplete = state.duration != Duration.zero &&
position != Duration.zero &&
state.duration.inSeconds == position.inSeconds;
if (!isComplete || _playlist == null) return;
_playerStateStream.add(AudioPlaybackState.completed); _playerStateStream.add(AudioPlaybackState.completed);
if (!event || _playlist == null) return;
if (loopMode == PlaylistMode.single) { if (loopMode == PlaylistMode.single) {
await super.open(_playlist!.medias[_playlist!.index], play: true); await super.open(_playlist!.medias[_playlist!.index], play: true);