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 'dart:ui';
import 'package:flutter/gestures.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart'; import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.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/hooks/use_brightness_value.dart';
import 'package:spotube/models/logger.dart'; import 'package:spotube/models/logger.dart';
import 'package:flutter/material.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/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences_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/platform.dart';
import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart';
@ -30,6 +29,7 @@ class BottomPlayer extends HookConsumerWidget {
final logger = getLogger(BottomPlayer); final logger = getLogger(BottomPlayer);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final auth = ref.watch(AuthenticationNotifier.provider);
final playlist = ref.watch(ProxyPlaylistNotifier.provider); final playlist = ref.watch(ProxyPlaylistNotifier.provider);
final layoutMode = final layoutMode =
ref.watch(userPreferencesProvider.select((s) => s.layoutMode)); ref.watch(userPreferencesProvider.select((s) => s.layoutMode));
@ -87,29 +87,30 @@ class BottomPlayer extends HookConsumerWidget {
children: [ children: [
PlayerActions( PlayerActions(
extraActions: [ extraActions: [
IconButton( if (auth != null)
tooltip: context.l10n.mini_player, IconButton(
icon: const Icon(SpotubeIcons.miniPlayer), tooltip: context.l10n.mini_player,
onPressed: () async { icon: const Icon(SpotubeIcons.miniPlayer),
await DesktopTools.window.setMinimumSize( onPressed: () async {
const Size(300, 300), await DesktopTools.window.setMinimumSize(
); const Size(300, 300),
await DesktopTools.window.setAlwaysOnTop(true); );
if (!kIsLinux) { await DesktopTools.window.setAlwaysOnTop(true);
await DesktopTools.window.setHasShadow(false); if (!kIsLinux) {
} await DesktopTools.window.setHasShadow(false);
await DesktopTools.window }
.setAlignment(Alignment.topRight); await DesktopTools.window
await DesktopTools.window .setAlignment(Alignment.topRight);
.setSize(const Size(400, 500)); await DesktopTools.window
await Future.delayed( .setSize(const Size(400, 500));
const Duration(milliseconds: 100), await Future.delayed(
() async { const Duration(milliseconds: 100),
GoRouter.of(context).go('/mini-player'); () async {
}, GoRouter.of(context).go('/mini-player');
); },
}, );
), },
),
], ],
), ),
Container( Container(

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

View File

@ -216,20 +216,32 @@ class MkPlayerWithState extends Player {
/// This replaces the old source with a new one /// 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 /// 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) { void replace(String oldUrl, String newUrl) {
if (_playlist == null || if (_playlist == null) {
_playlist!.medias[_playlist!.index].uri == oldUrl) {
return; return;
} }
final isOldUrlPlaying = _playlist!.medias[_playlist!.index].uri == oldUrl;
for (var i = 0; i < _playlist!.medias.length - 1; i++) { for (var i = 0; i < _playlist!.medias.length - 1; i++) {
final media = _playlist!.medias[i]; final media = _playlist!.medias[i];
if (media.uri == oldUrl) { if (media.uri == oldUrl) {
if (isOldUrlPlaying) {
pause();
}
final newMedias = _playlist!.medias.toList(); final newMedias = _playlist!.medias.toList();
newMedias[i] = Media(newUrl, extras: media.extras); newMedias[i] = Media(newUrl, extras: media.extras);
playlist = _playlist!.copyWith(medias: newMedias); playlist = _playlist!.copyWith(medias: newMedias);
if (isOldUrlPlaying) {
super.open(
newMedias[i],
play: true,
);
}
break; break;
} }
} }