fix: alternative track source not playing new source

This commit is contained in:
Kingkor Roy Tirtho 2023-06-28 12:13:33 +06:00
parent 4ce0d989fa
commit a9b5a714e4
3 changed files with 45 additions and 32 deletions

View File

@ -1,6 +1,5 @@
import 'dart:ui';
import 'package:flutter/gestures.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
@ -18,9 +17,9 @@ import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/use_brightness_value.dart';
import 'package:spotube/models/logger.dart';
import 'package:flutter/material.dart';
import 'package:spotube/provider/authentication_provider.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/provider/volume_provider.dart';
import 'package:spotube/utils/platform.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
@ -30,6 +29,7 @@ class BottomPlayer extends HookConsumerWidget {
final logger = getLogger(BottomPlayer);
@override
Widget build(BuildContext context, ref) {
final auth = ref.watch(AuthenticationNotifier.provider);
final playlist = ref.watch(ProxyPlaylistNotifier.provider);
final layoutMode =
ref.watch(userPreferencesProvider.select((s) => s.layoutMode));
@ -87,6 +87,7 @@ class BottomPlayer extends HookConsumerWidget {
children: [
PlayerActions(
extraActions: [
if (auth != null)
IconButton(
tooltip: context.l10n.mini_player,
icon: const Icon(SpotubeIcons.miniPlayer),

View File

@ -19,19 +19,19 @@ import 'package:spotube/provider/piped_provider.dart';
import 'package:spotube/utils/persisted_state_notifier.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
/// Things to implement:
/// Things implemented:
/// * [x] Sponsor-Block skip
/// * [x] Prefetch next track as [SpotubeTrack] on 80% of current track
/// * [x] Mixed Queue containing both [SpotubeTrack] and [LocalTrack]
/// * [ ] Modification of the Queue
/// * [x] Modification of the Queue
/// * [x] Add track at the end
/// * [x] Add track at the beginning
/// * [x] Remove track
/// * [ ] Reorder track
/// * [x] Reorder track
/// * [x] Caching and loading of cache of tracks
/// * [x] Shuffling
/// * [x] loop => playlist, track, none
/// * [ ] Alternative Track Source
/// * [x] Alternative Track Source
/// * [x] Blacklisting of tracks and artist
///
/// Don'ts:

View File

@ -216,20 +216,32 @@ class MkPlayerWithState extends Player {
/// This replaces the old source with a new one
///
/// If the old source is playing, the new one will play
/// from the beginning
///
/// This doesn't work when [playlist] is null
/// Or, when the current media is the one to be replaced
void replace(String oldUrl, String newUrl) {
if (_playlist == null ||
_playlist!.medias[_playlist!.index].uri == oldUrl) {
if (_playlist == null) {
return;
}
final isOldUrlPlaying = _playlist!.medias[_playlist!.index].uri == oldUrl;
for (var i = 0; i < _playlist!.medias.length - 1; i++) {
final media = _playlist!.medias[i];
if (media.uri == oldUrl) {
if (isOldUrlPlaying) {
pause();
}
final newMedias = _playlist!.medias.toList();
newMedias[i] = Media(newUrl, extras: media.extras);
playlist = _playlist!.copyWith(medias: newMedias);
if (isOldUrlPlaying) {
super.open(
newMedias[i],
play: true,
);
}
break;
}
}