diff --git a/android/.gitignore b/android/.gitignore index 6f568019..2391a77e 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -11,3 +11,4 @@ GeneratedPluginRegistrant.java key.properties **/*.keystore **/*.jks +.kotlin \ No newline at end of file diff --git a/lib/models/metadata/audio_source.dart b/lib/models/metadata/audio_source.dart index 44804285..898300e9 100644 --- a/lib/models/metadata/audio_source.dart +++ b/lib/models/metadata/audio_source.dart @@ -44,7 +44,7 @@ class SpotubeAudioLossyContainerQuality @override toString() { - return "${oneOptionalDecimalFormatter.format(bitrate)}kbps"; + return "${oneOptionalDecimalFormatter.format(bitrate / 1000)}kbps"; } } diff --git a/lib/modules/metadata_plugins/installed_plugin.dart b/lib/modules/metadata_plugins/installed_plugin.dart index 34881aaf..7abda5ec 100644 --- a/lib/modules/metadata_plugins/installed_plugin.dart +++ b/lib/modules/metadata_plugins/installed_plugin.dart @@ -52,9 +52,10 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { ref.watch(metadataPluginAuthenticatedProvider); final isAudioSourceAuthenticatedSnapshot = ref.watch(audioSourcePluginAuthenticatedProvider); - final isAuthenticated = - isMetadataAuthenticatedSnapshot.asData?.value == true || - isAudioSourceAuthenticatedSnapshot.asData?.value == true; + final isAuthenticated = (isDefaultMetadata && + isMetadataAuthenticatedSnapshot.asData?.value == true) || + (isDefaultAudioSource && + isAudioSourceAuthenticatedSnapshot.asData?.value == true); final metadataUpdateAvailable = ref.watch(metadataPluginUpdateCheckerProvider); diff --git a/lib/provider/metadata_plugin/audio_source/quality_presets.dart b/lib/provider/metadata_plugin/audio_source/quality_presets.dart index 9cc7dc44..05028bc1 100644 --- a/lib/provider/metadata_plugin/audio_source/quality_presets.dart +++ b/lib/provider/metadata_plugin/audio_source/quality_presets.dart @@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; +import 'package:spotube/services/metadata/metadata.dart'; part 'quality_presets.g.dart'; part 'quality_presets.freezed.dart'; @@ -28,9 +29,13 @@ class AudioSourceAvailableQualityPresetsNotifier extends Notifier { @override build() { - ref.watch(audioSourcePluginProvider); + final audioSourceSnapshot = ref.watch(audioSourcePluginProvider); + final audioSourceConfigSnapshot = ref.watch( + metadataPluginsProvider.select((data) => + data.whenData((value) => value.defaultAudioSourcePluginConfig)), + ); - _initialize(); + _initialize(audioSourceSnapshot, audioSourceConfigSnapshot); listenSelf((previous, next) { final isNewLossless = @@ -49,26 +54,29 @@ class AudioSourceAvailableQualityPresetsNotifier return AudioSourcePresetsState(); } - void _initialize() async { - final audioSource = await ref.read(audioSourcePluginProvider.future); - final audioSourceConfig = await ref.read( - metadataPluginsProvider - .selectAsync((data) => data.defaultAudioSourcePluginConfig), - ); - if (audioSource == null || audioSourceConfig == null) { - throw Exception("Dude wat?"); - } - final preferences = await SharedPreferences.getInstance(); - final persistedStateStr = - preferences.getString("audioSourceState-${audioSourceConfig.slug}"); + void _initialize( + AsyncValue audioSourceSnapshot, + AsyncValue audioSourceConfigSnapshot, + ) async { + audioSourceConfigSnapshot.whenData((audioSourceConfig) { + audioSourceSnapshot.whenData((audioSource) async { + if (audioSource == null || audioSourceConfig == null) { + throw Exception("Dude wat?"); + } + final preferences = await SharedPreferences.getInstance(); + final persistedStateStr = + preferences.getString("audioSourceState-${audioSourceConfig.slug}"); - if (persistedStateStr != null) { - state = AudioSourcePresetsState.fromJson(jsonDecode(persistedStateStr)); - } else { - state = AudioSourcePresetsState( - presets: audioSource.audioSource.supportedPresets, - ); - } + if (persistedStateStr != null) { + state = + AudioSourcePresetsState.fromJson(jsonDecode(persistedStateStr)); + } else { + state = AudioSourcePresetsState( + presets: audioSource.audioSource.supportedPresets, + ); + } + }); + }); } void setSelectedStreamingContainerIndex(int index) { diff --git a/lib/provider/metadata_plugin/core/auth.dart b/lib/provider/metadata_plugin/core/auth.dart index 647b94f9..dc5e7eb6 100644 --- a/lib/provider/metadata_plugin/core/auth.dart +++ b/lib/provider/metadata_plugin/core/auth.dart @@ -65,6 +65,6 @@ class AudioSourcePluginAuthenticatedNotifier extends AsyncNotifier { } final audioSourcePluginAuthenticatedProvider = - AsyncNotifierProvider( - MetadataPluginAuthenticatedNotifier.new, + AsyncNotifierProvider( + AudioSourcePluginAuthenticatedNotifier.new, ); diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index ec3a98a1..792d7797 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -48,7 +48,7 @@ class ServerPlaybackRoutes { return join( await UserPreferencesNotifier.getMusicCacheDir(), ServiceUtils.sanitizeFilename( - '${track.query.name} - ${track.query.artists.join(",")} (${track.info.id}).${track.qualityPreset!.name}', + '${track.query.name} - ${track.query.artists.map((d) => d.name).join(",")} (${track.info.id}).${track.qualityPreset!.name}', ), ); } @@ -288,7 +288,9 @@ class ServerPlaybackRoutes { imageBytes: imageBytes, fileLength: fileLength, ), - ); + ).catchError((e, stackTrace) { + AppLogger.reportError(e, stackTrace); + }); } return (bytes: bytes, response: res); diff --git a/lib/services/sourced_track/sourced_track.dart b/lib/services/sourced_track/sourced_track.dart index 76b202da..a738ffba 100644 --- a/lib/services/sourced_track/sourced_track.dart +++ b/lib/services/sourced_track/sourced_track.dart @@ -317,7 +317,7 @@ class SourcedTrack extends BasicSourcedTrack { source.bitDepth == quality.bitDepth; } else { return source.bitrate == - (preset as SpotubeAudioLossyContainerQuality).bitrate; + (quality as SpotubeAudioLossyContainerQuality).bitrate; } }, );