diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 7e7a546..d94da39 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -1,59 +1,59 @@
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Groovy Box
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- Groovy Box
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSApplicationCategoryType
- public.app-category.music
- LSRequiresIPhoneOS
-
- NSMicrophoneUsageDescription
- To provide information for RhythmBox to normalize the output audio
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- audio
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIStatusBarHidden
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Groovy Box
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Groovy Box
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSApplicationCategoryType
+ public.app-category.music
+ LSRequiresIPhoneOS
+
+ NSMicrophoneUsageDescription
+ To provide information for RhythmBox to normalize the output audio
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ audio
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart
index 631701b..52e60bf 100644
--- a/lib/screens/explore.dart
+++ b/lib/screens/explore.dart
@@ -85,15 +85,6 @@ class _ExploreScreenState extends State {
),
body: CustomScrollView(
slivers: [
- if (_newReleasesPlaylist?.isNotEmpty ?? false)
- SliverToBoxAdapter(
- child: PlaylistSection(
- isLoading: _isLoading['newReleases']!,
- title: 'New Releases',
- list: _newReleasesPlaylist,
- ),
- ),
- if (_newReleasesPlaylist?.isNotEmpty ?? false) const SliverGap(16),
if (_recentlyPlaylist?.isNotEmpty ?? false)
SliverToBoxAdapter(
child: PlaylistSection(
@@ -103,6 +94,15 @@ class _ExploreScreenState extends State {
),
),
if (_recentlyPlaylist?.isNotEmpty ?? false) const SliverGap(16),
+ if (_newReleasesPlaylist?.isNotEmpty ?? false)
+ SliverToBoxAdapter(
+ child: PlaylistSection(
+ isLoading: _isLoading['newReleases']!,
+ title: 'New Releases',
+ list: _newReleasesPlaylist,
+ ),
+ ),
+ if (_newReleasesPlaylist?.isNotEmpty ?? false) const SliverGap(16),
SliverList.builder(
itemCount: _forYouView?.length ?? 0,
itemBuilder: (context, idx) {
diff --git a/lib/screens/player/mini.dart b/lib/screens/player/mini.dart
index e7bcf1e..5fe142a 100644
--- a/lib/screens/player/mini.dart
+++ b/lib/screens/player/mini.dart
@@ -2,8 +2,11 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import 'package:rhythm_box/platform.dart';
+import 'package:rhythm_box/screens/player/queue.dart';
+import 'package:rhythm_box/screens/player/siblings.dart';
import 'package:rhythm_box/widgets/lyrics/synced_lyrics.dart';
import 'package:rhythm_box/widgets/player/bottom_player.dart';
+import 'package:rhythm_box/widgets/player/devices.dart';
import 'package:window_manager/window_manager.dart';
class MiniPlayerScreen extends StatefulWidget {
@@ -94,6 +97,46 @@ class _MiniPlayerScreenState extends State {
onPressed: () => _exitMiniPlayer(),
),
const Spacer(),
+ IconButton(
+ icon: const Icon(Icons.speaker, size: 18),
+ onPressed: () {
+ showModalBottomSheet(
+ useRootNavigator: true,
+ context: context,
+ builder: (context) => const PlayerDevicePopup(),
+ );
+ },
+ ),
+ IconButton(
+ icon: const Icon(Icons.merge),
+ onPressed: () {
+ showModalBottomSheet(
+ useRootNavigator: true,
+ isScrollControlled: true,
+ context: context,
+ builder: (context) => const SiblingTracksPopup(),
+ ).then((_) {
+ if (mounted) {
+ setState(() {});
+ }
+ });
+ },
+ ),
+ IconButton(
+ icon: const Icon(Icons.queue_music),
+ onPressed: () {
+ showModalBottomSheet(
+ useRootNavigator: true,
+ isScrollControlled: true,
+ context: context,
+ builder: (context) => const PlayerQueuePopup(),
+ ).then((_) {
+ if (mounted) {
+ setState(() {});
+ }
+ });
+ },
+ ),
IconButton(
icon: _isHoverMode
? const Icon(Icons.touch_app)
diff --git a/lib/screens/player/view.dart b/lib/screens/player/view.dart
index cf2cbf6..ecf621a 100644
--- a/lib/screens/player/view.dart
+++ b/lib/screens/player/view.dart
@@ -139,6 +139,9 @@ class _PlayerScreenState extends State {
if (_playback.state.value.activeTrack != null &&
_auth.auth.value != null)
TrackHeartButton(
+ key: ValueKey(
+ _playback.state.value.activeTrack!.id!,
+ ),
trackId: _playback.state.value.activeTrack!.id!,
),
],
@@ -178,7 +181,9 @@ class _PlayerScreenState extends State {
},
onChangeEnd: (value) {
audioPlayer.seek(
- Duration(milliseconds: value.toInt()));
+ Duration(milliseconds: value.toInt()),
+ );
+ setState(() => _draggingValue = null);
},
),
),
diff --git a/lib/widgets/player/bottom_player.dart b/lib/widgets/player/bottom_player.dart
index 4517950..a717b00 100644
--- a/lib/widgets/player/bottom_player.dart
+++ b/lib/widgets/player/bottom_player.dart
@@ -113,7 +113,7 @@ class _BottomPlayerState extends State
duration: const Duration(milliseconds: 1000),
builder: (context, value, _) => LinearProgressIndicator(
minHeight: 3,
- value: _isFetchingActiveTrack ? null : null,
+ value: _isFetchingActiveTrack ? null : value,
),
),
Row(
diff --git a/pubspec.yaml b/pubspec.yaml
index 9ed5562..d5ab98d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: rhythm_box
-description: "A new Flutter project."
+description: Yet another Spotify third-party client.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
diff --git a/web/index.html b/web/index.html
index 34e5cf0..37254ff 100644
--- a/web/index.html
+++ b/web/index.html
@@ -29,6 +29,9 @@
RhythmBox
+
+
+