diff --git a/lib/provider/proxy_playlist/next_fetcher_mixin.dart b/lib/provider/proxy_playlist/next_fetcher_mixin.dart index 0236ec58..c3f44015 100644 --- a/lib/provider/proxy_playlist/next_fetcher_mixin.dart +++ b/lib/provider/proxy_playlist/next_fetcher_mixin.dart @@ -86,13 +86,14 @@ mixin NextFetcher on StateNotifier { } else if (track is LocalTrack) { return track.path; } else { - return "https://youtube.com/unplayable.m4a?id=${track.id}&title=${track.name?.replaceAll( - RegExp(r'\s+', caseSensitive: false), - '-', - )}"; + return trackToUnplayableSource(track); } } + String trackToUnplayableSource(Track track) { + return "https://youtube.com/unplayable.m4a?id=${track.id}&title=${Uri.encodeComponent(track.name!)}"; + } + List mapSourcesToTracks(List sources) { return sources .map((source) { diff --git a/lib/provider/proxy_playlist/proxy_playlist_provider.dart b/lib/provider/proxy_playlist/proxy_playlist_provider.dart index fdb05673..941951af 100644 --- a/lib/provider/proxy_playlist/proxy_playlist_provider.dart +++ b/lib/provider/proxy_playlist/proxy_playlist_provider.dart @@ -336,15 +336,18 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier Future jumpTo(int index) async { final oldTrack = mapSourcesToTracks([audioPlayer.currentSource!]).firstOrNull; + state = state.copyWith(active: index); await audioPlayer.pause(); final track = await ensureSourcePlayable(audioPlayer.sources[index]); + if (track != null) { state = state.copyWith( tracks: mergeTracks([track], state.tracks), active: index, ); } + await audioPlayer.jumpTo(index); if (oldTrack != null || track != null) { diff --git a/lib/services/audio_player/mk_state_player.dart b/lib/services/audio_player/mk_state_player.dart index 84765727..c64f0095 100644 --- a/lib/services/audio_player/mk_state_player.dart +++ b/lib/services/audio_player/mk_state_player.dart @@ -159,7 +159,7 @@ class MkPlayerWithState extends Player { @override Future next() async { - if (_playlist == null || _playlist!.index + 1 >= _playlist!.medias.length) { + if (_playlist == null) { return; } @@ -190,7 +190,7 @@ class MkPlayerWithState extends Player { @override Future jump(int index) async { if (_playlist == null || index < 0 || index >= _playlist!.medias.length) { - return null; + return; } playlist = _playlist!.copyWith(index: index); diff --git a/lib/utils/type_conversion_utils.dart b/lib/utils/type_conversion_utils.dart index 5694d3fe..cf658a0e 100644 --- a/lib/utils/type_conversion_utils.dart +++ b/lib/utils/type_conversion_utils.dart @@ -67,7 +67,7 @@ abstract class TypeConversionUtils { if (onRouteChange != null) { onRouteChange("/artist/${artist.value.id}"); } else { - ServiceUtils.navigate( + ServiceUtils.push( context, "/artist/${artist.value.id}", );