diff --git a/lib/collections/fake.dart b/lib/collections/fake.dart index 7d201ae2..bcdbfb04 100644 --- a/lib/collections/fake.dart +++ b/lib/collections/fake.dart @@ -3,13 +3,15 @@ import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/history/summary.dart'; abstract class FakeData { - static final SpotubeImageObject image = SpotubeImageObject( + static const SpotubeImageObject image = SpotubeImageObject( + typeName: "image", height: 100, width: 100, url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg", ); - static final SpotubeFullArtistObject artist = SpotubeFullArtistObject( + static const SpotubeFullArtistObject artist = SpotubeFullArtistObject( + typeName: "artist_full", id: "1", name: "What an artist", externalUri: "https://example.com", @@ -17,6 +19,7 @@ abstract class FakeData { genres: ["genre"], images: [ SpotubeImageObject( + typeName: "image", height: 100, width: 100, url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg", @@ -24,7 +27,8 @@ abstract class FakeData { ], ); - static final SpotubeFullAlbumObject album = SpotubeFullAlbumObject( + static const SpotubeFullAlbumObject album = SpotubeFullAlbumObject( + typeName: "album_full", id: "1", name: "A good album", externalUri: "https://example.com", @@ -37,15 +41,17 @@ abstract class FakeData { recordLabel: "Record Label", ); - static final SpotubeSimpleArtistObject artistSimple = + static const SpotubeSimpleArtistObject artistSimple = SpotubeSimpleArtistObject( + typeName: "artist_simple", id: "1", name: "What an artist", externalUri: "https://example.com", images: null, ); - static final SpotubeSimpleAlbumObject albumSimple = SpotubeSimpleAlbumObject( + static const SpotubeSimpleAlbumObject albumSimple = SpotubeSimpleAlbumObject( + typeName: "album_simple", albumType: SpotubeAlbumType.album, artists: [], externalUri: "https://example.com", @@ -54,6 +60,7 @@ abstract class FakeData { releaseDate: "2021-01-01", images: [ SpotubeImageObject( + typeName: "image", height: 1, width: 1, url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg", @@ -61,24 +68,30 @@ abstract class FakeData { ], ); - static final SpotubeFullTrackObject track = SpotubeTrackObject.full( - id: "1", - name: "A good track", - externalUri: "https://example.com", - album: albumSimple, - durationMs: 3 * 60 * 1000, // 3 minutes - isrc: "USUM72112345", - explicit: false, - ) as SpotubeFullTrackObject; + static const SpotubeTrackObject track = SpotubeTrackObject.full( + SpotubeFullTrackObject( + typeName: "track", + id: "1", + name: "A good track", + externalUri: "https://example.com", + album: albumSimple, + durationMs: 3 * 60 * 1000, // 3 minutes + isrc: "USUM72112345", + explicit: false, + artists: [artistSimple], + ), + ); - static final SpotubeUserObject user = SpotubeUserObject( + static const SpotubeUserObject user = SpotubeUserObject( + typeName: "user", id: "1", name: "User Name", externalUri: "https://example.com", images: [image], ); - static final SpotubeFullPlaylistObject playlist = SpotubeFullPlaylistObject( + static const SpotubeFullPlaylistObject playlist = SpotubeFullPlaylistObject( + typeName: "playlist_full", id: "1", name: "A good playlist", description: "A very good playlist description", @@ -89,8 +102,9 @@ abstract class FakeData { images: [image], collaborators: [user]); - static final SpotubeSimplePlaylistObject playlistSimple = + static const SpotubeSimplePlaylistObject playlistSimple = SpotubeSimplePlaylistObject( + typeName: "playlist_simple", id: "1", name: "A good playlist", description: "A very good playlist description", @@ -99,13 +113,18 @@ abstract class FakeData { images: [image], ); - static final SpotubeBrowseSectionObject browseSection = + static const SpotubeBrowseSectionObject browseSection = SpotubeBrowseSectionObject( + typeName: "browse_section", id: "section-id", title: "Browse Section", browseMore: true, externalUri: "https://example.com/browse/section", - items: [playlistSimple, playlistSimple, playlistSimple]); + items: [ + SpotubeBrowseSectionResponseObjectItem.playlistSimple(playlistSimple), + SpotubeBrowseSectionResponseObjectItem.playlistSimple(playlistSimple), + SpotubeBrowseSectionResponseObjectItem.playlistSimple(playlistSimple), + ]); static const historySummary = PlaybackHistorySummary( albums: 1, diff --git a/lib/collections/routes.gr.dart b/lib/collections/routes.gr.dart index f5ff24bf..51144ceb 100644 --- a/lib/collections/routes.gr.dart +++ b/lib/collections/routes.gr.dart @@ -225,7 +225,7 @@ class HomeBrowseSectionItemsRoute HomeBrowseSectionItemsRoute({ _i44.Key? key, required String sectionId, - required _i43.SpotubeBrowseSectionObject section, + required _i43.SpotubeBrowseSectionObject section, List<_i41.PageRouteInfo>? children, }) : super( HomeBrowseSectionItemsRoute.name, @@ -264,7 +264,7 @@ class HomeBrowseSectionItemsRouteArgs { final String sectionId; - final _i43.SpotubeBrowseSectionObject section; + final _i43.SpotubeBrowseSectionObject section; @override String toString() { @@ -632,7 +632,7 @@ class SettingsMetadataProviderFormRoute SettingsMetadataProviderFormRoute({ _i44.Key? key, required String title, - required List<_i43.MetadataFormFieldObject> fields, + required List fields, List<_i41.PageRouteInfo>? children, }) : super( SettingsMetadataProviderFormRoute.name, @@ -670,7 +670,7 @@ class SettingsMetadataProviderFormRouteArgs { final String title; - final List<_i43.MetadataFormFieldObject> fields; + final List fields; @override String toString() { diff --git a/lib/components/dialogs/replace_downloaded_dialog.dart b/lib/components/dialogs/replace_downloaded_dialog.dart index 5b5b194e..b71dde84 100644 --- a/lib/components/dialogs/replace_downloaded_dialog.dart +++ b/lib/components/dialogs/replace_downloaded_dialog.dart @@ -7,7 +7,7 @@ import 'package:spotube/models/metadata/metadata.dart'; final replaceDownloadedFileState = StateProvider((ref) => null); class ReplaceDownloadedDialog extends ConsumerWidget { - final SpotubeTrackObject track; + final SpotubeFullTrackObject track; const ReplaceDownloadedDialog({required this.track, super.key}); @override diff --git a/lib/components/dialogs/track_details_dialog.dart b/lib/components/dialogs/track_details_dialog.dart index 9d35a6fb..8945806e 100644 --- a/lib/components/dialogs/track_details_dialog.dart +++ b/lib/components/dialogs/track_details_dialog.dart @@ -37,7 +37,8 @@ class TrackDetailsDialog extends HookConsumerWidget { // style: const TextStyle(color: Colors.blue), // ), context.l10n.duration: sourcedTrack.asData != null - ? sourcedTrack.asData!.value.info.duration.toHumanReadableString() + ? Duration(milliseconds: sourcedTrack.asData!.value.info.duration) + .toHumanReadableString() : Duration(milliseconds: track.durationMs).toHumanReadableString(), if (track.album.releaseDate != null) context.l10n.released: track.album.releaseDate, diff --git a/lib/components/heart_button/heart_button.dart b/lib/components/heart_button/heart_button.dart index 14a0572f..a43b007c 100644 --- a/lib/components/heart_button/heart_button.dart +++ b/lib/components/heart_button/heart_button.dart @@ -65,7 +65,7 @@ class HeartButton extends HookConsumerWidget { } class TrackHeartButton extends HookConsumerWidget { - final SpotubeTrackObject track; + final SpotubeFullTrackObject track; const TrackHeartButton({ super.key, required this.track, diff --git a/lib/components/heart_button/use_track_toggle_like.dart b/lib/components/heart_button/use_track_toggle_like.dart index af961578..3f4a1b48 100644 --- a/lib/components/heart_button/use_track_toggle_like.dart +++ b/lib/components/heart_button/use_track_toggle_like.dart @@ -5,10 +5,11 @@ import 'package:spotube/provider/metadata_plugin/library/tracks.dart'; typedef UseTrackToggleLike = ({ bool isLiked, bool isLoading, - Future Function(SpotubeTrackObject track) toggleTrackLike, + Future Function(SpotubeFullTrackObject track) toggleTrackLike, }); -UseTrackToggleLike useTrackToggleLike(SpotubeTrackObject track, WidgetRef ref) { +UseTrackToggleLike useTrackToggleLike( + SpotubeFullTrackObject track, WidgetRef ref) { final savedTracksNotifier = ref.watch(metadataPluginSavedTracksProvider.notifier); diff --git a/lib/components/track_presentation/presentation_actions.dart b/lib/components/track_presentation/presentation_actions.dart index 61202a48..7dd4bda7 100644 --- a/lib/components/track_presentation/presentation_actions.dart +++ b/lib/components/track_presentation/presentation_actions.dart @@ -80,7 +80,7 @@ class TrackPresentationActionsSection extends HookConsumerWidget { required String action, }) async { final fullTrackObjects = - tracks.whereType().toList(); + tracks.whereType().toList(); final confirmed = await showDialog( context: context, builder: (context) { @@ -89,7 +89,7 @@ class TrackPresentationActionsSection extends HookConsumerWidget { ) ?? false; if (confirmed != true) return; - downloader.addAllToQueue(fullTrackObjects); + downloader.addAllToQueue(fullTrackObjects.map((e) => e.field0).toList()); notifier.deselectAllTracks(); if (!context.mounted) return; showToastForAction(context, action, fullTrackObjects.length); diff --git a/lib/components/track_presentation/presentation_list.dart b/lib/components/track_presentation/presentation_list.dart index 19772c7c..406de8c2 100644 --- a/lib/components/track_presentation/presentation_list.dart +++ b/lib/components/track_presentation/presentation_list.dart @@ -13,6 +13,7 @@ import 'package:spotube/components/track_presentation/use_track_tile_play_callba import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/components/track_presentation/use_is_user_playlist.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; diff --git a/lib/components/track_presentation/presentation_props.dart b/lib/components/track_presentation/presentation_props.dart index 1992487f..3b16435d 100644 --- a/lib/components/track_presentation/presentation_props.dart +++ b/lib/components/track_presentation/presentation_props.dart @@ -8,7 +8,7 @@ class PaginationProps { final bool isLoading; final VoidCallback onFetchMore; final Future Function() onRefresh; - final Future> Function() onFetchAll; + final Future> Function() onFetchAll; const PaginationProps({ required this.hasNextPage, @@ -46,7 +46,7 @@ class TrackPresentationOptions { final String? ownerImage; final String image; final String routePath; - final List tracks; + final List tracks; final PaginationProps pagination; final bool isLiked; final String? shareUrl; diff --git a/lib/components/track_presentation/presentation_state.dart b/lib/components/track_presentation/presentation_state.dart index 32b7353a..2a828127 100644 --- a/lib/components/track_presentation/presentation_state.dart +++ b/lib/components/track_presentation/presentation_state.dart @@ -44,7 +44,7 @@ class PresentationStateNotifier next.whenData((value) { state = state.copyWith( presentationTracks: ServiceUtils.sortTracks( - value.items, + value.items.union(), state.sortBy, ), ); @@ -62,7 +62,7 @@ class PresentationStateNotifier next.whenData((value) { state = state.copyWith( presentationTracks: ServiceUtils.sortTracks( - value.items, + value.items.union(), state.sortBy, ), ); @@ -109,7 +109,7 @@ class PresentationStateNotifier } ?? []; - return tracks; + return tracks.union(); } void selectTrack(SpotubeTrackObject track) { diff --git a/lib/components/track_presentation/presentation_top.dart b/lib/components/track_presentation/presentation_top.dart index d2576cc0..be7e6fbb 100644 --- a/lib/components/track_presentation/presentation_top.dart +++ b/lib/components/track_presentation/presentation_top.dart @@ -11,6 +11,7 @@ import 'package:spotube/components/track_presentation/use_action_callbacks.dart' import 'package:spotube/components/track_presentation/use_is_user_playlist.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; class TrackPresentationTopSection extends HookConsumerWidget { diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index 7d14493e..6c47e86e 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -10,7 +10,7 @@ import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/track_options/track_options_provider.dart'; -/// [track] must be a [SpotubeFullTrackObject] or [SpotubeLocalTrackObject] +/// [track] must be a [SpotubeTrackObject] or [SpotubeLocalTrackObject] class TrackOptions extends HookConsumerWidget { final SpotubeTrackObject track; final bool userPlaylist; @@ -26,8 +26,8 @@ class TrackOptions extends HookConsumerWidget { this.icon, this.onTapItem, }) : assert( - track is SpotubeFullTrackObject || track is SpotubeLocalTrackObject, - "Track must be a SpotubeFullTrackObject, SpotubeLocalTrackObject", + track is SpotubeTrackObject || track is SpotubeLocalTrackObject, + "Track must be a SpotubeTrackObject, SpotubeLocalTrackObject", ); @override diff --git a/lib/hooks/configurators/use_endless_playback.dart b/lib/hooks/configurators/use_endless_playback.dart index 9e8c191e..29c369fc 100644 --- a/lib/hooks/configurators/use_endless_playback.dart +++ b/lib/hooks/configurators/use_endless_playback.dart @@ -1,3 +1,4 @@ +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -24,12 +25,15 @@ void useEndlessPlayback(WidgetRef ref) { final track = playlist.tracks.last; - final tracks = await (await metadataPlugin)?.track.radio(track.id); + final tracks = await metadataPlugin.then( + (plugin) async => + plugin?.track.radio(id: track.id, mpscTx: plugin.sender), + ); if (tracks == null || tracks.isEmpty) return; await playback.addTracks( - tracks.toList() + tracks.union() ..removeWhere((e) { final playlist = ref.read(audioPlayerProvider); final isDuplicate = playlist.tracks.any((t) => t.id == e.id); diff --git a/lib/models/connect/connect.freezed.dart b/lib/models/connect/connect.freezed.dart index 157d0911..b52df3d9 100644 --- a/lib/models/connect/connect.freezed.dart +++ b/lib/models/connect/connect.freezed.dart @@ -33,23 +33,23 @@ WebSocketLoadEventData _$WebSocketLoadEventDataFromJson( /// @nodoc mixin _$WebSocketLoadEventData { - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List get tracks => throw _privateConstructorUsedError; Object? get collection => throw _privateConstructorUsedError; int? get initialIndex => throw _privateConstructorUsedError; @optionalTypeArgs TResult when({ required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex) playlist, required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex) @@ -59,15 +59,15 @@ mixin _$WebSocketLoadEventData { @optionalTypeArgs TResult? whenOrNull({ TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -77,15 +77,15 @@ mixin _$WebSocketLoadEventData { @optionalTypeArgs TResult maybeWhen({ TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -130,8 +130,8 @@ abstract class $WebSocketLoadEventDataCopyWith<$Res> { _$WebSocketLoadEventDataCopyWithImpl<$Res, WebSocketLoadEventData>; @useResult $Res call( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, int? initialIndex}); } @@ -178,8 +178,8 @@ abstract class _$$WebSocketLoadEventDataPlaylistImplCopyWith<$Res> @override @useResult $Res call( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex}); @@ -243,8 +243,8 @@ class __$$WebSocketLoadEventDataPlaylistImplCopyWithImpl<$Res> class _$WebSocketLoadEventDataPlaylistImpl extends WebSocketLoadEventDataPlaylist { _$WebSocketLoadEventDataPlaylistImpl( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") required final List tracks, this.collection, this.initialIndex, @@ -259,8 +259,8 @@ class _$WebSocketLoadEventDataPlaylistImpl final List _tracks; @override - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List get tracks { if (_tracks is EqualUnmodifiableListView) return _tracks; // ignore: implicit_dynamic_type @@ -311,15 +311,15 @@ class _$WebSocketLoadEventDataPlaylistImpl @optionalTypeArgs TResult when({ required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex) playlist, required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex) @@ -332,15 +332,15 @@ class _$WebSocketLoadEventDataPlaylistImpl @optionalTypeArgs TResult? whenOrNull({ TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -353,15 +353,15 @@ class _$WebSocketLoadEventDataPlaylistImpl @optionalTypeArgs TResult maybeWhen({ TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -415,8 +415,8 @@ class _$WebSocketLoadEventDataPlaylistImpl abstract class WebSocketLoadEventDataPlaylist extends WebSocketLoadEventData { factory WebSocketLoadEventDataPlaylist( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") required final List tracks, final SpotubeSimplePlaylistObject? collection, final int? initialIndex}) = _$WebSocketLoadEventDataPlaylistImpl; @@ -426,8 +426,8 @@ abstract class WebSocketLoadEventDataPlaylist extends WebSocketLoadEventData { _$WebSocketLoadEventDataPlaylistImpl.fromJson; @override - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List get tracks; @override SpotubeSimplePlaylistObject? get collection; @@ -453,8 +453,8 @@ abstract class _$$WebSocketLoadEventDataAlbumImplCopyWith<$Res> @override @useResult $Res call( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex}); @@ -516,8 +516,8 @@ class __$$WebSocketLoadEventDataAlbumImplCopyWithImpl<$Res> @JsonSerializable() class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { _$WebSocketLoadEventDataAlbumImpl( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") required final List tracks, this.collection, this.initialIndex, @@ -532,8 +532,8 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { final List _tracks; @override - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List get tracks { if (_tracks is EqualUnmodifiableListView) return _tracks; // ignore: implicit_dynamic_type @@ -583,15 +583,15 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { @optionalTypeArgs TResult when({ required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex) playlist, required TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex) @@ -604,15 +604,15 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { @optionalTypeArgs TResult? whenOrNull({ TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult? Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -625,15 +625,15 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { @optionalTypeArgs TResult maybeWhen({ TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimplePlaylistObject? collection, int? initialIndex)? playlist, TResult Function( - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List tracks, SpotubeSimpleAlbumObject? collection, int? initialIndex)? @@ -687,8 +687,8 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { abstract class WebSocketLoadEventDataAlbum extends WebSocketLoadEventData { factory WebSocketLoadEventDataAlbum( - {@Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + {@Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") required final List tracks, final SpotubeSimpleAlbumObject? collection, final int? initialIndex}) = _$WebSocketLoadEventDataAlbumImpl; @@ -698,8 +698,8 @@ abstract class WebSocketLoadEventDataAlbum extends WebSocketLoadEventData { _$WebSocketLoadEventDataAlbumImpl.fromJson; @override - @Assert("tracks is List", - "tracks must be a list of SpotubeFullTrackObject") + @Assert("tracks is List", + "tracks must be a list of SpotubeTrackObject") List get tracks; @override SpotubeSimpleAlbumObject? get collection; diff --git a/lib/models/connect/load.dart b/lib/models/connect/load.dart index d61e0f1e..109dc5e7 100644 --- a/lib/models/connect/load.dart +++ b/lib/models/connect/load.dart @@ -6,8 +6,8 @@ class WebSocketLoadEventData with _$WebSocketLoadEventData { factory WebSocketLoadEventData.playlist({ @Assert( - "tracks is List", - "tracks must be a list of SpotubeFullTrackObject", + "tracks is List", + "tracks must be a list of SpotubeTrackObject", ) required List tracks, SpotubeSimplePlaylistObject? collection, @@ -16,8 +16,8 @@ class WebSocketLoadEventData with _$WebSocketLoadEventData { factory WebSocketLoadEventData.album({ @Assert( - "tracks is List", - "tracks must be a list of SpotubeFullTrackObject", + "tracks is List", + "tracks must be a list of SpotubeTrackObject", ) required List tracks, SpotubeSimpleAlbumObject? collection, diff --git a/lib/models/connect/ws_event.dart b/lib/models/connect/ws_event.dart index 7867f686..34ec3a3c 100644 --- a/lib/models/connect/ws_event.dart +++ b/lib/models/connect/ws_event.dart @@ -338,14 +338,14 @@ class WebSocketRemoveTrackEvent extends WebSocketEvent { WebSocketRemoveTrackEvent(String data) : super(WsEvent.removeTrack, data); } -class WebSocketAddTrackEvent extends WebSocketEvent { - WebSocketAddTrackEvent(SpotubeFullTrackObject data) +class WebSocketAddTrackEvent extends WebSocketEvent { + WebSocketAddTrackEvent(SpotubeTrackObject data) : super(WsEvent.addTrack, data); WebSocketAddTrackEvent.fromJson(Map json) : super( WsEvent.addTrack, - SpotubeFullTrackObject.fromJson( + SpotubeTrackObject.fromJson( json["data"] as Map, ), ); diff --git a/lib/models/metadata/album.dart b/lib/models/metadata/album.dart deleted file mode 100644 index bc9022de..00000000 --- a/lib/models/metadata/album.dart +++ /dev/null @@ -1,42 +0,0 @@ -part of 'metadata.dart'; - -enum SpotubeAlbumType { - album, - single, - compilation, -} - -@freezed -class SpotubeFullAlbumObject with _$SpotubeFullAlbumObject { - factory SpotubeFullAlbumObject({ - required String id, - required String name, - required List artists, - @Default([]) List images, - required String releaseDate, - required String externalUri, - required int totalTracks, - required SpotubeAlbumType albumType, - String? recordLabel, - List? genres, - }) = _SpotubeFullAlbumObject; - - factory SpotubeFullAlbumObject.fromJson(Map json) => - _$SpotubeFullAlbumObjectFromJson(json); -} - -@freezed -class SpotubeSimpleAlbumObject with _$SpotubeSimpleAlbumObject { - factory SpotubeSimpleAlbumObject({ - required String id, - required String name, - required String externalUri, - required List artists, - @Default([]) List images, - required SpotubeAlbumType albumType, - String? releaseDate, - }) = _SpotubeSimpleAlbumObject; - - factory SpotubeSimpleAlbumObject.fromJson(Map json) => - _$SpotubeSimpleAlbumObjectFromJson(json); -} diff --git a/lib/models/metadata/artist.dart b/lib/models/metadata/artist.dart index 24d8f55c..0fe42639 100644 --- a/lib/models/metadata/artist.dart +++ b/lib/models/metadata/artist.dart @@ -1,33 +1,5 @@ part of 'metadata.dart'; -@freezed -class SpotubeFullArtistObject with _$SpotubeFullArtistObject { - factory SpotubeFullArtistObject({ - required String id, - required String name, - required String externalUri, - @Default([]) List images, - List? genres, - int? followers, - }) = _SpotubeFullArtistObject; - - factory SpotubeFullArtistObject.fromJson(Map json) => - _$SpotubeFullArtistObjectFromJson(json); -} - -@freezed -class SpotubeSimpleArtistObject with _$SpotubeSimpleArtistObject { - factory SpotubeSimpleArtistObject({ - required String id, - required String name, - required String externalUri, - List? images, - }) = _SpotubeSimpleArtistObject; - - factory SpotubeSimpleArtistObject.fromJson(Map json) => - _$SpotubeSimpleArtistObjectFromJson(json); -} - extension SpotubeFullArtistObjectAsString on List { String asString() { return map((e) => e.name).join(", "); diff --git a/lib/models/metadata/audio_source.dart b/lib/models/metadata/audio_source.dart index 4fb790ea..547df83d 100644 --- a/lib/models/metadata/audio_source.dart +++ b/lib/models/metadata/audio_source.dart @@ -7,29 +7,7 @@ enum SpotubeMediaCompressionType { lossless, } -@Freezed(unionKey: 'type') -class SpotubeAudioSourceContainerPreset - with _$SpotubeAudioSourceContainerPreset { - const SpotubeAudioSourceContainerPreset._(); - - @FreezedUnionValue("lossy") - factory SpotubeAudioSourceContainerPreset.lossy({ - required SpotubeMediaCompressionType type, - required String name, - required List qualities, - }) = SpotubeAudioSourceContainerPresetLossy; - - @FreezedUnionValue("lossless") - factory SpotubeAudioSourceContainerPreset.lossless({ - required SpotubeMediaCompressionType type, - required String name, - required List qualities, - }) = SpotubeAudioSourceContainerPresetLossless; - - factory SpotubeAudioSourceContainerPreset.fromJson( - Map json) => - _$SpotubeAudioSourceContainerPresetFromJson(json); - +extension GetFileExtension on SpotubeAudioSourceContainerPreset { String getFileExtension() { return switch (name) { "mp4" => "m4a", @@ -39,72 +17,16 @@ class SpotubeAudioSourceContainerPreset } } -@freezed -class SpotubeAudioLossyContainerQuality - with _$SpotubeAudioLossyContainerQuality { - const SpotubeAudioLossyContainerQuality._(); - - factory SpotubeAudioLossyContainerQuality({ - required int bitrate, // bits per second - }) = _SpotubeAudioLossyContainerQuality; - - factory SpotubeAudioLossyContainerQuality.fromJson( - Map json) => - _$SpotubeAudioLossyContainerQualityFromJson(json); - - @override - toString() { +extension ToStringSpotubeAudioLossyContainerQuality + on SpotubeAudioLossyContainerQuality { + toFormattedString() { return "${oneOptionalDecimalFormatter.format(bitrate / 1000)}kbps"; } } -@freezed -class SpotubeAudioLosslessContainerQuality - with _$SpotubeAudioLosslessContainerQuality { - const SpotubeAudioLosslessContainerQuality._(); - - factory SpotubeAudioLosslessContainerQuality({ - required int bitDepth, // bit - required int sampleRate, // hz - }) = _SpotubeAudioLosslessContainerQuality; - - factory SpotubeAudioLosslessContainerQuality.fromJson( - Map json) => - _$SpotubeAudioLosslessContainerQualityFromJson(json); - - @override - toString() { +extension ToStringSpotubeAudioLosslessContainerQuality + on SpotubeAudioLosslessContainerQuality { + toFormattedString() { return "${bitDepth}bit • ${oneOptionalDecimalFormatter.format(sampleRate / 1000)}kHz"; } } - -@freezed -class SpotubeAudioSourceMatchObject with _$SpotubeAudioSourceMatchObject { - factory SpotubeAudioSourceMatchObject({ - required String id, - required String title, - required List artists, - required Duration duration, - String? thumbnail, - required String externalUri, - }) = _SpotubeAudioSourceMatchObject; - - factory SpotubeAudioSourceMatchObject.fromJson(Map json) => - _$SpotubeAudioSourceMatchObjectFromJson(json); -} - -@freezed -class SpotubeAudioSourceStreamObject with _$SpotubeAudioSourceStreamObject { - factory SpotubeAudioSourceStreamObject({ - required String url, - required String container, - required SpotubeMediaCompressionType type, - String? codec, - double? bitrate, - int? bitDepth, - double? sampleRate, - }) = _SpotubeAudioSourceStreamObject; - - factory SpotubeAudioSourceStreamObject.fromJson(Map json) => - _$SpotubeAudioSourceStreamObjectFromJson(json); -} diff --git a/lib/models/metadata/browse.dart b/lib/models/metadata/browse.dart index e2a69181..928f5543 100644 --- a/lib/models/metadata/browse.dart +++ b/lib/models/metadata/browse.dart @@ -1,21 +1,79 @@ part of 'metadata.dart'; -@Freezed(genericArgumentFactories: true) -class SpotubeBrowseSectionObject with _$SpotubeBrowseSectionObject { - factory SpotubeBrowseSectionObject({ - required String id, - required String title, - required String externalUri, - required bool browseMore, - required List items, - }) = _SpotubeBrowseSectionObject; +class SpotubeFlattenedBrowseSectionObject { + final String id; + final String title; + final String externalUri; + final bool browseMore; + final List items; - factory SpotubeBrowseSectionObject.fromJson( - Map json, - T Function(Map json) fromJsonT, - ) => - _$SpotubeBrowseSectionObjectFromJson( - json, - (json) => fromJsonT(json as Map), - ); + SpotubeFlattenedBrowseSectionObject({ + required this.id, + required this.title, + required this.browseMore, + required this.externalUri, + required this.items, + }); + + static SpotubeFlattenedBrowseSectionObject from( + SpotubeBrowseSectionObject browseSection, + T Function(SpotubeBrowseSectionResponseObjectItem item) parse, + ) { + return SpotubeFlattenedBrowseSectionObject( + browseMore: browseSection.browseMore, + id: browseSection.id, + title: browseSection.title, + externalUri: browseSection.externalUri, + items: browseSection.items + .map((item) => parse(item)) + .toList(growable: false), + ); + } + + SpotubeFlattenedBrowseSectionObject copyWith({ + String? id, + String? title, + String? externalUri, + bool? browseMore, + List? items, + }) { + return SpotubeFlattenedBrowseSectionObject( + id: id ?? this.id, + title: title ?? this.title, + externalUri: externalUri ?? this.externalUri, + browseMore: browseMore ?? this.browseMore, + items: items ?? this.items, + ); + } +} + +extension SpotubeBrowseSectionObjectExtension on SpotubeBrowseSectionObject { + SpotubeFlattenedBrowseSectionObject flatten() { + return SpotubeFlattenedBrowseSectionObject.from( + this, + (item) => switch (T) { + SpotubeSimpleAlbumObject() => + (item as SpotubeBrowseSectionResponseObjectItem_AlbumSimple).field0 + as T, + SpotubeFullAlbumObject() => + (item as SpotubeBrowseSectionResponseObjectItem_AlbumFull).field0 + as T, + SpotubeSimpleArtistObject() => + (item as SpotubeBrowseSectionResponseObjectItem_ArtistSimple).field0 + as T, + SpotubeFullArtistObject() => + (item as SpotubeBrowseSectionResponseObjectItem_ArtistFull).field0 + as T, + SpotubeTrackObject() => + (item as SpotubeBrowseSectionResponseObjectItem_Track).field0 as T, + SpotubeSimplePlaylistObject() => + (item as SpotubeBrowseSectionResponseObjectItem_PlaylistSimple).field0 + as T, + SpotubeFullPlaylistObject() => + (item as SpotubeBrowseSectionResponseObjectItem_PlaylistFull).field0 + as T, + _ => throw Exception("Unsupported type: $T"), + }, + ); + } } diff --git a/lib/models/metadata/image.dart b/lib/models/metadata/image.dart index 2ee0f748..97c59869 100644 --- a/lib/models/metadata/image.dart +++ b/lib/models/metadata/image.dart @@ -1,17 +1,5 @@ part of 'metadata.dart'; -@freezed -class SpotubeImageObject with _$SpotubeImageObject { - factory SpotubeImageObject({ - required String url, - int? width, - int? height, - }) = _SpotubeImageObject; - - factory SpotubeImageObject.fromJson(Map json) => - _$SpotubeImageObjectFromJson(json); -} - enum ImagePlaceholder { albumArt, artist, diff --git a/lib/models/metadata/metadata.dart b/lib/models/metadata/metadata.dart index e68bcd14..00bbabe7 100644 --- a/lib/models/metadata/metadata.dart +++ b/lib/models/metadata/metadata.dart @@ -10,23 +10,31 @@ import 'package:metadata_god/metadata_god.dart'; import 'package:mime/mime.dart'; import 'package:path/path.dart'; import 'package:spotube/collections/assets.gen.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/utils/primitive_utils.dart'; +export "package:spotube/src/rust/api/plugin/models/album.dart"; +export "package:spotube/src/rust/api/plugin/models/audio_source.dart"; +export "package:spotube/src/rust/api/plugin/models/artist.dart"; +export "package:spotube/src/rust/api/plugin/models/auth.dart"; +export "package:spotube/src/rust/api/plugin/models/browse.dart"; +export "package:spotube/src/rust/api/plugin/models/core.dart"; +export "package:spotube/src/rust/api/plugin/models/playlist.dart"; +export "package:spotube/src/rust/api/plugin/models/track.dart"; +export "package:spotube/src/rust/api/plugin/models/user.dart"; +export "package:spotube/src/rust/api/plugin/models/image.dart"; +export "package:spotube/src/rust/api/plugin/models/pagination.dart"; +export "package:spotube/src/rust/api/plugin/models/search.dart"; + part 'metadata.g.dart'; part 'metadata.freezed.dart'; -part 'audio_source.dart'; -part 'album.dart'; part 'artist.dart'; +part 'audio_source.dart'; part 'browse.dart'; part 'fields.dart'; part 'image.dart'; part 'pagination.dart'; -part 'playlist.dart'; -part 'search.dart'; part 'track.dart'; -part 'user.dart'; - -part 'plugin.dart'; part 'repository.dart'; diff --git a/lib/models/metadata/metadata.freezed.dart b/lib/models/metadata/metadata.freezed.dart index fee1cbc2..53f62def 100644 --- a/lib/models/metadata/metadata.freezed.dart +++ b/lib/models/metadata/metadata.freezed.dart @@ -14,2955 +14,6 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -SpotubeAudioSourceContainerPreset _$SpotubeAudioSourceContainerPresetFromJson( - Map json) { - switch (json['type']) { - case 'lossy': - return SpotubeAudioSourceContainerPresetLossy.fromJson(json); - case 'lossless': - return SpotubeAudioSourceContainerPresetLossless.fromJson(json); - - default: - throw CheckedFromJsonException( - json, - 'type', - 'SpotubeAudioSourceContainerPreset', - 'Invalid union type "${json['type']}"!'); - } -} - -/// @nodoc -mixin _$SpotubeAudioSourceContainerPreset { - SpotubeMediaCompressionType get type => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - List get qualities => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossy, - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossless, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeAudioSourceContainerPresetLossy value) - lossy, - required TResult Function(SpotubeAudioSourceContainerPresetLossless value) - lossless, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult? Function(SpotubeAudioSourceContainerPresetLossless value)? - lossless, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult Function(SpotubeAudioSourceContainerPresetLossless value)? lossless, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Serializes this SpotubeAudioSourceContainerPreset to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeAudioSourceContainerPresetCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeAudioSourceContainerPresetCopyWith<$Res> { - factory $SpotubeAudioSourceContainerPresetCopyWith( - SpotubeAudioSourceContainerPreset value, - $Res Function(SpotubeAudioSourceContainerPreset) then) = - _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, - SpotubeAudioSourceContainerPreset>; - @useResult - $Res call({SpotubeMediaCompressionType type, String name}); -} - -/// @nodoc -class _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, - $Val extends SpotubeAudioSourceContainerPreset> - implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { - _$SpotubeAudioSourceContainerPresetCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? type = null, - Object? name = null, - }) { - return _then(_value.copyWith( - type: null == type - ? _value.type - : type // ignore: cast_nullable_to_non_nullable - as SpotubeMediaCompressionType, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeAudioSourceContainerPresetLossyImplCopyWith<$Res> - implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { - factory _$$SpotubeAudioSourceContainerPresetLossyImplCopyWith( - _$SpotubeAudioSourceContainerPresetLossyImpl value, - $Res Function(_$SpotubeAudioSourceContainerPresetLossyImpl) then) = - __$$SpotubeAudioSourceContainerPresetLossyImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {SpotubeMediaCompressionType type, - String name, - List qualities}); -} - -/// @nodoc -class __$$SpotubeAudioSourceContainerPresetLossyImplCopyWithImpl<$Res> - extends _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, - _$SpotubeAudioSourceContainerPresetLossyImpl> - implements _$$SpotubeAudioSourceContainerPresetLossyImplCopyWith<$Res> { - __$$SpotubeAudioSourceContainerPresetLossyImplCopyWithImpl( - _$SpotubeAudioSourceContainerPresetLossyImpl _value, - $Res Function(_$SpotubeAudioSourceContainerPresetLossyImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? type = null, - Object? name = null, - Object? qualities = null, - }) { - return _then(_$SpotubeAudioSourceContainerPresetLossyImpl( - type: null == type - ? _value.type - : type // ignore: cast_nullable_to_non_nullable - as SpotubeMediaCompressionType, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - qualities: null == qualities - ? _value._qualities - : qualities // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioSourceContainerPresetLossyImpl - extends SpotubeAudioSourceContainerPresetLossy { - _$SpotubeAudioSourceContainerPresetLossyImpl( - {required this.type, - required this.name, - required final List qualities}) - : _qualities = qualities, - super._(); - - factory _$SpotubeAudioSourceContainerPresetLossyImpl.fromJson( - Map json) => - _$$SpotubeAudioSourceContainerPresetLossyImplFromJson(json); - - @override - final SpotubeMediaCompressionType type; - @override - final String name; - final List _qualities; - @override - List get qualities { - if (_qualities is EqualUnmodifiableListView) return _qualities; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_qualities); - } - - @override - String toString() { - return 'SpotubeAudioSourceContainerPreset.lossy(type: $type, name: $name, qualities: $qualities)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioSourceContainerPresetLossyImpl && - (identical(other.type, type) || other.type == type) && - (identical(other.name, name) || other.name == name) && - const DeepCollectionEquality() - .equals(other._qualities, _qualities)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, type, name, const DeepCollectionEquality().hash(_qualities)); - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioSourceContainerPresetLossyImplCopyWith< - _$SpotubeAudioSourceContainerPresetLossyImpl> - get copyWith => - __$$SpotubeAudioSourceContainerPresetLossyImplCopyWithImpl< - _$SpotubeAudioSourceContainerPresetLossyImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossy, - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossless, - }) { - return lossy(type, name, qualities); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - }) { - return lossy?.call(type, name, qualities); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - required TResult orElse(), - }) { - if (lossy != null) { - return lossy(type, name, qualities); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeAudioSourceContainerPresetLossy value) - lossy, - required TResult Function(SpotubeAudioSourceContainerPresetLossless value) - lossless, - }) { - return lossy(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult? Function(SpotubeAudioSourceContainerPresetLossless value)? - lossless, - }) { - return lossy?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult Function(SpotubeAudioSourceContainerPresetLossless value)? lossless, - required TResult orElse(), - }) { - if (lossy != null) { - return lossy(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$SpotubeAudioSourceContainerPresetLossyImplToJson( - this, - ); - } -} - -abstract class SpotubeAudioSourceContainerPresetLossy - extends SpotubeAudioSourceContainerPreset { - factory SpotubeAudioSourceContainerPresetLossy( - {required final SpotubeMediaCompressionType type, - required final String name, - required final List qualities}) = - _$SpotubeAudioSourceContainerPresetLossyImpl; - SpotubeAudioSourceContainerPresetLossy._() : super._(); - - factory SpotubeAudioSourceContainerPresetLossy.fromJson( - Map json) = - _$SpotubeAudioSourceContainerPresetLossyImpl.fromJson; - - @override - SpotubeMediaCompressionType get type; - @override - String get name; - @override - List get qualities; - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioSourceContainerPresetLossyImplCopyWith< - _$SpotubeAudioSourceContainerPresetLossyImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$SpotubeAudioSourceContainerPresetLosslessImplCopyWith<$Res> - implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { - factory _$$SpotubeAudioSourceContainerPresetLosslessImplCopyWith( - _$SpotubeAudioSourceContainerPresetLosslessImpl value, - $Res Function(_$SpotubeAudioSourceContainerPresetLosslessImpl) then) = - __$$SpotubeAudioSourceContainerPresetLosslessImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {SpotubeMediaCompressionType type, - String name, - List qualities}); -} - -/// @nodoc -class __$$SpotubeAudioSourceContainerPresetLosslessImplCopyWithImpl<$Res> - extends _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, - _$SpotubeAudioSourceContainerPresetLosslessImpl> - implements _$$SpotubeAudioSourceContainerPresetLosslessImplCopyWith<$Res> { - __$$SpotubeAudioSourceContainerPresetLosslessImplCopyWithImpl( - _$SpotubeAudioSourceContainerPresetLosslessImpl _value, - $Res Function(_$SpotubeAudioSourceContainerPresetLosslessImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? type = null, - Object? name = null, - Object? qualities = null, - }) { - return _then(_$SpotubeAudioSourceContainerPresetLosslessImpl( - type: null == type - ? _value.type - : type // ignore: cast_nullable_to_non_nullable - as SpotubeMediaCompressionType, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - qualities: null == qualities - ? _value._qualities - : qualities // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioSourceContainerPresetLosslessImpl - extends SpotubeAudioSourceContainerPresetLossless { - _$SpotubeAudioSourceContainerPresetLosslessImpl( - {required this.type, - required this.name, - required final List qualities}) - : _qualities = qualities, - super._(); - - factory _$SpotubeAudioSourceContainerPresetLosslessImpl.fromJson( - Map json) => - _$$SpotubeAudioSourceContainerPresetLosslessImplFromJson(json); - - @override - final SpotubeMediaCompressionType type; - @override - final String name; - final List _qualities; - @override - List get qualities { - if (_qualities is EqualUnmodifiableListView) return _qualities; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_qualities); - } - - @override - String toString() { - return 'SpotubeAudioSourceContainerPreset.lossless(type: $type, name: $name, qualities: $qualities)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioSourceContainerPresetLosslessImpl && - (identical(other.type, type) || other.type == type) && - (identical(other.name, name) || other.name == name) && - const DeepCollectionEquality() - .equals(other._qualities, _qualities)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, type, name, const DeepCollectionEquality().hash(_qualities)); - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioSourceContainerPresetLosslessImplCopyWith< - _$SpotubeAudioSourceContainerPresetLosslessImpl> - get copyWith => - __$$SpotubeAudioSourceContainerPresetLosslessImplCopyWithImpl< - _$SpotubeAudioSourceContainerPresetLosslessImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossy, - required TResult Function(SpotubeMediaCompressionType type, String name, - List qualities) - lossless, - }) { - return lossless(type, name, qualities); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult? Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - }) { - return lossless?.call(type, name, qualities); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossy, - TResult Function(SpotubeMediaCompressionType type, String name, - List qualities)? - lossless, - required TResult orElse(), - }) { - if (lossless != null) { - return lossless(type, name, qualities); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeAudioSourceContainerPresetLossy value) - lossy, - required TResult Function(SpotubeAudioSourceContainerPresetLossless value) - lossless, - }) { - return lossless(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult? Function(SpotubeAudioSourceContainerPresetLossless value)? - lossless, - }) { - return lossless?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeAudioSourceContainerPresetLossy value)? lossy, - TResult Function(SpotubeAudioSourceContainerPresetLossless value)? lossless, - required TResult orElse(), - }) { - if (lossless != null) { - return lossless(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$SpotubeAudioSourceContainerPresetLosslessImplToJson( - this, - ); - } -} - -abstract class SpotubeAudioSourceContainerPresetLossless - extends SpotubeAudioSourceContainerPreset { - factory SpotubeAudioSourceContainerPresetLossless( - {required final SpotubeMediaCompressionType type, - required final String name, - required final List - qualities}) = _$SpotubeAudioSourceContainerPresetLosslessImpl; - SpotubeAudioSourceContainerPresetLossless._() : super._(); - - factory SpotubeAudioSourceContainerPresetLossless.fromJson( - Map json) = - _$SpotubeAudioSourceContainerPresetLosslessImpl.fromJson; - - @override - SpotubeMediaCompressionType get type; - @override - String get name; - @override - List get qualities; - - /// Create a copy of SpotubeAudioSourceContainerPreset - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioSourceContainerPresetLosslessImplCopyWith< - _$SpotubeAudioSourceContainerPresetLosslessImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeAudioLossyContainerQuality _$SpotubeAudioLossyContainerQualityFromJson( - Map json) { - return _SpotubeAudioLossyContainerQuality.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeAudioLossyContainerQuality { - int get bitrate => throw _privateConstructorUsedError; - - /// Serializes this SpotubeAudioLossyContainerQuality to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeAudioLossyContainerQuality - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeAudioLossyContainerQualityCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeAudioLossyContainerQualityCopyWith<$Res> { - factory $SpotubeAudioLossyContainerQualityCopyWith( - SpotubeAudioLossyContainerQuality value, - $Res Function(SpotubeAudioLossyContainerQuality) then) = - _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, - SpotubeAudioLossyContainerQuality>; - @useResult - $Res call({int bitrate}); -} - -/// @nodoc -class _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, - $Val extends SpotubeAudioLossyContainerQuality> - implements $SpotubeAudioLossyContainerQualityCopyWith<$Res> { - _$SpotubeAudioLossyContainerQualityCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeAudioLossyContainerQuality - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? bitrate = null, - }) { - return _then(_value.copyWith( - bitrate: null == bitrate - ? _value.bitrate - : bitrate // ignore: cast_nullable_to_non_nullable - as int, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeAudioLossyContainerQualityImplCopyWith<$Res> - implements $SpotubeAudioLossyContainerQualityCopyWith<$Res> { - factory _$$SpotubeAudioLossyContainerQualityImplCopyWith( - _$SpotubeAudioLossyContainerQualityImpl value, - $Res Function(_$SpotubeAudioLossyContainerQualityImpl) then) = - __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({int bitrate}); -} - -/// @nodoc -class __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl<$Res> - extends _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, - _$SpotubeAudioLossyContainerQualityImpl> - implements _$$SpotubeAudioLossyContainerQualityImplCopyWith<$Res> { - __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl( - _$SpotubeAudioLossyContainerQualityImpl _value, - $Res Function(_$SpotubeAudioLossyContainerQualityImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioLossyContainerQuality - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? bitrate = null, - }) { - return _then(_$SpotubeAudioLossyContainerQualityImpl( - bitrate: null == bitrate - ? _value.bitrate - : bitrate // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioLossyContainerQualityImpl - extends _SpotubeAudioLossyContainerQuality { - _$SpotubeAudioLossyContainerQualityImpl({required this.bitrate}) : super._(); - - factory _$SpotubeAudioLossyContainerQualityImpl.fromJson( - Map json) => - _$$SpotubeAudioLossyContainerQualityImplFromJson(json); - - @override - final int bitrate; - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioLossyContainerQualityImpl && - (identical(other.bitrate, bitrate) || other.bitrate == bitrate)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, bitrate); - - /// Create a copy of SpotubeAudioLossyContainerQuality - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioLossyContainerQualityImplCopyWith< - _$SpotubeAudioLossyContainerQualityImpl> - get copyWith => __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl< - _$SpotubeAudioLossyContainerQualityImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeAudioLossyContainerQualityImplToJson( - this, - ); - } -} - -abstract class _SpotubeAudioLossyContainerQuality - extends SpotubeAudioLossyContainerQuality { - factory _SpotubeAudioLossyContainerQuality({required final int bitrate}) = - _$SpotubeAudioLossyContainerQualityImpl; - _SpotubeAudioLossyContainerQuality._() : super._(); - - factory _SpotubeAudioLossyContainerQuality.fromJson( - Map json) = - _$SpotubeAudioLossyContainerQualityImpl.fromJson; - - @override - int get bitrate; - - /// Create a copy of SpotubeAudioLossyContainerQuality - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioLossyContainerQualityImplCopyWith< - _$SpotubeAudioLossyContainerQualityImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeAudioLosslessContainerQuality - _$SpotubeAudioLosslessContainerQualityFromJson(Map json) { - return _SpotubeAudioLosslessContainerQuality.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeAudioLosslessContainerQuality { - int get bitDepth => throw _privateConstructorUsedError; // bit - int get sampleRate => throw _privateConstructorUsedError; - - /// Serializes this SpotubeAudioLosslessContainerQuality to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeAudioLosslessContainerQuality - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeAudioLosslessContainerQualityCopyWith< - SpotubeAudioLosslessContainerQuality> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { - factory $SpotubeAudioLosslessContainerQualityCopyWith( - SpotubeAudioLosslessContainerQuality value, - $Res Function(SpotubeAudioLosslessContainerQuality) then) = - _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, - SpotubeAudioLosslessContainerQuality>; - @useResult - $Res call({int bitDepth, int sampleRate}); -} - -/// @nodoc -class _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, - $Val extends SpotubeAudioLosslessContainerQuality> - implements $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { - _$SpotubeAudioLosslessContainerQualityCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeAudioLosslessContainerQuality - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? bitDepth = null, - Object? sampleRate = null, - }) { - return _then(_value.copyWith( - bitDepth: null == bitDepth - ? _value.bitDepth - : bitDepth // ignore: cast_nullable_to_non_nullable - as int, - sampleRate: null == sampleRate - ? _value.sampleRate - : sampleRate // ignore: cast_nullable_to_non_nullable - as int, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeAudioLosslessContainerQualityImplCopyWith<$Res> - implements $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { - factory _$$SpotubeAudioLosslessContainerQualityImplCopyWith( - _$SpotubeAudioLosslessContainerQualityImpl value, - $Res Function(_$SpotubeAudioLosslessContainerQualityImpl) then) = - __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({int bitDepth, int sampleRate}); -} - -/// @nodoc -class __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl<$Res> - extends _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, - _$SpotubeAudioLosslessContainerQualityImpl> - implements _$$SpotubeAudioLosslessContainerQualityImplCopyWith<$Res> { - __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl( - _$SpotubeAudioLosslessContainerQualityImpl _value, - $Res Function(_$SpotubeAudioLosslessContainerQualityImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioLosslessContainerQuality - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? bitDepth = null, - Object? sampleRate = null, - }) { - return _then(_$SpotubeAudioLosslessContainerQualityImpl( - bitDepth: null == bitDepth - ? _value.bitDepth - : bitDepth // ignore: cast_nullable_to_non_nullable - as int, - sampleRate: null == sampleRate - ? _value.sampleRate - : sampleRate // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioLosslessContainerQualityImpl - extends _SpotubeAudioLosslessContainerQuality { - _$SpotubeAudioLosslessContainerQualityImpl( - {required this.bitDepth, required this.sampleRate}) - : super._(); - - factory _$SpotubeAudioLosslessContainerQualityImpl.fromJson( - Map json) => - _$$SpotubeAudioLosslessContainerQualityImplFromJson(json); - - @override - final int bitDepth; -// bit - @override - final int sampleRate; - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioLosslessContainerQualityImpl && - (identical(other.bitDepth, bitDepth) || - other.bitDepth == bitDepth) && - (identical(other.sampleRate, sampleRate) || - other.sampleRate == sampleRate)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, bitDepth, sampleRate); - - /// Create a copy of SpotubeAudioLosslessContainerQuality - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioLosslessContainerQualityImplCopyWith< - _$SpotubeAudioLosslessContainerQualityImpl> - get copyWith => __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl< - _$SpotubeAudioLosslessContainerQualityImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeAudioLosslessContainerQualityImplToJson( - this, - ); - } -} - -abstract class _SpotubeAudioLosslessContainerQuality - extends SpotubeAudioLosslessContainerQuality { - factory _SpotubeAudioLosslessContainerQuality( - {required final int bitDepth, required final int sampleRate}) = - _$SpotubeAudioLosslessContainerQualityImpl; - _SpotubeAudioLosslessContainerQuality._() : super._(); - - factory _SpotubeAudioLosslessContainerQuality.fromJson( - Map json) = - _$SpotubeAudioLosslessContainerQualityImpl.fromJson; - - @override - int get bitDepth; // bit - @override - int get sampleRate; - - /// Create a copy of SpotubeAudioLosslessContainerQuality - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioLosslessContainerQualityImplCopyWith< - _$SpotubeAudioLosslessContainerQualityImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeAudioSourceMatchObject _$SpotubeAudioSourceMatchObjectFromJson( - Map json) { - return _SpotubeAudioSourceMatchObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeAudioSourceMatchObject { - String get id => throw _privateConstructorUsedError; - String get title => throw _privateConstructorUsedError; - List get artists => throw _privateConstructorUsedError; - Duration get duration => throw _privateConstructorUsedError; - String? get thumbnail => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - - /// Serializes this SpotubeAudioSourceMatchObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeAudioSourceMatchObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeAudioSourceMatchObjectCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeAudioSourceMatchObjectCopyWith<$Res> { - factory $SpotubeAudioSourceMatchObjectCopyWith( - SpotubeAudioSourceMatchObject value, - $Res Function(SpotubeAudioSourceMatchObject) then) = - _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, - SpotubeAudioSourceMatchObject>; - @useResult - $Res call( - {String id, - String title, - List artists, - Duration duration, - String? thumbnail, - String externalUri}); -} - -/// @nodoc -class _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, - $Val extends SpotubeAudioSourceMatchObject> - implements $SpotubeAudioSourceMatchObjectCopyWith<$Res> { - _$SpotubeAudioSourceMatchObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeAudioSourceMatchObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? title = null, - Object? artists = null, - Object? duration = null, - Object? thumbnail = freezed, - Object? externalUri = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value.artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - duration: null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - thumbnail: freezed == thumbnail - ? _value.thumbnail - : thumbnail // ignore: cast_nullable_to_non_nullable - as String?, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeAudioSourceMatchObjectImplCopyWith<$Res> - implements $SpotubeAudioSourceMatchObjectCopyWith<$Res> { - factory _$$SpotubeAudioSourceMatchObjectImplCopyWith( - _$SpotubeAudioSourceMatchObjectImpl value, - $Res Function(_$SpotubeAudioSourceMatchObjectImpl) then) = - __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String title, - List artists, - Duration duration, - String? thumbnail, - String externalUri}); -} - -/// @nodoc -class __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl<$Res> - extends _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, - _$SpotubeAudioSourceMatchObjectImpl> - implements _$$SpotubeAudioSourceMatchObjectImplCopyWith<$Res> { - __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl( - _$SpotubeAudioSourceMatchObjectImpl _value, - $Res Function(_$SpotubeAudioSourceMatchObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioSourceMatchObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? title = null, - Object? artists = null, - Object? duration = null, - Object? thumbnail = freezed, - Object? externalUri = null, - }) { - return _then(_$SpotubeAudioSourceMatchObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - duration: null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - thumbnail: freezed == thumbnail - ? _value.thumbnail - : thumbnail // ignore: cast_nullable_to_non_nullable - as String?, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioSourceMatchObjectImpl - implements _SpotubeAudioSourceMatchObject { - _$SpotubeAudioSourceMatchObjectImpl( - {required this.id, - required this.title, - required final List artists, - required this.duration, - this.thumbnail, - required this.externalUri}) - : _artists = artists; - - factory _$SpotubeAudioSourceMatchObjectImpl.fromJson( - Map json) => - _$$SpotubeAudioSourceMatchObjectImplFromJson(json); - - @override - final String id; - @override - final String title; - final List _artists; - @override - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - @override - final Duration duration; - @override - final String? thumbnail; - @override - final String externalUri; - - @override - String toString() { - return 'SpotubeAudioSourceMatchObject(id: $id, title: $title, artists: $artists, duration: $duration, thumbnail: $thumbnail, externalUri: $externalUri)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioSourceMatchObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.title, title) || other.title == title) && - const DeepCollectionEquality().equals(other._artists, _artists) && - (identical(other.duration, duration) || - other.duration == duration) && - (identical(other.thumbnail, thumbnail) || - other.thumbnail == thumbnail) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - title, - const DeepCollectionEquality().hash(_artists), - duration, - thumbnail, - externalUri); - - /// Create a copy of SpotubeAudioSourceMatchObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioSourceMatchObjectImplCopyWith< - _$SpotubeAudioSourceMatchObjectImpl> - get copyWith => __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl< - _$SpotubeAudioSourceMatchObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeAudioSourceMatchObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeAudioSourceMatchObject - implements SpotubeAudioSourceMatchObject { - factory _SpotubeAudioSourceMatchObject( - {required final String id, - required final String title, - required final List artists, - required final Duration duration, - final String? thumbnail, - required final String externalUri}) = _$SpotubeAudioSourceMatchObjectImpl; - - factory _SpotubeAudioSourceMatchObject.fromJson(Map json) = - _$SpotubeAudioSourceMatchObjectImpl.fromJson; - - @override - String get id; - @override - String get title; - @override - List get artists; - @override - Duration get duration; - @override - String? get thumbnail; - @override - String get externalUri; - - /// Create a copy of SpotubeAudioSourceMatchObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioSourceMatchObjectImplCopyWith< - _$SpotubeAudioSourceMatchObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeAudioSourceStreamObject _$SpotubeAudioSourceStreamObjectFromJson( - Map json) { - return _SpotubeAudioSourceStreamObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeAudioSourceStreamObject { - String get url => throw _privateConstructorUsedError; - String get container => throw _privateConstructorUsedError; - SpotubeMediaCompressionType get type => throw _privateConstructorUsedError; - String? get codec => throw _privateConstructorUsedError; - double? get bitrate => throw _privateConstructorUsedError; - int? get bitDepth => throw _privateConstructorUsedError; - double? get sampleRate => throw _privateConstructorUsedError; - - /// Serializes this SpotubeAudioSourceStreamObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeAudioSourceStreamObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeAudioSourceStreamObjectCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeAudioSourceStreamObjectCopyWith<$Res> { - factory $SpotubeAudioSourceStreamObjectCopyWith( - SpotubeAudioSourceStreamObject value, - $Res Function(SpotubeAudioSourceStreamObject) then) = - _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, - SpotubeAudioSourceStreamObject>; - @useResult - $Res call( - {String url, - String container, - SpotubeMediaCompressionType type, - String? codec, - double? bitrate, - int? bitDepth, - double? sampleRate}); -} - -/// @nodoc -class _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, - $Val extends SpotubeAudioSourceStreamObject> - implements $SpotubeAudioSourceStreamObjectCopyWith<$Res> { - _$SpotubeAudioSourceStreamObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeAudioSourceStreamObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - Object? container = null, - Object? type = null, - Object? codec = freezed, - Object? bitrate = freezed, - Object? bitDepth = freezed, - Object? sampleRate = freezed, - }) { - return _then(_value.copyWith( - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - container: null == container - ? _value.container - : container // ignore: cast_nullable_to_non_nullable - as String, - type: null == type - ? _value.type - : type // ignore: cast_nullable_to_non_nullable - as SpotubeMediaCompressionType, - codec: freezed == codec - ? _value.codec - : codec // ignore: cast_nullable_to_non_nullable - as String?, - bitrate: freezed == bitrate - ? _value.bitrate - : bitrate // ignore: cast_nullable_to_non_nullable - as double?, - bitDepth: freezed == bitDepth - ? _value.bitDepth - : bitDepth // ignore: cast_nullable_to_non_nullable - as int?, - sampleRate: freezed == sampleRate - ? _value.sampleRate - : sampleRate // ignore: cast_nullable_to_non_nullable - as double?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeAudioSourceStreamObjectImplCopyWith<$Res> - implements $SpotubeAudioSourceStreamObjectCopyWith<$Res> { - factory _$$SpotubeAudioSourceStreamObjectImplCopyWith( - _$SpotubeAudioSourceStreamObjectImpl value, - $Res Function(_$SpotubeAudioSourceStreamObjectImpl) then) = - __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String url, - String container, - SpotubeMediaCompressionType type, - String? codec, - double? bitrate, - int? bitDepth, - double? sampleRate}); -} - -/// @nodoc -class __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl<$Res> - extends _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, - _$SpotubeAudioSourceStreamObjectImpl> - implements _$$SpotubeAudioSourceStreamObjectImplCopyWith<$Res> { - __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl( - _$SpotubeAudioSourceStreamObjectImpl _value, - $Res Function(_$SpotubeAudioSourceStreamObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeAudioSourceStreamObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - Object? container = null, - Object? type = null, - Object? codec = freezed, - Object? bitrate = freezed, - Object? bitDepth = freezed, - Object? sampleRate = freezed, - }) { - return _then(_$SpotubeAudioSourceStreamObjectImpl( - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - container: null == container - ? _value.container - : container // ignore: cast_nullable_to_non_nullable - as String, - type: null == type - ? _value.type - : type // ignore: cast_nullable_to_non_nullable - as SpotubeMediaCompressionType, - codec: freezed == codec - ? _value.codec - : codec // ignore: cast_nullable_to_non_nullable - as String?, - bitrate: freezed == bitrate - ? _value.bitrate - : bitrate // ignore: cast_nullable_to_non_nullable - as double?, - bitDepth: freezed == bitDepth - ? _value.bitDepth - : bitDepth // ignore: cast_nullable_to_non_nullable - as int?, - sampleRate: freezed == sampleRate - ? _value.sampleRate - : sampleRate // ignore: cast_nullable_to_non_nullable - as double?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeAudioSourceStreamObjectImpl - implements _SpotubeAudioSourceStreamObject { - _$SpotubeAudioSourceStreamObjectImpl( - {required this.url, - required this.container, - required this.type, - this.codec, - this.bitrate, - this.bitDepth, - this.sampleRate}); - - factory _$SpotubeAudioSourceStreamObjectImpl.fromJson( - Map json) => - _$$SpotubeAudioSourceStreamObjectImplFromJson(json); - - @override - final String url; - @override - final String container; - @override - final SpotubeMediaCompressionType type; - @override - final String? codec; - @override - final double? bitrate; - @override - final int? bitDepth; - @override - final double? sampleRate; - - @override - String toString() { - return 'SpotubeAudioSourceStreamObject(url: $url, container: $container, type: $type, codec: $codec, bitrate: $bitrate, bitDepth: $bitDepth, sampleRate: $sampleRate)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeAudioSourceStreamObjectImpl && - (identical(other.url, url) || other.url == url) && - (identical(other.container, container) || - other.container == container) && - (identical(other.type, type) || other.type == type) && - (identical(other.codec, codec) || other.codec == codec) && - (identical(other.bitrate, bitrate) || other.bitrate == bitrate) && - (identical(other.bitDepth, bitDepth) || - other.bitDepth == bitDepth) && - (identical(other.sampleRate, sampleRate) || - other.sampleRate == sampleRate)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, url, container, type, codec, bitrate, bitDepth, sampleRate); - - /// Create a copy of SpotubeAudioSourceStreamObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeAudioSourceStreamObjectImplCopyWith< - _$SpotubeAudioSourceStreamObjectImpl> - get copyWith => __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl< - _$SpotubeAudioSourceStreamObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeAudioSourceStreamObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeAudioSourceStreamObject - implements SpotubeAudioSourceStreamObject { - factory _SpotubeAudioSourceStreamObject( - {required final String url, - required final String container, - required final SpotubeMediaCompressionType type, - final String? codec, - final double? bitrate, - final int? bitDepth, - final double? sampleRate}) = _$SpotubeAudioSourceStreamObjectImpl; - - factory _SpotubeAudioSourceStreamObject.fromJson(Map json) = - _$SpotubeAudioSourceStreamObjectImpl.fromJson; - - @override - String get url; - @override - String get container; - @override - SpotubeMediaCompressionType get type; - @override - String? get codec; - @override - double? get bitrate; - @override - int? get bitDepth; - @override - double? get sampleRate; - - /// Create a copy of SpotubeAudioSourceStreamObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeAudioSourceStreamObjectImplCopyWith< - _$SpotubeAudioSourceStreamObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeFullAlbumObject _$SpotubeFullAlbumObjectFromJson( - Map json) { - return _SpotubeFullAlbumObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeFullAlbumObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - List get artists => - throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - String get releaseDate => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - int get totalTracks => throw _privateConstructorUsedError; - SpotubeAlbumType get albumType => throw _privateConstructorUsedError; - String? get recordLabel => throw _privateConstructorUsedError; - List? get genres => throw _privateConstructorUsedError; - - /// Serializes this SpotubeFullAlbumObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeFullAlbumObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeFullAlbumObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeFullAlbumObjectCopyWith<$Res> { - factory $SpotubeFullAlbumObjectCopyWith(SpotubeFullAlbumObject value, - $Res Function(SpotubeFullAlbumObject) then) = - _$SpotubeFullAlbumObjectCopyWithImpl<$Res, SpotubeFullAlbumObject>; - @useResult - $Res call( - {String id, - String name, - List artists, - List images, - String releaseDate, - String externalUri, - int totalTracks, - SpotubeAlbumType albumType, - String? recordLabel, - List? genres}); -} - -/// @nodoc -class _$SpotubeFullAlbumObjectCopyWithImpl<$Res, - $Val extends SpotubeFullAlbumObject> - implements $SpotubeFullAlbumObjectCopyWith<$Res> { - _$SpotubeFullAlbumObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeFullAlbumObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? artists = null, - Object? images = null, - Object? releaseDate = null, - Object? externalUri = null, - Object? totalTracks = null, - Object? albumType = null, - Object? recordLabel = freezed, - Object? genres = freezed, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value.artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - releaseDate: null == releaseDate - ? _value.releaseDate - : releaseDate // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - totalTracks: null == totalTracks - ? _value.totalTracks - : totalTracks // ignore: cast_nullable_to_non_nullable - as int, - albumType: null == albumType - ? _value.albumType - : albumType // ignore: cast_nullable_to_non_nullable - as SpotubeAlbumType, - recordLabel: freezed == recordLabel - ? _value.recordLabel - : recordLabel // ignore: cast_nullable_to_non_nullable - as String?, - genres: freezed == genres - ? _value.genres - : genres // ignore: cast_nullable_to_non_nullable - as List?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeFullAlbumObjectImplCopyWith<$Res> - implements $SpotubeFullAlbumObjectCopyWith<$Res> { - factory _$$SpotubeFullAlbumObjectImplCopyWith( - _$SpotubeFullAlbumObjectImpl value, - $Res Function(_$SpotubeFullAlbumObjectImpl) then) = - __$$SpotubeFullAlbumObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - List artists, - List images, - String releaseDate, - String externalUri, - int totalTracks, - SpotubeAlbumType albumType, - String? recordLabel, - List? genres}); -} - -/// @nodoc -class __$$SpotubeFullAlbumObjectImplCopyWithImpl<$Res> - extends _$SpotubeFullAlbumObjectCopyWithImpl<$Res, - _$SpotubeFullAlbumObjectImpl> - implements _$$SpotubeFullAlbumObjectImplCopyWith<$Res> { - __$$SpotubeFullAlbumObjectImplCopyWithImpl( - _$SpotubeFullAlbumObjectImpl _value, - $Res Function(_$SpotubeFullAlbumObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeFullAlbumObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? artists = null, - Object? images = null, - Object? releaseDate = null, - Object? externalUri = null, - Object? totalTracks = null, - Object? albumType = null, - Object? recordLabel = freezed, - Object? genres = freezed, - }) { - return _then(_$SpotubeFullAlbumObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - releaseDate: null == releaseDate - ? _value.releaseDate - : releaseDate // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - totalTracks: null == totalTracks - ? _value.totalTracks - : totalTracks // ignore: cast_nullable_to_non_nullable - as int, - albumType: null == albumType - ? _value.albumType - : albumType // ignore: cast_nullable_to_non_nullable - as SpotubeAlbumType, - recordLabel: freezed == recordLabel - ? _value.recordLabel - : recordLabel // ignore: cast_nullable_to_non_nullable - as String?, - genres: freezed == genres - ? _value._genres - : genres // ignore: cast_nullable_to_non_nullable - as List?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeFullAlbumObjectImpl implements _SpotubeFullAlbumObject { - _$SpotubeFullAlbumObjectImpl( - {required this.id, - required this.name, - required final List artists, - final List images = const [], - required this.releaseDate, - required this.externalUri, - required this.totalTracks, - required this.albumType, - this.recordLabel, - final List? genres}) - : _artists = artists, - _images = images, - _genres = genres; - - factory _$SpotubeFullAlbumObjectImpl.fromJson(Map json) => - _$$SpotubeFullAlbumObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - final List _artists; - @override - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - @override - final String releaseDate; - @override - final String externalUri; - @override - final int totalTracks; - @override - final SpotubeAlbumType albumType; - @override - final String? recordLabel; - final List? _genres; - @override - List? get genres { - final value = _genres; - if (value == null) return null; - if (_genres is EqualUnmodifiableListView) return _genres; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); - } - - @override - String toString() { - return 'SpotubeFullAlbumObject(id: $id, name: $name, artists: $artists, images: $images, releaseDate: $releaseDate, externalUri: $externalUri, totalTracks: $totalTracks, albumType: $albumType, recordLabel: $recordLabel, genres: $genres)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeFullAlbumObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - const DeepCollectionEquality().equals(other._artists, _artists) && - const DeepCollectionEquality().equals(other._images, _images) && - (identical(other.releaseDate, releaseDate) || - other.releaseDate == releaseDate) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - (identical(other.totalTracks, totalTracks) || - other.totalTracks == totalTracks) && - (identical(other.albumType, albumType) || - other.albumType == albumType) && - (identical(other.recordLabel, recordLabel) || - other.recordLabel == recordLabel) && - const DeepCollectionEquality().equals(other._genres, _genres)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - name, - const DeepCollectionEquality().hash(_artists), - const DeepCollectionEquality().hash(_images), - releaseDate, - externalUri, - totalTracks, - albumType, - recordLabel, - const DeepCollectionEquality().hash(_genres)); - - /// Create a copy of SpotubeFullAlbumObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeFullAlbumObjectImplCopyWith<_$SpotubeFullAlbumObjectImpl> - get copyWith => __$$SpotubeFullAlbumObjectImplCopyWithImpl< - _$SpotubeFullAlbumObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeFullAlbumObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeFullAlbumObject implements SpotubeFullAlbumObject { - factory _SpotubeFullAlbumObject( - {required final String id, - required final String name, - required final List artists, - final List images, - required final String releaseDate, - required final String externalUri, - required final int totalTracks, - required final SpotubeAlbumType albumType, - final String? recordLabel, - final List? genres}) = _$SpotubeFullAlbumObjectImpl; - - factory _SpotubeFullAlbumObject.fromJson(Map json) = - _$SpotubeFullAlbumObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - List get artists; - @override - List get images; - @override - String get releaseDate; - @override - String get externalUri; - @override - int get totalTracks; - @override - SpotubeAlbumType get albumType; - @override - String? get recordLabel; - @override - List? get genres; - - /// Create a copy of SpotubeFullAlbumObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeFullAlbumObjectImplCopyWith<_$SpotubeFullAlbumObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeSimpleAlbumObject _$SpotubeSimpleAlbumObjectFromJson( - Map json) { - return _SpotubeSimpleAlbumObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeSimpleAlbumObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - List get artists => - throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - SpotubeAlbumType get albumType => throw _privateConstructorUsedError; - String? get releaseDate => throw _privateConstructorUsedError; - - /// Serializes this SpotubeSimpleAlbumObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeSimpleAlbumObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeSimpleAlbumObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeSimpleAlbumObjectCopyWith<$Res> { - factory $SpotubeSimpleAlbumObjectCopyWith(SpotubeSimpleAlbumObject value, - $Res Function(SpotubeSimpleAlbumObject) then) = - _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, SpotubeSimpleAlbumObject>; - @useResult - $Res call( - {String id, - String name, - String externalUri, - List artists, - List images, - SpotubeAlbumType albumType, - String? releaseDate}); -} - -/// @nodoc -class _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, - $Val extends SpotubeSimpleAlbumObject> - implements $SpotubeSimpleAlbumObjectCopyWith<$Res> { - _$SpotubeSimpleAlbumObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeSimpleAlbumObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? artists = null, - Object? images = null, - Object? albumType = null, - Object? releaseDate = freezed, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value.artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - albumType: null == albumType - ? _value.albumType - : albumType // ignore: cast_nullable_to_non_nullable - as SpotubeAlbumType, - releaseDate: freezed == releaseDate - ? _value.releaseDate - : releaseDate // ignore: cast_nullable_to_non_nullable - as String?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeSimpleAlbumObjectImplCopyWith<$Res> - implements $SpotubeSimpleAlbumObjectCopyWith<$Res> { - factory _$$SpotubeSimpleAlbumObjectImplCopyWith( - _$SpotubeSimpleAlbumObjectImpl value, - $Res Function(_$SpotubeSimpleAlbumObjectImpl) then) = - __$$SpotubeSimpleAlbumObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String externalUri, - List artists, - List images, - SpotubeAlbumType albumType, - String? releaseDate}); -} - -/// @nodoc -class __$$SpotubeSimpleAlbumObjectImplCopyWithImpl<$Res> - extends _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, - _$SpotubeSimpleAlbumObjectImpl> - implements _$$SpotubeSimpleAlbumObjectImplCopyWith<$Res> { - __$$SpotubeSimpleAlbumObjectImplCopyWithImpl( - _$SpotubeSimpleAlbumObjectImpl _value, - $Res Function(_$SpotubeSimpleAlbumObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeSimpleAlbumObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? artists = null, - Object? images = null, - Object? albumType = null, - Object? releaseDate = freezed, - }) { - return _then(_$SpotubeSimpleAlbumObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - albumType: null == albumType - ? _value.albumType - : albumType // ignore: cast_nullable_to_non_nullable - as SpotubeAlbumType, - releaseDate: freezed == releaseDate - ? _value.releaseDate - : releaseDate // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeSimpleAlbumObjectImpl implements _SpotubeSimpleAlbumObject { - _$SpotubeSimpleAlbumObjectImpl( - {required this.id, - required this.name, - required this.externalUri, - required final List artists, - final List images = const [], - required this.albumType, - this.releaseDate}) - : _artists = artists, - _images = images; - - factory _$SpotubeSimpleAlbumObjectImpl.fromJson(Map json) => - _$$SpotubeSimpleAlbumObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String externalUri; - final List _artists; - @override - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - @override - final SpotubeAlbumType albumType; - @override - final String? releaseDate; - - @override - String toString() { - return 'SpotubeSimpleAlbumObject(id: $id, name: $name, externalUri: $externalUri, artists: $artists, images: $images, albumType: $albumType, releaseDate: $releaseDate)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeSimpleAlbumObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - const DeepCollectionEquality().equals(other._artists, _artists) && - const DeepCollectionEquality().equals(other._images, _images) && - (identical(other.albumType, albumType) || - other.albumType == albumType) && - (identical(other.releaseDate, releaseDate) || - other.releaseDate == releaseDate)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - name, - externalUri, - const DeepCollectionEquality().hash(_artists), - const DeepCollectionEquality().hash(_images), - albumType, - releaseDate); - - /// Create a copy of SpotubeSimpleAlbumObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeSimpleAlbumObjectImplCopyWith<_$SpotubeSimpleAlbumObjectImpl> - get copyWith => __$$SpotubeSimpleAlbumObjectImplCopyWithImpl< - _$SpotubeSimpleAlbumObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeSimpleAlbumObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeSimpleAlbumObject implements SpotubeSimpleAlbumObject { - factory _SpotubeSimpleAlbumObject( - {required final String id, - required final String name, - required final String externalUri, - required final List artists, - final List images, - required final SpotubeAlbumType albumType, - final String? releaseDate}) = _$SpotubeSimpleAlbumObjectImpl; - - factory _SpotubeSimpleAlbumObject.fromJson(Map json) = - _$SpotubeSimpleAlbumObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get externalUri; - @override - List get artists; - @override - List get images; - @override - SpotubeAlbumType get albumType; - @override - String? get releaseDate; - - /// Create a copy of SpotubeSimpleAlbumObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeSimpleAlbumObjectImplCopyWith<_$SpotubeSimpleAlbumObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeFullArtistObject _$SpotubeFullArtistObjectFromJson( - Map json) { - return _SpotubeFullArtistObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeFullArtistObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - List? get genres => throw _privateConstructorUsedError; - int? get followers => throw _privateConstructorUsedError; - - /// Serializes this SpotubeFullArtistObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeFullArtistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeFullArtistObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeFullArtistObjectCopyWith<$Res> { - factory $SpotubeFullArtistObjectCopyWith(SpotubeFullArtistObject value, - $Res Function(SpotubeFullArtistObject) then) = - _$SpotubeFullArtistObjectCopyWithImpl<$Res, SpotubeFullArtistObject>; - @useResult - $Res call( - {String id, - String name, - String externalUri, - List images, - List? genres, - int? followers}); -} - -/// @nodoc -class _$SpotubeFullArtistObjectCopyWithImpl<$Res, - $Val extends SpotubeFullArtistObject> - implements $SpotubeFullArtistObjectCopyWith<$Res> { - _$SpotubeFullArtistObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeFullArtistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? images = null, - Object? genres = freezed, - Object? followers = freezed, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - genres: freezed == genres - ? _value.genres - : genres // ignore: cast_nullable_to_non_nullable - as List?, - followers: freezed == followers - ? _value.followers - : followers // ignore: cast_nullable_to_non_nullable - as int?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeFullArtistObjectImplCopyWith<$Res> - implements $SpotubeFullArtistObjectCopyWith<$Res> { - factory _$$SpotubeFullArtistObjectImplCopyWith( - _$SpotubeFullArtistObjectImpl value, - $Res Function(_$SpotubeFullArtistObjectImpl) then) = - __$$SpotubeFullArtistObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String externalUri, - List images, - List? genres, - int? followers}); -} - -/// @nodoc -class __$$SpotubeFullArtistObjectImplCopyWithImpl<$Res> - extends _$SpotubeFullArtistObjectCopyWithImpl<$Res, - _$SpotubeFullArtistObjectImpl> - implements _$$SpotubeFullArtistObjectImplCopyWith<$Res> { - __$$SpotubeFullArtistObjectImplCopyWithImpl( - _$SpotubeFullArtistObjectImpl _value, - $Res Function(_$SpotubeFullArtistObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeFullArtistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? images = null, - Object? genres = freezed, - Object? followers = freezed, - }) { - return _then(_$SpotubeFullArtistObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - genres: freezed == genres - ? _value._genres - : genres // ignore: cast_nullable_to_non_nullable - as List?, - followers: freezed == followers - ? _value.followers - : followers // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeFullArtistObjectImpl implements _SpotubeFullArtistObject { - _$SpotubeFullArtistObjectImpl( - {required this.id, - required this.name, - required this.externalUri, - final List images = const [], - final List? genres, - this.followers}) - : _images = images, - _genres = genres; - - factory _$SpotubeFullArtistObjectImpl.fromJson(Map json) => - _$$SpotubeFullArtistObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String externalUri; - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - final List? _genres; - @override - List? get genres { - final value = _genres; - if (value == null) return null; - if (_genres is EqualUnmodifiableListView) return _genres; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); - } - - @override - final int? followers; - - @override - String toString() { - return 'SpotubeFullArtistObject(id: $id, name: $name, externalUri: $externalUri, images: $images, genres: $genres, followers: $followers)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeFullArtistObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - const DeepCollectionEquality().equals(other._images, _images) && - const DeepCollectionEquality().equals(other._genres, _genres) && - (identical(other.followers, followers) || - other.followers == followers)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - name, - externalUri, - const DeepCollectionEquality().hash(_images), - const DeepCollectionEquality().hash(_genres), - followers); - - /// Create a copy of SpotubeFullArtistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeFullArtistObjectImplCopyWith<_$SpotubeFullArtistObjectImpl> - get copyWith => __$$SpotubeFullArtistObjectImplCopyWithImpl< - _$SpotubeFullArtistObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeFullArtistObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeFullArtistObject implements SpotubeFullArtistObject { - factory _SpotubeFullArtistObject( - {required final String id, - required final String name, - required final String externalUri, - final List images, - final List? genres, - final int? followers}) = _$SpotubeFullArtistObjectImpl; - - factory _SpotubeFullArtistObject.fromJson(Map json) = - _$SpotubeFullArtistObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get externalUri; - @override - List get images; - @override - List? get genres; - @override - int? get followers; - - /// Create a copy of SpotubeFullArtistObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeFullArtistObjectImplCopyWith<_$SpotubeFullArtistObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeSimpleArtistObject _$SpotubeSimpleArtistObjectFromJson( - Map json) { - return _SpotubeSimpleArtistObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeSimpleArtistObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - List? get images => throw _privateConstructorUsedError; - - /// Serializes this SpotubeSimpleArtistObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeSimpleArtistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeSimpleArtistObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeSimpleArtistObjectCopyWith<$Res> { - factory $SpotubeSimpleArtistObjectCopyWith(SpotubeSimpleArtistObject value, - $Res Function(SpotubeSimpleArtistObject) then) = - _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, SpotubeSimpleArtistObject>; - @useResult - $Res call( - {String id, - String name, - String externalUri, - List? images}); -} - -/// @nodoc -class _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, - $Val extends SpotubeSimpleArtistObject> - implements $SpotubeSimpleArtistObjectCopyWith<$Res> { - _$SpotubeSimpleArtistObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeSimpleArtistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? images = freezed, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - images: freezed == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeSimpleArtistObjectImplCopyWith<$Res> - implements $SpotubeSimpleArtistObjectCopyWith<$Res> { - factory _$$SpotubeSimpleArtistObjectImplCopyWith( - _$SpotubeSimpleArtistObjectImpl value, - $Res Function(_$SpotubeSimpleArtistObjectImpl) then) = - __$$SpotubeSimpleArtistObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String externalUri, - List? images}); -} - -/// @nodoc -class __$$SpotubeSimpleArtistObjectImplCopyWithImpl<$Res> - extends _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, - _$SpotubeSimpleArtistObjectImpl> - implements _$$SpotubeSimpleArtistObjectImplCopyWith<$Res> { - __$$SpotubeSimpleArtistObjectImplCopyWithImpl( - _$SpotubeSimpleArtistObjectImpl _value, - $Res Function(_$SpotubeSimpleArtistObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeSimpleArtistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? images = freezed, - }) { - return _then(_$SpotubeSimpleArtistObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - images: freezed == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeSimpleArtistObjectImpl implements _SpotubeSimpleArtistObject { - _$SpotubeSimpleArtistObjectImpl( - {required this.id, - required this.name, - required this.externalUri, - final List? images}) - : _images = images; - - factory _$SpotubeSimpleArtistObjectImpl.fromJson(Map json) => - _$$SpotubeSimpleArtistObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String externalUri; - final List? _images; - @override - List? get images { - final value = _images; - if (value == null) return null; - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); - } - - @override - String toString() { - return 'SpotubeSimpleArtistObject(id: $id, name: $name, externalUri: $externalUri, images: $images)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeSimpleArtistObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - const DeepCollectionEquality().equals(other._images, _images)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, id, name, externalUri, - const DeepCollectionEquality().hash(_images)); - - /// Create a copy of SpotubeSimpleArtistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeSimpleArtistObjectImplCopyWith<_$SpotubeSimpleArtistObjectImpl> - get copyWith => __$$SpotubeSimpleArtistObjectImplCopyWithImpl< - _$SpotubeSimpleArtistObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeSimpleArtistObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeSimpleArtistObject implements SpotubeSimpleArtistObject { - factory _SpotubeSimpleArtistObject( - {required final String id, - required final String name, - required final String externalUri, - final List? images}) = - _$SpotubeSimpleArtistObjectImpl; - - factory _SpotubeSimpleArtistObject.fromJson(Map json) = - _$SpotubeSimpleArtistObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get externalUri; - @override - List? get images; - - /// Create a copy of SpotubeSimpleArtistObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeSimpleArtistObjectImplCopyWith<_$SpotubeSimpleArtistObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeBrowseSectionObject _$SpotubeBrowseSectionObjectFromJson( - Map json, T Function(Object?) fromJsonT) { - return _SpotubeBrowseSectionObject.fromJson(json, fromJsonT); -} - -/// @nodoc -mixin _$SpotubeBrowseSectionObject { - String get id => throw _privateConstructorUsedError; - String get title => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - bool get browseMore => throw _privateConstructorUsedError; - List get items => throw _privateConstructorUsedError; - - /// Serializes this SpotubeBrowseSectionObject to a JSON map. - Map toJson(Object? Function(T) toJsonT) => - throw _privateConstructorUsedError; - - /// Create a copy of SpotubeBrowseSectionObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeBrowseSectionObjectCopyWith> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeBrowseSectionObjectCopyWith { - factory $SpotubeBrowseSectionObjectCopyWith( - SpotubeBrowseSectionObject value, - $Res Function(SpotubeBrowseSectionObject) then) = - _$SpotubeBrowseSectionObjectCopyWithImpl>; - @useResult - $Res call( - {String id, - String title, - String externalUri, - bool browseMore, - List items}); -} - -/// @nodoc -class _$SpotubeBrowseSectionObjectCopyWithImpl> - implements $SpotubeBrowseSectionObjectCopyWith { - _$SpotubeBrowseSectionObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeBrowseSectionObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? title = null, - Object? externalUri = null, - Object? browseMore = null, - Object? items = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - browseMore: null == browseMore - ? _value.browseMore - : browseMore // ignore: cast_nullable_to_non_nullable - as bool, - items: null == items - ? _value.items - : items // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeBrowseSectionObjectImplCopyWith - implements $SpotubeBrowseSectionObjectCopyWith { - factory _$$SpotubeBrowseSectionObjectImplCopyWith( - _$SpotubeBrowseSectionObjectImpl value, - $Res Function(_$SpotubeBrowseSectionObjectImpl) then) = - __$$SpotubeBrowseSectionObjectImplCopyWithImpl; - @override - @useResult - $Res call( - {String id, - String title, - String externalUri, - bool browseMore, - List items}); -} - -/// @nodoc -class __$$SpotubeBrowseSectionObjectImplCopyWithImpl - extends _$SpotubeBrowseSectionObjectCopyWithImpl> - implements _$$SpotubeBrowseSectionObjectImplCopyWith { - __$$SpotubeBrowseSectionObjectImplCopyWithImpl( - _$SpotubeBrowseSectionObjectImpl _value, - $Res Function(_$SpotubeBrowseSectionObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeBrowseSectionObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? title = null, - Object? externalUri = null, - Object? browseMore = null, - Object? items = null, - }) { - return _then(_$SpotubeBrowseSectionObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - browseMore: null == browseMore - ? _value.browseMore - : browseMore // ignore: cast_nullable_to_non_nullable - as bool, - items: null == items - ? _value._items - : items // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable(genericArgumentFactories: true) -class _$SpotubeBrowseSectionObjectImpl - implements _SpotubeBrowseSectionObject { - _$SpotubeBrowseSectionObjectImpl( - {required this.id, - required this.title, - required this.externalUri, - required this.browseMore, - required final List items}) - : _items = items; - - factory _$SpotubeBrowseSectionObjectImpl.fromJson( - Map json, T Function(Object?) fromJsonT) => - _$$SpotubeBrowseSectionObjectImplFromJson(json, fromJsonT); - - @override - final String id; - @override - final String title; - @override - final String externalUri; - @override - final bool browseMore; - final List _items; - @override - List get items { - if (_items is EqualUnmodifiableListView) return _items; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_items); - } - - @override - String toString() { - return 'SpotubeBrowseSectionObject<$T>(id: $id, title: $title, externalUri: $externalUri, browseMore: $browseMore, items: $items)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeBrowseSectionObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.title, title) || other.title == title) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - (identical(other.browseMore, browseMore) || - other.browseMore == browseMore) && - const DeepCollectionEquality().equals(other._items, _items)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, id, title, externalUri, - browseMore, const DeepCollectionEquality().hash(_items)); - - /// Create a copy of SpotubeBrowseSectionObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeBrowseSectionObjectImplCopyWith> - get copyWith => __$$SpotubeBrowseSectionObjectImplCopyWithImpl>(this, _$identity); - - @override - Map toJson(Object? Function(T) toJsonT) { - return _$$SpotubeBrowseSectionObjectImplToJson(this, toJsonT); - } -} - -abstract class _SpotubeBrowseSectionObject - implements SpotubeBrowseSectionObject { - factory _SpotubeBrowseSectionObject( - {required final String id, - required final String title, - required final String externalUri, - required final bool browseMore, - required final List items}) = _$SpotubeBrowseSectionObjectImpl; - - factory _SpotubeBrowseSectionObject.fromJson( - Map json, T Function(Object?) fromJsonT) = - _$SpotubeBrowseSectionObjectImpl.fromJson; - - @override - String get id; - @override - String get title; - @override - String get externalUri; - @override - bool get browseMore; - @override - List get items; - - /// Create a copy of SpotubeBrowseSectionObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeBrowseSectionObjectImplCopyWith> - get copyWith => throw _privateConstructorUsedError; -} - MetadataFormFieldObject _$MetadataFormFieldObjectFromJson( Map json) { switch (json['objectType']) { @@ -3566,2966 +617,6 @@ abstract class MetadataFormFieldTextObject implements MetadataFormFieldObject { get copyWith => throw _privateConstructorUsedError; } -SpotubeImageObject _$SpotubeImageObjectFromJson(Map json) { - return _SpotubeImageObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeImageObject { - String get url => throw _privateConstructorUsedError; - int? get width => throw _privateConstructorUsedError; - int? get height => throw _privateConstructorUsedError; - - /// Serializes this SpotubeImageObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeImageObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeImageObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeImageObjectCopyWith<$Res> { - factory $SpotubeImageObjectCopyWith( - SpotubeImageObject value, $Res Function(SpotubeImageObject) then) = - _$SpotubeImageObjectCopyWithImpl<$Res, SpotubeImageObject>; - @useResult - $Res call({String url, int? width, int? height}); -} - -/// @nodoc -class _$SpotubeImageObjectCopyWithImpl<$Res, $Val extends SpotubeImageObject> - implements $SpotubeImageObjectCopyWith<$Res> { - _$SpotubeImageObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeImageObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - Object? width = freezed, - Object? height = freezed, - }) { - return _then(_value.copyWith( - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - width: freezed == width - ? _value.width - : width // ignore: cast_nullable_to_non_nullable - as int?, - height: freezed == height - ? _value.height - : height // ignore: cast_nullable_to_non_nullable - as int?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeImageObjectImplCopyWith<$Res> - implements $SpotubeImageObjectCopyWith<$Res> { - factory _$$SpotubeImageObjectImplCopyWith(_$SpotubeImageObjectImpl value, - $Res Function(_$SpotubeImageObjectImpl) then) = - __$$SpotubeImageObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String url, int? width, int? height}); -} - -/// @nodoc -class __$$SpotubeImageObjectImplCopyWithImpl<$Res> - extends _$SpotubeImageObjectCopyWithImpl<$Res, _$SpotubeImageObjectImpl> - implements _$$SpotubeImageObjectImplCopyWith<$Res> { - __$$SpotubeImageObjectImplCopyWithImpl(_$SpotubeImageObjectImpl _value, - $Res Function(_$SpotubeImageObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeImageObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - Object? width = freezed, - Object? height = freezed, - }) { - return _then(_$SpotubeImageObjectImpl( - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - width: freezed == width - ? _value.width - : width // ignore: cast_nullable_to_non_nullable - as int?, - height: freezed == height - ? _value.height - : height // ignore: cast_nullable_to_non_nullable - as int?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeImageObjectImpl implements _SpotubeImageObject { - _$SpotubeImageObjectImpl({required this.url, this.width, this.height}); - - factory _$SpotubeImageObjectImpl.fromJson(Map json) => - _$$SpotubeImageObjectImplFromJson(json); - - @override - final String url; - @override - final int? width; - @override - final int? height; - - @override - String toString() { - return 'SpotubeImageObject(url: $url, width: $width, height: $height)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeImageObjectImpl && - (identical(other.url, url) || other.url == url) && - (identical(other.width, width) || other.width == width) && - (identical(other.height, height) || other.height == height)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, url, width, height); - - /// Create a copy of SpotubeImageObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeImageObjectImplCopyWith<_$SpotubeImageObjectImpl> get copyWith => - __$$SpotubeImageObjectImplCopyWithImpl<_$SpotubeImageObjectImpl>( - this, _$identity); - - @override - Map toJson() { - return _$$SpotubeImageObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeImageObject implements SpotubeImageObject { - factory _SpotubeImageObject( - {required final String url, - final int? width, - final int? height}) = _$SpotubeImageObjectImpl; - - factory _SpotubeImageObject.fromJson(Map json) = - _$SpotubeImageObjectImpl.fromJson; - - @override - String get url; - @override - int? get width; - @override - int? get height; - - /// Create a copy of SpotubeImageObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeImageObjectImplCopyWith<_$SpotubeImageObjectImpl> get copyWith => - throw _privateConstructorUsedError; -} - -SpotubePaginationResponseObject _$SpotubePaginationResponseObjectFromJson( - Map json, T Function(Object?) fromJsonT) { - return _SpotubePaginationResponseObject.fromJson(json, fromJsonT); -} - -/// @nodoc -mixin _$SpotubePaginationResponseObject { - int get limit => throw _privateConstructorUsedError; - int? get nextOffset => throw _privateConstructorUsedError; - int get total => throw _privateConstructorUsedError; - bool get hasMore => throw _privateConstructorUsedError; - List get items => throw _privateConstructorUsedError; - - /// Serializes this SpotubePaginationResponseObject to a JSON map. - Map toJson(Object? Function(T) toJsonT) => - throw _privateConstructorUsedError; - - /// Create a copy of SpotubePaginationResponseObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubePaginationResponseObjectCopyWith> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubePaginationResponseObjectCopyWith { - factory $SpotubePaginationResponseObjectCopyWith( - SpotubePaginationResponseObject value, - $Res Function(SpotubePaginationResponseObject) then) = - _$SpotubePaginationResponseObjectCopyWithImpl>; - @useResult - $Res call( - {int limit, int? nextOffset, int total, bool hasMore, List items}); -} - -/// @nodoc -class _$SpotubePaginationResponseObjectCopyWithImpl> - implements $SpotubePaginationResponseObjectCopyWith { - _$SpotubePaginationResponseObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubePaginationResponseObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? limit = null, - Object? nextOffset = freezed, - Object? total = null, - Object? hasMore = null, - Object? items = null, - }) { - return _then(_value.copyWith( - limit: null == limit - ? _value.limit - : limit // ignore: cast_nullable_to_non_nullable - as int, - nextOffset: freezed == nextOffset - ? _value.nextOffset - : nextOffset // ignore: cast_nullable_to_non_nullable - as int?, - total: null == total - ? _value.total - : total // ignore: cast_nullable_to_non_nullable - as int, - hasMore: null == hasMore - ? _value.hasMore - : hasMore // ignore: cast_nullable_to_non_nullable - as bool, - items: null == items - ? _value.items - : items // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubePaginationResponseObjectImplCopyWith - implements $SpotubePaginationResponseObjectCopyWith { - factory _$$SpotubePaginationResponseObjectImplCopyWith( - _$SpotubePaginationResponseObjectImpl value, - $Res Function(_$SpotubePaginationResponseObjectImpl) then) = - __$$SpotubePaginationResponseObjectImplCopyWithImpl; - @override - @useResult - $Res call( - {int limit, int? nextOffset, int total, bool hasMore, List items}); -} - -/// @nodoc -class __$$SpotubePaginationResponseObjectImplCopyWithImpl - extends _$SpotubePaginationResponseObjectCopyWithImpl> - implements _$$SpotubePaginationResponseObjectImplCopyWith { - __$$SpotubePaginationResponseObjectImplCopyWithImpl( - _$SpotubePaginationResponseObjectImpl _value, - $Res Function(_$SpotubePaginationResponseObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubePaginationResponseObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? limit = null, - Object? nextOffset = freezed, - Object? total = null, - Object? hasMore = null, - Object? items = null, - }) { - return _then(_$SpotubePaginationResponseObjectImpl( - limit: null == limit - ? _value.limit - : limit // ignore: cast_nullable_to_non_nullable - as int, - nextOffset: freezed == nextOffset - ? _value.nextOffset - : nextOffset // ignore: cast_nullable_to_non_nullable - as int?, - total: null == total - ? _value.total - : total // ignore: cast_nullable_to_non_nullable - as int, - hasMore: null == hasMore - ? _value.hasMore - : hasMore // ignore: cast_nullable_to_non_nullable - as bool, - items: null == items - ? _value._items - : items // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable(genericArgumentFactories: true) -class _$SpotubePaginationResponseObjectImpl - implements _SpotubePaginationResponseObject { - _$SpotubePaginationResponseObjectImpl( - {required this.limit, - required this.nextOffset, - required this.total, - required this.hasMore, - required final List items}) - : _items = items; - - factory _$SpotubePaginationResponseObjectImpl.fromJson( - Map json, T Function(Object?) fromJsonT) => - _$$SpotubePaginationResponseObjectImplFromJson(json, fromJsonT); - - @override - final int limit; - @override - final int? nextOffset; - @override - final int total; - @override - final bool hasMore; - final List _items; - @override - List get items { - if (_items is EqualUnmodifiableListView) return _items; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_items); - } - - @override - String toString() { - return 'SpotubePaginationResponseObject<$T>(limit: $limit, nextOffset: $nextOffset, total: $total, hasMore: $hasMore, items: $items)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubePaginationResponseObjectImpl && - (identical(other.limit, limit) || other.limit == limit) && - (identical(other.nextOffset, nextOffset) || - other.nextOffset == nextOffset) && - (identical(other.total, total) || other.total == total) && - (identical(other.hasMore, hasMore) || other.hasMore == hasMore) && - const DeepCollectionEquality().equals(other._items, _items)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, limit, nextOffset, total, - hasMore, const DeepCollectionEquality().hash(_items)); - - /// Create a copy of SpotubePaginationResponseObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubePaginationResponseObjectImplCopyWith> - get copyWith => __$$SpotubePaginationResponseObjectImplCopyWithImpl>(this, _$identity); - - @override - Map toJson(Object? Function(T) toJsonT) { - return _$$SpotubePaginationResponseObjectImplToJson(this, toJsonT); - } -} - -abstract class _SpotubePaginationResponseObject - implements SpotubePaginationResponseObject { - factory _SpotubePaginationResponseObject( - {required final int limit, - required final int? nextOffset, - required final int total, - required final bool hasMore, - required final List items}) = _$SpotubePaginationResponseObjectImpl; - - factory _SpotubePaginationResponseObject.fromJson( - Map json, T Function(Object?) fromJsonT) = - _$SpotubePaginationResponseObjectImpl.fromJson; - - @override - int get limit; - @override - int? get nextOffset; - @override - int get total; - @override - bool get hasMore; - @override - List get items; - - /// Create a copy of SpotubePaginationResponseObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubePaginationResponseObjectImplCopyWith> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeFullPlaylistObject _$SpotubeFullPlaylistObjectFromJson( - Map json) { - return _SpotubeFullPlaylistObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeFullPlaylistObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get description => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - SpotubeUserObject get owner => throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - List get collaborators => - throw _privateConstructorUsedError; - bool get collaborative => throw _privateConstructorUsedError; - bool get public => throw _privateConstructorUsedError; - - /// Serializes this SpotubeFullPlaylistObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeFullPlaylistObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeFullPlaylistObjectCopyWith<$Res> { - factory $SpotubeFullPlaylistObjectCopyWith(SpotubeFullPlaylistObject value, - $Res Function(SpotubeFullPlaylistObject) then) = - _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, SpotubeFullPlaylistObject>; - @useResult - $Res call( - {String id, - String name, - String description, - String externalUri, - SpotubeUserObject owner, - List images, - List collaborators, - bool collaborative, - bool public}); - - $SpotubeUserObjectCopyWith<$Res> get owner; -} - -/// @nodoc -class _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, - $Val extends SpotubeFullPlaylistObject> - implements $SpotubeFullPlaylistObjectCopyWith<$Res> { - _$SpotubeFullPlaylistObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? description = null, - Object? externalUri = null, - Object? owner = null, - Object? images = null, - Object? collaborators = null, - Object? collaborative = null, - Object? public = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - owner: null == owner - ? _value.owner - : owner // ignore: cast_nullable_to_non_nullable - as SpotubeUserObject, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - collaborators: null == collaborators - ? _value.collaborators - : collaborators // ignore: cast_nullable_to_non_nullable - as List, - collaborative: null == collaborative - ? _value.collaborative - : collaborative // ignore: cast_nullable_to_non_nullable - as bool, - public: null == public - ? _value.public - : public // ignore: cast_nullable_to_non_nullable - as bool, - ) as $Val); - } - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $SpotubeUserObjectCopyWith<$Res> get owner { - return $SpotubeUserObjectCopyWith<$Res>(_value.owner, (value) { - return _then(_value.copyWith(owner: value) as $Val); - }); - } -} - -/// @nodoc -abstract class _$$SpotubeFullPlaylistObjectImplCopyWith<$Res> - implements $SpotubeFullPlaylistObjectCopyWith<$Res> { - factory _$$SpotubeFullPlaylistObjectImplCopyWith( - _$SpotubeFullPlaylistObjectImpl value, - $Res Function(_$SpotubeFullPlaylistObjectImpl) then) = - __$$SpotubeFullPlaylistObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String description, - String externalUri, - SpotubeUserObject owner, - List images, - List collaborators, - bool collaborative, - bool public}); - - @override - $SpotubeUserObjectCopyWith<$Res> get owner; -} - -/// @nodoc -class __$$SpotubeFullPlaylistObjectImplCopyWithImpl<$Res> - extends _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, - _$SpotubeFullPlaylistObjectImpl> - implements _$$SpotubeFullPlaylistObjectImplCopyWith<$Res> { - __$$SpotubeFullPlaylistObjectImplCopyWithImpl( - _$SpotubeFullPlaylistObjectImpl _value, - $Res Function(_$SpotubeFullPlaylistObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? description = null, - Object? externalUri = null, - Object? owner = null, - Object? images = null, - Object? collaborators = null, - Object? collaborative = null, - Object? public = null, - }) { - return _then(_$SpotubeFullPlaylistObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - owner: null == owner - ? _value.owner - : owner // ignore: cast_nullable_to_non_nullable - as SpotubeUserObject, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - collaborators: null == collaborators - ? _value._collaborators - : collaborators // ignore: cast_nullable_to_non_nullable - as List, - collaborative: null == collaborative - ? _value.collaborative - : collaborative // ignore: cast_nullable_to_non_nullable - as bool, - public: null == public - ? _value.public - : public // ignore: cast_nullable_to_non_nullable - as bool, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeFullPlaylistObjectImpl implements _SpotubeFullPlaylistObject { - _$SpotubeFullPlaylistObjectImpl( - {required this.id, - required this.name, - required this.description, - required this.externalUri, - required this.owner, - final List images = const [], - final List collaborators = const [], - this.collaborative = false, - this.public = false}) - : _images = images, - _collaborators = collaborators; - - factory _$SpotubeFullPlaylistObjectImpl.fromJson(Map json) => - _$$SpotubeFullPlaylistObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String description; - @override - final String externalUri; - @override - final SpotubeUserObject owner; - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - final List _collaborators; - @override - @JsonKey() - List get collaborators { - if (_collaborators is EqualUnmodifiableListView) return _collaborators; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_collaborators); - } - - @override - @JsonKey() - final bool collaborative; - @override - @JsonKey() - final bool public; - - @override - String toString() { - return 'SpotubeFullPlaylistObject(id: $id, name: $name, description: $description, externalUri: $externalUri, owner: $owner, images: $images, collaborators: $collaborators, collaborative: $collaborative, public: $public)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeFullPlaylistObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.description, description) || - other.description == description) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - (identical(other.owner, owner) || other.owner == owner) && - const DeepCollectionEquality().equals(other._images, _images) && - const DeepCollectionEquality() - .equals(other._collaborators, _collaborators) && - (identical(other.collaborative, collaborative) || - other.collaborative == collaborative) && - (identical(other.public, public) || other.public == public)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - name, - description, - externalUri, - owner, - const DeepCollectionEquality().hash(_images), - const DeepCollectionEquality().hash(_collaborators), - collaborative, - public); - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeFullPlaylistObjectImplCopyWith<_$SpotubeFullPlaylistObjectImpl> - get copyWith => __$$SpotubeFullPlaylistObjectImplCopyWithImpl< - _$SpotubeFullPlaylistObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeFullPlaylistObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeFullPlaylistObject implements SpotubeFullPlaylistObject { - factory _SpotubeFullPlaylistObject( - {required final String id, - required final String name, - required final String description, - required final String externalUri, - required final SpotubeUserObject owner, - final List images, - final List collaborators, - final bool collaborative, - final bool public}) = _$SpotubeFullPlaylistObjectImpl; - - factory _SpotubeFullPlaylistObject.fromJson(Map json) = - _$SpotubeFullPlaylistObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get description; - @override - String get externalUri; - @override - SpotubeUserObject get owner; - @override - List get images; - @override - List get collaborators; - @override - bool get collaborative; - @override - bool get public; - - /// Create a copy of SpotubeFullPlaylistObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeFullPlaylistObjectImplCopyWith<_$SpotubeFullPlaylistObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeSimplePlaylistObject _$SpotubeSimplePlaylistObjectFromJson( - Map json) { - return _SpotubeSimplePlaylistObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeSimplePlaylistObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get description => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - SpotubeUserObject get owner => throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - - /// Serializes this SpotubeSimplePlaylistObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeSimplePlaylistObjectCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeSimplePlaylistObjectCopyWith<$Res> { - factory $SpotubeSimplePlaylistObjectCopyWith( - SpotubeSimplePlaylistObject value, - $Res Function(SpotubeSimplePlaylistObject) then) = - _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, - SpotubeSimplePlaylistObject>; - @useResult - $Res call( - {String id, - String name, - String description, - String externalUri, - SpotubeUserObject owner, - List images}); - - $SpotubeUserObjectCopyWith<$Res> get owner; -} - -/// @nodoc -class _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, - $Val extends SpotubeSimplePlaylistObject> - implements $SpotubeSimplePlaylistObjectCopyWith<$Res> { - _$SpotubeSimplePlaylistObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? description = null, - Object? externalUri = null, - Object? owner = null, - Object? images = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - owner: null == owner - ? _value.owner - : owner // ignore: cast_nullable_to_non_nullable - as SpotubeUserObject, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $SpotubeUserObjectCopyWith<$Res> get owner { - return $SpotubeUserObjectCopyWith<$Res>(_value.owner, (value) { - return _then(_value.copyWith(owner: value) as $Val); - }); - } -} - -/// @nodoc -abstract class _$$SpotubeSimplePlaylistObjectImplCopyWith<$Res> - implements $SpotubeSimplePlaylistObjectCopyWith<$Res> { - factory _$$SpotubeSimplePlaylistObjectImplCopyWith( - _$SpotubeSimplePlaylistObjectImpl value, - $Res Function(_$SpotubeSimplePlaylistObjectImpl) then) = - __$$SpotubeSimplePlaylistObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String description, - String externalUri, - SpotubeUserObject owner, - List images}); - - @override - $SpotubeUserObjectCopyWith<$Res> get owner; -} - -/// @nodoc -class __$$SpotubeSimplePlaylistObjectImplCopyWithImpl<$Res> - extends _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, - _$SpotubeSimplePlaylistObjectImpl> - implements _$$SpotubeSimplePlaylistObjectImplCopyWith<$Res> { - __$$SpotubeSimplePlaylistObjectImplCopyWithImpl( - _$SpotubeSimplePlaylistObjectImpl _value, - $Res Function(_$SpotubeSimplePlaylistObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? description = null, - Object? externalUri = null, - Object? owner = null, - Object? images = null, - }) { - return _then(_$SpotubeSimplePlaylistObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - owner: null == owner - ? _value.owner - : owner // ignore: cast_nullable_to_non_nullable - as SpotubeUserObject, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeSimplePlaylistObjectImpl - implements _SpotubeSimplePlaylistObject { - _$SpotubeSimplePlaylistObjectImpl( - {required this.id, - required this.name, - required this.description, - required this.externalUri, - required this.owner, - final List images = const []}) - : _images = images; - - factory _$SpotubeSimplePlaylistObjectImpl.fromJson( - Map json) => - _$$SpotubeSimplePlaylistObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String description; - @override - final String externalUri; - @override - final SpotubeUserObject owner; - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - @override - String toString() { - return 'SpotubeSimplePlaylistObject(id: $id, name: $name, description: $description, externalUri: $externalUri, owner: $owner, images: $images)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeSimplePlaylistObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.description, description) || - other.description == description) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - (identical(other.owner, owner) || other.owner == owner) && - const DeepCollectionEquality().equals(other._images, _images)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, id, name, description, - externalUri, owner, const DeepCollectionEquality().hash(_images)); - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeSimplePlaylistObjectImplCopyWith<_$SpotubeSimplePlaylistObjectImpl> - get copyWith => __$$SpotubeSimplePlaylistObjectImplCopyWithImpl< - _$SpotubeSimplePlaylistObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeSimplePlaylistObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeSimplePlaylistObject - implements SpotubeSimplePlaylistObject { - factory _SpotubeSimplePlaylistObject( - {required final String id, - required final String name, - required final String description, - required final String externalUri, - required final SpotubeUserObject owner, - final List images}) = - _$SpotubeSimplePlaylistObjectImpl; - - factory _SpotubeSimplePlaylistObject.fromJson(Map json) = - _$SpotubeSimplePlaylistObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get description; - @override - String get externalUri; - @override - SpotubeUserObject get owner; - @override - List get images; - - /// Create a copy of SpotubeSimplePlaylistObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeSimplePlaylistObjectImplCopyWith<_$SpotubeSimplePlaylistObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeSearchResponseObject _$SpotubeSearchResponseObjectFromJson( - Map json) { - return _SpotubeSearchResponseObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeSearchResponseObject { - List get albums => - throw _privateConstructorUsedError; - List get artists => - throw _privateConstructorUsedError; - List get playlists => - throw _privateConstructorUsedError; - List get tracks => throw _privateConstructorUsedError; - - /// Serializes this SpotubeSearchResponseObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeSearchResponseObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeSearchResponseObjectCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeSearchResponseObjectCopyWith<$Res> { - factory $SpotubeSearchResponseObjectCopyWith( - SpotubeSearchResponseObject value, - $Res Function(SpotubeSearchResponseObject) then) = - _$SpotubeSearchResponseObjectCopyWithImpl<$Res, - SpotubeSearchResponseObject>; - @useResult - $Res call( - {List albums, - List artists, - List playlists, - List tracks}); -} - -/// @nodoc -class _$SpotubeSearchResponseObjectCopyWithImpl<$Res, - $Val extends SpotubeSearchResponseObject> - implements $SpotubeSearchResponseObjectCopyWith<$Res> { - _$SpotubeSearchResponseObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeSearchResponseObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? albums = null, - Object? artists = null, - Object? playlists = null, - Object? tracks = null, - }) { - return _then(_value.copyWith( - albums: null == albums - ? _value.albums - : albums // ignore: cast_nullable_to_non_nullable - as List, - artists: null == artists - ? _value.artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - playlists: null == playlists - ? _value.playlists - : playlists // ignore: cast_nullable_to_non_nullable - as List, - tracks: null == tracks - ? _value.tracks - : tracks // ignore: cast_nullable_to_non_nullable - as List, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeSearchResponseObjectImplCopyWith<$Res> - implements $SpotubeSearchResponseObjectCopyWith<$Res> { - factory _$$SpotubeSearchResponseObjectImplCopyWith( - _$SpotubeSearchResponseObjectImpl value, - $Res Function(_$SpotubeSearchResponseObjectImpl) then) = - __$$SpotubeSearchResponseObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {List albums, - List artists, - List playlists, - List tracks}); -} - -/// @nodoc -class __$$SpotubeSearchResponseObjectImplCopyWithImpl<$Res> - extends _$SpotubeSearchResponseObjectCopyWithImpl<$Res, - _$SpotubeSearchResponseObjectImpl> - implements _$$SpotubeSearchResponseObjectImplCopyWith<$Res> { - __$$SpotubeSearchResponseObjectImplCopyWithImpl( - _$SpotubeSearchResponseObjectImpl _value, - $Res Function(_$SpotubeSearchResponseObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeSearchResponseObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? albums = null, - Object? artists = null, - Object? playlists = null, - Object? tracks = null, - }) { - return _then(_$SpotubeSearchResponseObjectImpl( - albums: null == albums - ? _value._albums - : albums // ignore: cast_nullable_to_non_nullable - as List, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - playlists: null == playlists - ? _value._playlists - : playlists // ignore: cast_nullable_to_non_nullable - as List, - tracks: null == tracks - ? _value._tracks - : tracks // ignore: cast_nullable_to_non_nullable - as List, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeSearchResponseObjectImpl - implements _SpotubeSearchResponseObject { - _$SpotubeSearchResponseObjectImpl( - {required final List albums, - required final List artists, - required final List playlists, - required final List tracks}) - : _albums = albums, - _artists = artists, - _playlists = playlists, - _tracks = tracks; - - factory _$SpotubeSearchResponseObjectImpl.fromJson( - Map json) => - _$$SpotubeSearchResponseObjectImplFromJson(json); - - final List _albums; - @override - List get albums { - if (_albums is EqualUnmodifiableListView) return _albums; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_albums); - } - - final List _artists; - @override - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - final List _playlists; - @override - List get playlists { - if (_playlists is EqualUnmodifiableListView) return _playlists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_playlists); - } - - final List _tracks; - @override - List get tracks { - if (_tracks is EqualUnmodifiableListView) return _tracks; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_tracks); - } - - @override - String toString() { - return 'SpotubeSearchResponseObject(albums: $albums, artists: $artists, playlists: $playlists, tracks: $tracks)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeSearchResponseObjectImpl && - const DeepCollectionEquality().equals(other._albums, _albums) && - const DeepCollectionEquality().equals(other._artists, _artists) && - const DeepCollectionEquality() - .equals(other._playlists, _playlists) && - const DeepCollectionEquality().equals(other._tracks, _tracks)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - const DeepCollectionEquality().hash(_albums), - const DeepCollectionEquality().hash(_artists), - const DeepCollectionEquality().hash(_playlists), - const DeepCollectionEquality().hash(_tracks)); - - /// Create a copy of SpotubeSearchResponseObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeSearchResponseObjectImplCopyWith<_$SpotubeSearchResponseObjectImpl> - get copyWith => __$$SpotubeSearchResponseObjectImplCopyWithImpl< - _$SpotubeSearchResponseObjectImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SpotubeSearchResponseObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeSearchResponseObject - implements SpotubeSearchResponseObject { - factory _SpotubeSearchResponseObject( - {required final List albums, - required final List artists, - required final List playlists, - required final List tracks}) = - _$SpotubeSearchResponseObjectImpl; - - factory _SpotubeSearchResponseObject.fromJson(Map json) = - _$SpotubeSearchResponseObjectImpl.fromJson; - - @override - List get albums; - @override - List get artists; - @override - List get playlists; - @override - List get tracks; - - /// Create a copy of SpotubeSearchResponseObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeSearchResponseObjectImplCopyWith<_$SpotubeSearchResponseObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeTrackObject _$SpotubeTrackObjectFromJson(Map json) { - switch (json['runtimeType']) { - case 'local': - return SpotubeLocalTrackObject.fromJson(json); - case 'full': - return SpotubeFullTrackObject.fromJson(json); - - default: - throw CheckedFromJsonException(json, 'runtimeType', 'SpotubeTrackObject', - 'Invalid union type "${json['runtimeType']}"!'); - } -} - -/// @nodoc -mixin _$SpotubeTrackObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - List get artists => - throw _privateConstructorUsedError; - SpotubeSimpleAlbumObject get album => throw _privateConstructorUsedError; - int get durationMs => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path) - local, - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit) - full, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeLocalTrackObject value) local, - required TResult Function(SpotubeFullTrackObject value) full, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeLocalTrackObject value)? local, - TResult? Function(SpotubeFullTrackObject value)? full, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeLocalTrackObject value)? local, - TResult Function(SpotubeFullTrackObject value)? full, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Serializes this SpotubeTrackObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeTrackObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeTrackObjectCopyWith<$Res> { - factory $SpotubeTrackObjectCopyWith( - SpotubeTrackObject value, $Res Function(SpotubeTrackObject) then) = - _$SpotubeTrackObjectCopyWithImpl<$Res, SpotubeTrackObject>; - @useResult - $Res call( - {String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs}); - - $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; -} - -/// @nodoc -class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> - implements $SpotubeTrackObjectCopyWith<$Res> { - _$SpotubeTrackObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? artists = null, - Object? album = null, - Object? durationMs = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value.artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - album: null == album - ? _value.album - : album // ignore: cast_nullable_to_non_nullable - as SpotubeSimpleAlbumObject, - durationMs: null == durationMs - ? _value.durationMs - : durationMs // ignore: cast_nullable_to_non_nullable - as int, - ) as $Val); - } - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $SpotubeSimpleAlbumObjectCopyWith<$Res> get album { - return $SpotubeSimpleAlbumObjectCopyWith<$Res>(_value.album, (value) { - return _then(_value.copyWith(album: value) as $Val); - }); - } -} - -/// @nodoc -abstract class _$$SpotubeLocalTrackObjectImplCopyWith<$Res> - implements $SpotubeTrackObjectCopyWith<$Res> { - factory _$$SpotubeLocalTrackObjectImplCopyWith( - _$SpotubeLocalTrackObjectImpl value, - $Res Function(_$SpotubeLocalTrackObjectImpl) then) = - __$$SpotubeLocalTrackObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path}); - - @override - $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; -} - -/// @nodoc -class __$$SpotubeLocalTrackObjectImplCopyWithImpl<$Res> - extends _$SpotubeTrackObjectCopyWithImpl<$Res, - _$SpotubeLocalTrackObjectImpl> - implements _$$SpotubeLocalTrackObjectImplCopyWith<$Res> { - __$$SpotubeLocalTrackObjectImplCopyWithImpl( - _$SpotubeLocalTrackObjectImpl _value, - $Res Function(_$SpotubeLocalTrackObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? artists = null, - Object? album = null, - Object? durationMs = null, - Object? path = null, - }) { - return _then(_$SpotubeLocalTrackObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - album: null == album - ? _value.album - : album // ignore: cast_nullable_to_non_nullable - as SpotubeSimpleAlbumObject, - durationMs: null == durationMs - ? _value.durationMs - : durationMs // ignore: cast_nullable_to_non_nullable - as int, - path: null == path - ? _value.path - : path // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeLocalTrackObjectImpl implements SpotubeLocalTrackObject { - _$SpotubeLocalTrackObjectImpl( - {required this.id, - required this.name, - required this.externalUri, - final List artists = const [], - required this.album, - required this.durationMs, - required this.path, - final String? $type}) - : _artists = artists, - $type = $type ?? 'local'; - - factory _$SpotubeLocalTrackObjectImpl.fromJson(Map json) => - _$$SpotubeLocalTrackObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String externalUri; - final List _artists; - @override - @JsonKey() - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - @override - final SpotubeSimpleAlbumObject album; - @override - final int durationMs; - @override - final String path; - - @JsonKey(name: 'runtimeType') - final String $type; - - @override - String toString() { - return 'SpotubeTrackObject.local(id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, path: $path)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeLocalTrackObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - const DeepCollectionEquality().equals(other._artists, _artists) && - (identical(other.album, album) || other.album == album) && - (identical(other.durationMs, durationMs) || - other.durationMs == durationMs) && - (identical(other.path, path) || other.path == path)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, id, name, externalUri, - const DeepCollectionEquality().hash(_artists), album, durationMs, path); - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeLocalTrackObjectImplCopyWith<_$SpotubeLocalTrackObjectImpl> - get copyWith => __$$SpotubeLocalTrackObjectImplCopyWithImpl< - _$SpotubeLocalTrackObjectImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path) - local, - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit) - full, - }) { - return local(id, name, externalUri, artists, album, durationMs, path); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - }) { - return local?.call(id, name, externalUri, artists, album, durationMs, path); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - required TResult orElse(), - }) { - if (local != null) { - return local(id, name, externalUri, artists, album, durationMs, path); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeLocalTrackObject value) local, - required TResult Function(SpotubeFullTrackObject value) full, - }) { - return local(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeLocalTrackObject value)? local, - TResult? Function(SpotubeFullTrackObject value)? full, - }) { - return local?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeLocalTrackObject value)? local, - TResult Function(SpotubeFullTrackObject value)? full, - required TResult orElse(), - }) { - if (local != null) { - return local(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$SpotubeLocalTrackObjectImplToJson( - this, - ); - } -} - -abstract class SpotubeLocalTrackObject implements SpotubeTrackObject { - factory SpotubeLocalTrackObject( - {required final String id, - required final String name, - required final String externalUri, - final List artists, - required final SpotubeSimpleAlbumObject album, - required final int durationMs, - required final String path}) = _$SpotubeLocalTrackObjectImpl; - - factory SpotubeLocalTrackObject.fromJson(Map json) = - _$SpotubeLocalTrackObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get externalUri; - @override - List get artists; - @override - SpotubeSimpleAlbumObject get album; - @override - int get durationMs; - String get path; - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeLocalTrackObjectImplCopyWith<_$SpotubeLocalTrackObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$SpotubeFullTrackObjectImplCopyWith<$Res> - implements $SpotubeTrackObjectCopyWith<$Res> { - factory _$$SpotubeFullTrackObjectImplCopyWith( - _$SpotubeFullTrackObjectImpl value, - $Res Function(_$SpotubeFullTrackObjectImpl) then) = - __$$SpotubeFullTrackObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit}); - - @override - $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; -} - -/// @nodoc -class __$$SpotubeFullTrackObjectImplCopyWithImpl<$Res> - extends _$SpotubeTrackObjectCopyWithImpl<$Res, _$SpotubeFullTrackObjectImpl> - implements _$$SpotubeFullTrackObjectImplCopyWith<$Res> { - __$$SpotubeFullTrackObjectImplCopyWithImpl( - _$SpotubeFullTrackObjectImpl _value, - $Res Function(_$SpotubeFullTrackObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? externalUri = null, - Object? artists = null, - Object? album = null, - Object? durationMs = null, - Object? isrc = null, - Object? explicit = null, - }) { - return _then(_$SpotubeFullTrackObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - artists: null == artists - ? _value._artists - : artists // ignore: cast_nullable_to_non_nullable - as List, - album: null == album - ? _value.album - : album // ignore: cast_nullable_to_non_nullable - as SpotubeSimpleAlbumObject, - durationMs: null == durationMs - ? _value.durationMs - : durationMs // ignore: cast_nullable_to_non_nullable - as int, - isrc: null == isrc - ? _value.isrc - : isrc // ignore: cast_nullable_to_non_nullable - as String, - explicit: null == explicit - ? _value.explicit - : explicit // ignore: cast_nullable_to_non_nullable - as bool, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeFullTrackObjectImpl implements SpotubeFullTrackObject { - _$SpotubeFullTrackObjectImpl( - {required this.id, - required this.name, - required this.externalUri, - final List artists = const [], - required this.album, - required this.durationMs, - required this.isrc, - required this.explicit, - final String? $type}) - : _artists = artists, - $type = $type ?? 'full'; - - factory _$SpotubeFullTrackObjectImpl.fromJson(Map json) => - _$$SpotubeFullTrackObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - @override - final String externalUri; - final List _artists; - @override - @JsonKey() - List get artists { - if (_artists is EqualUnmodifiableListView) return _artists; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_artists); - } - - @override - final SpotubeSimpleAlbumObject album; - @override - final int durationMs; - @override - final String isrc; - @override - final bool explicit; - - @JsonKey(name: 'runtimeType') - final String $type; - - @override - String toString() { - return 'SpotubeTrackObject.full(id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, isrc: $isrc, explicit: $explicit)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeFullTrackObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri) && - const DeepCollectionEquality().equals(other._artists, _artists) && - (identical(other.album, album) || other.album == album) && - (identical(other.durationMs, durationMs) || - other.durationMs == durationMs) && - (identical(other.isrc, isrc) || other.isrc == isrc) && - (identical(other.explicit, explicit) || - other.explicit == explicit)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - id, - name, - externalUri, - const DeepCollectionEquality().hash(_artists), - album, - durationMs, - isrc, - explicit); - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeFullTrackObjectImplCopyWith<_$SpotubeFullTrackObjectImpl> - get copyWith => __$$SpotubeFullTrackObjectImplCopyWithImpl< - _$SpotubeFullTrackObjectImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path) - local, - required TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit) - full, - }) { - return full( - id, name, externalUri, artists, album, durationMs, isrc, explicit); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult? Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - }) { - return full?.call( - id, name, externalUri, artists, album, durationMs, isrc, explicit); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String path)? - local, - TResult Function( - String id, - String name, - String externalUri, - List artists, - SpotubeSimpleAlbumObject album, - int durationMs, - String isrc, - bool explicit)? - full, - required TResult orElse(), - }) { - if (full != null) { - return full( - id, name, externalUri, artists, album, durationMs, isrc, explicit); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SpotubeLocalTrackObject value) local, - required TResult Function(SpotubeFullTrackObject value) full, - }) { - return full(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SpotubeLocalTrackObject value)? local, - TResult? Function(SpotubeFullTrackObject value)? full, - }) { - return full?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SpotubeLocalTrackObject value)? local, - TResult Function(SpotubeFullTrackObject value)? full, - required TResult orElse(), - }) { - if (full != null) { - return full(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$SpotubeFullTrackObjectImplToJson( - this, - ); - } -} - -abstract class SpotubeFullTrackObject implements SpotubeTrackObject { - factory SpotubeFullTrackObject( - {required final String id, - required final String name, - required final String externalUri, - final List artists, - required final SpotubeSimpleAlbumObject album, - required final int durationMs, - required final String isrc, - required final bool explicit}) = _$SpotubeFullTrackObjectImpl; - - factory SpotubeFullTrackObject.fromJson(Map json) = - _$SpotubeFullTrackObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - String get externalUri; - @override - List get artists; - @override - SpotubeSimpleAlbumObject get album; - @override - int get durationMs; - String get isrc; - bool get explicit; - - /// Create a copy of SpotubeTrackObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeFullTrackObjectImplCopyWith<_$SpotubeFullTrackObjectImpl> - get copyWith => throw _privateConstructorUsedError; -} - -SpotubeUserObject _$SpotubeUserObjectFromJson(Map json) { - return _SpotubeUserObject.fromJson(json); -} - -/// @nodoc -mixin _$SpotubeUserObject { - String get id => throw _privateConstructorUsedError; - String get name => throw _privateConstructorUsedError; - List get images => throw _privateConstructorUsedError; - String get externalUri => throw _privateConstructorUsedError; - - /// Serializes this SpotubeUserObject to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of SpotubeUserObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeUserObjectCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SpotubeUserObjectCopyWith<$Res> { - factory $SpotubeUserObjectCopyWith( - SpotubeUserObject value, $Res Function(SpotubeUserObject) then) = - _$SpotubeUserObjectCopyWithImpl<$Res, SpotubeUserObject>; - @useResult - $Res call( - {String id, - String name, - List images, - String externalUri}); -} - -/// @nodoc -class _$SpotubeUserObjectCopyWithImpl<$Res, $Val extends SpotubeUserObject> - implements $SpotubeUserObjectCopyWith<$Res> { - _$SpotubeUserObjectCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SpotubeUserObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? images = null, - Object? externalUri = null, - }) { - return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - images: null == images - ? _value.images - : images // ignore: cast_nullable_to_non_nullable - as List, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SpotubeUserObjectImplCopyWith<$Res> - implements $SpotubeUserObjectCopyWith<$Res> { - factory _$$SpotubeUserObjectImplCopyWith(_$SpotubeUserObjectImpl value, - $Res Function(_$SpotubeUserObjectImpl) then) = - __$$SpotubeUserObjectImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String id, - String name, - List images, - String externalUri}); -} - -/// @nodoc -class __$$SpotubeUserObjectImplCopyWithImpl<$Res> - extends _$SpotubeUserObjectCopyWithImpl<$Res, _$SpotubeUserObjectImpl> - implements _$$SpotubeUserObjectImplCopyWith<$Res> { - __$$SpotubeUserObjectImplCopyWithImpl(_$SpotubeUserObjectImpl _value, - $Res Function(_$SpotubeUserObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of SpotubeUserObject - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? id = null, - Object? name = null, - Object? images = null, - Object? externalUri = null, - }) { - return _then(_$SpotubeUserObjectImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - images: null == images - ? _value._images - : images // ignore: cast_nullable_to_non_nullable - as List, - externalUri: null == externalUri - ? _value.externalUri - : externalUri // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SpotubeUserObjectImpl implements _SpotubeUserObject { - _$SpotubeUserObjectImpl( - {required this.id, - required this.name, - final List images = const [], - required this.externalUri}) - : _images = images; - - factory _$SpotubeUserObjectImpl.fromJson(Map json) => - _$$SpotubeUserObjectImplFromJson(json); - - @override - final String id; - @override - final String name; - final List _images; - @override - @JsonKey() - List get images { - if (_images is EqualUnmodifiableListView) return _images; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_images); - } - - @override - final String externalUri; - - @override - String toString() { - return 'SpotubeUserObject(id: $id, name: $name, images: $images, externalUri: $externalUri)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SpotubeUserObjectImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - const DeepCollectionEquality().equals(other._images, _images) && - (identical(other.externalUri, externalUri) || - other.externalUri == externalUri)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, id, name, - const DeepCollectionEquality().hash(_images), externalUri); - - /// Create a copy of SpotubeUserObject - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SpotubeUserObjectImplCopyWith<_$SpotubeUserObjectImpl> get copyWith => - __$$SpotubeUserObjectImplCopyWithImpl<_$SpotubeUserObjectImpl>( - this, _$identity); - - @override - Map toJson() { - return _$$SpotubeUserObjectImplToJson( - this, - ); - } -} - -abstract class _SpotubeUserObject implements SpotubeUserObject { - factory _SpotubeUserObject( - {required final String id, - required final String name, - final List images, - required final String externalUri}) = _$SpotubeUserObjectImpl; - - factory _SpotubeUserObject.fromJson(Map json) = - _$SpotubeUserObjectImpl.fromJson; - - @override - String get id; - @override - String get name; - @override - List get images; - @override - String get externalUri; - - /// Create a copy of SpotubeUserObject - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeUserObjectImplCopyWith<_$SpotubeUserObjectImpl> get copyWith => - throw _privateConstructorUsedError; -} - -PluginConfiguration _$PluginConfigurationFromJson(Map json) { - return _PluginConfiguration.fromJson(json); -} - -/// @nodoc -mixin _$PluginConfiguration { - String get name => throw _privateConstructorUsedError; - String get description => throw _privateConstructorUsedError; - String get version => throw _privateConstructorUsedError; - String get author => throw _privateConstructorUsedError; - String get entryPoint => throw _privateConstructorUsedError; - String get pluginApiVersion => throw _privateConstructorUsedError; - List get apis => throw _privateConstructorUsedError; - List get abilities => throw _privateConstructorUsedError; - String? get repository => throw _privateConstructorUsedError; - - /// Serializes this PluginConfiguration to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of PluginConfiguration - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $PluginConfigurationCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PluginConfigurationCopyWith<$Res> { - factory $PluginConfigurationCopyWith( - PluginConfiguration value, $Res Function(PluginConfiguration) then) = - _$PluginConfigurationCopyWithImpl<$Res, PluginConfiguration>; - @useResult - $Res call( - {String name, - String description, - String version, - String author, - String entryPoint, - String pluginApiVersion, - List apis, - List abilities, - String? repository}); -} - -/// @nodoc -class _$PluginConfigurationCopyWithImpl<$Res, $Val extends PluginConfiguration> - implements $PluginConfigurationCopyWith<$Res> { - _$PluginConfigurationCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PluginConfiguration - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? description = null, - Object? version = null, - Object? author = null, - Object? entryPoint = null, - Object? pluginApiVersion = null, - Object? apis = null, - Object? abilities = null, - Object? repository = freezed, - }) { - return _then(_value.copyWith( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as String, - author: null == author - ? _value.author - : author // ignore: cast_nullable_to_non_nullable - as String, - entryPoint: null == entryPoint - ? _value.entryPoint - : entryPoint // ignore: cast_nullable_to_non_nullable - as String, - pluginApiVersion: null == pluginApiVersion - ? _value.pluginApiVersion - : pluginApiVersion // ignore: cast_nullable_to_non_nullable - as String, - apis: null == apis - ? _value.apis - : apis // ignore: cast_nullable_to_non_nullable - as List, - abilities: null == abilities - ? _value.abilities - : abilities // ignore: cast_nullable_to_non_nullable - as List, - repository: freezed == repository - ? _value.repository - : repository // ignore: cast_nullable_to_non_nullable - as String?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$PluginConfigurationImplCopyWith<$Res> - implements $PluginConfigurationCopyWith<$Res> { - factory _$$PluginConfigurationImplCopyWith(_$PluginConfigurationImpl value, - $Res Function(_$PluginConfigurationImpl) then) = - __$$PluginConfigurationImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String name, - String description, - String version, - String author, - String entryPoint, - String pluginApiVersion, - List apis, - List abilities, - String? repository}); -} - -/// @nodoc -class __$$PluginConfigurationImplCopyWithImpl<$Res> - extends _$PluginConfigurationCopyWithImpl<$Res, _$PluginConfigurationImpl> - implements _$$PluginConfigurationImplCopyWith<$Res> { - __$$PluginConfigurationImplCopyWithImpl(_$PluginConfigurationImpl _value, - $Res Function(_$PluginConfigurationImpl) _then) - : super(_value, _then); - - /// Create a copy of PluginConfiguration - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? name = null, - Object? description = null, - Object? version = null, - Object? author = null, - Object? entryPoint = null, - Object? pluginApiVersion = null, - Object? apis = null, - Object? abilities = null, - Object? repository = freezed, - }) { - return _then(_$PluginConfigurationImpl( - name: null == name - ? _value.name - : name // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as String, - author: null == author - ? _value.author - : author // ignore: cast_nullable_to_non_nullable - as String, - entryPoint: null == entryPoint - ? _value.entryPoint - : entryPoint // ignore: cast_nullable_to_non_nullable - as String, - pluginApiVersion: null == pluginApiVersion - ? _value.pluginApiVersion - : pluginApiVersion // ignore: cast_nullable_to_non_nullable - as String, - apis: null == apis - ? _value._apis - : apis // ignore: cast_nullable_to_non_nullable - as List, - abilities: null == abilities - ? _value._abilities - : abilities // ignore: cast_nullable_to_non_nullable - as List, - repository: freezed == repository - ? _value.repository - : repository // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$PluginConfigurationImpl extends _PluginConfiguration { - _$PluginConfigurationImpl( - {required this.name, - required this.description, - required this.version, - required this.author, - required this.entryPoint, - required this.pluginApiVersion, - final List apis = const [], - final List abilities = const [], - this.repository}) - : _apis = apis, - _abilities = abilities, - super._(); - - factory _$PluginConfigurationImpl.fromJson(Map json) => - _$$PluginConfigurationImplFromJson(json); - - @override - final String name; - @override - final String description; - @override - final String version; - @override - final String author; - @override - final String entryPoint; - @override - final String pluginApiVersion; - final List _apis; - @override - @JsonKey() - List get apis { - if (_apis is EqualUnmodifiableListView) return _apis; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_apis); - } - - final List _abilities; - @override - @JsonKey() - List get abilities { - if (_abilities is EqualUnmodifiableListView) return _abilities; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_abilities); - } - - @override - final String? repository; - - @override - String toString() { - return 'PluginConfiguration(name: $name, description: $description, version: $version, author: $author, entryPoint: $entryPoint, pluginApiVersion: $pluginApiVersion, apis: $apis, abilities: $abilities, repository: $repository)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PluginConfigurationImpl && - (identical(other.name, name) || other.name == name) && - (identical(other.description, description) || - other.description == description) && - (identical(other.version, version) || other.version == version) && - (identical(other.author, author) || other.author == author) && - (identical(other.entryPoint, entryPoint) || - other.entryPoint == entryPoint) && - (identical(other.pluginApiVersion, pluginApiVersion) || - other.pluginApiVersion == pluginApiVersion) && - const DeepCollectionEquality().equals(other._apis, _apis) && - const DeepCollectionEquality() - .equals(other._abilities, _abilities) && - (identical(other.repository, repository) || - other.repository == repository)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - name, - description, - version, - author, - entryPoint, - pluginApiVersion, - const DeepCollectionEquality().hash(_apis), - const DeepCollectionEquality().hash(_abilities), - repository); - - /// Create a copy of PluginConfiguration - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PluginConfigurationImplCopyWith<_$PluginConfigurationImpl> get copyWith => - __$$PluginConfigurationImplCopyWithImpl<_$PluginConfigurationImpl>( - this, _$identity); - - @override - Map toJson() { - return _$$PluginConfigurationImplToJson( - this, - ); - } -} - -abstract class _PluginConfiguration extends PluginConfiguration { - factory _PluginConfiguration( - {required final String name, - required final String description, - required final String version, - required final String author, - required final String entryPoint, - required final String pluginApiVersion, - final List apis, - final List abilities, - final String? repository}) = _$PluginConfigurationImpl; - _PluginConfiguration._() : super._(); - - factory _PluginConfiguration.fromJson(Map json) = - _$PluginConfigurationImpl.fromJson; - - @override - String get name; - @override - String get description; - @override - String get version; - @override - String get author; - @override - String get entryPoint; - @override - String get pluginApiVersion; - @override - List get apis; - @override - List get abilities; - @override - String? get repository; - - /// Create a copy of PluginConfiguration - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PluginConfigurationImplCopyWith<_$PluginConfigurationImpl> get copyWith => - throw _privateConstructorUsedError; -} - -PluginUpdateAvailable _$PluginUpdateAvailableFromJson( - Map json) { - return _PluginUpdateAvailable.fromJson(json); -} - -/// @nodoc -mixin _$PluginUpdateAvailable { - String get downloadUrl => throw _privateConstructorUsedError; - String get version => throw _privateConstructorUsedError; - String? get changelog => throw _privateConstructorUsedError; - - /// Serializes this PluginUpdateAvailable to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of PluginUpdateAvailable - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $PluginUpdateAvailableCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PluginUpdateAvailableCopyWith<$Res> { - factory $PluginUpdateAvailableCopyWith(PluginUpdateAvailable value, - $Res Function(PluginUpdateAvailable) then) = - _$PluginUpdateAvailableCopyWithImpl<$Res, PluginUpdateAvailable>; - @useResult - $Res call({String downloadUrl, String version, String? changelog}); -} - -/// @nodoc -class _$PluginUpdateAvailableCopyWithImpl<$Res, - $Val extends PluginUpdateAvailable> - implements $PluginUpdateAvailableCopyWith<$Res> { - _$PluginUpdateAvailableCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PluginUpdateAvailable - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? downloadUrl = null, - Object? version = null, - Object? changelog = freezed, - }) { - return _then(_value.copyWith( - downloadUrl: null == downloadUrl - ? _value.downloadUrl - : downloadUrl // ignore: cast_nullable_to_non_nullable - as String, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as String, - changelog: freezed == changelog - ? _value.changelog - : changelog // ignore: cast_nullable_to_non_nullable - as String?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$PluginUpdateAvailableImplCopyWith<$Res> - implements $PluginUpdateAvailableCopyWith<$Res> { - factory _$$PluginUpdateAvailableImplCopyWith( - _$PluginUpdateAvailableImpl value, - $Res Function(_$PluginUpdateAvailableImpl) then) = - __$$PluginUpdateAvailableImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String downloadUrl, String version, String? changelog}); -} - -/// @nodoc -class __$$PluginUpdateAvailableImplCopyWithImpl<$Res> - extends _$PluginUpdateAvailableCopyWithImpl<$Res, - _$PluginUpdateAvailableImpl> - implements _$$PluginUpdateAvailableImplCopyWith<$Res> { - __$$PluginUpdateAvailableImplCopyWithImpl(_$PluginUpdateAvailableImpl _value, - $Res Function(_$PluginUpdateAvailableImpl) _then) - : super(_value, _then); - - /// Create a copy of PluginUpdateAvailable - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? downloadUrl = null, - Object? version = null, - Object? changelog = freezed, - }) { - return _then(_$PluginUpdateAvailableImpl( - downloadUrl: null == downloadUrl - ? _value.downloadUrl - : downloadUrl // ignore: cast_nullable_to_non_nullable - as String, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as String, - changelog: freezed == changelog - ? _value.changelog - : changelog // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$PluginUpdateAvailableImpl implements _PluginUpdateAvailable { - _$PluginUpdateAvailableImpl( - {required this.downloadUrl, required this.version, this.changelog}); - - factory _$PluginUpdateAvailableImpl.fromJson(Map json) => - _$$PluginUpdateAvailableImplFromJson(json); - - @override - final String downloadUrl; - @override - final String version; - @override - final String? changelog; - - @override - String toString() { - return 'PluginUpdateAvailable(downloadUrl: $downloadUrl, version: $version, changelog: $changelog)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PluginUpdateAvailableImpl && - (identical(other.downloadUrl, downloadUrl) || - other.downloadUrl == downloadUrl) && - (identical(other.version, version) || other.version == version) && - (identical(other.changelog, changelog) || - other.changelog == changelog)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, downloadUrl, version, changelog); - - /// Create a copy of PluginUpdateAvailable - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PluginUpdateAvailableImplCopyWith<_$PluginUpdateAvailableImpl> - get copyWith => __$$PluginUpdateAvailableImplCopyWithImpl< - _$PluginUpdateAvailableImpl>(this, _$identity); - - @override - Map toJson() { - return _$$PluginUpdateAvailableImplToJson( - this, - ); - } -} - -abstract class _PluginUpdateAvailable implements PluginUpdateAvailable { - factory _PluginUpdateAvailable( - {required final String downloadUrl, - required final String version, - final String? changelog}) = _$PluginUpdateAvailableImpl; - - factory _PluginUpdateAvailable.fromJson(Map json) = - _$PluginUpdateAvailableImpl.fromJson; - - @override - String get downloadUrl; - @override - String get version; - @override - String? get changelog; - - /// Create a copy of PluginUpdateAvailable - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PluginUpdateAvailableImplCopyWith<_$PluginUpdateAvailableImpl> - get copyWith => throw _privateConstructorUsedError; -} - MetadataPluginRepository _$MetadataPluginRepositoryFromJson( Map json) { return _MetadataPluginRepository.fromJson(json); diff --git a/lib/models/metadata/metadata.g.dart b/lib/models/metadata/metadata.g.dart index 56783d80..d8d6ad59 100644 --- a/lib/models/metadata/metadata.g.dart +++ b/lib/models/metadata/metadata.g.dart @@ -6,270 +6,6 @@ part of 'metadata.dart'; // JsonSerializableGenerator // ************************************************************************** -_$SpotubeAudioSourceContainerPresetLossyImpl - _$$SpotubeAudioSourceContainerPresetLossyImplFromJson(Map json) => - _$SpotubeAudioSourceContainerPresetLossyImpl( - type: $enumDecode(_$SpotubeMediaCompressionTypeEnumMap, json['type']), - name: json['name'] as String, - qualities: (json['qualities'] as List) - .map((e) => SpotubeAudioLossyContainerQuality.fromJson( - Map.from(e as Map))) - .toList(), - ); - -Map _$$SpotubeAudioSourceContainerPresetLossyImplToJson( - _$SpotubeAudioSourceContainerPresetLossyImpl instance) => - { - 'type': _$SpotubeMediaCompressionTypeEnumMap[instance.type]!, - 'name': instance.name, - 'qualities': instance.qualities.map((e) => e.toJson()).toList(), - }; - -const _$SpotubeMediaCompressionTypeEnumMap = { - SpotubeMediaCompressionType.lossy: 'lossy', - SpotubeMediaCompressionType.lossless: 'lossless', -}; - -_$SpotubeAudioSourceContainerPresetLosslessImpl - _$$SpotubeAudioSourceContainerPresetLosslessImplFromJson(Map json) => - _$SpotubeAudioSourceContainerPresetLosslessImpl( - type: $enumDecode(_$SpotubeMediaCompressionTypeEnumMap, json['type']), - name: json['name'] as String, - qualities: (json['qualities'] as List) - .map((e) => SpotubeAudioLosslessContainerQuality.fromJson( - Map.from(e as Map))) - .toList(), - ); - -Map _$$SpotubeAudioSourceContainerPresetLosslessImplToJson( - _$SpotubeAudioSourceContainerPresetLosslessImpl instance) => - { - 'type': _$SpotubeMediaCompressionTypeEnumMap[instance.type]!, - 'name': instance.name, - 'qualities': instance.qualities.map((e) => e.toJson()).toList(), - }; - -_$SpotubeAudioLossyContainerQualityImpl - _$$SpotubeAudioLossyContainerQualityImplFromJson(Map json) => - _$SpotubeAudioLossyContainerQualityImpl( - bitrate: (json['bitrate'] as num).toInt(), - ); - -Map _$$SpotubeAudioLossyContainerQualityImplToJson( - _$SpotubeAudioLossyContainerQualityImpl instance) => - { - 'bitrate': instance.bitrate, - }; - -_$SpotubeAudioLosslessContainerQualityImpl - _$$SpotubeAudioLosslessContainerQualityImplFromJson(Map json) => - _$SpotubeAudioLosslessContainerQualityImpl( - bitDepth: (json['bitDepth'] as num).toInt(), - sampleRate: (json['sampleRate'] as num).toInt(), - ); - -Map _$$SpotubeAudioLosslessContainerQualityImplToJson( - _$SpotubeAudioLosslessContainerQualityImpl instance) => - { - 'bitDepth': instance.bitDepth, - 'sampleRate': instance.sampleRate, - }; - -_$SpotubeAudioSourceMatchObjectImpl - _$$SpotubeAudioSourceMatchObjectImplFromJson(Map json) => - _$SpotubeAudioSourceMatchObjectImpl( - id: json['id'] as String, - title: json['title'] as String, - artists: (json['artists'] as List) - .map((e) => e as String) - .toList(), - duration: Duration(microseconds: (json['duration'] as num).toInt()), - thumbnail: json['thumbnail'] as String?, - externalUri: json['externalUri'] as String, - ); - -Map _$$SpotubeAudioSourceMatchObjectImplToJson( - _$SpotubeAudioSourceMatchObjectImpl instance) => - { - 'id': instance.id, - 'title': instance.title, - 'artists': instance.artists, - 'duration': instance.duration.inMicroseconds, - 'thumbnail': instance.thumbnail, - 'externalUri': instance.externalUri, - }; - -_$SpotubeAudioSourceStreamObjectImpl - _$$SpotubeAudioSourceStreamObjectImplFromJson(Map json) => - _$SpotubeAudioSourceStreamObjectImpl( - url: json['url'] as String, - container: json['container'] as String, - type: $enumDecode(_$SpotubeMediaCompressionTypeEnumMap, json['type']), - codec: json['codec'] as String?, - bitrate: (json['bitrate'] as num?)?.toDouble(), - bitDepth: (json['bitDepth'] as num?)?.toInt(), - sampleRate: (json['sampleRate'] as num?)?.toDouble(), - ); - -Map _$$SpotubeAudioSourceStreamObjectImplToJson( - _$SpotubeAudioSourceStreamObjectImpl instance) => - { - 'url': instance.url, - 'container': instance.container, - 'type': _$SpotubeMediaCompressionTypeEnumMap[instance.type]!, - 'codec': instance.codec, - 'bitrate': instance.bitrate, - 'bitDepth': instance.bitDepth, - 'sampleRate': instance.sampleRate, - }; - -_$SpotubeFullAlbumObjectImpl _$$SpotubeFullAlbumObjectImplFromJson(Map json) => - _$SpotubeFullAlbumObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - artists: (json['artists'] as List) - .map((e) => SpotubeSimpleArtistObject.fromJson( - Map.from(e as Map))) - .toList(), - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - releaseDate: json['releaseDate'] as String, - externalUri: json['externalUri'] as String, - totalTracks: (json['totalTracks'] as num).toInt(), - albumType: $enumDecode(_$SpotubeAlbumTypeEnumMap, json['albumType']), - recordLabel: json['recordLabel'] as String?, - genres: - (json['genres'] as List?)?.map((e) => e as String).toList(), - ); - -Map _$$SpotubeFullAlbumObjectImplToJson( - _$SpotubeFullAlbumObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'artists': instance.artists.map((e) => e.toJson()).toList(), - 'images': instance.images.map((e) => e.toJson()).toList(), - 'releaseDate': instance.releaseDate, - 'externalUri': instance.externalUri, - 'totalTracks': instance.totalTracks, - 'albumType': _$SpotubeAlbumTypeEnumMap[instance.albumType]!, - 'recordLabel': instance.recordLabel, - 'genres': instance.genres, - }; - -const _$SpotubeAlbumTypeEnumMap = { - SpotubeAlbumType.album: 'album', - SpotubeAlbumType.single: 'single', - SpotubeAlbumType.compilation: 'compilation', -}; - -_$SpotubeSimpleAlbumObjectImpl _$$SpotubeSimpleAlbumObjectImplFromJson( - Map json) => - _$SpotubeSimpleAlbumObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - externalUri: json['externalUri'] as String, - artists: (json['artists'] as List) - .map((e) => SpotubeSimpleArtistObject.fromJson( - Map.from(e as Map))) - .toList(), - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - albumType: $enumDecode(_$SpotubeAlbumTypeEnumMap, json['albumType']), - releaseDate: json['releaseDate'] as String?, - ); - -Map _$$SpotubeSimpleAlbumObjectImplToJson( - _$SpotubeSimpleAlbumObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'externalUri': instance.externalUri, - 'artists': instance.artists.map((e) => e.toJson()).toList(), - 'images': instance.images.map((e) => e.toJson()).toList(), - 'albumType': _$SpotubeAlbumTypeEnumMap[instance.albumType]!, - 'releaseDate': instance.releaseDate, - }; - -_$SpotubeFullArtistObjectImpl _$$SpotubeFullArtistObjectImplFromJson( - Map json) => - _$SpotubeFullArtistObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - externalUri: json['externalUri'] as String, - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - genres: - (json['genres'] as List?)?.map((e) => e as String).toList(), - followers: (json['followers'] as num?)?.toInt(), - ); - -Map _$$SpotubeFullArtistObjectImplToJson( - _$SpotubeFullArtistObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'externalUri': instance.externalUri, - 'images': instance.images.map((e) => e.toJson()).toList(), - 'genres': instance.genres, - 'followers': instance.followers, - }; - -_$SpotubeSimpleArtistObjectImpl _$$SpotubeSimpleArtistObjectImplFromJson( - Map json) => - _$SpotubeSimpleArtistObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - externalUri: json['externalUri'] as String, - images: (json['images'] as List?) - ?.map((e) => - SpotubeImageObject.fromJson(Map.from(e as Map))) - .toList(), - ); - -Map _$$SpotubeSimpleArtistObjectImplToJson( - _$SpotubeSimpleArtistObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'externalUri': instance.externalUri, - 'images': instance.images?.map((e) => e.toJson()).toList(), - }; - -_$SpotubeBrowseSectionObjectImpl - _$$SpotubeBrowseSectionObjectImplFromJson( - Map json, - T Function(Object? json) fromJsonT, -) => - _$SpotubeBrowseSectionObjectImpl( - id: json['id'] as String, - title: json['title'] as String, - externalUri: json['externalUri'] as String, - browseMore: json['browseMore'] as bool, - items: (json['items'] as List).map(fromJsonT).toList(), - ); - -Map _$$SpotubeBrowseSectionObjectImplToJson( - _$SpotubeBrowseSectionObjectImpl instance, - Object? Function(T value) toJsonT, -) => - { - 'id': instance.id, - 'title': instance.title, - 'externalUri': instance.externalUri, - 'browseMore': instance.browseMore, - 'items': instance.items.map(toJsonT).toList(), - }; - _$MetadataFormFieldInputObjectImpl _$$MetadataFormFieldInputObjectImplFromJson( Map json) => _$MetadataFormFieldInputObjectImpl( @@ -316,286 +52,6 @@ Map _$$MetadataFormFieldTextObjectImplToJson( 'text': instance.text, }; -_$SpotubeImageObjectImpl _$$SpotubeImageObjectImplFromJson(Map json) => - _$SpotubeImageObjectImpl( - url: json['url'] as String, - width: (json['width'] as num?)?.toInt(), - height: (json['height'] as num?)?.toInt(), - ); - -Map _$$SpotubeImageObjectImplToJson( - _$SpotubeImageObjectImpl instance) => - { - 'url': instance.url, - 'width': instance.width, - 'height': instance.height, - }; - -_$SpotubePaginationResponseObjectImpl - _$$SpotubePaginationResponseObjectImplFromJson( - Map json, - T Function(Object? json) fromJsonT, -) => - _$SpotubePaginationResponseObjectImpl( - limit: (json['limit'] as num).toInt(), - nextOffset: (json['nextOffset'] as num?)?.toInt(), - total: (json['total'] as num).toInt(), - hasMore: json['hasMore'] as bool, - items: (json['items'] as List).map(fromJsonT).toList(), - ); - -Map _$$SpotubePaginationResponseObjectImplToJson( - _$SpotubePaginationResponseObjectImpl instance, - Object? Function(T value) toJsonT, -) => - { - 'limit': instance.limit, - 'nextOffset': instance.nextOffset, - 'total': instance.total, - 'hasMore': instance.hasMore, - 'items': instance.items.map(toJsonT).toList(), - }; - -_$SpotubeFullPlaylistObjectImpl _$$SpotubeFullPlaylistObjectImplFromJson( - Map json) => - _$SpotubeFullPlaylistObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - description: json['description'] as String, - externalUri: json['externalUri'] as String, - owner: SpotubeUserObject.fromJson( - Map.from(json['owner'] as Map)), - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - collaborators: (json['collaborators'] as List?) - ?.map((e) => SpotubeUserObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - collaborative: json['collaborative'] as bool? ?? false, - public: json['public'] as bool? ?? false, - ); - -Map _$$SpotubeFullPlaylistObjectImplToJson( - _$SpotubeFullPlaylistObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'description': instance.description, - 'externalUri': instance.externalUri, - 'owner': instance.owner.toJson(), - 'images': instance.images.map((e) => e.toJson()).toList(), - 'collaborators': instance.collaborators.map((e) => e.toJson()).toList(), - 'collaborative': instance.collaborative, - 'public': instance.public, - }; - -_$SpotubeSimplePlaylistObjectImpl _$$SpotubeSimplePlaylistObjectImplFromJson( - Map json) => - _$SpotubeSimplePlaylistObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - description: json['description'] as String, - externalUri: json['externalUri'] as String, - owner: SpotubeUserObject.fromJson( - Map.from(json['owner'] as Map)), - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - ); - -Map _$$SpotubeSimplePlaylistObjectImplToJson( - _$SpotubeSimplePlaylistObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'description': instance.description, - 'externalUri': instance.externalUri, - 'owner': instance.owner.toJson(), - 'images': instance.images.map((e) => e.toJson()).toList(), - }; - -_$SpotubeSearchResponseObjectImpl _$$SpotubeSearchResponseObjectImplFromJson( - Map json) => - _$SpotubeSearchResponseObjectImpl( - albums: (json['albums'] as List) - .map((e) => SpotubeSimpleAlbumObject.fromJson( - Map.from(e as Map))) - .toList(), - artists: (json['artists'] as List) - .map((e) => SpotubeFullArtistObject.fromJson( - Map.from(e as Map))) - .toList(), - playlists: (json['playlists'] as List) - .map((e) => SpotubeSimplePlaylistObject.fromJson( - Map.from(e as Map))) - .toList(), - tracks: (json['tracks'] as List) - .map((e) => SpotubeFullTrackObject.fromJson( - Map.from(e as Map))) - .toList(), - ); - -Map _$$SpotubeSearchResponseObjectImplToJson( - _$SpotubeSearchResponseObjectImpl instance) => - { - 'albums': instance.albums.map((e) => e.toJson()).toList(), - 'artists': instance.artists.map((e) => e.toJson()).toList(), - 'playlists': instance.playlists.map((e) => e.toJson()).toList(), - 'tracks': instance.tracks.map((e) => e.toJson()).toList(), - }; - -_$SpotubeLocalTrackObjectImpl _$$SpotubeLocalTrackObjectImplFromJson( - Map json) => - _$SpotubeLocalTrackObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - externalUri: json['externalUri'] as String, - artists: (json['artists'] as List?) - ?.map((e) => SpotubeSimpleArtistObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - album: SpotubeSimpleAlbumObject.fromJson( - Map.from(json['album'] as Map)), - durationMs: (json['durationMs'] as num).toInt(), - path: json['path'] as String, - $type: json['runtimeType'] as String?, - ); - -Map _$$SpotubeLocalTrackObjectImplToJson( - _$SpotubeLocalTrackObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'externalUri': instance.externalUri, - 'artists': instance.artists.map((e) => e.toJson()).toList(), - 'album': instance.album.toJson(), - 'durationMs': instance.durationMs, - 'path': instance.path, - 'runtimeType': instance.$type, - }; - -_$SpotubeFullTrackObjectImpl _$$SpotubeFullTrackObjectImplFromJson(Map json) => - _$SpotubeFullTrackObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - externalUri: json['externalUri'] as String, - artists: (json['artists'] as List?) - ?.map((e) => SpotubeSimpleArtistObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - album: SpotubeSimpleAlbumObject.fromJson( - Map.from(json['album'] as Map)), - durationMs: (json['durationMs'] as num).toInt(), - isrc: json['isrc'] as String, - explicit: json['explicit'] as bool, - $type: json['runtimeType'] as String?, - ); - -Map _$$SpotubeFullTrackObjectImplToJson( - _$SpotubeFullTrackObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'externalUri': instance.externalUri, - 'artists': instance.artists.map((e) => e.toJson()).toList(), - 'album': instance.album.toJson(), - 'durationMs': instance.durationMs, - 'isrc': instance.isrc, - 'explicit': instance.explicit, - 'runtimeType': instance.$type, - }; - -_$SpotubeUserObjectImpl _$$SpotubeUserObjectImplFromJson(Map json) => - _$SpotubeUserObjectImpl( - id: json['id'] as String, - name: json['name'] as String, - images: (json['images'] as List?) - ?.map((e) => SpotubeImageObject.fromJson( - Map.from(e as Map))) - .toList() ?? - const [], - externalUri: json['externalUri'] as String, - ); - -Map _$$SpotubeUserObjectImplToJson( - _$SpotubeUserObjectImpl instance) => - { - 'id': instance.id, - 'name': instance.name, - 'images': instance.images.map((e) => e.toJson()).toList(), - 'externalUri': instance.externalUri, - }; - -_$PluginConfigurationImpl _$$PluginConfigurationImplFromJson(Map json) => - _$PluginConfigurationImpl( - name: json['name'] as String, - description: json['description'] as String, - version: json['version'] as String, - author: json['author'] as String, - entryPoint: json['entryPoint'] as String, - pluginApiVersion: json['pluginApiVersion'] as String, - apis: (json['apis'] as List?) - ?.map((e) => $enumDecode(_$PluginApisEnumMap, e)) - .toList() ?? - const [], - abilities: (json['abilities'] as List?) - ?.map((e) => $enumDecode(_$PluginAbilitiesEnumMap, e)) - .toList() ?? - const [], - repository: json['repository'] as String?, - ); - -Map _$$PluginConfigurationImplToJson( - _$PluginConfigurationImpl instance) => - { - 'name': instance.name, - 'description': instance.description, - 'version': instance.version, - 'author': instance.author, - 'entryPoint': instance.entryPoint, - 'pluginApiVersion': instance.pluginApiVersion, - 'apis': instance.apis.map((e) => _$PluginApisEnumMap[e]!).toList(), - 'abilities': - instance.abilities.map((e) => _$PluginAbilitiesEnumMap[e]!).toList(), - 'repository': instance.repository, - }; - -const _$PluginApisEnumMap = { - PluginApis.webview: 'webview', - PluginApis.localstorage: 'localstorage', - PluginApis.timezone: 'timezone', -}; - -const _$PluginAbilitiesEnumMap = { - PluginAbilities.authentication: 'authentication', - PluginAbilities.scrobbling: 'scrobbling', - PluginAbilities.metadata: 'metadata', - PluginAbilities.audioSource: 'audio-source', -}; - -_$PluginUpdateAvailableImpl _$$PluginUpdateAvailableImplFromJson(Map json) => - _$PluginUpdateAvailableImpl( - downloadUrl: json['downloadUrl'] as String, - version: json['version'] as String, - changelog: json['changelog'] as String?, - ); - -Map _$$PluginUpdateAvailableImplToJson( - _$PluginUpdateAvailableImpl instance) => - { - 'downloadUrl': instance.downloadUrl, - 'version': instance.version, - 'changelog': instance.changelog, - }; - _$MetadataPluginRepositoryImpl _$$MetadataPluginRepositoryImplFromJson( Map json) => _$MetadataPluginRepositoryImpl( diff --git a/lib/models/metadata/pagination.dart b/lib/models/metadata/pagination.dart index 093c1d2b..65c6029b 100644 --- a/lib/models/metadata/pagination.dart +++ b/lib/models/metadata/pagination.dart @@ -1,22 +1,78 @@ part of 'metadata.dart'; -@Freezed(genericArgumentFactories: true) -class SpotubePaginationResponseObject - with _$SpotubePaginationResponseObject { - factory SpotubePaginationResponseObject({ - required int limit, - required int? nextOffset, - required int total, - required bool hasMore, - required List items, - }) = _SpotubePaginationResponseObject; +class SpotubeFlattenedPaginationObject { + final int limit; + final int? nextOffset; + final int total; + final bool hasMore; + final List items; - factory SpotubePaginationResponseObject.fromJson( - Map json, - T Function(Map json) fromJsonT, - ) => - _$SpotubePaginationResponseObjectFromJson( - json, - (json) => fromJsonT(json as Map), - ); + SpotubeFlattenedPaginationObject({ + required this.limit, + required this.nextOffset, + required this.total, + required this.hasMore, + required this.items, + }); + + static SpotubeFlattenedPaginationObject from( + SpotubePaginationResponseObject response, + T Function(SpotubePaginationResponseObjectItem item) parse, + ) { + return SpotubeFlattenedPaginationObject( + limit: response.limit, + nextOffset: response.nextOffset, + total: response.total, + hasMore: response.hasMore, + items: response.items.map((item) => parse(item)).toList(growable: false), + ); + } + + SpotubeFlattenedPaginationObject copyWith({ + int? limit, + int? nextOffset, + int? total, + bool? hasMore, + List? items, + }) { + return SpotubeFlattenedPaginationObject( + limit: limit ?? this.limit, + nextOffset: nextOffset ?? this.nextOffset, + total: total ?? this.total, + hasMore: hasMore ?? this.hasMore, + items: items ?? this.items, + ); + } +} + +extension SpotubePaginationResponseObjectExtension + on SpotubePaginationResponseObject { + SpotubeFlattenedPaginationObject flatten() { + return SpotubeFlattenedPaginationObject.from( + this, + (item) => switch (T) { + SpotubeSimpleAlbumObject() => + (item as SpotubePaginationResponseObjectItem_AlbumSimple).field0 as T, + SpotubeFullAlbumObject() => + (item as SpotubePaginationResponseObjectItem_AlbumFull).field0 as T, + SpotubeSimpleArtistObject() => + (item as SpotubePaginationResponseObjectItem_ArtistSimple).field0 + as T, + SpotubeFullArtistObject() => + (item as SpotubePaginationResponseObjectItem_ArtistFull).field0 as T, + SpotubeTrackObject() => + (item as SpotubePaginationResponseObjectItem_Track).field0 as T, + SpotubeSimplePlaylistObject() => + (item as SpotubePaginationResponseObjectItem_PlaylistSimple).field0 + as T, + SpotubeFullPlaylistObject() => + (item as SpotubePaginationResponseObjectItem_PlaylistFull).field0 + as T, + SpotubeBrowseSectionObject() => + (item as SpotubePaginationResponseObjectItem_BrowseSection).field0 + as T, + _ => throw Exception("Unsupported type: $T"), + }, + ); + } } diff --git a/lib/models/metadata/playlist.dart b/lib/models/metadata/playlist.dart deleted file mode 100644 index 5bb8f1ae..00000000 --- a/lib/models/metadata/playlist.dart +++ /dev/null @@ -1,34 +0,0 @@ -part of 'metadata.dart'; - -@freezed -class SpotubeFullPlaylistObject with _$SpotubeFullPlaylistObject { - factory SpotubeFullPlaylistObject({ - required String id, - required String name, - required String description, - required String externalUri, - required SpotubeUserObject owner, - @Default([]) List images, - @Default([]) List collaborators, - @Default(false) bool collaborative, - @Default(false) bool public, - }) = _SpotubeFullPlaylistObject; - - factory SpotubeFullPlaylistObject.fromJson(Map json) => - _$SpotubeFullPlaylistObjectFromJson(json); -} - -@freezed -class SpotubeSimplePlaylistObject with _$SpotubeSimplePlaylistObject { - factory SpotubeSimplePlaylistObject({ - required String id, - required String name, - required String description, - required String externalUri, - required SpotubeUserObject owner, - @Default([]) List images, - }) = _SpotubeSimplePlaylistObject; - - factory SpotubeSimplePlaylistObject.fromJson(Map json) => - _$SpotubeSimplePlaylistObjectFromJson(json); -} diff --git a/lib/models/metadata/plugin.dart b/lib/models/metadata/plugin.dart deleted file mode 100644 index 6bc84160..00000000 --- a/lib/models/metadata/plugin.dart +++ /dev/null @@ -1,45 +0,0 @@ -part of 'metadata.dart'; - -enum PluginApis { webview, localstorage, timezone } - -enum PluginAbilities { - authentication, - scrobbling, - metadata, - @JsonValue('audio-source') - audioSource, -} - -@freezed -class PluginConfiguration with _$PluginConfiguration { - const PluginConfiguration._(); - - factory PluginConfiguration({ - required String name, - required String description, - required String version, - required String author, - required String entryPoint, - required String pluginApiVersion, - @Default([]) List apis, - @Default([]) List abilities, - String? repository, - }) = _PluginConfiguration; - - factory PluginConfiguration.fromJson(Map json) => - _$PluginConfigurationFromJson(json); - - String get slug => name.toLowerCase().replaceAll(RegExp(r'[^a-z0-9]+'), '-'); -} - -@freezed -class PluginUpdateAvailable with _$PluginUpdateAvailable { - factory PluginUpdateAvailable({ - required String downloadUrl, - required String version, - String? changelog, - }) = _PluginUpdateAvailable; - - factory PluginUpdateAvailable.fromJson(Map json) => - _$PluginUpdateAvailableFromJson(json); -} diff --git a/lib/models/metadata/search.dart b/lib/models/metadata/search.dart deleted file mode 100644 index b39f063a..00000000 --- a/lib/models/metadata/search.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'metadata.dart'; - -@freezed -class SpotubeSearchResponseObject with _$SpotubeSearchResponseObject { - factory SpotubeSearchResponseObject({ - required List albums, - required List artists, - required List playlists, - required List tracks, - }) = _SpotubeSearchResponseObject; - - factory SpotubeSearchResponseObject.fromJson(Map json) => - _$SpotubeSearchResponseObjectFromJson(json); -} diff --git a/lib/models/metadata/track.dart b/lib/models/metadata/track.dart index ecf7f0a2..f8df8b9d 100644 --- a/lib/models/metadata/track.dart +++ b/lib/models/metadata/track.dart @@ -1,94 +1,37 @@ part of 'metadata.dart'; -@freezed -class SpotubeTrackObject with _$SpotubeTrackObject { - factory SpotubeTrackObject.local({ - required String id, - required String name, - required String externalUri, - @Default([]) List artists, - required SpotubeSimpleAlbumObject album, - required int durationMs, - required String path, - }) = SpotubeLocalTrackObject; - - factory SpotubeTrackObject.full({ - required String id, - required String name, - required String externalUri, - @Default([]) List artists, - required SpotubeSimpleAlbumObject album, - required int durationMs, - required String isrc, - required bool explicit, - }) = SpotubeFullTrackObject; - - factory SpotubeTrackObject.localTrackFromFile( - File file, { - Metadata? metadata, - String? art, - }) { - return SpotubeLocalTrackObject( - id: file.absolute.path, - name: metadata?.title ?? basenameWithoutExtension(file.path), - externalUri: "file://${file.absolute.path}", - artists: metadata?.artist?.split(",").map((a) { - return SpotubeSimpleArtistObject( - id: a.trim(), - name: a.trim(), - externalUri: "file://${file.absolute.path}", - ); - }).toList() ?? - [ - SpotubeSimpleArtistObject( - id: "unknown", - name: "Unknown Artist", - externalUri: "file://${file.absolute.path}", - ), - ], - album: SpotubeSimpleAlbumObject( - albumType: SpotubeAlbumType.album, - id: metadata?.album ?? "unknown", - name: metadata?.album ?? "Unknown Album", - externalUri: "file://${file.absolute.path}", - artists: [ - SpotubeSimpleArtistObject( - id: metadata?.albumArtist ?? "unknown", - name: metadata?.albumArtist ?? "Unknown Artist", - externalUri: "file://${file.absolute.path}", - ), - ], - releaseDate: - metadata?.year != null ? "${metadata!.year}-01-01" : "1970-01-01", - images: [ - if (art != null) - SpotubeImageObject( - url: art, - width: 300, - height: 300, - ), - ], - ), - durationMs: metadata?.durationMs?.toInt() ?? 0, - path: file.path, - ); - } - - factory SpotubeTrackObject.fromJson(Map json) => - _$SpotubeTrackObjectFromJson( - json.containsKey("path") - ? {...json, "runtimeType": "local"} - : {...json, "runtimeType": "full"}, - ); -} - extension AsMediaListSpotubeTrackObject on Iterable { List asMediaList() { return map((track) => SpotubeMedia(track)).toList(); } } -extension ToMetadataSpotubeFullTrackObject on SpotubeFullTrackObject { +extension FullAsPartialSpotubeTrackObject on Iterable? { + List? union() { + return this?.map((track) => SpotubeTrackObject.full(track)).toList(); + } +} + +extension FullAsSpotubeTrackObject on Iterable { + List union() { + return map((track) => SpotubeTrackObject.full(track)).toList(); + } +} + +extension LocalAsPartialSpotubeTrackObject + on Iterable? { + List? union() { + return this?.map((track) => SpotubeTrackObject.local(track)).toList(); + } +} + +extension LocalAsSpotubeTrackObject on Iterable { + List union() { + return map((track) => SpotubeTrackObject.local(track)).toList(); + } +} + +extension ToMetadataSpotubeFullTrackObject on SpotubeTrackObject { Metadata toMetadata({ required int fileLength, Uint8List? imageBytes, @@ -117,3 +60,91 @@ extension ToMetadataSpotubeFullTrackObject on SpotubeFullTrackObject { ); } } + +extension CommonTrackProperties on SpotubeTrackObject { + String get id => when( + full: (track) => track.id, + local: (track) => track.id, + ); + + String get name => when( + full: (track) => track.name, + local: (track) => track.name, + ); + + String get externalUri => when( + full: (track) => track.externalUri, + local: (track) => track.externalUri, + ); + + int get durationMs => when( + full: (track) => track.durationMs, + local: (track) => track.durationMs, + ); + + SpotubeSimpleAlbumObject get album => when( + full: (track) => track.album, + local: (track) => track.album, + ); + List get artists => when( + full: (track) => track.artists, + local: (track) => track.artists, + ); +} + +SpotubeLocalTrackObject localTrackFromFile( + File file, { + Metadata? metadata, + String? art, +}) { + return SpotubeLocalTrackObject( + typeName: "track_local", + id: file.absolute.path, + name: metadata?.title ?? basenameWithoutExtension(file.path), + externalUri: "file://${file.absolute.path}", + artists: metadata?.artist?.split(",").map((a) { + return SpotubeSimpleArtistObject( + typeName: "artist_simple", + id: a.trim(), + name: a.trim(), + externalUri: "file://${file.absolute.path}", + ); + }).toList() ?? + [ + SpotubeSimpleArtistObject( + typeName: "artist_simple", + id: "unknown", + name: "Unknown Artist", + externalUri: "file://${file.absolute.path}", + ), + ], + album: SpotubeSimpleAlbumObject( + typeName: "album_simple", + albumType: SpotubeAlbumType.album, + id: metadata?.album ?? "unknown", + name: metadata?.album ?? "Unknown Album", + externalUri: "file://${file.absolute.path}", + artists: [ + SpotubeSimpleArtistObject( + typeName: "artist_simple", + id: metadata?.albumArtist ?? "unknown", + name: metadata?.albumArtist ?? "Unknown Artist", + externalUri: "file://${file.absolute.path}", + ), + ], + releaseDate: + metadata?.year != null ? "${metadata!.year}-01-01" : "1970-01-01", + images: [ + if (art != null) + SpotubeImageObject( + typeName: "image", + url: art, + width: 300, + height: 300, + ), + ], + ), + durationMs: metadata?.durationMs?.toInt() ?? 0, + path: file.path, + ); +} diff --git a/lib/models/metadata/user.dart b/lib/models/metadata/user.dart deleted file mode 100644 index cd041f9c..00000000 --- a/lib/models/metadata/user.dart +++ /dev/null @@ -1,14 +0,0 @@ -part of 'metadata.dart'; - -@freezed -class SpotubeUserObject with _$SpotubeUserObject { - factory SpotubeUserObject({ - required final String id, - required final String name, - @Default([]) final List images, - required final String externalUri, - }) = _SpotubeUserObject; - - factory SpotubeUserObject.fromJson(Map json) => - _$SpotubeUserObjectFromJson(json); -} diff --git a/lib/models/playback/track_sources.g.dart b/lib/models/playback/track_sources.g.dart index 3088493a..d3c1796e 100644 --- a/lib/models/playback/track_sources.g.dart +++ b/lib/models/playback/track_sources.g.dart @@ -7,7 +7,7 @@ part of 'track_sources.dart'; // ************************************************************************** BasicSourcedTrack _$BasicSourcedTrackFromJson(Map json) => BasicSourcedTrack( - query: SpotubeFullTrackObject.fromJson( + query: SpotubeTrackObject.fromJson( Map.from(json['query'] as Map)), source: json['source'] as String, info: SpotubeAudioSourceMatchObject.fromJson( diff --git a/lib/modules/album/album_card.dart b/lib/modules/album/album_card.dart index 80dfd55b..0da933f6 100644 --- a/lib/modules/album/album_card.dart +++ b/lib/modules/album/album_card.dart @@ -88,12 +88,12 @@ class AlbumCard extends HookConsumerWidget { final remotePlayback = ref.read(connectProvider.notifier); await remotePlayback.load( WebSocketLoadEventData.album( - tracks: fetchedTracks, + tracks: fetchedTracks.union(), collection: album, ), ); } else { - await playlistNotifier.load(fetchedTracks, autoPlay: true); + await playlistNotifier.load(fetchedTracks.union(), autoPlay: true); playlistNotifier.addCollection(album.id); historyNotifier.addAlbums([album]); } @@ -123,7 +123,9 @@ class AlbumCard extends HookConsumerWidget { final fetchedTracks = await fetchAllTrack(); if (fetchedTracks.isEmpty) return; - playlistNotifier.addTracks(fetchedTracks); + playlistNotifier.addTracks( + fetchedTracks.union(), + ); playlistNotifier.addCollection(album.id); historyNotifier.addAlbums([album]); if (context.mounted) { diff --git a/lib/modules/metadata_plugins/installed_plugin.dart b/lib/modules/metadata_plugins/installed_plugin.dart index 7abda5ec..a5108af4 100644 --- a/lib/modules/metadata_plugins/installed_plugin.dart +++ b/lib/modules/metadata_plugins/installed_plugin.dart @@ -14,8 +14,8 @@ import 'package:spotube/provider/metadata_plugin/updater/update_checker.dart'; import 'package:url_launcher/url_launcher.dart'; final validAbilities = { - PluginAbilities.metadata: ("Metadata", SpotubeIcons.album), - PluginAbilities.audioSource: ("Audio Source", SpotubeIcons.music), + PluginAbility.metadata: ("Metadata", SpotubeIcons.album), + PluginAbility.audioSource: ("Audio Source", SpotubeIcons.music), }; class MetadataInstalledPluginItem extends HookConsumerWidget { @@ -44,9 +44,9 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { final pluginsNotifier = ref.watch(metadataPluginsProvider.notifier); final requiresAuth = (isDefaultMetadata || isDefaultAudioSource) && - plugin.abilities.contains(PluginAbilities.authentication); + plugin.abilities.contains(PluginAbility.authentication); final supportsScrobbling = isDefaultMetadata && - plugin.abilities.contains(PluginAbilities.scrobbling); + plugin.abilities.contains(PluginAbility.scrobbling); final isMetadataAuthenticatedSnapshot = ref.watch(metadataPluginAuthenticatedProvider); @@ -253,7 +253,7 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { spacing: 8, runSpacing: 8, children: [ - if (plugin.abilities.contains(PluginAbilities.metadata)) + if (plugin.abilities.contains(PluginAbility.metadata)) Button.secondary( enabled: !isDefaultMetadata, onPressed: () async { @@ -265,7 +265,7 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { : context.l10n.set_default_metadata_source, ), ), - if (plugin.abilities.contains(PluginAbilities.audioSource)) + if (plugin.abilities.contains(PluginAbility.audioSource)) Button.secondary( enabled: !isDefaultAudioSource, onPressed: () async { @@ -378,8 +378,13 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { !isAuthenticated) Button.primary( onPressed: () async { - await pluginSnapshot?.asData?.value?.auth - .authenticate(); + if ((pluginSnapshot?.hasValue ?? false) == false) { + return; + } + + await pluginSnapshot!.value!.auth.authenticate( + mpscTx: pluginSnapshot.value!.sender, + ); }, leading: const Icon(SpotubeIcons.login), child: Text(context.l10n.login), @@ -389,7 +394,13 @@ class MetadataInstalledPluginItem extends HookConsumerWidget { isAuthenticated) Button.destructive( onPressed: () async { - await pluginSnapshot?.asData?.value?.auth.logout(); + if ((pluginSnapshot?.hasValue ?? false) == false) { + return; + } + + await pluginSnapshot!.value!.auth.logout( + mpscTx: pluginSnapshot.value!.sender, + ); }, leading: const Icon(SpotubeIcons.logout), child: Text(context.l10n.logout), diff --git a/lib/modules/player/player.dart b/lib/modules/player/player.dart index 5ea690e0..655169a0 100644 --- a/lib/modules/player/player.dart +++ b/lib/modules/player/player.dart @@ -123,7 +123,7 @@ class PlayerView extends HookConsumerWidget { context: context, builder: (context) { return TrackDetailsDialog( - track: currentActiveTrack + track: currentActiveTrack?.field0 as SpotubeFullTrackObject, ); }); @@ -180,7 +180,7 @@ class PlayerView extends HookConsumerWidget { ), if (isLocalTrack) Text( - currentActiveTrack.artists.asString(), + currentActiveTrack?.artists.asString() ?? "", style: theme.typography.normal .copyWith(fontWeight: FontWeight.bold), ) diff --git a/lib/modules/player/player_actions.dart b/lib/modules/player/player_actions.dart index 9f8639ec..fd7b7525 100644 --- a/lib/modules/player/player_actions.dart +++ b/lib/modules/player/player_actions.dart @@ -38,11 +38,12 @@ class PlayerActions extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final playlist = ref.watch(audioPlayerProvider); - final isLocalTrack = playlist.activeTrack is SpotubeLocalTrackObject; + final isLocalTrack = + playlist.activeTrack?.field0 is SpotubeLocalTrackObject; ref.watch(downloadManagerProvider); final downloader = ref.watch(downloadManagerProvider.notifier); final isInQueue = useMemoized(() { - if (playlist.activeTrack is! SpotubeFullTrackObject) return false; + if (playlist.activeTrack is! SpotubeTrackObject) return false; final downloadTask = downloader.getTaskByTrackId(playlist.activeTrack!.id); return const [ @@ -172,16 +173,19 @@ class PlayerActions extends HookConsumerWidget { icon: Icon( isDownloaded ? SpotubeIcons.done : SpotubeIcons.download, ), - onPressed: playlist.activeTrack != null + onPressed: playlist.activeTrack != null && !isLocalTrack ? () => downloader.addToQueue( - playlist.activeTrack! as SpotubeFullTrackObject) + playlist.activeTrack?.field0 + as SpotubeFullTrackObject, + ) : null, ), ), if (playlist.activeTrack != null && !isLocalTrack && authenticated.asData?.value == true) - TrackHeartButton(track: playlist.activeTrack!), + TrackHeartButton( + track: playlist.activeTrack?.field0 as SpotubeFullTrackObject), AdaptivePopSheetList( tooltip: context.l10n.sleep_timer, offset: Offset(0, -50 * (sleepTimerEntries.values.length + 2)), diff --git a/lib/modules/player/sibling_tracks_sheet.dart b/lib/modules/player/sibling_tracks_sheet.dart index b9bd7631..56a05413 100644 --- a/lib/modules/player/sibling_tracks_sheet.dart +++ b/lib/modules/player/sibling_tracks_sheet.dart @@ -26,14 +26,14 @@ class SiblingTracksSheet extends HookConsumerWidget { final activeTrack = ref.watch(audioPlayerProvider.select((e) => e.activeTrack)); - if (activeTrack == null || activeTrack is! SpotubeFullTrackObject) { + if (activeTrack is! SpotubeTrackObject_Full) { return const SafeArea(child: NotFound()); } return HookBuilder(builder: (context) { - final sourcedTrack = ref.watch(sourcedTrackProvider(activeTrack)); + final sourcedTrack = ref.watch(sourcedTrackProvider(activeTrack.field0)); final sourcedTrackNotifier = - ref.watch(sourcedTrackProvider(activeTrack).notifier); + ref.watch(sourcedTrackProvider(activeTrack.field0).notifier); final siblings = useMemoized>( () => !sourcedTrack.isLoading @@ -112,8 +112,10 @@ class SiblingTracksSheet extends HookConsumerWidget { width: 60, ) : null, - trailing: - Text(sourceInfo.duration.toHumanReadableString()), + trailing: Text( + Duration(milliseconds: sourceInfo.duration) + .toHumanReadableString(), + ), subtitle: Text( sourceInfo.artists.join(", "), maxLines: 1, diff --git a/lib/modules/playlist/playlist_card.dart b/lib/modules/playlist/playlist_card.dart index 1d221a33..6d139dfe 100644 --- a/lib/modules/playlist/playlist_card.dart +++ b/lib/modules/playlist/playlist_card.dart @@ -98,19 +98,23 @@ class PlaylistCard extends HookConsumerWidget { final allTracks = await fetchAllTracks(); await remotePlayback.load( WebSocketLoadEventData.playlist( - tracks: allTracks, + tracks: allTracks.union(), collection: playlist, ), ); } else { - await playlistNotifier.load(fetchedInitialTracks, autoPlay: true); + await playlistNotifier.load( + fetchedInitialTracks.union(), + autoPlay: true, + ); playlistNotifier.addCollection(playlist.id); historyNotifier.addPlaylists([playlist]); final allTracks = await fetchAllTracks(); - await playlistNotifier - .addTracks(allTracks.sublist(fetchedInitialTracks.length)); + await playlistNotifier.addTracks( + allTracks.sublist(fetchedInitialTracks.length).union(), + ); } } finally { if (context.mounted) { @@ -142,7 +146,9 @@ class PlaylistCard extends HookConsumerWidget { if (fetchedInitialTracks.isEmpty) return; - playlistNotifier.addTracks(fetchedInitialTracks); + playlistNotifier.addTracks( + fetchedInitialTracks.union(), + ); playlistNotifier.addCollection(playlist.id); historyNotifier.addPlaylists([playlist]); if (context.mounted) { diff --git a/lib/modules/search/sections/tracks.dart b/lib/modules/search/sections/tracks.dart index 6bc60045..1b80e9ed 100644 --- a/lib/modules/search/sections/tracks.dart +++ b/lib/modules/search/sections/tracks.dart @@ -7,10 +7,12 @@ import 'package:spotube/components/dialogs/select_device_dialog.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/connect/connect.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/pages/search/search.dart'; import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/metadata_plugin/search/all.dart'; +import 'package:spotube/src/rust/api/plugin/models/track.dart'; class SearchTracksSection extends HookConsumerWidget { const SearchTracksSection({ @@ -41,7 +43,8 @@ class SearchTracksSection extends HookConsumerWidget { if (search.isLoading) const CircularProgressIndicator() else - ...tracks.mapIndexed((i, track) { + ...tracks.mapIndexed((i, mehTrack) { + final track = SpotubeTrackObject.full(mehTrack); return TrackTile( index: i, track: track, diff --git a/lib/pages/album/album.dart b/lib/pages/album/album.dart index 049d8023..0ce8ea1d 100644 --- a/lib/pages/album/album.dart +++ b/lib/pages/album/album.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart' as material; import 'package:auto_route/auto_route.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; @@ -31,6 +32,10 @@ class AlbumPage extends HookConsumerWidget { ref.watch(metadataPluginSavedAlbumsProvider.notifier); final isSavedAlbum = ref.watch(metadataPluginIsSavedAlbumProvider(album.id)); + final tracksUnion = useMemoized( + () => tracks.asData?.value.items.union() ?? [], + [tracks.asData?.value.items], + ); return material.RefreshIndicator.adaptive( onRefresh: () async { @@ -47,7 +52,7 @@ class AlbumPage extends HookConsumerWidget { title: album.name, description: "${context.l10n.released} • ${album.releaseDate} • ${album.artists.first.name}", - tracks: tracks.asData?.value.items ?? [], + tracks: tracksUnion, error: tracks.error, pagination: PaginationProps( hasNextPage: tracks.asData?.value.hasMore ?? false, @@ -56,7 +61,9 @@ class AlbumPage extends HookConsumerWidget { await tracksNotifier.fetchMore(); }, onFetchAll: () async { - return tracksNotifier.fetchAll(); + final res = await tracksNotifier.fetchAll(); + + return res.union(); }, onRefresh: () async { ref.invalidate(metadataPluginAlbumTracksProvider(album.id)); diff --git a/lib/pages/artist/section/top_tracks.dart b/lib/pages/artist/section/top_tracks.dart index 30745a01..07249aa0 100644 --- a/lib/pages/artist/section/top_tracks.dart +++ b/lib/pages/artist/section/top_tracks.dart @@ -44,7 +44,7 @@ class ArtistPageTopTracks extends HookConsumerWidget { List.generate(10, (index) => FakeData.track); void playPlaylist( - List tracks, { + List tracks, { SpotubeTrackObject? currentTrack, }) async { isLoading.value = true; diff --git a/lib/pages/home/sections/section_items.dart b/lib/pages/home/sections/section_items.dart index 89666d26..e2beea24 100644 --- a/lib/pages/home/sections/section_items.dart +++ b/lib/pages/home/sections/section_items.dart @@ -28,7 +28,7 @@ class HomeBrowseSectionItemsPage extends HookConsumerWidget { static const name = "home_browse_section_items"; final String sectionId; - final SpotubeBrowseSectionObject section; + final SpotubeBrowseSectionObject section; const HomeBrowseSectionItemsPage({ super.key, @PathParam("sectionId") required this.sectionId, diff --git a/lib/pages/library/user_local_tracks/local_folder.dart b/lib/pages/library/user_local_tracks/local_folder.dart index 523097e1..a01263bc 100644 --- a/lib/pages/library/user_local_tracks/local_folder.dart +++ b/lib/pages/library/user_local_tracks/local_folder.dart @@ -55,17 +55,17 @@ class LocalLibraryPage extends HookConsumerWidget { final playlist = ref.read(audioPlayerProvider); final playback = ref.read(audioPlayerProvider.notifier); currentTrack ??= tracks.first; - final isPlaylistPlaying = playlist.containsTracks(tracks); + final isPlaylistPlaying = playlist.containsTracks(tracks.union()); if (!isPlaylistPlaying) { var indexWhere = tracks.indexWhere((s) => s.id == currentTrack?.id); await playback.load( - tracks, + tracks.union(), initialIndex: indexWhere, autoPlay: true, ); } else if (isPlaylistPlaying && currentTrack.id != playlist.activeTrack?.id) { - await playback.jumpToTrack(currentTrack); + await playback.jumpToTrack(SpotubeTrackObject.local(currentTrack)); } } @@ -75,12 +75,12 @@ class LocalLibraryPage extends HookConsumerWidget { ) async { final playlist = ref.read(audioPlayerProvider); final playback = ref.read(audioPlayerProvider.notifier); - final isPlaylistPlaying = playlist.containsTracks(tracks); + final isPlaylistPlaying = playlist.containsTracks(tracks.union()); final shuffledTracks = tracks.shuffled(); if (isPlaylistPlaying) return; await playback.load( - shuffledTracks, + shuffledTracks.union(), initialIndex: 0, autoPlay: true, ); @@ -93,9 +93,9 @@ class LocalLibraryPage extends HookConsumerWidget { ) async { final playlist = ref.read(audioPlayerProvider); final playback = ref.read(audioPlayerProvider.notifier); - final isPlaylistPlaying = playlist.containsTracks(tracks); + final isPlaylistPlaying = playlist.containsTracks(tracks.union()); if (isPlaylistPlaying) return; - await playback.addTracks(tracks); + await playback.addTracks(tracks.union()); if (!context.mounted) return; showToastForAction(context, "add-to-queue", tracks.length); } @@ -109,7 +109,7 @@ class LocalLibraryPage extends HookConsumerWidget { final trackSnapshot = ref.watch(localTracksProvider); final isPlaylistPlaying = useMemoized( () => playlist.containsTracks( - trackSnapshot.asData?.value[location] ?? [], + trackSnapshot.asData?.value[location]?.union() ?? [], ), [playlist, trackSnapshot, location], ); @@ -382,7 +382,7 @@ class LocalLibraryPage extends HookConsumerWidget { data: (tracks) { final sortedTracks = useMemoized(() { return ServiceUtils.sortTracks( - tracks[location] ?? [], + tracks[location]?.union() ?? [], sortBy.value); }, [sortBy.value, tracks]); @@ -463,8 +463,12 @@ class LocalLibraryPage extends HookConsumerWidget { onTap: () async { await playLocalTracks( ref, - sortedTracks, - currentTrack: track, + sortedTracks + .map((e) => e.field0 + as SpotubeLocalTrackObject) + .toList(), + currentTrack: track.field0 + as SpotubeLocalTrackObject, ); }, ); diff --git a/lib/pages/library/user_playlists.dart b/lib/pages/library/user_playlists.dart index 740bc947..25dc404d 100644 --- a/lib/pages/library/user_playlists.dart +++ b/lib/pages/library/user_playlists.dart @@ -43,6 +43,7 @@ class UserPlaylistsPage extends HookConsumerWidget { () => me.asData?.value == null ? null : SpotubeSimplePlaylistObject( + typeName: "playlist_simple", id: "user-liked-tracks", name: context.l10n.liked_tracks, description: context.l10n.liked_tracks_description, @@ -50,6 +51,7 @@ class UserPlaylistsPage extends HookConsumerWidget { owner: me.asData!.value!, images: [ SpotubeImageObject( + typeName: "image", url: Assets.images.likedTracks.path, width: 300, height: 300, diff --git a/lib/pages/lyrics/mini_lyrics.dart b/lib/pages/lyrics/mini_lyrics.dart index 553213c8..09713ef5 100644 --- a/lib/pages/lyrics/mini_lyrics.dart +++ b/lib/pages/lyrics/mini_lyrics.dart @@ -2,10 +2,11 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:palette_generator/palette_generator.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/modules/player/player_controls.dart'; import 'package:spotube/modules/player/player_queue.dart'; import 'package:spotube/extensions/context.dart'; diff --git a/lib/pages/playlist/liked_playlist.dart b/lib/pages/playlist/liked_playlist.dart index 3897acef..bd008ecb 100644 --- a/lib/pages/playlist/liked_playlist.dart +++ b/lib/pages/playlist/liked_playlist.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart' as material; import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; @@ -25,7 +26,9 @@ class LikedPlaylistPage extends HookConsumerWidget { final likedTracks = ref.watch(metadataPluginSavedTracksProvider); final likedTracksNotifier = ref.watch(metadataPluginSavedTracksProvider.notifier); - final tracks = likedTracks.asData?.value.items ?? []; + final tracks = useMemoized( + () => likedTracks.asData?.value.items.union() ?? [], + [likedTracks.asData?.value]); return material.RefreshIndicator.adaptive( onRefresh: () async { @@ -42,7 +45,9 @@ class LikedPlaylistPage extends HookConsumerWidget { await likedTracksNotifier.fetchMore(); }, onFetchAll: () async { - return await likedTracksNotifier.fetchAll(); + final res = await likedTracksNotifier.fetchAll(); + + return res.union(); }, onRefresh: () async { ref.invalidate(metadataPluginSavedTracksProvider); diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index 4aca5945..7b33d94f 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart' as material; import 'package:collection/collection.dart'; import 'package:flutter/material.dart' hide Page; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/components/dialogs/prompt_dialog.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; @@ -50,6 +51,10 @@ class PlaylistPage extends HookConsumerWidget { ref.watch(metadataPluginSavedPlaylistsProvider.notifier); final isUserPlaylist = useIsUserPlaylist(ref, playlist.id); + final tracksMemoized = useMemoized( + () => tracks.asData?.value.items.union() ?? [], + [tracks.asData?.value], + ); return material.RefreshIndicator.adaptive( onRefresh: () async { @@ -71,14 +76,15 @@ class PlaylistPage extends HookConsumerWidget { ref.invalidate(metadataPluginPlaylistTracksProvider(playlist.id)); }, onFetchAll: () async { - return await tracksNotifier.fetchAll(); + final res = await tracksNotifier.fetchAll(); + return res.union(); }, ), title: playlist.name, description: playlist.description, owner: playlist.owner.name, ownerImage: playlist.owner.images.lastOrNull?.url, - tracks: tracks.asData?.value.items ?? [], + tracks: tracksMemoized, error: tracks.error, routePath: '/playlist/${playlist.id}', isLiked: isFavoritePlaylist.asData?.value ?? false, diff --git a/lib/pages/search/tabs/tracks.dart b/lib/pages/search/tabs/tracks.dart index e4c56891..c35a4ff4 100644 --- a/lib/pages/search/tabs/tracks.dart +++ b/lib/pages/search/tabs/tracks.dart @@ -8,6 +8,7 @@ import 'package:spotube/components/fallbacks/error_box.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/connect/connect.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/modules/search/loading.dart'; import 'package:spotube/pages/search/search.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; diff --git a/lib/pages/settings/metadata_plugins.dart b/lib/pages/settings/metadata_plugins.dart index d4cb1ecf..8926ec52 100644 --- a/lib/pages/settings/metadata_plugins.dart +++ b/lib/pages/settings/metadata_plugins.dart @@ -82,8 +82,8 @@ class SettingsMetadataProviderPage extends HookConsumerWidget { return plugins.asData?.value.plugins.where((d) { return d.abilities.contains( tabState.value == 1 - ? PluginAbilities.metadata - : PluginAbilities.audioSource, + ? PluginAbility.metadata + : PluginAbility.audioSource, ); }).toList(); }, [tabState.value, plugins.asData?.value]); diff --git a/lib/pages/stats/minutes/minutes.dart b/lib/pages/stats/minutes/minutes.dart index a6c95992..c90844f7 100644 --- a/lib/pages/stats/minutes/minutes.dart +++ b/lib/pages/stats/minutes/minutes.dart @@ -3,6 +3,7 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/extensions/context.dart'; diff --git a/lib/pages/track/track.dart b/lib/pages/track/track.dart index 44453ebd..6cfc468e 100644 --- a/lib/pages/track/track.dart +++ b/lib/pages/track/track.dart @@ -44,7 +44,8 @@ class TrackPage extends HookConsumerWidget { final trackQuery = ref.watch(metadataPluginTrackProvider(trackId)); - final track = trackQuery.asData?.value ?? FakeData.track; + final track = SpotubeTrackObject.full(trackQuery.asData?.value ?? + FakeData.track.field0 as SpotubeFullTrackObject); void onPlay() async { if (isActive) { @@ -230,7 +231,10 @@ class TrackPage extends HookConsumerWidget { const Spacer() else const Gap(20), - TrackHeartButton(track: track), + TrackHeartButton( + track: track.field0 + as SpotubeFullTrackObject, + ), TrackOptionsButton( track: track, userPlaylist: false, diff --git a/lib/provider/audio_player/audio_player.dart b/lib/provider/audio_player/audio_player.dart index 66878714..6c80b2c5 100644 --- a/lib/provider/audio_player/audio_player.dart +++ b/lib/provider/audio_player/audio_player.dart @@ -22,16 +22,16 @@ class AudioPlayerNotifier extends Notifier { assert( tracks.every( (track) => - track is SpotubeFullTrackObject || track is SpotubeLocalTrackObject, + track is SpotubeTrackObject || track is SpotubeLocalTrackObject, ), - 'All tracks must be either SpotubeFullTrackObject or SpotubeLocalTrackObject', + 'All tracks must be either SpotubeTrackObject or SpotubeLocalTrackObject', ); } void _assertAllowedTrack(SpotubeTrackObject tracks) { assert( - tracks is SpotubeFullTrackObject || tracks is SpotubeLocalTrackObject, - 'Track must be either SpotubeFullTrackObject or SpotubeLocalTrackObject', + tracks is SpotubeTrackObject || tracks is SpotubeLocalTrackObject, + 'Track must be either SpotubeTrackObject or SpotubeLocalTrackObject', ); } @@ -345,9 +345,12 @@ class AudioPlayerNotifier extends Notifier { return false; } - return a is SpotubeLocalTrackObject && b is SpotubeLocalTrackObject - ? a.path == b.path - : a.id == b.id; + return switch ((a.field0, b.field0)) { + (SpotubeLocalTrackObject(), SpotubeLocalTrackObject()) => + (a.field0 as SpotubeLocalTrackObject).path == + (b.field0 as SpotubeLocalTrackObject).path, + _ => a.id == b.id, + }; } Future load( @@ -366,12 +369,10 @@ class AudioPlayerNotifier extends Notifier { // Giving the initial track a boost so MediaKit won't skip // because of timeout final intendedActiveTrack = medias.elementAt(initialIndex); - if (intendedActiveTrack.track is! SpotubeLocalTrackObject) { - ref.read( - sourcedTrackProvider( - intendedActiveTrack.track as SpotubeFullTrackObject, - ).future, - ); + if (intendedActiveTrack.track is SpotubeTrackObject_Full) { + ref.read(sourcedTrackProvider( + intendedActiveTrack.track.field0 as SpotubeFullTrackObject) + .future); } if (medias.isEmpty) return; @@ -398,7 +399,7 @@ class AudioPlayerNotifier extends Notifier { } Future swapActiveSource() async { - if (state.tracks.isEmpty || state.activeTrack is! SpotubeFullTrackObject) { + if (state.tracks.isEmpty || state.activeTrack is! SpotubeTrackObject) { return; } diff --git a/lib/provider/audio_player/audio_player_streams.dart b/lib/provider/audio_player/audio_player_streams.dart index eff13134..baee08a0 100644 --- a/lib/provider/audio_player/audio_player_streams.dart +++ b/lib/provider/audio_player/audio_player_streams.dart @@ -103,7 +103,8 @@ class AudioPlayerStreamListeners { return; } - scrobbler.scrobble(audioPlayerState.activeTrack!); + scrobbler.scrobble( + audioPlayerState.activeTrack!.field0 as SpotubeFullTrackObject); ref .read(metadataPluginScrobbleProvider.notifier) .scrobble(audioPlayerState.activeTrack!); @@ -115,13 +116,28 @@ class AudioPlayerStreamListeners { if (activeTrack.artists.any((a) => a.images == null)) { final metadataPlugin = await ref.read(metadataPluginProvider.future); final artists = await Future.wait( - activeTrack.artists - .map((artist) => metadataPlugin!.artist.getArtist(artist.id)), + activeTrack.artists.map( + (artist) => metadataPlugin!.artist.getArtist( + id: artist.id, + mpscTx: metadataPlugin.sender, + ), + ), ); - activeTrack = activeTrack.copyWith( - artists: artists - .map((e) => SpotubeSimpleArtistObject.fromJson(e.toJson())) - .toList(), + activeTrack = activeTrack.when( + full: (field0) => SpotubeTrackObject.full( + field0.copyWith( + artists: artists + .map((e) => SpotubeSimpleArtistObject.fromJson(e.toJson())) + .toList(), + ), + ), + local: (field0) => SpotubeTrackObject.local( + field0.copyWith( + artists: artists + .map((e) => SpotubeSimpleArtistObject.fromJson(e.toJson())) + .toList(), + ), + ), ); } @@ -155,7 +171,8 @@ class AudioPlayerStreamListeners { try { await ref.read( - sourcedTrackProvider(nextTrack as SpotubeFullTrackObject).future, + sourcedTrackProvider(nextTrack.field0 as SpotubeFullTrackObject) + .future, ); } finally { lastTrack = nextTrack.id; diff --git a/lib/provider/audio_player/querying_track_info.dart b/lib/provider/audio_player/querying_track_info.dart index 06e9653c..d9aa713a 100644 --- a/lib/provider/audio_player/querying_track_info.dart +++ b/lib/provider/audio_player/querying_track_info.dart @@ -10,14 +10,14 @@ final queryingTrackInfoProvider = Provider((ref) { return false; } - if (audioPlayer.activeTrack is! SpotubeFullTrackObject) { + if (audioPlayer.activeTrack is! SpotubeTrackObject_Full) { return false; } return ref .watch( sourcedTrackProvider( - audioPlayer.activeTrack! as SpotubeFullTrackObject), + audioPlayer.activeTrack?.field0 as SpotubeFullTrackObject), ) .isLoading; }); diff --git a/lib/provider/audio_player/state.dart b/lib/provider/audio_player/state.dart index d62155f3..31f21e41 100644 --- a/lib/provider/audio_player/state.dart +++ b/lib/provider/audio_player/state.dart @@ -27,9 +27,8 @@ class AudioPlayerState with _$AudioPlayerState { List tracks = const [], }) { assert( - tracks.every((track) => - track is SpotubeFullTrackObject || track is SpotubeLocalTrackObject), - 'All tracks must be either SpotubeFullTrackObject or SpotubeLocalTrackObject', + tracks.every((track) => track is SpotubeTrackObject_Local), + 'All tracks must be either SpotubeTrackObject or SpotubeLocalTrackObject', ); return AudioPlayerState._inner( @@ -53,10 +52,12 @@ class AudioPlayerState with _$AudioPlayerState { bool containsTrack(SpotubeTrackObject track) { return tracks.isNotEmpty && tracks.any( - (t) => - t is SpotubeLocalTrackObject && track is SpotubeLocalTrackObject - ? t.path == track.path - : t.id == track.id, + (t) => switch ((t.field0, track.field0)) { + (SpotubeLocalTrackObject(), SpotubeLocalTrackObject()) => + (t.field0 as SpotubeLocalTrackObject).path == + (track.field0 as SpotubeLocalTrackObject).path, + _ => t.id == track.id, + }, ); } diff --git a/lib/provider/connect/connect.dart b/lib/provider/connect/connect.dart index 268b6567..49dfd71d 100644 --- a/lib/provider/connect/connect.dart +++ b/lib/provider/connect/connect.dart @@ -208,7 +208,7 @@ class ConnectNotifier extends AsyncNotifier { emit(WebSocketLoopEvent(value)); } - Future addTrack(SpotubeFullTrackObject data) async { + Future addTrack(SpotubeTrackObject data) async { emit(WebSocketAddTrackEvent(data)); } diff --git a/lib/provider/download_manager_provider.dart b/lib/provider/download_manager_provider.dart index 0ca99ec1..b7262a3e 100644 --- a/lib/provider/download_manager_provider.dart +++ b/lib/provider/download_manager_provider.dart @@ -249,7 +249,7 @@ class DownloadManagerNotifier extends Notifier> { ); await MetadataGod.writeMetadata( file: savePath, - metadata: task.track.toMetadata( + metadata: SpotubeTrackObject.full(task.track).toMetadata( fileLength: await savePathFile.length(), imageBytes: imageBytes, ), diff --git a/lib/provider/history/top/albums.dart b/lib/provider/history/top/albums.dart index 1caad5cd..1ab21afa 100644 --- a/lib/provider/history/top/albums.dart +++ b/lib/provider/history/top/albums.dart @@ -69,7 +69,7 @@ class HistoryTopAlbumsNotifier extends FamilyPaginatedAsyncNotifier< final items = getAlbumsWithCount(await albumsQuery.get()); - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( items: items, limit: limit, hasMore: items.length == limit, @@ -110,7 +110,7 @@ class HistoryTopAlbumsNotifier extends FamilyPaginatedAsyncNotifier< final historyTopAlbumsProvider = AsyncNotifierProviderFamily< HistoryTopAlbumsNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, HistoryDuration>( () => HistoryTopAlbumsNotifier(), ); diff --git a/lib/provider/history/top/playlists.dart b/lib/provider/history/top/playlists.dart index 1beabb80..c6285808 100644 --- a/lib/provider/history/top/playlists.dart +++ b/lib/provider/history/top/playlists.dart @@ -36,7 +36,7 @@ class HistoryTopPlaylistsNotifier extends FamilyPaginatedAsyncNotifier< final items = getPlaylistsWithCount(await playlistsQuery.get()); - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( items: items, nextOffset: offset + limit, total: items.length, @@ -80,7 +80,7 @@ class HistoryTopPlaylistsNotifier extends FamilyPaginatedAsyncNotifier< final historyTopPlaylistsProvider = AsyncNotifierProviderFamily< HistoryTopPlaylistsNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, HistoryDuration>( () => HistoryTopPlaylistsNotifier(), ); diff --git a/lib/provider/history/top/tracks.dart b/lib/provider/history/top/tracks.dart index 5c1dbdbf..bd304bb7 100644 --- a/lib/provider/history/top/tracks.dart +++ b/lib/provider/history/top/tracks.dart @@ -81,9 +81,12 @@ class HistoryTopTracksNotifier extends FamilyPaginatedAsyncNotifier< .nonNulls .toList(); - track = track.copyWith(artists: includedArtists); + final updatedTrack = track.when( + full: (field0) => field0.copyWith(artists: includedArtists).toJson(), + local: (field0) => field0.copyWith(artists: includedArtists).toJson(), + ); - return e.copyWith(data: track.toJson()); + return e.copyWith(data: updatedTrack); }); assert( @@ -109,7 +112,7 @@ class HistoryTopTracksNotifier extends FamilyPaginatedAsyncNotifier< final items = getTracksWithCount(entries); - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( items: items, nextOffset: offset + limit, total: items.length, @@ -190,7 +193,7 @@ class HistoryTopTracksNotifier extends FamilyPaginatedAsyncNotifier< final historyTopTracksProvider = AsyncNotifierProviderFamily< HistoryTopTracksNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, HistoryDuration>( () => HistoryTopTracksNotifier(), ); diff --git a/lib/provider/local_tracks/local_tracks_provider.dart b/lib/provider/local_tracks/local_tracks_provider.dart index 8d44b607..7f15b19e 100644 --- a/lib/provider/local_tracks/local_tracks_provider.dart +++ b/lib/provider/local_tracks/local_tracks_provider.dart @@ -130,11 +130,11 @@ final localTracksProvider = final tracksFromMetadata = filesWithMetadata .map( - (fileWithMetadata) => SpotubeTrackObject.localTrackFromFile( + (fileWithMetadata) => localTrackFromFile( fileWithMetadata.file, metadata: fileWithMetadata.metadata, art: fileWithMetadata.art, - ) as SpotubeLocalTrackObject, + ), ) .toList(); diff --git a/lib/provider/metadata_plugin/album/album.dart b/lib/provider/metadata_plugin/album/album.dart index 394f6eb0..9339bf9a 100644 --- a/lib/provider/metadata_plugin/album/album.dart +++ b/lib/provider/metadata_plugin/album/album.dart @@ -15,6 +15,6 @@ final metadataPluginAlbumProvider = throw MetadataPluginException.noDefaultMetadataPlugin(); } - return metadataPlugin.album.getAlbum(id); + return metadataPlugin.album.getAlbum(id: id, mpscTx: metadataPlugin.sender); }, ); diff --git a/lib/provider/metadata_plugin/album/releases.dart b/lib/provider/metadata_plugin/album/releases.dart index e6e88baf..7c27c8b3 100644 --- a/lib/provider/metadata_plugin/album/releases.dart +++ b/lib/provider/metadata_plugin/album/releases.dart @@ -6,13 +6,14 @@ import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; class MetadataPluginAlbumReleasesNotifier extends PaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { return await (await metadataPlugin) .album - .releases(limit: limit, offset: offset); + .releases(mpscTx: await mpscTx, limit: limit, offset: offset) + .then((a) => a.flatten()); } @override @@ -24,6 +25,6 @@ class MetadataPluginAlbumReleasesNotifier final metadataPluginAlbumReleasesProvider = AsyncNotifierProvider< MetadataPluginAlbumReleasesNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginAlbumReleasesNotifier(), ); diff --git a/lib/provider/metadata_plugin/artist/albums.dart b/lib/provider/metadata_plugin/artist/albums.dart index 0f582bf9..d9b5ffdd 100644 --- a/lib/provider/metadata_plugin/artist/albums.dart +++ b/lib/provider/metadata_plugin/artist/albums.dart @@ -6,15 +6,19 @@ import 'package:spotube/provider/metadata_plugin/utils/family_paginated.dart'; class MetadataPluginArtistAlbumNotifier extends FamilyPaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { - return await (await metadataPlugin).artist.albums( - arg, + return await (await metadataPlugin) + .artist + .albums( + mpscTx: await mpscTx, + id: arg, limit: limit, offset: offset, - ); + ) + .then((a) => a.flatten()); } @override @@ -26,7 +30,7 @@ class MetadataPluginArtistAlbumNotifier final metadataPluginArtistAlbumsProvider = AsyncNotifierProviderFamily< MetadataPluginArtistAlbumNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginArtistAlbumNotifier(), ); diff --git a/lib/provider/metadata_plugin/artist/artist.dart b/lib/provider/metadata_plugin/artist/artist.dart index e66309d4..371ba699 100644 --- a/lib/provider/metadata_plugin/artist/artist.dart +++ b/lib/provider/metadata_plugin/artist/artist.dart @@ -15,6 +15,7 @@ final metadataPluginArtistProvider = throw MetadataPluginException.noDefaultMetadataPlugin(); } - return metadataPlugin.artist.getArtist(artistId); + return metadataPlugin.artist + .getArtist(id: artistId, mpscTx: metadataPlugin.sender); }, ); diff --git a/lib/provider/metadata_plugin/artist/related.dart b/lib/provider/metadata_plugin/artist/related.dart index c6a80f75..0d4fa494 100644 --- a/lib/provider/metadata_plugin/artist/related.dart +++ b/lib/provider/metadata_plugin/artist/related.dart @@ -6,15 +6,19 @@ import 'package:spotube/provider/metadata_plugin/utils/family_paginated.dart'; class MetadataPluginArtistRelatedArtistsNotifier extends FamilyPaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { - return await (await metadataPlugin).artist.related( - arg, + return await (await metadataPlugin) + .artist + .related( + id: arg, limit: limit, offset: offset, - ); + mpscTx: await mpscTx, + ) + .then((a) => a.flatten()); } @override @@ -26,7 +30,7 @@ class MetadataPluginArtistRelatedArtistsNotifier final metadataPluginArtistRelatedArtistsProvider = AsyncNotifierProviderFamily< MetadataPluginArtistRelatedArtistsNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginArtistRelatedArtistsNotifier(), ); diff --git a/lib/provider/metadata_plugin/artist/top_tracks.dart b/lib/provider/metadata_plugin/artist/top_tracks.dart index c622a738..564199e1 100644 --- a/lib/provider/metadata_plugin/artist/top_tracks.dart +++ b/lib/provider/metadata_plugin/artist/top_tracks.dart @@ -5,19 +5,20 @@ import 'package:spotube/provider/metadata_plugin/utils/family_paginated.dart'; import 'package:spotube/provider/metadata_plugin/utils/common.dart'; class MetadataPluginArtistTopTracksNotifier - extends AutoDisposeFamilyPaginatedAsyncNotifier { MetadataPluginArtistTopTracksNotifier() : super(); @override fetch(offset, limit) async { final tracks = await (await metadataPlugin).artist.topTracks( - arg, + id: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return tracks; + return tracks.flatten(); } @override @@ -32,7 +33,7 @@ class MetadataPluginArtistTopTracksNotifier final metadataPluginArtistTopTracksProvider = AutoDisposeAsyncNotifierProviderFamily< MetadataPluginArtistTopTracksNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginArtistTopTracksNotifier(), ); diff --git a/lib/provider/metadata_plugin/audio_source/quality_presets.dart b/lib/provider/metadata_plugin/audio_source/quality_presets.dart index ba88fed6..89281cae 100644 --- a/lib/provider/metadata_plugin/audio_source/quality_presets.dart +++ b/lib/provider/metadata_plugin/audio_source/quality_presets.dart @@ -41,10 +41,10 @@ class AudioSourceAvailableQualityPresetsNotifier listenSelf((previous, next) { final isNewLossless = next.presets.elementAtOrNull(next.selectedStreamingContainerIndex) - is SpotubeAudioSourceContainerPresetLossless; + is SpotubeAudioSourceContainerPreset_Lossless; final isOldLossless = previous?.presets .elementAtOrNull(previous.selectedStreamingContainerIndex) - is SpotubeAudioSourceContainerPresetLossless; + is SpotubeAudioSourceContainerPreset_Lossless; if (!isOldLossless && isNewLossless) { audioPlayer.setDemuxerBufferSize(6 * 1024 * 1024); // 6MB } else if (isOldLossless && !isNewLossless) { @@ -72,11 +72,13 @@ class AudioSourceAvailableQualityPresetsNotifier state = AudioSourcePresetsState.fromJson(jsonDecode(persistedStateStr)) .copyWith( - presets: audioSource.audioSource.supportedPresets, + presets: await audioSource.audioSource + .supportedPresets(mpscTx: audioSource.sender), ); } else { state = AudioSourcePresetsState( - presets: audioSource.audioSource.supportedPresets, + presets: await audioSource.audioSource + .supportedPresets(mpscTx: audioSource.sender), ); } }); diff --git a/lib/provider/metadata_plugin/browse/section_items.dart b/lib/provider/metadata_plugin/browse/section_items.dart index 5c03ec2c..64e6bbbd 100644 --- a/lib/provider/metadata_plugin/browse/section_items.dart +++ b/lib/provider/metadata_plugin/browse/section_items.dart @@ -6,15 +6,19 @@ import 'package:spotube/provider/metadata_plugin/utils/family_paginated.dart'; class MetadataPluginBrowseSectionItemsNotifier extends FamilyPaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { - return await (await metadataPlugin).browse.sectionItems( - arg, + return await (await metadataPlugin) + .browse + .sectionItems( + id: arg, limit: limit, offset: offset, - ); + mpscTx: await mpscTx, + ) + .then((value) => value.flatten()); } @override @@ -26,7 +30,7 @@ class MetadataPluginBrowseSectionItemsNotifier final metadataPluginBrowseSectionItemsProvider = AsyncNotifierProviderFamily< MetadataPluginBrowseSectionItemsNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginBrowseSectionItemsNotifier(), ); diff --git a/lib/provider/metadata_plugin/browse/sections.dart b/lib/provider/metadata_plugin/browse/sections.dart index 1f73e10c..7771ee33 100644 --- a/lib/provider/metadata_plugin/browse/sections.dart +++ b/lib/provider/metadata_plugin/browse/sections.dart @@ -4,17 +4,20 @@ import 'package:spotube/provider/metadata_plugin/core/auth.dart'; import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; class MetadataPluginBrowseSectionsNotifier - extends PaginatedAsyncNotifier> { + extends PaginatedAsyncNotifier { @override - Future>> - fetch( + Future> fetch( int offset, int limit, ) async { - return await (await metadataPlugin).browse.sections( + return await (await metadataPlugin) + .browse + .sections( limit: limit, offset: offset, - ); + mpscTx: await mpscTx, + ) + .then((value) => value.flatten()); } @override @@ -26,6 +29,6 @@ class MetadataPluginBrowseSectionsNotifier final metadataPluginBrowseSectionsProvider = AsyncNotifierProvider< MetadataPluginBrowseSectionsNotifier, - SpotubePaginationResponseObject>>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginBrowseSectionsNotifier(), ); diff --git a/lib/provider/metadata_plugin/core/auth.dart b/lib/provider/metadata_plugin/core/auth.dart index dc5e7eb6..e5b16555 100644 --- a/lib/provider/metadata_plugin/core/auth.dart +++ b/lib/provider/metadata_plugin/core/auth.dart @@ -9,7 +9,7 @@ class MetadataPluginAuthenticatedNotifier extends AsyncNotifier { FutureOr build() async { final defaultPluginConfig = ref.watch(metadataPluginsProvider); if (defaultPluginConfig.asData?.value.defaultMetadataPluginConfig?.abilities - .contains(PluginAbilities.authentication) != + .contains(PluginAbility.authentication) != true) { return false; } @@ -19,15 +19,16 @@ class MetadataPluginAuthenticatedNotifier extends AsyncNotifier { return false; } - final sub = defaultPlugin.auth.authStateStream.listen((event) { - state = AsyncData(defaultPlugin.auth.isAuthenticated()); + final sub = defaultPlugin.authState().listen((event) async { + state = AsyncData(await defaultPlugin.auth + .isAuthenticated(mpscTx: defaultPlugin.sender)); }); ref.onDispose(() { sub.cancel(); }); - return defaultPlugin.auth.isAuthenticated(); + return defaultPlugin.auth.isAuthenticated(mpscTx: defaultPlugin.sender); } } @@ -42,7 +43,7 @@ class AudioSourcePluginAuthenticatedNotifier extends AsyncNotifier { final defaultPluginConfig = ref.watch(metadataPluginsProvider); if (defaultPluginConfig .asData?.value.defaultAudioSourcePluginConfig?.abilities - .contains(PluginAbilities.authentication) != + .contains(PluginAbility.authentication) != true) { return false; } @@ -52,15 +53,16 @@ class AudioSourcePluginAuthenticatedNotifier extends AsyncNotifier { return false; } - final sub = defaultPlugin.auth.authStateStream.listen((event) { - state = AsyncData(defaultPlugin.auth.isAuthenticated()); + final sub = defaultPlugin.authState().listen((event) async { + state = AsyncData(await defaultPlugin.auth + .isAuthenticated(mpscTx: defaultPlugin.sender)); }); ref.onDispose(() { sub.cancel(); }); - return defaultPlugin.auth.isAuthenticated(); + return defaultPlugin.auth.isAuthenticated(mpscTx: defaultPlugin.sender); } } diff --git a/lib/provider/metadata_plugin/core/repositories.dart b/lib/provider/metadata_plugin/core/repositories.dart index d383e29e..fe54b58e 100644 --- a/lib/provider/metadata_plugin/core/repositories.dart +++ b/lib/provider/metadata_plugin/core/repositories.dart @@ -62,7 +62,7 @@ class MetadataPluginRepositoriesNotifier return _hasMore[response.requestOptions.uri.host] ?? false; }); - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( items: repos, total: responses.fold( 0, @@ -85,6 +85,6 @@ class MetadataPluginRepositoriesNotifier final metadataPluginRepositoriesProvider = AsyncNotifierProvider< MetadataPluginRepositoriesNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginRepositoriesNotifier(), ); diff --git a/lib/provider/metadata_plugin/core/scrobble.dart b/lib/provider/metadata_plugin/core/scrobble.dart index 0f8fcc19..c57d8e86 100644 --- a/lib/provider/metadata_plugin/core/scrobble.dart +++ b/lib/provider/metadata_plugin/core/scrobble.dart @@ -17,7 +17,7 @@ class MetadataPluginScrobbleNotifier if (metadataPlugin.valueOrNull == null || pluginConfig == null || - !pluginConfig.abilities.contains(PluginAbilities.scrobbling)) { + !pluginConfig.abilities.contains(PluginAbility.scrobbling)) { return null; } @@ -25,23 +25,46 @@ class MetadataPluginScrobbleNotifier final subscription = controller.stream.listen((event) async { try { - await metadataPlugin.valueOrNull?.core.scrobble({ - "id": event.id, - "title": event.name, - "artists": event.artists - .map((artist) => { - "id": artist.id, - "name": artist.name, - }) - .toList(), - "album": { - "id": event.album.id, - "name": event.album.name, - }, - "timestamp": DateTime.now().millisecondsSinceEpoch ~/ 1000, - "duration_ms": event.durationMs, - "isrc": event is SpotubeFullTrackObject ? event.isrc : null, - }); + final details = switch (event) { + SpotubeTrackObject_Full(:final field0) => ScrobbleDetails( + id: field0.id, + title: field0.name, + artists: field0.artists + .map((artist) => ScrobbleArtist( + id: artist.id, + name: artist.name, + )) + .toList(), + album: ScrobbleAlbum( + id: field0.album.id, + name: field0.album.name, + ), + timestamp: DateTime.now().millisecondsSinceEpoch, + durationMs: field0.durationMs, + isrc: field0.isrc, + ), + SpotubeTrackObject_Local(:final field0) => ScrobbleDetails( + id: field0.id, + title: field0.name, + artists: field0.artists + .map((artist) => ScrobbleArtist( + id: artist.id, + name: artist.name, + )) + .toList(), + album: ScrobbleAlbum( + id: field0.album.id, + name: field0.album.name, + ), + timestamp: DateTime.now().millisecondsSinceEpoch, + durationMs: field0.durationMs, + ), + }; + + await metadataPlugin.valueOrNull?.core.scrobble( + mpscTx: metadataPlugin.valueOrNull!.sender, + details: details, + ); } catch (e, stack) { AppLogger.reportError(e, stack); } diff --git a/lib/provider/metadata_plugin/core/support.dart b/lib/provider/metadata_plugin/core/support.dart index 8864f1b1..915e451c 100644 --- a/lib/provider/metadata_plugin/core/support.dart +++ b/lib/provider/metadata_plugin/core/support.dart @@ -7,7 +7,7 @@ final metadataPluginSupportTextProvider = FutureProvider((ref) async { if (metadataPlugin == null) { throw 'No metadata plugin available'; } - return await metadataPlugin.core.support; + return await metadataPlugin.core.support(mpscTx: metadataPlugin.sender); }); final audioSourcePluginSupportTextProvider = @@ -17,5 +17,5 @@ final audioSourcePluginSupportTextProvider = if (audioSourcePlugin == null) { throw 'No metadata plugin available'; } - return await audioSourcePlugin.core.support; + return await audioSourcePlugin.core.support(mpscTx: audioSourcePlugin.sender); }); diff --git a/lib/provider/metadata_plugin/core/user.dart b/lib/provider/metadata_plugin/core/user.dart index 3ad46d63..16e761bd 100644 --- a/lib/provider/metadata_plugin/core/user.dart +++ b/lib/provider/metadata_plugin/core/user.dart @@ -12,6 +12,6 @@ final metadataPluginUserProvider = FutureProvider( if (!authenticated || metadataPlugin == null) { return null; } - return metadataPlugin.user.me(); + return metadataPlugin.user.me(mpscTx: metadataPlugin.sender); }, ); diff --git a/lib/provider/metadata_plugin/library/albums.dart b/lib/provider/metadata_plugin/library/albums.dart index 10438025..9d769d49 100644 --- a/lib/provider/metadata_plugin/library/albums.dart +++ b/lib/provider/metadata_plugin/library/albums.dart @@ -6,14 +6,18 @@ import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; class MetadataPluginSavedAlbumNotifier extends PaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { - return await (await metadataPlugin).user.savedAlbums( + return await (await metadataPlugin) + .user + .savedAlbums( limit: limit, offset: offset, - ); + mpscTx: await mpscTx, + ) + .then((a) => a.flatten()); } @override @@ -35,7 +39,10 @@ class MetadataPluginSavedAlbumNotifier ), ); try { - await (await metadataPlugin).album.save(albums.map((e) => e.id).toList()); + await (await metadataPlugin).album.save( + ids: albums.map((e) => e.id).toList(), + mpscTx: await mpscTx, + ); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -58,7 +65,9 @@ class MetadataPluginSavedAlbumNotifier ), ); try { - await (await metadataPlugin).album.unsave(albumIds); + await (await metadataPlugin) + .album + .unsave(ids: albumIds, mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -68,7 +77,7 @@ class MetadataPluginSavedAlbumNotifier final metadataPluginSavedAlbumsProvider = AsyncNotifierProvider< MetadataPluginSavedAlbumNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginSavedAlbumNotifier(), ); diff --git a/lib/provider/metadata_plugin/library/artists.dart b/lib/provider/metadata_plugin/library/artists.dart index 31f976e0..d81cf74f 100644 --- a/lib/provider/metadata_plugin/library/artists.dart +++ b/lib/provider/metadata_plugin/library/artists.dart @@ -6,16 +6,17 @@ import 'package:spotube/provider/metadata_plugin/utils/paginated.dart'; class MetadataPluginSavedArtistNotifier extends PaginatedAsyncNotifier { @override - Future> fetch( + Future> fetch( int offset, int limit, ) async { final artists = await (await metadataPlugin).user.savedArtists( limit: limit, offset: offset, + mpscTx: await mpscTx, ); - return artists; + return artists.flatten(); } @override @@ -39,7 +40,7 @@ class MetadataPluginSavedArtistNotifier try { await (await metadataPlugin) .artist - .save(artists.map((e) => e.id).toList()); + .save(ids: artists.map((e) => e.id).toList(), mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -63,7 +64,9 @@ class MetadataPluginSavedArtistNotifier ); try { - await (await metadataPlugin).artist.unsave(artistIds); + await (await metadataPlugin) + .artist + .unsave(ids: artistIds, mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -73,7 +76,7 @@ class MetadataPluginSavedArtistNotifier final metadataPluginSavedArtistsProvider = AsyncNotifierProvider< MetadataPluginSavedArtistNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginSavedArtistNotifier(), ); diff --git a/lib/provider/metadata_plugin/library/playlists.dart b/lib/provider/metadata_plugin/library/playlists.dart index 5793eb57..6e5ac845 100644 --- a/lib/provider/metadata_plugin/library/playlists.dart +++ b/lib/provider/metadata_plugin/library/playlists.dart @@ -15,9 +15,9 @@ class MetadataPluginSavedPlaylistsNotifier fetch(int offset, int limit) async { final playlists = await (await metadataPlugin) .user - .savedPlaylists(limit: limit, offset: offset); + .savedPlaylists(limit: limit, offset: offset, mpscTx: await mpscTx); - return playlists; + return playlists.flatten(); } @override @@ -58,7 +58,9 @@ class MetadataPluginSavedPlaylistsNotifier ); try { - await (await metadataPlugin).playlist.save(playlist.id); + await (await metadataPlugin) + .playlist + .save(playlistId: playlist.id, mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -76,7 +78,9 @@ class MetadataPluginSavedPlaylistsNotifier ); try { - await (await metadataPlugin).playlist.unsave(playlist.id); + await (await metadataPlugin) + .playlist + .unsave(playlistId: playlist.id, mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -88,7 +92,9 @@ class MetadataPluginSavedPlaylistsNotifier final oldState = state; try { state = const AsyncLoading(); - await (await metadataPlugin).playlist.deletePlaylist(playlistId); + await (await metadataPlugin) + .playlist + .deletePlaylist(playlistId: playlistId, mpscTx: await mpscTx); ref.invalidateSelf(); ref.invalidate(metadataPluginIsSavedPlaylistProvider(playlistId)); ref.invalidate(metadataPluginPlaylistTracksProvider(playlistId)); @@ -101,9 +107,8 @@ class MetadataPluginSavedPlaylistsNotifier Future addTracks(String playlistId, List trackIds) async { if (state.value == null) return; - await (await metadataPlugin) - .playlist - .addTracks(playlistId, trackIds: trackIds); + await (await metadataPlugin).playlist.addTracks( + playlistId: playlistId, trackIds: trackIds, mpscTx: await mpscTx); ref.invalidate(metadataPluginPlaylistTracksProvider(playlistId)); } @@ -111,9 +116,8 @@ class MetadataPluginSavedPlaylistsNotifier Future removeTracks(String playlistId, List trackIds) async { if (state.value == null) return; - await (await metadataPlugin) - .playlist - .removeTracks(playlistId, trackIds: trackIds); + await (await metadataPlugin).playlist.removeTracks( + playlistId: playlistId, trackIds: trackIds, mpscTx: await mpscTx); ref.invalidate(metadataPluginPlaylistTracksProvider(playlistId)); } @@ -121,7 +125,7 @@ class MetadataPluginSavedPlaylistsNotifier final metadataPluginSavedPlaylistsProvider = AsyncNotifierProvider< MetadataPluginSavedPlaylistsNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginSavedPlaylistsNotifier(), ); diff --git a/lib/provider/metadata_plugin/library/tracks.dart b/lib/provider/metadata_plugin/library/tracks.dart index d19865dd..c8d2f077 100644 --- a/lib/provider/metadata_plugin/library/tracks.dart +++ b/lib/provider/metadata_plugin/library/tracks.dart @@ -13,9 +13,10 @@ class MetadataPluginSavedTracksNotifier final tracks = await (await metadataPlugin).user.savedTracks( offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return tracks; + return tracks.flatten(); } @override @@ -26,7 +27,7 @@ class MetadataPluginSavedTracksNotifier return await fetch(0, 20); } - Future addFavorite(List tracks) async { + Future addFavorite(List tracks) async { if (state.value == null) { return; } @@ -34,22 +35,21 @@ class MetadataPluginSavedTracksNotifier final oldState = state.value; state = AsyncData( state.value!.copyWith( - items: [ - ...tracks.whereType(), - ...state.value!.items - ], + items: [...tracks, ...state.value!.items], ), ); try { - await (await metadataPlugin).track.save(tracks.map((e) => e.id).toList()); + await (await metadataPlugin) + .track + .save(ids: tracks.map((e) => e.id).toList(), mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; } } - Future removeFavorite(List tracks) async { + Future removeFavorite(List tracks) async { if (state.value == null) { return; } @@ -68,7 +68,7 @@ class MetadataPluginSavedTracksNotifier try { await (await metadataPlugin) .track - .unsave(tracks.map((e) => e.id).toList()); + .unsave(ids: tracks.map((e) => e.id).toList(), mpscTx: await mpscTx); } catch (e) { state = AsyncData(oldState!); rethrow; @@ -78,7 +78,7 @@ class MetadataPluginSavedTracksNotifier final metadataPluginSavedTracksProvider = AutoDisposeAsyncNotifierProvider< MetadataPluginSavedTracksNotifier, - SpotubePaginationResponseObject>( + SpotubeFlattenedPaginationObject>( () => MetadataPluginSavedTracksNotifier(), ); diff --git a/lib/provider/metadata_plugin/metadata_plugin_provider.dart b/lib/provider/metadata_plugin/metadata_plugin_provider.dart index cdc96c41..16e1bce5 100644 --- a/lib/provider/metadata_plugin/metadata_plugin_provider.dart +++ b/lib/provider/metadata_plugin/metadata_plugin_provider.dart @@ -11,7 +11,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/database/database.dart'; -import 'package:spotube/provider/youtube_engine/youtube_engine.dart'; +import 'package:spotube/provider/server/server.dart'; import 'package:spotube/services/dio/dio.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/metadata/errors/exceptions.dart'; @@ -24,6 +24,8 @@ final allowedDomainsRegex = RegExp( r"^(https?:\/\/)?(www\.)?(github\.com|codeberg\.org)\/.+", ); +final kPluginApiVersion = Version.parse("2.0.0"); + class MetadataPluginState { final List plugins; final int defaultMetadataPlugin; @@ -129,7 +131,7 @@ class MetadataPluginNotifier extends AsyncNotifier { repository: plugin.repository, apis: plugin.apis .map( - (e) => PluginApis.values.firstWhereOrNull( + (e) => PluginApi.values.firstWhereOrNull( (api) => api.name == e, ), ) @@ -137,7 +139,7 @@ class MetadataPluginNotifier extends AsyncNotifier { .toList(), abilities: plugin.abilities .map( - (e) => PluginAbilities.values.firstWhereOrNull( + (e) => PluginAbility.values.firstWhereOrNull( (ability) => ability.name == e, ), ) @@ -149,7 +151,7 @@ class MetadataPluginNotifier extends AsyncNotifier { final pluginJsonFile = File(join(pluginExtractionDir.path, "plugin.json")); final pluginBinaryFile = - File(join(pluginExtractionDir.path, "plugin.out")); + File(join(pluginExtractionDir.path, "plugin.js")); if (!await pluginExtractionDir.exists() || !await pluginJsonFile.exists() || @@ -374,13 +376,12 @@ class MetadataPluginNotifier extends AsyncNotifier { bool validatePluginApiCompatibility(PluginConfiguration plugin) { final configPluginApiVersion = Version.parse(plugin.pluginApiVersion); - final appPluginApiVersion = MetadataPlugin.pluginApiVersion; // Plugin API's major version must match the app's major version - if (configPluginApiVersion.major != appPluginApiVersion.major) { + if (configPluginApiVersion.major != kPluginApiVersion.major) { return false; } - return configPluginApiVersion >= appPluginApiVersion; + return configPluginApiVersion >= kPluginApiVersion; } void _assertPluginApiCompatibility(PluginConfiguration plugin) { @@ -419,18 +420,18 @@ class MetadataPluginNotifier extends AsyncNotifier { selectedForMetadata: Value( (state.valueOrNull?.plugins .where( - (d) => d.abilities.contains(PluginAbilities.metadata)) + (d) => d.abilities.contains(PluginAbility.metadata)) .isEmpty ?? true) && - plugin.abilities.contains(PluginAbilities.metadata), + plugin.abilities.contains(PluginAbility.metadata), ), selectedForAudioSource: Value( (state.valueOrNull?.plugins .where((d) => - d.abilities.contains(PluginAbilities.audioSource)) + d.abilities.contains(PluginAbility.audioSource)) .isEmpty ?? true) && - plugin.abilities.contains(PluginAbilities.audioSource), + plugin.abilities.contains(PluginAbility.audioSource), ), ), ); @@ -450,8 +451,7 @@ class MetadataPluginNotifier extends AsyncNotifier { // only when there is 1 remaining plugin if (state.valueOrNull?.defaultMetadataPluginConfig == plugin) { final remainingPlugins = state.valueOrNull?.plugins.where( - (p) => - p != plugin && p.abilities.contains(PluginAbilities.metadata), + (p) => p != plugin && p.abilities.contains(PluginAbility.metadata), ) ?? []; if (remainingPlugins.length == 1) { @@ -462,8 +462,7 @@ class MetadataPluginNotifier extends AsyncNotifier { if (state.valueOrNull?.defaultAudioSourcePluginConfig == plugin) { final remainingPlugins = state.valueOrNull?.plugins.where( (p) => - p != plugin && - p.abilities.contains(PluginAbilities.audioSource), + p != plugin && p.abilities.contains(PluginAbility.audioSource), ) ?? []; if (remainingPlugins.length == 1) { @@ -523,7 +522,7 @@ class MetadataPluginNotifier extends AsyncNotifier { Future setDefaultMetadataPlugin(PluginConfiguration plugin) async { assert( - plugin.abilities.contains(PluginAbilities.metadata), + plugin.abilities.contains(PluginAbility.metadata), "Must be a metadata plugin", ); @@ -541,7 +540,7 @@ class MetadataPluginNotifier extends AsyncNotifier { Future setDefaultAudioSourcePlugin(PluginConfiguration plugin) async { assert( - plugin.abilities.contains(PluginAbilities.audioSource), + plugin.abilities.contains(PluginAbility.audioSource), "Must be an audio-source plugin", ); @@ -556,16 +555,16 @@ class MetadataPluginNotifier extends AsyncNotifier { ); } - Future getPluginByteCode(PluginConfiguration plugin) async { + Future getPluginSourceCode(PluginConfiguration plugin) async { final pluginExtractionDirPath = await _getPluginExtractionDir(plugin); - final libraryFile = File(join(pluginExtractionDirPath.path, "plugin.out")); + final libraryFile = File(join(pluginExtractionDirPath.path, "plugin.js")); if (!libraryFile.existsSync()) { - throw MetadataPluginException.pluginByteCodeFileNotFound(); + throw MetadataPluginException.pluginSourceCodeFileNotFound(); } - return await libraryFile.readAsBytes(); + return await libraryFile.readAsString(); } Future getLogoPath(PluginConfiguration plugin) async { @@ -586,27 +585,41 @@ final metadataPluginsProvider = MetadataPluginNotifier.new, ); +final _pluginProvider = + FutureProvider.family( + (ref, config) async { + final (:server, :port) = await ref.watch(serverProvider.future); + final serverSecret = ref.watch(serverRandomSecretProvider); + + if (config == null) { + return null; + } + + final pluginsNotifier = ref.read(metadataPluginsProvider.notifier); + final pluginSourceCode = await pluginsNotifier.getPluginSourceCode(config); + + final plugin = MetadataPlugin( + pluginScript: pluginSourceCode, + pluginConfig: config, + serverEndpointUrl: "http://${server.address.host}:$port", + serverSecret: serverSecret, + ); + + ref.onDispose(() { + plugin.close(); + }); + + return plugin; + }, +); + final metadataPluginProvider = FutureProvider( (ref) async { final defaultPlugin = await ref.watch( metadataPluginsProvider .selectAsync((data) => data.defaultMetadataPluginConfig), ); - final youtubeEngine = ref.read(youtubeEngineProvider); - - if (defaultPlugin == null) { - return null; - } - - final pluginsNotifier = ref.read(metadataPluginsProvider.notifier); - final pluginByteCode = - await pluginsNotifier.getPluginByteCode(defaultPlugin); - - return await MetadataPlugin.create( - youtubeEngine, - defaultPlugin, - pluginByteCode, - ); + return await ref.watch(_pluginProvider(defaultPlugin).future); }, ); @@ -616,20 +629,6 @@ final audioSourcePluginProvider = FutureProvider( metadataPluginsProvider .selectAsync((data) => data.defaultAudioSourcePluginConfig), ); - final youtubeEngine = ref.watch(youtubeEngineProvider); - - if (defaultPlugin == null) { - return null; - } - - final pluginsNotifier = ref.read(metadataPluginsProvider.notifier); - final pluginByteCode = - await pluginsNotifier.getPluginByteCode(defaultPlugin); - - return await MetadataPlugin.create( - youtubeEngine, - defaultPlugin, - pluginByteCode, - ); + return await ref.watch(_pluginProvider(defaultPlugin).future); }, ); diff --git a/lib/provider/metadata_plugin/playlist/playlist.dart b/lib/provider/metadata_plugin/playlist/playlist.dart index 9a41340d..26d5e47a 100644 --- a/lib/provider/metadata_plugin/playlist/playlist.dart +++ b/lib/provider/metadata_plugin/playlist/playlist.dart @@ -6,6 +6,7 @@ import 'package:spotube/provider/metadata_plugin/core/user.dart'; import 'package:spotube/provider/metadata_plugin/utils/common.dart'; import 'package:spotube/services/metadata/errors/exceptions.dart'; import 'package:spotube/services/metadata/metadata.dart'; +import 'package:spotube/src/rust/api/plugin/plugin.dart'; class MetadataPluginPlaylistNotifier extends AutoDisposeFamilyAsyncNotifier { @@ -19,11 +20,17 @@ class MetadataPluginPlaylistNotifier return metadataPlugin; } + Future get mpscTx async { + return (await metadataPlugin).sender; + } + @override build(playlistId) async { ref.cacheFor(); - return (await metadataPlugin).playlist.getPlaylist(playlistId); + return (await metadataPlugin) + .playlist + .getPlaylist(id: playlistId, mpscTx: await mpscTx); } Future create({ @@ -40,12 +47,13 @@ class MetadataPluginPlaylistNotifier } state = const AsyncValue.loading(); try { - final playlist = await (await metadataPlugin).playlist.create( - userId, + final playlist = await (await metadataPlugin).playlist.createPlaylist( + userId: userId, name: name, description: description, public: public, collaborative: collaborative, + mpscTx: await mpscTx, ); if (playlist != null) { state = AsyncValue.data(playlist); @@ -71,12 +79,13 @@ class MetadataPluginPlaylistNotifier collaborative == null) { throw Exception('No modifications provided.'); } - await (await metadataPlugin).playlist.update( - arg, + await (await metadataPlugin).playlist.updatePlaylist( + playlistId: arg, name: name, description: description, public: public, collaborative: collaborative, + mpscTx: await mpscTx, ); ref.invalidateSelf(); } on Exception catch (e) { diff --git a/lib/provider/metadata_plugin/search/albums.dart b/lib/provider/metadata_plugin/search/albums.dart index 40bb62e6..7304fb6e 100644 --- a/lib/provider/metadata_plugin/search/albums.dart +++ b/lib/provider/metadata_plugin/search/albums.dart @@ -12,7 +12,7 @@ class MetadataPluginSearchAlbumsNotifier @override fetch(offset, limit) async { if (arg.isEmpty) { - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( limit: limit, nextOffset: null, total: 0, @@ -22,12 +22,13 @@ class MetadataPluginSearchAlbumsNotifier } final res = await (await metadataPlugin).search.albums( - arg, + query: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return res; + return res.flatten(); } @override @@ -41,6 +42,6 @@ class MetadataPluginSearchAlbumsNotifier final metadataPluginSearchAlbumsProvider = AutoDisposeAsyncNotifierProviderFamily, String>( + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginSearchAlbumsNotifier(), ); diff --git a/lib/provider/metadata_plugin/search/all.dart b/lib/provider/metadata_plugin/search/all.dart index 4b051e58..d38c51b6 100644 --- a/lib/provider/metadata_plugin/search/all.dart +++ b/lib/provider/metadata_plugin/search/all.dart @@ -12,7 +12,8 @@ final metadataPluginSearchAllProvider = throw MetadataPluginException.noDefaultMetadataPlugin(); } - return metadataPlugin.search.all(query); + return metadataPlugin.search + .all(query: query, mpscTx: metadataPlugin.sender); }, ); @@ -22,5 +23,5 @@ final metadataPluginSearchChipsProvider = FutureProvider((ref) async { if (metadataPlugin == null) { throw MetadataPluginException.noDefaultMetadataPlugin(); } - return metadataPlugin.search.chips; + return metadataPlugin.search.chips(mpscTx: metadataPlugin.sender); }); diff --git a/lib/provider/metadata_plugin/search/artists.dart b/lib/provider/metadata_plugin/search/artists.dart index b4d619f7..88cc920d 100644 --- a/lib/provider/metadata_plugin/search/artists.dart +++ b/lib/provider/metadata_plugin/search/artists.dart @@ -12,7 +12,7 @@ class MetadataPluginSearchArtistsNotifier @override fetch(offset, limit) async { if (arg.isEmpty) { - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( limit: limit, nextOffset: null, total: 0, @@ -22,12 +22,13 @@ class MetadataPluginSearchArtistsNotifier } final res = await (await metadataPlugin).search.artists( - arg, + query: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return res; + return res.flatten(); } @override @@ -41,6 +42,6 @@ class MetadataPluginSearchArtistsNotifier final metadataPluginSearchArtistsProvider = AutoDisposeAsyncNotifierProviderFamily, String>( + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginSearchArtistsNotifier(), ); diff --git a/lib/provider/metadata_plugin/search/playlists.dart b/lib/provider/metadata_plugin/search/playlists.dart index dbf54250..63000783 100644 --- a/lib/provider/metadata_plugin/search/playlists.dart +++ b/lib/provider/metadata_plugin/search/playlists.dart @@ -12,7 +12,7 @@ class MetadataPluginSearchPlaylistsNotifier @override fetch(offset, limit) async { if (arg.isEmpty) { - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( limit: limit, nextOffset: null, total: 0, @@ -22,12 +22,13 @@ class MetadataPluginSearchPlaylistsNotifier } final res = await (await metadataPlugin).search.playlists( - arg, + query: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return res; + return res.flatten(); } @override @@ -42,7 +43,7 @@ class MetadataPluginSearchPlaylistsNotifier final metadataPluginSearchPlaylistsProvider = AutoDisposeAsyncNotifierProviderFamily< MetadataPluginSearchPlaylistsNotifier, - SpotubePaginationResponseObject, + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginSearchPlaylistsNotifier(), ); diff --git a/lib/provider/metadata_plugin/search/tracks.dart b/lib/provider/metadata_plugin/search/tracks.dart index 0b6ac141..13110f8b 100644 --- a/lib/provider/metadata_plugin/search/tracks.dart +++ b/lib/provider/metadata_plugin/search/tracks.dart @@ -5,14 +5,14 @@ import 'package:spotube/provider/metadata_plugin/utils/common.dart'; import 'package:spotube/provider/metadata_plugin/utils/family_paginated.dart'; class MetadataPluginSearchTracksNotifier - extends AutoDisposeFamilyPaginatedAsyncNotifier { MetadataPluginSearchTracksNotifier() : super(); @override fetch(offset, limit) async { if (arg.isEmpty) { - return SpotubePaginationResponseObject( + return SpotubeFlattenedPaginationObject( limit: limit, nextOffset: null, total: 0, @@ -22,12 +22,13 @@ class MetadataPluginSearchTracksNotifier } final tracks = await (await metadataPlugin).search.tracks( - arg, + query: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return tracks; + return tracks.flatten(); } @override @@ -41,6 +42,6 @@ class MetadataPluginSearchTracksNotifier final metadataPluginSearchTracksProvider = AutoDisposeAsyncNotifierProviderFamily, String>( + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginSearchTracksNotifier(), ); diff --git a/lib/provider/metadata_plugin/tracks/album.dart b/lib/provider/metadata_plugin/tracks/album.dart index 5491bdd0..fecbc2ef 100644 --- a/lib/provider/metadata_plugin/tracks/album.dart +++ b/lib/provider/metadata_plugin/tracks/album.dart @@ -12,12 +12,13 @@ class MetadataPluginAlbumTracksNotifier @override fetch(offset, limit) async { final tracks = await (await metadataPlugin).album.tracks( - arg, + id: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return tracks; + return tracks.flatten(); } @override @@ -31,6 +32,6 @@ class MetadataPluginAlbumTracksNotifier final metadataPluginAlbumTracksProvider = AutoDisposeAsyncNotifierProviderFamily, String>( + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginAlbumTracksNotifier(), ); diff --git a/lib/provider/metadata_plugin/tracks/playlist.dart b/lib/provider/metadata_plugin/tracks/playlist.dart index 7fdd47db..3f14cee6 100644 --- a/lib/provider/metadata_plugin/tracks/playlist.dart +++ b/lib/provider/metadata_plugin/tracks/playlist.dart @@ -12,12 +12,13 @@ class MetadataPluginPlaylistTracksNotifier @override fetch(offset, limit) async { final tracks = await (await metadataPlugin).playlist.tracks( - arg, + id: arg, offset: offset, limit: limit, + mpscTx: await mpscTx, ); - return tracks; + return tracks.flatten(); } @override @@ -31,6 +32,6 @@ class MetadataPluginPlaylistTracksNotifier final metadataPluginPlaylistTracksProvider = AutoDisposeAsyncNotifierProviderFamily, String>( + SpotubeFlattenedPaginationObject, String>( () => MetadataPluginPlaylistTracksNotifier(), ); diff --git a/lib/provider/metadata_plugin/tracks/track.dart b/lib/provider/metadata_plugin/tracks/track.dart index 1beac43a..6ef96f39 100644 --- a/lib/provider/metadata_plugin/tracks/track.dart +++ b/lib/provider/metadata_plugin/tracks/track.dart @@ -11,5 +11,7 @@ final metadataPluginTrackProvider = throw MetadataPluginException.noDefaultMetadataPlugin(); } - return metadataPlugin.track.getTrack(trackId); + return await metadataPlugin.track + .getTrack(id: trackId, mpscTx: metadataPlugin.sender); }); + \ No newline at end of file diff --git a/lib/provider/metadata_plugin/updater/update_checker.dart b/lib/provider/metadata_plugin/updater/update_checker.dart index 6a7dc589..91f98dcd 100644 --- a/lib/provider/metadata_plugin/updater/update_checker.dart +++ b/lib/provider/metadata_plugin/updater/update_checker.dart @@ -12,8 +12,10 @@ final metadataPluginUpdateCheckerProvider = return null; } - return metadataPlugin.core - .checkUpdate(metadataPluginConfigs.defaultMetadataPluginConfig!); + return metadataPlugin.core.checkUpdate( + pluginConfig: metadataPluginConfigs.defaultMetadataPluginConfig!, + mpscTx: metadataPlugin.sender, + ); }); final audioSourcePluginUpdateCheckerProvider = @@ -27,6 +29,8 @@ final audioSourcePluginUpdateCheckerProvider = return null; } - return audioSourcePlugin.core - .checkUpdate(audioSourcePluginConfigs.defaultAudioSourcePluginConfig!); + return audioSourcePlugin.core.checkUpdate( + pluginConfig: audioSourcePluginConfigs.defaultAudioSourcePluginConfig!, + mpscTx: audioSourcePlugin.sender, + ); }); diff --git a/lib/provider/metadata_plugin/utils/common.dart b/lib/provider/metadata_plugin/utils/common.dart index dc56e494..fd178ce9 100644 --- a/lib/provider/metadata_plugin/utils/common.dart +++ b/lib/provider/metadata_plugin/utils/common.dart @@ -8,6 +8,7 @@ import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart'; import 'package:spotube/services/metadata/errors/exceptions.dart'; import 'package:spotube/services/metadata/metadata.dart'; +import 'package:spotube/src/rust/api/plugin/plugin.dart'; extension PaginationExtension on AsyncValue { bool get isLoadingNextPage => this is AsyncData && this is AsyncLoadingNext; @@ -15,7 +16,7 @@ extension PaginationExtension on AsyncValue { mixin MetadataPluginMixin // ignore: invalid_use_of_internal_member - on AsyncNotifierBase> { + on AsyncNotifierBase> { Future get metadataPlugin async { final plugin = await ref.read(metadataPluginProvider.future); @@ -25,6 +26,11 @@ mixin MetadataPluginMixin return plugin; } + + Future get mpscTx async { + final plugin = await metadataPlugin; + return plugin.sender; + } } extension AutoDisposeAsyncNotifierCacheFor diff --git a/lib/provider/metadata_plugin/utils/family_paginated.dart b/lib/provider/metadata_plugin/utils/family_paginated.dart index b798dc8e..ad7180d0 100644 --- a/lib/provider/metadata_plugin/utils/family_paginated.dart +++ b/lib/provider/metadata_plugin/utils/family_paginated.dart @@ -7,9 +7,9 @@ import 'package:spotube/provider/metadata_plugin/utils/common.dart'; import 'package:spotube/services/logger/logger.dart'; abstract class FamilyPaginatedAsyncNotifier - extends FamilyAsyncNotifier, A> + extends FamilyAsyncNotifier, A> with MetadataPluginMixin { - Future> fetch(int offset, int limit); + Future> fetch(int offset, int limit); Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; @@ -74,9 +74,9 @@ abstract class FamilyPaginatedAsyncNotifier } abstract class AutoDisposeFamilyPaginatedAsyncNotifier - extends AutoDisposeFamilyAsyncNotifier, + extends AutoDisposeFamilyAsyncNotifier, A> with MetadataPluginMixin { - Future> fetch(int offset, int limit); + Future> fetch(int offset, int limit); Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; diff --git a/lib/provider/metadata_plugin/utils/paginated.dart b/lib/provider/metadata_plugin/utils/paginated.dart index 4c77441a..fdbdff02 100644 --- a/lib/provider/metadata_plugin/utils/paginated.dart +++ b/lib/provider/metadata_plugin/utils/paginated.dart @@ -10,8 +10,8 @@ import 'package:spotube/services/logger/logger.dart'; mixin PaginatedAsyncNotifierMixin // ignore: invalid_use_of_internal_member - on AsyncNotifierBase> { - Future> fetch(int offset, int limit); + on AsyncNotifierBase> { + Future> fetch(int offset, int limit); Future fetchMore() async { if (state.value == null || !state.value!.hasMore) return; @@ -75,9 +75,9 @@ mixin PaginatedAsyncNotifierMixin } abstract class PaginatedAsyncNotifier - extends AsyncNotifier> + extends AsyncNotifier> with PaginatedAsyncNotifierMixin, MetadataPluginMixin {} abstract class AutoDisposePaginatedAsyncNotifier - extends AutoDisposeAsyncNotifier> + extends AutoDisposeAsyncNotifier> with PaginatedAsyncNotifierMixin, MetadataPluginMixin {} diff --git a/lib/provider/scrobbler/scrobbler.dart b/lib/provider/scrobbler/scrobbler.dart index f5e5556d..d769c05b 100644 --- a/lib/provider/scrobbler/scrobbler.dart +++ b/lib/provider/scrobbler/scrobbler.dart @@ -10,8 +10,8 @@ import 'package:spotube/provider/database/database.dart'; import 'package:spotube/services/logger/logger.dart'; class ScrobblerNotifier extends AsyncNotifier { - final StreamController _scrobbleController = - StreamController.broadcast(); + final _scrobbleController = + StreamController.broadcast(); @override build() async { final database = ref.watch(databaseProvider); @@ -107,18 +107,18 @@ class ScrobblerNotifier extends AsyncNotifier { await database.delete(database.scrobblerTable).go(); } - void scrobble(SpotubeTrackObject track) { + void scrobble(SpotubeFullTrackObject track) { _scrobbleController.add(track); } - Future love(SpotubeTrackObject track) async { + Future love(SpotubeFullTrackObject track) async { await state.asData?.value?.track.love( artist: track.artists.asString(), track: track.name, ); } - Future unlove(SpotubeTrackObject track) async { + Future unlove(SpotubeFullTrackObject track) async { await state.asData?.value?.track.unLove( artist: track.artists.asString(), track: track.name, diff --git a/lib/provider/server/active_track_sources.dart b/lib/provider/server/active_track_sources.dart index 603ca0e4..13344fb5 100644 --- a/lib/provider/server/active_track_sources.dart +++ b/lib/provider/server/active_track_sources.dart @@ -16,7 +16,7 @@ final activeTrackSourcesProvider = FutureProvider< return null; } - if (audioPlayerState.activeTrack is SpotubeLocalTrackObject) { + if (audioPlayerState.activeTrack is SpotubeTrackObject_Local) { return ( source: null, notifier: null, @@ -26,12 +26,12 @@ final activeTrackSourcesProvider = FutureProvider< final sourcedTrack = await ref.watch( sourcedTrackProvider( - audioPlayerState.activeTrack! as SpotubeFullTrackObject, + audioPlayerState.activeTrack?.field0 as SpotubeFullTrackObject, ).future, ); final sourcedTrackNotifier = ref.watch( sourcedTrackProvider( - audioPlayerState.activeTrack! as SpotubeFullTrackObject, + audioPlayerState.activeTrack?.field0 as SpotubeFullTrackObject, ).notifier, ); diff --git a/lib/provider/server/routes/connect.dart b/lib/provider/server/routes/connect.dart index 257c4cb4..ce733518 100644 --- a/lib/provider/server/routes/connect.dart +++ b/lib/provider/server/routes/connect.dart @@ -161,7 +161,7 @@ class ServerConnectRoutes { event.onLoad((event) async { await audioPlayerNotifier.load( - event.data.tracks.cast().toList(), + event.data.tracks.cast().toList(), autoPlay: true, initialIndex: event.data.initialIndex ?? 0, ); diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index db6bf8f5..d26a3051 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -70,8 +70,9 @@ class ServerPlaybackRoutes { final sourcedTrack = activeSourcedTrack?.track.id == track.id ? activeSourcedTrack?.source : await ref.read( - sourcedTrackProvider(spotubeMedia.track as SpotubeFullTrackObject) - .future, + sourcedTrackProvider( + spotubeMedia.track.field0 as SpotubeFullTrackObject, + ).future, ); return sourcedTrack; @@ -258,7 +259,7 @@ class ServerPlaybackRoutes { await MetadataGod.writeMetadata( file: trackCacheFile.path, - metadata: track.query.toMetadata( + metadata: SpotubeTrackObject.full(track.query).toMetadata( imageBytes: imageBytes, fileLength: fileLength, ), diff --git a/lib/provider/track_options/track_options_provider.dart b/lib/provider/track_options/track_options_provider.dart index 5aebf39c..5f65a0e3 100644 --- a/lib/provider/track_options/track_options_provider.dart +++ b/lib/provider/track_options/track_options_provider.dart @@ -98,7 +98,8 @@ class TrackOptionsActions { throw MetadataPluginException.noDefaultMetadataPlugin(); } - final tracks = await metadataPlugin.track.radio(track.id); + final tracks = await metadataPlugin.track + .radio(id: track.id, mpscTx: metadataPlugin.sender); bool replaceQueue = false; @@ -123,7 +124,7 @@ class TrackOptionsActions { } await playback.addTracks( - tracks.toList() + tracks.union() ..removeWhere((e) { final isDuplicate = playlist.tracks.any((t) => t.id == e.id); return e.id == track.id || isDuplicate; @@ -202,14 +203,17 @@ class TrackOptionsActions { } break; case TrackOptionValue.favorite: + if (track is SpotubeTrackObject_Local) break; final isLikedTrack = await ref.read( metadataPluginIsSavedTrackProvider(track.id).future, ); if (isLikedTrack) { - await favoriteTracks.removeFavorite([track]); + await favoriteTracks + .removeFavorite([track.field0 as SpotubeFullTrackObject]); } else { - await favoriteTracks.addFavorite([track]); + await favoriteTracks + .addFavorite([track.field0 as SpotubeFullTrackObject]); } break; case TrackOptionValue.addToPlaylist: @@ -236,18 +240,19 @@ class TrackOptionsActions { actionShare(context); break; case TrackOptionValue.details: - if (track is! SpotubeFullTrackObject) break; + if (track is! SpotubeTrackObject_Full) break; showDialog( context: context, builder: (context) => ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), - child: TrackDetailsDialog(track: track as SpotubeFullTrackObject), + child: TrackDetailsDialog( + track: track.field0 as SpotubeFullTrackObject), ), ); break; case TrackOptionValue.download: - if (track is SpotubeLocalTrackObject) break; - downloadManager.addToQueue(track as SpotubeFullTrackObject); + if (track is SpotubeTrackObject_Local) break; + downloadManager.addToQueue(track.field0 as SpotubeFullTrackObject); break; case TrackOptionValue.startRadio: actionStartRadio(context); diff --git a/lib/services/audio_player/audio_player.dart b/lib/services/audio_player/audio_player.dart index 2693f13a..2c94626c 100644 --- a/lib/services/audio_player/audio_player.dart +++ b/lib/services/audio_player/audio_player.dart @@ -24,13 +24,14 @@ class SpotubeMedia extends mk.Media { final SpotubeTrackObject track; SpotubeMedia(this.track) : assert( - track is SpotubeLocalTrackObject || track is SpotubeFullTrackObject, + track is SpotubeTrackObject_Local || + ((track.field0 as SpotubeFullTrackObject).isrc.isNotEmpty), "Track must be a either a local track or a full track object with ISRC", ), // If the track is a local track, use its path, otherwise use the server URL super( - track is SpotubeLocalTrackObject - ? track.path + track is SpotubeTrackObject_Local + ? track.field0.path : "http://$_host:$serverPort/stream/${track.id}", extras: track.toJson(), ); diff --git a/lib/services/metadata/apis/localstorage.dart b/lib/services/metadata/apis/localstorage.dart deleted file mode 100644 index 4c511e77..00000000 --- a/lib/services/metadata/apis/localstorage.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:hetu_spotube_plugin/hetu_spotube_plugin.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class SharedPreferencesLocalStorage implements Localstorage { - final SharedPreferences _prefs; - final String pluginSlug; - - SharedPreferencesLocalStorage(this._prefs, this.pluginSlug); - - String prefix(String key) { - return 'spotube_plugin.$pluginSlug.$key'; - } - - @override - Future clear() { - return _prefs.clear(); - } - - @override - Future containsKey(String key) async { - return _prefs.containsKey(prefix(key)); - } - - @override - Future getBool(String key) async { - return _prefs.getBool(prefix(key)); - } - - @override - Future getDouble(String key) async { - return _prefs.getDouble(prefix(key)); - } - - @override - Future getInt(String key) async { - return _prefs.getInt(prefix(key)); - } - - @override - Future getString(String key) async { - return _prefs.getString(prefix(key)); - } - - @override - Future?> getStringList(String key) async { - return _prefs.getStringList(prefix(key)); - } - - @override - Future remove(String key) async { - await _prefs.remove(prefix(key)); - } - - @override - Future setBool(String key, bool value) async { - await _prefs.setBool(prefix(key), value); - } - - @override - Future setDouble(String key, double value) async { - await _prefs.setDouble(prefix(key), value); - } - - @override - Future setInt(String key, int value) async { - await _prefs.setInt(prefix(key), value); - } - - @override - Future setString(String key, String value) async { - await _prefs.setString(prefix(key), value); - } - - @override - Future setStringList(String key, List value) async { - await _prefs.setStringList(prefix(key), value); - } -} diff --git a/lib/services/metadata/endpoints/album.dart b/lib/services/metadata/endpoints/album.dart deleted file mode 100644 index 8a858343..00000000 --- a/lib/services/metadata/endpoints/album.dart +++ /dev/null @@ -1,75 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginAlbumEndpoint { - final Hetu hetu; - MetadataPluginAlbumEndpoint(this.hetu); - - HTInstance get hetuMetadataAlbum => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("album") - as HTInstance; - - Future getAlbum(String id) async { - final raw = - await hetuMetadataAlbum.invoke("getAlbum", positionalArgs: [id]) as Map; - - return SpotubeFullAlbumObject.fromJson( - raw.cast(), - ); - } - - Future> tracks( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataAlbum.invoke( - "tracks", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeFullTrackObject.fromJson(json.cast()), - ); - } - - Future> releases({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataAlbum.invoke( - "releases", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeSimpleAlbumObject.fromJson(json.cast()), - ); - } - - Future save(List ids) async { - await hetuMetadataAlbum.invoke( - "save", - positionalArgs: [ids], - ); - } - - Future unsave(List ids) async { - await hetuMetadataAlbum.invoke( - "unsave", - positionalArgs: [ids], - ); - } -} diff --git a/lib/services/metadata/endpoints/artist.dart b/lib/services/metadata/endpoints/artist.dart deleted file mode 100644 index d008ce61..00000000 --- a/lib/services/metadata/endpoints/artist.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginArtistEndpoint { - final Hetu hetu; - MetadataPluginArtistEndpoint(this.hetu); - - HTInstance get hetuMetadataArtist => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("artist") - as HTInstance; - - Future getArtist(String id) async { - final raw = await hetuMetadataArtist - .invoke("getArtist", positionalArgs: [id]) as Map; - - return SpotubeFullArtistObject.fromJson( - raw.cast(), - ); - } - - Future> topTracks( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataArtist.invoke( - "topTracks", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => SpotubeFullTrackObject.fromJson( - json.cast(), - ), - ); - } - - Future> albums( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataArtist.invoke( - "albums", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => SpotubeSimpleAlbumObject.fromJson( - json.cast(), - ), - ); - } - - Future save(List ids) async { - await hetuMetadataArtist.invoke( - "save", - positionalArgs: [ids], - ); - } - - Future unsave(List ids) async { - await hetuMetadataArtist.invoke( - "unsave", - positionalArgs: [ids], - ); - } - - Future> related( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataArtist.invoke( - "related", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit ?? 20, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => SpotubeFullArtistObject.fromJson( - json.cast(), - ), - ); - } -} diff --git a/lib/services/metadata/endpoints/audio_source.dart b/lib/services/metadata/endpoints/audio_source.dart deleted file mode 100644 index d22449c6..00000000 --- a/lib/services/metadata/endpoints/audio_source.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginAudioSourceEndpoint { - final Hetu hetu; - MetadataPluginAudioSourceEndpoint(this.hetu); - - HTInstance get hetuMetadataAudioSource => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("audioSource") - as HTInstance; - - List get supportedPresets { - final raw = hetuMetadataAudioSource.memberGet("supportedPresets") as List; - - return raw - .map((e) => SpotubeAudioSourceContainerPreset.fromJson(e)) - .toList(); - } - - Future> matches( - SpotubeFullTrackObject track, - ) async { - final raw = await hetuMetadataAudioSource - .invoke("matches", positionalArgs: [track.toJson()]) as List; - - return raw.map((e) => SpotubeAudioSourceMatchObject.fromJson(e)).toList(); - } - - Future> streams( - SpotubeAudioSourceMatchObject match, - ) async { - final raw = await hetuMetadataAudioSource - .invoke("streams", positionalArgs: [match.toJson()]) as List; - - return raw.map((e) => SpotubeAudioSourceStreamObject.fromJson(e)).toList(); - } -} diff --git a/lib/services/metadata/endpoints/auth.dart b/lib/services/metadata/endpoints/auth.dart deleted file mode 100644 index 7c2077be..00000000 --- a/lib/services/metadata/endpoints/auth.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:desktop_webview_window/desktop_webview_window.dart'; -import 'package:flutter_inappwebview/flutter_inappwebview.dart'; -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_std/hetu_std.dart'; -import 'package:spotube/utils/platform.dart'; - -class MetadataAuthEndpoint { - final Hetu hetu; - - MetadataAuthEndpoint(this.hetu); - - Stream get authStateStream => - hetu.eval("metadataPlugin.auth.authStateStream"); - - Future authenticate() async { - await hetu.eval("metadataPlugin.auth.authenticate()"); - } - - bool isAuthenticated() { - return hetu.eval("metadataPlugin.auth.isAuthenticated()") as bool; - } - - Future logout() async { - await hetu.eval("metadataPlugin.auth.logout()"); - if (kIsMobile) { - WebStorageManager.instance().deleteAllData(); - CookieManager.instance().deleteAllCookies(); - } - if (kIsDesktop) { - await WebviewWindow.clearAll(); - } - } -} diff --git a/lib/services/metadata/endpoints/browse.dart b/lib/services/metadata/endpoints/browse.dart deleted file mode 100644 index c8105ad1..00000000 --- a/lib/services/metadata/endpoints/browse.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginBrowseEndpoint { - final Hetu hetu; - MetadataPluginBrowseEndpoint(this.hetu); - - HTInstance get hetuMetadataBrowse => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("browse") - as HTInstance; - - Future>> - sections({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataBrowse.invoke( - "sections", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject< - SpotubeBrowseSectionObject>.fromJson( - raw.cast(), - (Map json) => SpotubeBrowseSectionObject.fromJson( - json.cast(), - (json) { - final isPlaylist = json["owner"] != null; - final isAlbum = json["artists"] != null; - if (isPlaylist) { - return SpotubeSimplePlaylistObject.fromJson( - json.cast(), - ); - } else if (isAlbum) { - return SpotubeSimpleAlbumObject.fromJson( - json.cast(), - ); - } else { - return SpotubeFullArtistObject.fromJson( - json.cast(), - ); - } - }, - ), - ); - } - - Future> sectionItems( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataBrowse.invoke( - "sectionItems", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (json) { - final isPlaylist = json["owner"] != null; - final isAlbum = json["artists"] != null; - if (isPlaylist) { - return SpotubeSimplePlaylistObject.fromJson( - json.cast(), - ); - } else if (isAlbum) { - return SpotubeSimpleAlbumObject.fromJson( - json.cast(), - ); - } else { - return SpotubeFullArtistObject.fromJson( - json.cast(), - ); - } - }, - ); - } -} diff --git a/lib/services/metadata/endpoints/core.dart b/lib/services/metadata/endpoints/core.dart deleted file mode 100644 index a8f86128..00000000 --- a/lib/services/metadata/endpoints/core.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginCore { - final Hetu hetu; - - MetadataPluginCore(this.hetu); - - HTInstance get hetuMetadataPluginUpdater => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("core") - as HTInstance; - - Future checkUpdate( - PluginConfiguration pluginConfig, - ) async { - final result = await hetuMetadataPluginUpdater.invoke( - "checkUpdate", - positionalArgs: [pluginConfig.toJson()], - ); - - return result == null - ? null - : PluginUpdateAvailable.fromJson( - (result as Map).cast(), - ); - } - - Future get support async { - final result = await hetuMetadataPluginUpdater.memberGet("support"); - - return result as String; - } - - /// [details] is a map containing the scrobble information, such as: - /// - [id] -> The unique identifier of the track. - /// - [title] -> The title of the track. - /// - [artists] -> List of artists - /// - [id] -> The unique identifier of the artist. - /// - [name] -> The name of the artist. - /// - [album] -> The album of the track - /// - [id] -> The unique identifier of the album. - /// - [name] -> The name of the album. - /// - [timestamp] -> The timestamp of the scrobble (optional). - /// - [duration_ms] -> The duration of the track in milliseconds (optional). - /// - [isrc] -> The ISRC code of the track (optional). - Future scrobble(Map details) { - return hetuMetadataPluginUpdater.invoke( - "scrobble", - positionalArgs: [details], - ); - } -} diff --git a/lib/services/metadata/endpoints/playlist.dart b/lib/services/metadata/endpoints/playlist.dart deleted file mode 100644 index c7f20487..00000000 --- a/lib/services/metadata/endpoints/playlist.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginPlaylistEndpoint { - final Hetu hetu; - MetadataPluginPlaylistEndpoint(this.hetu); - - HTInstance get hetuMetadataPlaylist => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("playlist") - as HTInstance; - - Future getPlaylist(String id) async { - final raw = await hetuMetadataPlaylist - .invoke("getPlaylist", positionalArgs: [id]) as Map; - - return SpotubeFullPlaylistObject.fromJson( - raw.cast(), - ); - } - - Future> tracks( - String id, { - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataPlaylist.invoke( - "tracks", - positionalArgs: [id], - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeFullTrackObject.fromJson(json.cast()), - ); - } - - Future create( - String userId, { - required String name, - String? description, - bool? public, - bool? collaborative, - }) async { - final raw = await hetuMetadataPlaylist.invoke( - "create", - positionalArgs: [userId], - namedArgs: { - "name": name, - "description": description, - "public": public, - "collaborative": collaborative, - }..removeWhere((key, value) => value == null), - ) as Map?; - - if (raw == null) return null; - - return SpotubeFullPlaylistObject.fromJson( - raw.cast(), - ); - } - - Future update( - String playlistId, { - String? name, - String? description, - bool? public, - bool? collaborative, - }) async { - await hetuMetadataPlaylist.invoke( - "update", - positionalArgs: [playlistId], - namedArgs: { - "name": name, - "description": description, - "public": public, - "collaborative": collaborative, - }..removeWhere((key, value) => value == null), - ); - } - - Future addTracks( - String playlistId, { - required List trackIds, - int? position, - }) async { - await hetuMetadataPlaylist.invoke( - "addTracks", - positionalArgs: [playlistId], - namedArgs: { - "trackIds": trackIds, - "position": position, - }..removeWhere((key, value) => value == null), - ); - } - - Future removeTracks( - String playlistId, { - required List trackIds, - }) async { - await hetuMetadataPlaylist.invoke( - "removeTracks", - positionalArgs: [playlistId], - namedArgs: { - "trackIds": trackIds, - }..removeWhere((key, value) => value == null), - ); - } - - Future save(String playlistId) async { - await hetuMetadataPlaylist.invoke( - "save", - positionalArgs: [playlistId], - ); - } - - Future unsave(String playlistId) async { - await hetuMetadataPlaylist.invoke( - "unsave", - positionalArgs: [playlistId], - ); - } - - Future deletePlaylist(String playlistId) async { - return await hetuMetadataPlaylist.invoke( - "deletePlaylist", - positionalArgs: [playlistId], - ); - } -} diff --git a/lib/services/metadata/endpoints/search.dart b/lib/services/metadata/endpoints/search.dart deleted file mode 100644 index c2e14765..00000000 --- a/lib/services/metadata/endpoints/search.dart +++ /dev/null @@ -1,160 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginSearchEndpoint { - final Hetu hetu; - MetadataPluginSearchEndpoint(this.hetu); - - HTInstance get hetuMetadataSearch => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("search") - as HTInstance; - - List get chips { - return (hetuMetadataSearch.memberGet("chips") as List).cast(); - } - - Future all(String query) async { - if (query.isEmpty) { - return SpotubeSearchResponseObject( - albums: [], - artists: [], - playlists: [], - tracks: [], - ); - } - - final raw = await hetuMetadataSearch.invoke( - "all", - positionalArgs: [query], - ) as Map; - - return SpotubeSearchResponseObject.fromJson(raw.cast()); - } - - Future> albums( - String query, { - int? limit, - int? offset, - }) async { - if (query.isEmpty) { - return SpotubePaginationResponseObject( - items: [], - total: 0, - limit: limit ?? 20, - hasMore: false, - nextOffset: null, - ); - } - - final raw = await hetuMetadataSearch.invoke( - "albums", - positionalArgs: [query], - namedArgs: { - "limit": limit, - "offset": offset, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (json) => SpotubeSimpleAlbumObject.fromJson(json.cast()), - ); - } - - Future> artists( - String query, { - int? limit, - int? offset, - }) async { - if (query.isEmpty) { - return SpotubePaginationResponseObject( - items: [], - total: 0, - limit: limit ?? 20, - hasMore: false, - nextOffset: null, - ); - } - - final raw = await hetuMetadataSearch.invoke( - "artists", - positionalArgs: [query], - namedArgs: { - "limit": limit, - "offset": offset, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (json) => SpotubeFullArtistObject.fromJson( - json.cast(), - ), - ); - } - - Future> - playlists( - String query, { - int? limit, - int? offset, - }) async { - if (query.isEmpty) { - return SpotubePaginationResponseObject( - items: [], - total: 0, - limit: limit ?? 20, - hasMore: false, - nextOffset: null, - ); - } - - final raw = await hetuMetadataSearch.invoke( - "playlists", - positionalArgs: [query], - namedArgs: { - "limit": limit, - "offset": offset, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject< - SpotubeSimplePlaylistObject>.fromJson( - raw.cast(), - (json) => SpotubeSimplePlaylistObject.fromJson( - json.cast(), - ), - ); - } - - Future> tracks( - String query, { - int? limit, - int? offset, - }) async { - if (query.isEmpty) { - return SpotubePaginationResponseObject( - items: [], - total: 0, - limit: limit ?? 20, - hasMore: false, - nextOffset: null, - ); - } - - final raw = await hetuMetadataSearch.invoke( - "tracks", - positionalArgs: [query], - namedArgs: { - "limit": limit, - "offset": offset, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (json) => SpotubeFullTrackObject.fromJson(json.cast()), - ); - } -} diff --git a/lib/services/metadata/endpoints/track.dart b/lib/services/metadata/endpoints/track.dart deleted file mode 100644 index 31535970..00000000 --- a/lib/services/metadata/endpoints/track.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginTrackEndpoint { - final Hetu hetu; - MetadataPluginTrackEndpoint(this.hetu); - - HTInstance get hetuMetadataTrack => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("track") - as HTInstance; - - Future getTrack(String id) async { - final raw = - await hetuMetadataTrack.invoke("getTrack", positionalArgs: [id]) as Map; - - return SpotubeFullTrackObject.fromJson( - raw.cast(), - ); - } - - Future save(List ids) async { - await hetuMetadataTrack.invoke("save", positionalArgs: [ids]); - } - - Future unsave(List ids) async { - await hetuMetadataTrack.invoke("unsave", positionalArgs: [ids]); - } - - Future> radio(String id) async { - final result = await hetuMetadataTrack.invoke( - "radio", - positionalArgs: [id], - ); - - return (result as List) - .map( - (e) => SpotubeFullTrackObject.fromJson( - (e as Map).cast(), - ), - ) - .toList(); - } -} diff --git a/lib/services/metadata/endpoints/user.dart b/lib/services/metadata/endpoints/user.dart deleted file mode 100644 index 3c8f0e42..00000000 --- a/lib/services/metadata/endpoints/user.dart +++ /dev/null @@ -1,132 +0,0 @@ -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_script/values.dart'; -import 'package:spotube/models/metadata/metadata.dart'; - -class MetadataPluginUserEndpoint { - final Hetu hetu; - MetadataPluginUserEndpoint(this.hetu); - - HTInstance get hetuMetadataUser => - (hetu.fetch("metadataPlugin") as HTInstance).memberGet("user") - as HTInstance; - - Future me() async { - final raw = await hetuMetadataUser.invoke("me") as Map; - - return SpotubeUserObject.fromJson( - raw.cast(), - ); - } - - Future> savedTracks({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataUser.invoke( - "savedTracks", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeFullTrackObject.fromJson(json.cast()), - ); - } - - Future> - savedPlaylists({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataUser.invoke( - "savedPlaylists", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject< - SpotubeSimplePlaylistObject>.fromJson( - raw.cast(), - (Map json) => - SpotubeSimplePlaylistObject.fromJson(json.cast()), - ); - } - - Future> - savedAlbums({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataUser.invoke( - "savedAlbums", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeSimpleAlbumObject.fromJson(json.cast()), - ); - } - - Future> - savedArtists({ - int? offset, - int? limit, - }) async { - final raw = await hetuMetadataUser.invoke( - "savedArtists", - namedArgs: { - "offset": offset, - "limit": limit, - }..removeWhere((key, value) => value == null), - ) as Map; - - return SpotubePaginationResponseObject.fromJson( - raw.cast(), - (Map json) => - SpotubeFullArtistObject.fromJson(json.cast()), - ); - } - - Future isSavedPlaylist(String playlistId) async { - return await hetuMetadataUser.invoke( - "isSavedPlaylist", - positionalArgs: [playlistId], - ) as bool; - } - - Future> isSavedTracks(List ids) async { - final values = await hetuMetadataUser.invoke( - "isSavedTracks", - positionalArgs: [ids], - ); - return (values as List).cast(); - } - - Future> isSavedAlbums(List ids) async { - final values = await hetuMetadataUser.invoke( - "isSavedAlbums", - positionalArgs: [ids], - ) as List; - return values.cast(); - } - - Future> isSavedArtists(List ids) async { - final values = await hetuMetadataUser.invoke( - "isSavedArtists", - positionalArgs: [ids], - ) as List; - - return values.cast(); - } -} diff --git a/lib/services/metadata/errors/exceptions.dart b/lib/services/metadata/errors/exceptions.dart index 5bb5ac57..319915b6 100644 --- a/lib/services/metadata/errors/exceptions.dart +++ b/lib/services/metadata/errors/exceptions.dart @@ -64,9 +64,9 @@ class MetadataPluginException implements Exception { 'Same plugin already exists with the same name and version.', errorCode: MetadataPluginErrorCode.duplicatePlugin, ); - MetadataPluginException.pluginByteCodeFileNotFound() + MetadataPluginException.pluginSourceCodeFileNotFound() : this._( - 'Plugin byte code file, plugin.out not found. Please ensure the plugin is correctly packaged.', + 'Plugin byte code file, plugin.js not found. Please ensure the plugin is correctly packaged.', errorCode: MetadataPluginErrorCode.pluginByteCodeFileNotFound, ); MetadataPluginException.noDefaultMetadataPlugin() diff --git a/lib/services/metadata/metadata.dart b/lib/services/metadata/metadata.dart index 5860e0d6..ffc3a746 100644 --- a/lib/services/metadata/metadata.dart +++ b/lib/services/metadata/metadata.dart @@ -1,181 +1,38 @@ -import 'dart:typed_data'; - -import 'package:auto_route/auto_route.dart'; -import 'package:hetu_otp_util/hetu_otp_util.dart'; -import 'package:hetu_script/hetu_script.dart'; -import 'package:hetu_spotube_plugin/hetu_spotube_plugin.dart' as spotube_plugin; -import 'package:hetu_spotube_plugin/hetu_spotube_plugin.dart' - hide YouTubeEngine; -import 'package:hetu_std/hetu_std.dart'; -import 'package:pub_semver/pub_semver.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:spotube/collections/routes.dart'; -import 'package:spotube/collections/routes.gr.dart'; -import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/models/metadata/metadata.dart'; -import 'package:spotube/services/metadata/apis/localstorage.dart'; -import 'package:spotube/services/metadata/endpoints/album.dart'; -import 'package:spotube/services/metadata/endpoints/artist.dart'; -import 'package:spotube/services/metadata/endpoints/audio_source.dart'; -import 'package:spotube/services/metadata/endpoints/auth.dart'; -import 'package:spotube/services/metadata/endpoints/browse.dart'; -import 'package:spotube/services/metadata/endpoints/playlist.dart'; -import 'package:spotube/services/metadata/endpoints/search.dart'; -import 'package:spotube/services/metadata/endpoints/track.dart'; -import 'package:spotube/services/metadata/endpoints/core.dart'; -import 'package:spotube/services/metadata/endpoints/user.dart'; -import 'package:spotube/services/youtube_engine/youtube_engine.dart'; - -const defaultMetadataLimit = "20"; +import 'package:spotube/src/rust/api/plugin/models/auth.dart'; +import 'package:spotube/src/rust/api/plugin/models/core.dart'; +import 'package:spotube/src/rust/api/plugin/plugin.dart'; +import 'package:spotube/src/rust/api/plugin/senders.dart'; class MetadataPlugin { - static final pluginApiVersion = Version.parse("2.0.0"); + final SpotubePlugin plugin; + late final OpaqueSender sender; - static Future create( - YouTubeEngine youtubeEngine, - PluginConfiguration config, - Uint8List byteCode, - ) async { - final sharedPreferences = await SharedPreferences.getInstance(); - BuildContext? pageContext; - - final hetu = Hetu(); - hetu.init(); - - HetuStdLoader.loadBindings(hetu); - HetuSpotubePluginLoader.loadBindings( - hetu, - localStorageImpl: SharedPreferencesLocalStorage( - sharedPreferences, - config.slug, - ), - onNavigatorPush: (route) { - return rootNavigatorKey.currentContext?.router - .pushWidget(Builder(builder: (context) { - pageContext = context; - return Scaffold( - headers: const [ - TitleBar( - automaticallyImplyLeading: true, - ) - ], - child: route, - ); - })); - }, - onNavigatorPop: () { - pageContext?.maybePop(); - }, - onShowForm: (title, fields) async { - if (rootNavigatorKey.currentContext == null) { - return []; - } - - return await rootNavigatorKey.currentContext!.router - .push>?>( - SettingsMetadataProviderFormRoute( - title: title, - fields: - fields.map((e) => MetadataFormFieldObject.fromJson(e)).toList(), - ), - ); - }, - createYoutubeEngine: () { - return spotube_plugin.YouTubeEngine( - search: (query) async { - final result = await youtubeEngine.searchVideos(query); - return result - .map((video) => { - 'id': video.id.value, - 'title': video.title, - 'author': video.author, - 'duration': video.duration?.inSeconds, - 'description': video.description, - 'uploadDate': video.uploadDate?.toIso8601String(), - 'viewCount': video.engagement.viewCount, - 'likeCount': video.engagement.likeCount, - 'isLive': video.isLive, - }) - .toList(); - }, - getVideo: (videoId) async { - final video = await youtubeEngine.getVideo(videoId); - return { - 'id': video.id.value, - 'title': video.title, - 'author': video.author, - 'duration': video.duration?.inSeconds, - 'description': video.description, - 'uploadDate': video.uploadDate?.toIso8601String(), - 'viewCount': video.engagement.viewCount, - 'likeCount': video.engagement.likeCount, - 'isLive': video.isLive, - }; - }, - streamManifest: (videoId) { - return youtubeEngine.getStreamManifest(videoId).then( - (manifest) { - final streams = manifest.audioOnly - .map( - (stream) => { - 'url': stream.url.toString(), - 'quality': stream.qualityLabel, - 'bitrate': stream.bitrate.bitsPerSecond, - 'container': stream.container.name, - 'videoId': stream.videoId, - }, - ) - .toList(); - return streams; - }, - ); - }, - ); - }, + MetadataPlugin({ + required String pluginScript, + required PluginConfiguration pluginConfig, + required String serverEndpointUrl, + required String serverSecret, + }) : plugin = SpotubePlugin() { + sender = plugin.createContext( + pluginScript: pluginScript, + pluginConfig: pluginConfig, + serverEndpointUrl: serverEndpointUrl, + serverSecret: serverSecret, ); - - await HetuStdLoader.loadBytecodeFlutter(hetu); - await HetuOtpUtilLoader.loadBytecodeFlutter(hetu); - await HetuSpotubePluginLoader.loadBytecodeFlutter(hetu); - - hetu.loadBytecode(bytes: byteCode, moduleName: "plugin"); - hetu.eval(""" - import "module:plugin" as plugin - - var Plugin = plugin.${config.entryPoint} - - var metadataPlugin = Plugin() - """); - - return MetadataPlugin._(hetu); } - final Hetu hetu; + Stream authState() => plugin.authState(); - late final MetadataAuthEndpoint auth; + PluginAlbumSender get album => plugin.album; + PluginArtistSender get artist => plugin.artist; + PluginAudioSourceSender get audioSource => plugin.audioSource; + PluginAuthSender get auth => plugin.auth; + PluginBrowseSender get browse => plugin.browse; + PluginCoreSender get core => plugin.core; + PluginPlaylistSender get playlist => plugin.playlist; + PluginSearchSender get search => plugin.search; + PluginTrackSender get track => plugin.track; + PluginUserSender get user => plugin.user; - late final MetadataPluginAudioSourceEndpoint audioSource; - late final MetadataPluginAlbumEndpoint album; - late final MetadataPluginArtistEndpoint artist; - late final MetadataPluginBrowseEndpoint browse; - late final MetadataPluginSearchEndpoint search; - late final MetadataPluginPlaylistEndpoint playlist; - late final MetadataPluginTrackEndpoint track; - late final MetadataPluginUserEndpoint user; - late final MetadataPluginCore core; - - MetadataPlugin._(this.hetu) { - auth = MetadataAuthEndpoint(hetu); - - audioSource = MetadataPluginAudioSourceEndpoint(hetu); - artist = MetadataPluginArtistEndpoint(hetu); - album = MetadataPluginAlbumEndpoint(hetu); - browse = MetadataPluginBrowseEndpoint(hetu); - search = MetadataPluginSearchEndpoint(hetu); - playlist = MetadataPluginPlaylistEndpoint(hetu); - track = MetadataPluginTrackEndpoint(hetu); - user = MetadataPluginUserEndpoint(hetu); - core = MetadataPluginCore(hetu); - } + Future close() => plugin.close(tx: sender); } diff --git a/lib/services/sourced_track/exceptions.dart b/lib/services/sourced_track/exceptions.dart index 4817c9fb..f23c6632 100644 --- a/lib/services/sourced_track/exceptions.dart +++ b/lib/services/sourced_track/exceptions.dart @@ -1,7 +1,7 @@ import 'package:spotube/models/metadata/metadata.dart'; class TrackNotFoundError extends Error { - final SpotubeTrackObject track; + final SpotubeFullTrackObject track; TrackNotFoundError(this.track); diff --git a/lib/services/sourced_track/sourced_track.dart b/lib/services/sourced_track/sourced_track.dart index 385e5be6..01b552a4 100644 --- a/lib/services/sourced_track/sourced_track.dart +++ b/lib/services/sourced_track/sourced_track.dart @@ -49,7 +49,7 @@ class SourcedTrack extends BasicSourcedTrack { final cachedSource = await (database.select(database.sourceMatchTable) ..where((s) => s.trackId.equals(query.id) & - s.sourceType.equals(audioSourceConfig.slug)) + s.sourceType.equals(audioSourceConfig.slug())) ..limit(1) ..orderBy([ (s) => @@ -68,17 +68,18 @@ class SourcedTrack extends BasicSourcedTrack { SourceMatchTableCompanion.insert( trackId: query.id, sourceInfo: Value(jsonEncode(siblings.first)), - sourceType: audioSourceConfig.slug, + sourceType: audioSourceConfig.slug(), ), ); - final manifest = await audioSource.audioSource.streams(siblings.first); + final manifest = await audioSource.audioSource + .streams(matched: siblings.first, mpscTx: audioSource.sender); return SourcedTrack( ref: ref, siblings: siblings.skip(1).toList(), info: siblings.first, - source: audioSourceConfig.slug, + source: audioSourceConfig.slug(), sources: manifest, query: query, ); @@ -86,7 +87,8 @@ class SourcedTrack extends BasicSourcedTrack { final item = SpotubeAudioSourceMatchObject.fromJson( jsonDecode(cachedSource.sourceInfo), ); - final manifest = await audioSource.audioSource.streams(item); + final manifest = await audioSource.audioSource + .streams(matched: item, mpscTx: audioSource.sender); final sourcedTrack = SourcedTrack( ref: ref, @@ -94,7 +96,7 @@ class SourcedTrack extends BasicSourcedTrack { sources: manifest, info: item, query: query, - source: audioSourceConfig.slug, + source: audioSourceConfig.slug(), ); AppLogger.log.i("${query.name}: ${sourcedTrack.url}"); @@ -163,7 +165,8 @@ class SourcedTrack extends BasicSourcedTrack { final videoResults = []; - final searchResults = await audioSource.audioSource.matches(query); + final searchResults = await audioSource.audioSource + .matches(track: query, mpscTx: audioSource.sender); if (ServiceUtils.onlyContainsEnglish(query.name)) { videoResults.addAll(searchResults); @@ -214,7 +217,10 @@ class SourcedTrack extends BasicSourcedTrack { final newSiblings = siblings.where((s) => s.id != sibling.id).toList() ..insert(0, info); - final manifest = await audioSource.audioSource.streams(newSourceInfo); + final manifest = await audioSource.audioSource.streams( + matched: newSourceInfo, + mpscTx: audioSource.sender, + ); final database = ref.read(databaseProvider); @@ -223,7 +229,7 @@ class SourcedTrack extends BasicSourcedTrack { ..where( (table) => table.trackId.equals(query.id) & - table.sourceType.equals(audioSourceConfig.slug), + table.sourceType.equals(audioSourceConfig.slug()), )) .go(); @@ -231,7 +237,7 @@ class SourcedTrack extends BasicSourcedTrack { SourceMatchTableCompanion.insert( trackId: query.id, sourceInfo: Value(jsonEncode(sibling)), - sourceType: audioSourceConfig.slug, + sourceType: audioSourceConfig.slug(), createdAt: Value(DateTime.now()), ), mode: InsertMode.replace, @@ -281,7 +287,10 @@ class SourcedTrack extends BasicSourcedTrack { AppLogger.log.d(stringBuffer.toString()); if (validStreams.isEmpty) { - validStreams = await audioSource.audioSource.streams(info); + validStreams = await audioSource.audioSource.streams( + matched: info, + mpscTx: audioSource.sender, + ); } final sourcedTrack = SourcedTrack( diff --git a/lib/src/rust/api/plugin/models/audio_source.dart b/lib/src/rust/api/plugin/models/audio_source.dart index c8652e40..ec5255a6 100644 --- a/lib/src/rust/api/plugin/models/audio_source.dart +++ b/lib/src/rust/api/plugin/models/audio_source.dart @@ -80,7 +80,7 @@ sealed class SpotubeAudioSourceMatchObject required String id, required String title, required List artists, - required BigInt duration, + required int duration, String? thumbnail, required String externalUri, }) = _SpotubeAudioSourceMatchObject; diff --git a/lib/src/rust/api/plugin/models/audio_source.freezed.dart b/lib/src/rust/api/plugin/models/audio_source.freezed.dart index b0904f73..bdb35945 100644 --- a/lib/src/rust/api/plugin/models/audio_source.freezed.dart +++ b/lib/src/rust/api/plugin/models/audio_source.freezed.dart @@ -973,7 +973,7 @@ mixin _$SpotubeAudioSourceMatchObject { String get id => throw _privateConstructorUsedError; String get title => throw _privateConstructorUsedError; List get artists => throw _privateConstructorUsedError; - BigInt get duration => throw _privateConstructorUsedError; + int get duration => throw _privateConstructorUsedError; String? get thumbnail => throw _privateConstructorUsedError; String get externalUri => throw _privateConstructorUsedError; @@ -1000,7 +1000,7 @@ abstract class $SpotubeAudioSourceMatchObjectCopyWith<$Res> { String id, String title, List artists, - BigInt duration, + int duration, String? thumbnail, String externalUri}); } @@ -1049,7 +1049,7 @@ class _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, duration: null == duration ? _value.duration : duration // ignore: cast_nullable_to_non_nullable - as BigInt, + as int, thumbnail: freezed == thumbnail ? _value.thumbnail : thumbnail // ignore: cast_nullable_to_non_nullable @@ -1076,7 +1076,7 @@ abstract class _$$SpotubeAudioSourceMatchObjectImplCopyWith<$Res> String id, String title, List artists, - BigInt duration, + int duration, String? thumbnail, String externalUri}); } @@ -1124,7 +1124,7 @@ class __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl<$Res> duration: null == duration ? _value.duration : duration // ignore: cast_nullable_to_non_nullable - as BigInt, + as int, thumbnail: freezed == thumbnail ? _value.thumbnail : thumbnail // ignore: cast_nullable_to_non_nullable @@ -1170,7 +1170,7 @@ class _$SpotubeAudioSourceMatchObjectImpl } @override - final BigInt duration; + final int duration; @override final String? thumbnail; @override @@ -1236,7 +1236,7 @@ abstract class _SpotubeAudioSourceMatchObject required final String id, required final String title, required final List artists, - required final BigInt duration, + required final int duration, final String? thumbnail, required final String externalUri}) = _$SpotubeAudioSourceMatchObjectImpl; @@ -1252,7 +1252,7 @@ abstract class _SpotubeAudioSourceMatchObject @override List get artists; @override - BigInt get duration; + int get duration; @override String? get thumbnail; @override diff --git a/lib/src/rust/api/plugin/models/audio_source.g.dart b/lib/src/rust/api/plugin/models/audio_source.g.dart index 51fe8ef0..3bf766ba 100644 --- a/lib/src/rust/api/plugin/models/audio_source.g.dart +++ b/lib/src/rust/api/plugin/models/audio_source.g.dart @@ -92,7 +92,7 @@ _$SpotubeAudioSourceMatchObjectImpl artists: (json['artists'] as List) .map((e) => e as String) .toList(), - duration: BigInt.parse(json['duration'] as String), + duration: (json['duration'] as num).toInt(), thumbnail: json['thumbnail'] as String?, externalUri: json['externalUri'] as String, ); @@ -104,7 +104,7 @@ Map _$$SpotubeAudioSourceMatchObjectImplToJson( 'id': instance.id, 'title': instance.title, 'artists': instance.artists, - 'duration': instance.duration.toString(), + 'duration': instance.duration, 'thumbnail': instance.thumbnail, 'externalUri': instance.externalUri, }; diff --git a/lib/src/rust/api/plugin/models/browse.dart b/lib/src/rust/api/plugin/models/browse.dart index a5b44df7..9530c1d9 100644 --- a/lib/src/rust/api/plugin/models/browse.dart +++ b/lib/src/rust/api/plugin/models/browse.dart @@ -34,7 +34,7 @@ sealed class SpotubeBrowseSectionResponseObjectItem const SpotubeBrowseSectionResponseObjectItem._(); const factory SpotubeBrowseSectionResponseObjectItem.track( - SpotubeTrackObject field0, + SpotubeFullTrackObject field0, ) = SpotubeBrowseSectionResponseObjectItem_Track; const factory SpotubeBrowseSectionResponseObjectItem.playlistFull( SpotubeFullPlaylistObject field0, diff --git a/lib/src/rust/api/plugin/models/browse.freezed.dart b/lib/src/rust/api/plugin/models/browse.freezed.dart index 0d4741cb..3e325ceb 100644 --- a/lib/src/rust/api/plugin/models/browse.freezed.dart +++ b/lib/src/rust/api/plugin/models/browse.freezed.dart @@ -270,7 +270,7 @@ mixin _$SpotubeBrowseSectionResponseObjectItem { Object get field0 => throw _privateConstructorUsedError; @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -282,7 +282,7 @@ mixin _$SpotubeBrowseSectionResponseObjectItem { throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -293,7 +293,7 @@ mixin _$SpotubeBrowseSectionResponseObjectItem { throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -403,9 +403,9 @@ abstract class _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith< then) = __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl<$Res>; @useResult - $Res call({SpotubeTrackObject field0}); + $Res call({SpotubeFullTrackObject field0}); - $SpotubeTrackObjectCopyWith<$Res> get field0; + $SpotubeFullTrackObjectCopyWith<$Res> get field0; } /// @nodoc @@ -430,7 +430,7 @@ class __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl<$Res> null == field0 ? _value.field0 : field0 // ignore: cast_nullable_to_non_nullable - as SpotubeTrackObject, + as SpotubeFullTrackObject, )); } @@ -438,8 +438,8 @@ class __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl<$Res> /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') - $SpotubeTrackObjectCopyWith<$Res> get field0 { - return $SpotubeTrackObjectCopyWith<$Res>(_value.field0, (value) { + $SpotubeFullTrackObjectCopyWith<$Res> get field0 { + return $SpotubeFullTrackObjectCopyWith<$Res>(_value.field0, (value) { return _then(_value.copyWith(field0: value)); }); } @@ -453,7 +453,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl : super._(); @override - final SpotubeTrackObject field0; + final SpotubeFullTrackObject field0; @override String toString() { @@ -486,7 +486,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -501,7 +501,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -515,7 +515,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -611,12 +611,12 @@ class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl abstract class SpotubeBrowseSectionResponseObjectItem_Track extends SpotubeBrowseSectionResponseObjectItem { const factory SpotubeBrowseSectionResponseObjectItem_Track( - final SpotubeTrackObject field0) = + final SpotubeFullTrackObject field0) = _$SpotubeBrowseSectionResponseObjectItem_TrackImpl; const SpotubeBrowseSectionResponseObjectItem_Track._() : super._(); @override - SpotubeTrackObject get field0; + SpotubeFullTrackObject get field0; /// Create a copy of SpotubeBrowseSectionResponseObjectItem /// with the given fields replaced by the non-null parameter values. @@ -724,7 +724,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -739,7 +739,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -753,7 +753,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -962,7 +962,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -977,7 +977,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -991,7 +991,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1199,7 +1199,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1214,7 +1214,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1228,7 +1228,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1433,7 +1433,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1448,7 +1448,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1462,7 +1462,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1668,7 +1668,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1683,7 +1683,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1697,7 +1697,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1906,7 +1906,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1921,7 +1921,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1935,7 +1935,7 @@ class _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, diff --git a/lib/src/rust/api/plugin/models/core.dart b/lib/src/rust/api/plugin/models/core.dart index 7dce7d94..5ab9ee9d 100644 --- a/lib/src/rust/api/plugin/models/core.dart +++ b/lib/src/rust/api/plugin/models/core.dart @@ -5,6 +5,9 @@ import '../../../frb_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'core.freezed.dart'; +part 'core.g.dart'; // These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `cmp`, `cmp`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `partial_cmp`, `partial_cmp` @@ -23,168 +26,75 @@ enum PluginApi { ; } -class PluginConfiguration { - final String name; - final String description; - final String version; - final String author; - final String entryPoint; - final String pluginApiVersion; - final List apis; - final List abilities; - final String? repository; - - const PluginConfiguration({ - required this.name, - required this.description, - required this.version, - required this.author, - required this.entryPoint, - required this.pluginApiVersion, - required this.apis, - required this.abilities, - this.repository, - }); - - Future slug() => +@freezed +sealed class PluginConfiguration with _$PluginConfiguration { + const PluginConfiguration._(); + const factory PluginConfiguration({ + required String name, + required String description, + required String version, + required String author, + required String entryPoint, + required String pluginApiVersion, + required List apis, + required List abilities, + String? repository, + }) = _PluginConfiguration; + String slug() => RustLib.instance.api.crateApiPluginModelsCorePluginConfigurationSlug( that: this, ); - @override - int get hashCode => - name.hashCode ^ - description.hashCode ^ - version.hashCode ^ - author.hashCode ^ - entryPoint.hashCode ^ - pluginApiVersion.hashCode ^ - apis.hashCode ^ - abilities.hashCode ^ - repository.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is PluginConfiguration && - runtimeType == other.runtimeType && - name == other.name && - description == other.description && - version == other.version && - author == other.author && - entryPoint == other.entryPoint && - pluginApiVersion == other.pluginApiVersion && - apis == other.apis && - abilities == other.abilities && - repository == other.repository; + factory PluginConfiguration.fromJson(Map json) => + _$PluginConfigurationFromJson(json); } -class PluginUpdateAvailable { - final String downloadUrl; - final String version; - final String? changelog; +@freezed +sealed class PluginUpdateAvailable with _$PluginUpdateAvailable { + const factory PluginUpdateAvailable({ + required String downloadUrl, + required String version, + String? changelog, + }) = _PluginUpdateAvailable; - const PluginUpdateAvailable({ - required this.downloadUrl, - required this.version, - this.changelog, - }); - - @override - int get hashCode => - downloadUrl.hashCode ^ version.hashCode ^ changelog.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is PluginUpdateAvailable && - runtimeType == other.runtimeType && - downloadUrl == other.downloadUrl && - version == other.version && - changelog == other.changelog; + factory PluginUpdateAvailable.fromJson(Map json) => + _$PluginUpdateAvailableFromJson(json); } -class ScrobbleAlbum { - final String id; - final String name; +@freezed +sealed class ScrobbleAlbum with _$ScrobbleAlbum { + const factory ScrobbleAlbum({ + required String id, + required String name, + }) = _ScrobbleAlbum; - const ScrobbleAlbum({ - required this.id, - required this.name, - }); - - @override - int get hashCode => id.hashCode ^ name.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is ScrobbleAlbum && - runtimeType == other.runtimeType && - id == other.id && - name == other.name; + factory ScrobbleAlbum.fromJson(Map json) => + _$ScrobbleAlbumFromJson(json); } -class ScrobbleArtist { - final String id; - final String name; +@freezed +sealed class ScrobbleArtist with _$ScrobbleArtist { + const factory ScrobbleArtist({ + required String id, + required String name, + }) = _ScrobbleArtist; - const ScrobbleArtist({ - required this.id, - required this.name, - }); - - @override - int get hashCode => id.hashCode ^ name.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is ScrobbleArtist && - runtimeType == other.runtimeType && - id == other.id && - name == other.name; + factory ScrobbleArtist.fromJson(Map json) => + _$ScrobbleArtistFromJson(json); } -class ScrobbleDetails { - final String id; - final String title; - final List artists; - final ScrobbleAlbum album; - final PlatformInt64? timestamp; - final int? durationMs; - final String? isrc; +@freezed +sealed class ScrobbleDetails with _$ScrobbleDetails { + const factory ScrobbleDetails({ + required String id, + required String title, + required List artists, + required ScrobbleAlbum album, + int? timestamp, + int? durationMs, + String? isrc, + }) = _ScrobbleDetails; - const ScrobbleDetails({ - required this.id, - required this.title, - required this.artists, - required this.album, - this.timestamp, - this.durationMs, - this.isrc, - }); - - @override - int get hashCode => - id.hashCode ^ - title.hashCode ^ - artists.hashCode ^ - album.hashCode ^ - timestamp.hashCode ^ - durationMs.hashCode ^ - isrc.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is ScrobbleDetails && - runtimeType == other.runtimeType && - id == other.id && - title == other.title && - artists == other.artists && - album == other.album && - timestamp == other.timestamp && - durationMs == other.durationMs && - isrc == other.isrc; + factory ScrobbleDetails.fromJson(Map json) => + _$ScrobbleDetailsFromJson(json); } diff --git a/lib/src/rust/api/plugin/models/core.freezed.dart b/lib/src/rust/api/plugin/models/core.freezed.dart new file mode 100644 index 00000000..0d0d2522 --- /dev/null +++ b/lib/src/rust/api/plugin/models/core.freezed.dart @@ -0,0 +1,1193 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'core.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +PluginConfiguration _$PluginConfigurationFromJson(Map json) { + return _PluginConfiguration.fromJson(json); +} + +/// @nodoc +mixin _$PluginConfiguration { + String get name => throw _privateConstructorUsedError; + String get description => throw _privateConstructorUsedError; + String get version => throw _privateConstructorUsedError; + String get author => throw _privateConstructorUsedError; + String get entryPoint => throw _privateConstructorUsedError; + String get pluginApiVersion => throw _privateConstructorUsedError; + List get apis => throw _privateConstructorUsedError; + List get abilities => throw _privateConstructorUsedError; + String? get repository => throw _privateConstructorUsedError; + + /// Serializes this PluginConfiguration to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PluginConfiguration + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PluginConfigurationCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PluginConfigurationCopyWith<$Res> { + factory $PluginConfigurationCopyWith( + PluginConfiguration value, $Res Function(PluginConfiguration) then) = + _$PluginConfigurationCopyWithImpl<$Res, PluginConfiguration>; + @useResult + $Res call( + {String name, + String description, + String version, + String author, + String entryPoint, + String pluginApiVersion, + List apis, + List abilities, + String? repository}); +} + +/// @nodoc +class _$PluginConfigurationCopyWithImpl<$Res, $Val extends PluginConfiguration> + implements $PluginConfigurationCopyWith<$Res> { + _$PluginConfigurationCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PluginConfiguration + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? version = null, + Object? author = null, + Object? entryPoint = null, + Object? pluginApiVersion = null, + Object? apis = null, + Object? abilities = null, + Object? repository = freezed, + }) { + return _then(_value.copyWith( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + version: null == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String, + author: null == author + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + entryPoint: null == entryPoint + ? _value.entryPoint + : entryPoint // ignore: cast_nullable_to_non_nullable + as String, + pluginApiVersion: null == pluginApiVersion + ? _value.pluginApiVersion + : pluginApiVersion // ignore: cast_nullable_to_non_nullable + as String, + apis: null == apis + ? _value.apis + : apis // ignore: cast_nullable_to_non_nullable + as List, + abilities: null == abilities + ? _value.abilities + : abilities // ignore: cast_nullable_to_non_nullable + as List, + repository: freezed == repository + ? _value.repository + : repository // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PluginConfigurationImplCopyWith<$Res> + implements $PluginConfigurationCopyWith<$Res> { + factory _$$PluginConfigurationImplCopyWith(_$PluginConfigurationImpl value, + $Res Function(_$PluginConfigurationImpl) then) = + __$$PluginConfigurationImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String name, + String description, + String version, + String author, + String entryPoint, + String pluginApiVersion, + List apis, + List abilities, + String? repository}); +} + +/// @nodoc +class __$$PluginConfigurationImplCopyWithImpl<$Res> + extends _$PluginConfigurationCopyWithImpl<$Res, _$PluginConfigurationImpl> + implements _$$PluginConfigurationImplCopyWith<$Res> { + __$$PluginConfigurationImplCopyWithImpl(_$PluginConfigurationImpl _value, + $Res Function(_$PluginConfigurationImpl) _then) + : super(_value, _then); + + /// Create a copy of PluginConfiguration + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = null, + Object? description = null, + Object? version = null, + Object? author = null, + Object? entryPoint = null, + Object? pluginApiVersion = null, + Object? apis = null, + Object? abilities = null, + Object? repository = freezed, + }) { + return _then(_$PluginConfigurationImpl( + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + version: null == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String, + author: null == author + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + entryPoint: null == entryPoint + ? _value.entryPoint + : entryPoint // ignore: cast_nullable_to_non_nullable + as String, + pluginApiVersion: null == pluginApiVersion + ? _value.pluginApiVersion + : pluginApiVersion // ignore: cast_nullable_to_non_nullable + as String, + apis: null == apis + ? _value._apis + : apis // ignore: cast_nullable_to_non_nullable + as List, + abilities: null == abilities + ? _value._abilities + : abilities // ignore: cast_nullable_to_non_nullable + as List, + repository: freezed == repository + ? _value.repository + : repository // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PluginConfigurationImpl extends _PluginConfiguration { + const _$PluginConfigurationImpl( + {required this.name, + required this.description, + required this.version, + required this.author, + required this.entryPoint, + required this.pluginApiVersion, + required final List apis, + required final List abilities, + this.repository}) + : _apis = apis, + _abilities = abilities, + super._(); + + factory _$PluginConfigurationImpl.fromJson(Map json) => + _$$PluginConfigurationImplFromJson(json); + + @override + final String name; + @override + final String description; + @override + final String version; + @override + final String author; + @override + final String entryPoint; + @override + final String pluginApiVersion; + final List _apis; + @override + List get apis { + if (_apis is EqualUnmodifiableListView) return _apis; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_apis); + } + + final List _abilities; + @override + List get abilities { + if (_abilities is EqualUnmodifiableListView) return _abilities; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_abilities); + } + + @override + final String? repository; + + @override + String toString() { + return 'PluginConfiguration(name: $name, description: $description, version: $version, author: $author, entryPoint: $entryPoint, pluginApiVersion: $pluginApiVersion, apis: $apis, abilities: $abilities, repository: $repository)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PluginConfigurationImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.version, version) || other.version == version) && + (identical(other.author, author) || other.author == author) && + (identical(other.entryPoint, entryPoint) || + other.entryPoint == entryPoint) && + (identical(other.pluginApiVersion, pluginApiVersion) || + other.pluginApiVersion == pluginApiVersion) && + const DeepCollectionEquality().equals(other._apis, _apis) && + const DeepCollectionEquality() + .equals(other._abilities, _abilities) && + (identical(other.repository, repository) || + other.repository == repository)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + name, + description, + version, + author, + entryPoint, + pluginApiVersion, + const DeepCollectionEquality().hash(_apis), + const DeepCollectionEquality().hash(_abilities), + repository); + + /// Create a copy of PluginConfiguration + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PluginConfigurationImplCopyWith<_$PluginConfigurationImpl> get copyWith => + __$$PluginConfigurationImplCopyWithImpl<_$PluginConfigurationImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$PluginConfigurationImplToJson( + this, + ); + } +} + +abstract class _PluginConfiguration extends PluginConfiguration { + const factory _PluginConfiguration( + {required final String name, + required final String description, + required final String version, + required final String author, + required final String entryPoint, + required final String pluginApiVersion, + required final List apis, + required final List abilities, + final String? repository}) = _$PluginConfigurationImpl; + const _PluginConfiguration._() : super._(); + + factory _PluginConfiguration.fromJson(Map json) = + _$PluginConfigurationImpl.fromJson; + + @override + String get name; + @override + String get description; + @override + String get version; + @override + String get author; + @override + String get entryPoint; + @override + String get pluginApiVersion; + @override + List get apis; + @override + List get abilities; + @override + String? get repository; + + /// Create a copy of PluginConfiguration + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PluginConfigurationImplCopyWith<_$PluginConfigurationImpl> get copyWith => + throw _privateConstructorUsedError; +} + +PluginUpdateAvailable _$PluginUpdateAvailableFromJson( + Map json) { + return _PluginUpdateAvailable.fromJson(json); +} + +/// @nodoc +mixin _$PluginUpdateAvailable { + String get downloadUrl => throw _privateConstructorUsedError; + String get version => throw _privateConstructorUsedError; + String? get changelog => throw _privateConstructorUsedError; + + /// Serializes this PluginUpdateAvailable to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PluginUpdateAvailable + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PluginUpdateAvailableCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PluginUpdateAvailableCopyWith<$Res> { + factory $PluginUpdateAvailableCopyWith(PluginUpdateAvailable value, + $Res Function(PluginUpdateAvailable) then) = + _$PluginUpdateAvailableCopyWithImpl<$Res, PluginUpdateAvailable>; + @useResult + $Res call({String downloadUrl, String version, String? changelog}); +} + +/// @nodoc +class _$PluginUpdateAvailableCopyWithImpl<$Res, + $Val extends PluginUpdateAvailable> + implements $PluginUpdateAvailableCopyWith<$Res> { + _$PluginUpdateAvailableCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PluginUpdateAvailable + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? downloadUrl = null, + Object? version = null, + Object? changelog = freezed, + }) { + return _then(_value.copyWith( + downloadUrl: null == downloadUrl + ? _value.downloadUrl + : downloadUrl // ignore: cast_nullable_to_non_nullable + as String, + version: null == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String, + changelog: freezed == changelog + ? _value.changelog + : changelog // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PluginUpdateAvailableImplCopyWith<$Res> + implements $PluginUpdateAvailableCopyWith<$Res> { + factory _$$PluginUpdateAvailableImplCopyWith( + _$PluginUpdateAvailableImpl value, + $Res Function(_$PluginUpdateAvailableImpl) then) = + __$$PluginUpdateAvailableImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String downloadUrl, String version, String? changelog}); +} + +/// @nodoc +class __$$PluginUpdateAvailableImplCopyWithImpl<$Res> + extends _$PluginUpdateAvailableCopyWithImpl<$Res, + _$PluginUpdateAvailableImpl> + implements _$$PluginUpdateAvailableImplCopyWith<$Res> { + __$$PluginUpdateAvailableImplCopyWithImpl(_$PluginUpdateAvailableImpl _value, + $Res Function(_$PluginUpdateAvailableImpl) _then) + : super(_value, _then); + + /// Create a copy of PluginUpdateAvailable + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? downloadUrl = null, + Object? version = null, + Object? changelog = freezed, + }) { + return _then(_$PluginUpdateAvailableImpl( + downloadUrl: null == downloadUrl + ? _value.downloadUrl + : downloadUrl // ignore: cast_nullable_to_non_nullable + as String, + version: null == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String, + changelog: freezed == changelog + ? _value.changelog + : changelog // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PluginUpdateAvailableImpl implements _PluginUpdateAvailable { + const _$PluginUpdateAvailableImpl( + {required this.downloadUrl, required this.version, this.changelog}); + + factory _$PluginUpdateAvailableImpl.fromJson(Map json) => + _$$PluginUpdateAvailableImplFromJson(json); + + @override + final String downloadUrl; + @override + final String version; + @override + final String? changelog; + + @override + String toString() { + return 'PluginUpdateAvailable(downloadUrl: $downloadUrl, version: $version, changelog: $changelog)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PluginUpdateAvailableImpl && + (identical(other.downloadUrl, downloadUrl) || + other.downloadUrl == downloadUrl) && + (identical(other.version, version) || other.version == version) && + (identical(other.changelog, changelog) || + other.changelog == changelog)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, downloadUrl, version, changelog); + + /// Create a copy of PluginUpdateAvailable + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PluginUpdateAvailableImplCopyWith<_$PluginUpdateAvailableImpl> + get copyWith => __$$PluginUpdateAvailableImplCopyWithImpl< + _$PluginUpdateAvailableImpl>(this, _$identity); + + @override + Map toJson() { + return _$$PluginUpdateAvailableImplToJson( + this, + ); + } +} + +abstract class _PluginUpdateAvailable implements PluginUpdateAvailable { + const factory _PluginUpdateAvailable( + {required final String downloadUrl, + required final String version, + final String? changelog}) = _$PluginUpdateAvailableImpl; + + factory _PluginUpdateAvailable.fromJson(Map json) = + _$PluginUpdateAvailableImpl.fromJson; + + @override + String get downloadUrl; + @override + String get version; + @override + String? get changelog; + + /// Create a copy of PluginUpdateAvailable + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PluginUpdateAvailableImplCopyWith<_$PluginUpdateAvailableImpl> + get copyWith => throw _privateConstructorUsedError; +} + +ScrobbleAlbum _$ScrobbleAlbumFromJson(Map json) { + return _ScrobbleAlbum.fromJson(json); +} + +/// @nodoc +mixin _$ScrobbleAlbum { + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + + /// Serializes this ScrobbleAlbum to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of ScrobbleAlbum + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ScrobbleAlbumCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ScrobbleAlbumCopyWith<$Res> { + factory $ScrobbleAlbumCopyWith( + ScrobbleAlbum value, $Res Function(ScrobbleAlbum) then) = + _$ScrobbleAlbumCopyWithImpl<$Res, ScrobbleAlbum>; + @useResult + $Res call({String id, String name}); +} + +/// @nodoc +class _$ScrobbleAlbumCopyWithImpl<$Res, $Val extends ScrobbleAlbum> + implements $ScrobbleAlbumCopyWith<$Res> { + _$ScrobbleAlbumCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of ScrobbleAlbum + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ScrobbleAlbumImplCopyWith<$Res> + implements $ScrobbleAlbumCopyWith<$Res> { + factory _$$ScrobbleAlbumImplCopyWith( + _$ScrobbleAlbumImpl value, $Res Function(_$ScrobbleAlbumImpl) then) = + __$$ScrobbleAlbumImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String id, String name}); +} + +/// @nodoc +class __$$ScrobbleAlbumImplCopyWithImpl<$Res> + extends _$ScrobbleAlbumCopyWithImpl<$Res, _$ScrobbleAlbumImpl> + implements _$$ScrobbleAlbumImplCopyWith<$Res> { + __$$ScrobbleAlbumImplCopyWithImpl( + _$ScrobbleAlbumImpl _value, $Res Function(_$ScrobbleAlbumImpl) _then) + : super(_value, _then); + + /// Create a copy of ScrobbleAlbum + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_$ScrobbleAlbumImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ScrobbleAlbumImpl implements _ScrobbleAlbum { + const _$ScrobbleAlbumImpl({required this.id, required this.name}); + + factory _$ScrobbleAlbumImpl.fromJson(Map json) => + _$$ScrobbleAlbumImplFromJson(json); + + @override + final String id; + @override + final String name; + + @override + String toString() { + return 'ScrobbleAlbum(id: $id, name: $name)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ScrobbleAlbumImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, name); + + /// Create a copy of ScrobbleAlbum + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ScrobbleAlbumImplCopyWith<_$ScrobbleAlbumImpl> get copyWith => + __$$ScrobbleAlbumImplCopyWithImpl<_$ScrobbleAlbumImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ScrobbleAlbumImplToJson( + this, + ); + } +} + +abstract class _ScrobbleAlbum implements ScrobbleAlbum { + const factory _ScrobbleAlbum( + {required final String id, + required final String name}) = _$ScrobbleAlbumImpl; + + factory _ScrobbleAlbum.fromJson(Map json) = + _$ScrobbleAlbumImpl.fromJson; + + @override + String get id; + @override + String get name; + + /// Create a copy of ScrobbleAlbum + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ScrobbleAlbumImplCopyWith<_$ScrobbleAlbumImpl> get copyWith => + throw _privateConstructorUsedError; +} + +ScrobbleArtist _$ScrobbleArtistFromJson(Map json) { + return _ScrobbleArtist.fromJson(json); +} + +/// @nodoc +mixin _$ScrobbleArtist { + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + + /// Serializes this ScrobbleArtist to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of ScrobbleArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ScrobbleArtistCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ScrobbleArtistCopyWith<$Res> { + factory $ScrobbleArtistCopyWith( + ScrobbleArtist value, $Res Function(ScrobbleArtist) then) = + _$ScrobbleArtistCopyWithImpl<$Res, ScrobbleArtist>; + @useResult + $Res call({String id, String name}); +} + +/// @nodoc +class _$ScrobbleArtistCopyWithImpl<$Res, $Val extends ScrobbleArtist> + implements $ScrobbleArtistCopyWith<$Res> { + _$ScrobbleArtistCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of ScrobbleArtist + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ScrobbleArtistImplCopyWith<$Res> + implements $ScrobbleArtistCopyWith<$Res> { + factory _$$ScrobbleArtistImplCopyWith(_$ScrobbleArtistImpl value, + $Res Function(_$ScrobbleArtistImpl) then) = + __$$ScrobbleArtistImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String id, String name}); +} + +/// @nodoc +class __$$ScrobbleArtistImplCopyWithImpl<$Res> + extends _$ScrobbleArtistCopyWithImpl<$Res, _$ScrobbleArtistImpl> + implements _$$ScrobbleArtistImplCopyWith<$Res> { + __$$ScrobbleArtistImplCopyWithImpl( + _$ScrobbleArtistImpl _value, $Res Function(_$ScrobbleArtistImpl) _then) + : super(_value, _then); + + /// Create a copy of ScrobbleArtist + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_$ScrobbleArtistImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ScrobbleArtistImpl implements _ScrobbleArtist { + const _$ScrobbleArtistImpl({required this.id, required this.name}); + + factory _$ScrobbleArtistImpl.fromJson(Map json) => + _$$ScrobbleArtistImplFromJson(json); + + @override + final String id; + @override + final String name; + + @override + String toString() { + return 'ScrobbleArtist(id: $id, name: $name)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ScrobbleArtistImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, id, name); + + /// Create a copy of ScrobbleArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ScrobbleArtistImplCopyWith<_$ScrobbleArtistImpl> get copyWith => + __$$ScrobbleArtistImplCopyWithImpl<_$ScrobbleArtistImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ScrobbleArtistImplToJson( + this, + ); + } +} + +abstract class _ScrobbleArtist implements ScrobbleArtist { + const factory _ScrobbleArtist( + {required final String id, + required final String name}) = _$ScrobbleArtistImpl; + + factory _ScrobbleArtist.fromJson(Map json) = + _$ScrobbleArtistImpl.fromJson; + + @override + String get id; + @override + String get name; + + /// Create a copy of ScrobbleArtist + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ScrobbleArtistImplCopyWith<_$ScrobbleArtistImpl> get copyWith => + throw _privateConstructorUsedError; +} + +ScrobbleDetails _$ScrobbleDetailsFromJson(Map json) { + return _ScrobbleDetails.fromJson(json); +} + +/// @nodoc +mixin _$ScrobbleDetails { + String get id => throw _privateConstructorUsedError; + String get title => throw _privateConstructorUsedError; + List get artists => throw _privateConstructorUsedError; + ScrobbleAlbum get album => throw _privateConstructorUsedError; + int? get timestamp => throw _privateConstructorUsedError; + int? get durationMs => throw _privateConstructorUsedError; + String? get isrc => throw _privateConstructorUsedError; + + /// Serializes this ScrobbleDetails to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ScrobbleDetailsCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ScrobbleDetailsCopyWith<$Res> { + factory $ScrobbleDetailsCopyWith( + ScrobbleDetails value, $Res Function(ScrobbleDetails) then) = + _$ScrobbleDetailsCopyWithImpl<$Res, ScrobbleDetails>; + @useResult + $Res call( + {String id, + String title, + List artists, + ScrobbleAlbum album, + int? timestamp, + int? durationMs, + String? isrc}); + + $ScrobbleAlbumCopyWith<$Res> get album; +} + +/// @nodoc +class _$ScrobbleDetailsCopyWithImpl<$Res, $Val extends ScrobbleDetails> + implements $ScrobbleDetailsCopyWith<$Res> { + _$ScrobbleDetailsCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? title = null, + Object? artists = null, + Object? album = null, + Object? timestamp = freezed, + Object? durationMs = freezed, + Object? isrc = freezed, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as ScrobbleAlbum, + timestamp: freezed == timestamp + ? _value.timestamp + : timestamp // ignore: cast_nullable_to_non_nullable + as int?, + durationMs: freezed == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as int?, + isrc: freezed == isrc + ? _value.isrc + : isrc // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $ScrobbleAlbumCopyWith<$Res> get album { + return $ScrobbleAlbumCopyWith<$Res>(_value.album, (value) { + return _then(_value.copyWith(album: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ScrobbleDetailsImplCopyWith<$Res> + implements $ScrobbleDetailsCopyWith<$Res> { + factory _$$ScrobbleDetailsImplCopyWith(_$ScrobbleDetailsImpl value, + $Res Function(_$ScrobbleDetailsImpl) then) = + __$$ScrobbleDetailsImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String id, + String title, + List artists, + ScrobbleAlbum album, + int? timestamp, + int? durationMs, + String? isrc}); + + @override + $ScrobbleAlbumCopyWith<$Res> get album; +} + +/// @nodoc +class __$$ScrobbleDetailsImplCopyWithImpl<$Res> + extends _$ScrobbleDetailsCopyWithImpl<$Res, _$ScrobbleDetailsImpl> + implements _$$ScrobbleDetailsImplCopyWith<$Res> { + __$$ScrobbleDetailsImplCopyWithImpl( + _$ScrobbleDetailsImpl _value, $Res Function(_$ScrobbleDetailsImpl) _then) + : super(_value, _then); + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? title = null, + Object? artists = null, + Object? album = null, + Object? timestamp = freezed, + Object? durationMs = freezed, + Object? isrc = freezed, + }) { + return _then(_$ScrobbleDetailsImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as ScrobbleAlbum, + timestamp: freezed == timestamp + ? _value.timestamp + : timestamp // ignore: cast_nullable_to_non_nullable + as int?, + durationMs: freezed == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as int?, + isrc: freezed == isrc + ? _value.isrc + : isrc // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ScrobbleDetailsImpl implements _ScrobbleDetails { + const _$ScrobbleDetailsImpl( + {required this.id, + required this.title, + required final List artists, + required this.album, + this.timestamp, + this.durationMs, + this.isrc}) + : _artists = artists; + + factory _$ScrobbleDetailsImpl.fromJson(Map json) => + _$$ScrobbleDetailsImplFromJson(json); + + @override + final String id; + @override + final String title; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + @override + final ScrobbleAlbum album; + @override + final int? timestamp; + @override + final int? durationMs; + @override + final String? isrc; + + @override + String toString() { + return 'ScrobbleDetails(id: $id, title: $title, artists: $artists, album: $album, timestamp: $timestamp, durationMs: $durationMs, isrc: $isrc)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ScrobbleDetailsImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.title, title) || other.title == title) && + const DeepCollectionEquality().equals(other._artists, _artists) && + (identical(other.album, album) || other.album == album) && + (identical(other.timestamp, timestamp) || + other.timestamp == timestamp) && + (identical(other.durationMs, durationMs) || + other.durationMs == durationMs) && + (identical(other.isrc, isrc) || other.isrc == isrc)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + id, + title, + const DeepCollectionEquality().hash(_artists), + album, + timestamp, + durationMs, + isrc); + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ScrobbleDetailsImplCopyWith<_$ScrobbleDetailsImpl> get copyWith => + __$$ScrobbleDetailsImplCopyWithImpl<_$ScrobbleDetailsImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$ScrobbleDetailsImplToJson( + this, + ); + } +} + +abstract class _ScrobbleDetails implements ScrobbleDetails { + const factory _ScrobbleDetails( + {required final String id, + required final String title, + required final List artists, + required final ScrobbleAlbum album, + final int? timestamp, + final int? durationMs, + final String? isrc}) = _$ScrobbleDetailsImpl; + + factory _ScrobbleDetails.fromJson(Map json) = + _$ScrobbleDetailsImpl.fromJson; + + @override + String get id; + @override + String get title; + @override + List get artists; + @override + ScrobbleAlbum get album; + @override + int? get timestamp; + @override + int? get durationMs; + @override + String? get isrc; + + /// Create a copy of ScrobbleDetails + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ScrobbleDetailsImplCopyWith<_$ScrobbleDetailsImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/core.g.dart b/lib/src/rust/api/plugin/models/core.g.dart new file mode 100644 index 00000000..e9c4ad75 --- /dev/null +++ b/lib/src/rust/api/plugin/models/core.g.dart @@ -0,0 +1,119 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'core.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PluginConfigurationImpl _$$PluginConfigurationImplFromJson(Map json) => + _$PluginConfigurationImpl( + name: json['name'] as String, + description: json['description'] as String, + version: json['version'] as String, + author: json['author'] as String, + entryPoint: json['entryPoint'] as String, + pluginApiVersion: json['pluginApiVersion'] as String, + apis: (json['apis'] as List) + .map((e) => $enumDecode(_$PluginApiEnumMap, e)) + .toList(), + abilities: (json['abilities'] as List) + .map((e) => $enumDecode(_$PluginAbilityEnumMap, e)) + .toList(), + repository: json['repository'] as String?, + ); + +Map _$$PluginConfigurationImplToJson( + _$PluginConfigurationImpl instance) => + { + 'name': instance.name, + 'description': instance.description, + 'version': instance.version, + 'author': instance.author, + 'entryPoint': instance.entryPoint, + 'pluginApiVersion': instance.pluginApiVersion, + 'apis': instance.apis.map((e) => _$PluginApiEnumMap[e]!).toList(), + 'abilities': + instance.abilities.map((e) => _$PluginAbilityEnumMap[e]!).toList(), + 'repository': instance.repository, + }; + +const _$PluginApiEnumMap = { + PluginApi.webview: 'webview', + PluginApi.localstorage: 'localstorage', + PluginApi.timezone: 'timezone', +}; + +const _$PluginAbilityEnumMap = { + PluginAbility.authentication: 'authentication', + PluginAbility.scrobbling: 'scrobbling', + PluginAbility.metadata: 'metadata', + PluginAbility.audioSource: 'audioSource', +}; + +_$PluginUpdateAvailableImpl _$$PluginUpdateAvailableImplFromJson(Map json) => + _$PluginUpdateAvailableImpl( + downloadUrl: json['downloadUrl'] as String, + version: json['version'] as String, + changelog: json['changelog'] as String?, + ); + +Map _$$PluginUpdateAvailableImplToJson( + _$PluginUpdateAvailableImpl instance) => + { + 'downloadUrl': instance.downloadUrl, + 'version': instance.version, + 'changelog': instance.changelog, + }; + +_$ScrobbleAlbumImpl _$$ScrobbleAlbumImplFromJson(Map json) => + _$ScrobbleAlbumImpl( + id: json['id'] as String, + name: json['name'] as String, + ); + +Map _$$ScrobbleAlbumImplToJson(_$ScrobbleAlbumImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + }; + +_$ScrobbleArtistImpl _$$ScrobbleArtistImplFromJson(Map json) => + _$ScrobbleArtistImpl( + id: json['id'] as String, + name: json['name'] as String, + ); + +Map _$$ScrobbleArtistImplToJson( + _$ScrobbleArtistImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + }; + +_$ScrobbleDetailsImpl _$$ScrobbleDetailsImplFromJson(Map json) => + _$ScrobbleDetailsImpl( + id: json['id'] as String, + title: json['title'] as String, + artists: (json['artists'] as List) + .map((e) => + ScrobbleArtist.fromJson(Map.from(e as Map))) + .toList(), + album: ScrobbleAlbum.fromJson( + Map.from(json['album'] as Map)), + timestamp: (json['timestamp'] as num?)?.toInt(), + durationMs: (json['durationMs'] as num?)?.toInt(), + isrc: json['isrc'] as String?, + ); + +Map _$$ScrobbleDetailsImplToJson( + _$ScrobbleDetailsImpl instance) => + { + 'id': instance.id, + 'title': instance.title, + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'album': instance.album.toJson(), + 'timestamp': instance.timestamp, + 'durationMs': instance.durationMs, + 'isrc': instance.isrc, + }; diff --git a/lib/src/rust/api/plugin/models/pagination.dart b/lib/src/rust/api/plugin/models/pagination.dart index 653a7391..882aa739 100644 --- a/lib/src/rust/api/plugin/models/pagination.dart +++ b/lib/src/rust/api/plugin/models/pagination.dart @@ -35,7 +35,7 @@ sealed class SpotubePaginationResponseObjectItem const SpotubePaginationResponseObjectItem._(); const factory SpotubePaginationResponseObjectItem.track( - SpotubeTrackObject field0, + SpotubeFullTrackObject field0, ) = SpotubePaginationResponseObjectItem_Track; const factory SpotubePaginationResponseObjectItem.playlistFull( SpotubeFullPlaylistObject field0, diff --git a/lib/src/rust/api/plugin/models/pagination.freezed.dart b/lib/src/rust/api/plugin/models/pagination.freezed.dart index b08464c8..a9b4d9dd 100644 --- a/lib/src/rust/api/plugin/models/pagination.freezed.dart +++ b/lib/src/rust/api/plugin/models/pagination.freezed.dart @@ -252,7 +252,7 @@ mixin _$SpotubePaginationResponseObjectItem { Object get field0 => throw _privateConstructorUsedError; @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -265,7 +265,7 @@ mixin _$SpotubePaginationResponseObjectItem { throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -277,7 +277,7 @@ mixin _$SpotubePaginationResponseObjectItem { throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -387,9 +387,9 @@ abstract class _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith<$Res> { $Res Function(_$SpotubePaginationResponseObjectItem_TrackImpl) then) = __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl<$Res>; @useResult - $Res call({SpotubeTrackObject field0}); + $Res call({SpotubeFullTrackObject field0}); - $SpotubeTrackObjectCopyWith<$Res> get field0; + $SpotubeFullTrackObjectCopyWith<$Res> get field0; } /// @nodoc @@ -413,7 +413,7 @@ class __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl<$Res> null == field0 ? _value.field0 : field0 // ignore: cast_nullable_to_non_nullable - as SpotubeTrackObject, + as SpotubeFullTrackObject, )); } @@ -421,8 +421,8 @@ class __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl<$Res> /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') - $SpotubeTrackObjectCopyWith<$Res> get field0 { - return $SpotubeTrackObjectCopyWith<$Res>(_value.field0, (value) { + $SpotubeFullTrackObjectCopyWith<$Res> get field0 { + return $SpotubeFullTrackObjectCopyWith<$Res>(_value.field0, (value) { return _then(_value.copyWith(field0: value)); }); } @@ -436,7 +436,7 @@ class _$SpotubePaginationResponseObjectItem_TrackImpl : super._(); @override - final SpotubeTrackObject field0; + final SpotubeFullTrackObject field0; @override String toString() { @@ -469,7 +469,7 @@ class _$SpotubePaginationResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -485,7 +485,7 @@ class _$SpotubePaginationResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -500,7 +500,7 @@ class _$SpotubePaginationResponseObjectItem_TrackImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -598,12 +598,12 @@ class _$SpotubePaginationResponseObjectItem_TrackImpl abstract class SpotubePaginationResponseObjectItem_Track extends SpotubePaginationResponseObjectItem { const factory SpotubePaginationResponseObjectItem_Track( - final SpotubeTrackObject field0) = + final SpotubeFullTrackObject field0) = _$SpotubePaginationResponseObjectItem_TrackImpl; const SpotubePaginationResponseObjectItem_Track._() : super._(); @override - SpotubeTrackObject get field0; + SpotubeFullTrackObject get field0; /// Create a copy of SpotubePaginationResponseObjectItem /// with the given fields replaced by the non-null parameter values. @@ -707,7 +707,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -723,7 +723,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -738,7 +738,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -948,7 +948,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -964,7 +964,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -979,7 +979,7 @@ class _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1185,7 +1185,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1201,7 +1201,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1216,7 +1216,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1421,7 +1421,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1437,7 +1437,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1452,7 +1452,7 @@ class _$SpotubePaginationResponseObjectItem_AlbumFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1657,7 +1657,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1673,7 +1673,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1688,7 +1688,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistFullImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1895,7 +1895,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -1911,7 +1911,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -1926,7 +1926,7 @@ class _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -2134,7 +2134,7 @@ class _$SpotubePaginationResponseObjectItem_BrowseSectionImpl @override @optionalTypeArgs TResult when({ - required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullTrackObject field0) track, required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, required TResult Function(SpotubeSimplePlaylistObject field0) playlistSimple, @@ -2150,7 +2150,7 @@ class _$SpotubePaginationResponseObjectItem_BrowseSectionImpl @override @optionalTypeArgs TResult? whenOrNull({ - TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullTrackObject field0)? track, TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, @@ -2165,7 +2165,7 @@ class _$SpotubePaginationResponseObjectItem_BrowseSectionImpl @override @optionalTypeArgs TResult maybeWhen({ - TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullTrackObject field0)? track, TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, diff --git a/lib/src/rust/api/plugin/models/search.dart b/lib/src/rust/api/plugin/models/search.dart index 626ad048..8359312e 100644 --- a/lib/src/rust/api/plugin/models/search.dart +++ b/lib/src/rust/api/plugin/models/search.dart @@ -24,7 +24,7 @@ sealed class SpotubeSearchResponseObject with _$SpotubeSearchResponseObject { required List albums, required List artists, required List playlists, - required List tracks, + required List tracks, }) = _SpotubeSearchResponseObject; factory SpotubeSearchResponseObject.fromJson(Map json) => diff --git a/lib/src/rust/api/plugin/models/search.freezed.dart b/lib/src/rust/api/plugin/models/search.freezed.dart index fd7448c3..48278215 100644 --- a/lib/src/rust/api/plugin/models/search.freezed.dart +++ b/lib/src/rust/api/plugin/models/search.freezed.dart @@ -28,7 +28,7 @@ mixin _$SpotubeSearchResponseObject { throw _privateConstructorUsedError; List get playlists => throw _privateConstructorUsedError; - List get tracks => throw _privateConstructorUsedError; + List get tracks => throw _privateConstructorUsedError; /// Serializes this SpotubeSearchResponseObject to a JSON map. Map toJson() => throw _privateConstructorUsedError; @@ -53,7 +53,7 @@ abstract class $SpotubeSearchResponseObjectCopyWith<$Res> { List albums, List artists, List playlists, - List tracks}); + List tracks}); } /// @nodoc @@ -98,7 +98,7 @@ class _$SpotubeSearchResponseObjectCopyWithImpl<$Res, tracks: null == tracks ? _value.tracks : tracks // ignore: cast_nullable_to_non_nullable - as List, + as List, ) as $Val); } } @@ -117,7 +117,7 @@ abstract class _$$SpotubeSearchResponseObjectImplCopyWith<$Res> List albums, List artists, List playlists, - List tracks}); + List tracks}); } /// @nodoc @@ -161,7 +161,7 @@ class __$$SpotubeSearchResponseObjectImplCopyWithImpl<$Res> tracks: null == tracks ? _value._tracks : tracks // ignore: cast_nullable_to_non_nullable - as List, + as List, )); } } @@ -175,7 +175,7 @@ class _$SpotubeSearchResponseObjectImpl required final List albums, required final List artists, required final List playlists, - required final List tracks}) + required final List tracks}) : _albums = albums, _artists = artists, _playlists = playlists, @@ -211,9 +211,9 @@ class _$SpotubeSearchResponseObjectImpl return EqualUnmodifiableListView(_playlists); } - final List _tracks; + final List _tracks; @override - List get tracks { + List get tracks { if (_tracks is EqualUnmodifiableListView) return _tracks; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_tracks); @@ -272,7 +272,7 @@ abstract class _SpotubeSearchResponseObject required final List albums, required final List artists, required final List playlists, - required final List tracks}) = + required final List tracks}) = _$SpotubeSearchResponseObjectImpl; factory _SpotubeSearchResponseObject.fromJson(Map json) = @@ -287,7 +287,7 @@ abstract class _SpotubeSearchResponseObject @override List get playlists; @override - List get tracks; + List get tracks; /// Create a copy of SpotubeSearchResponseObject /// with the given fields replaced by the non-null parameter values. diff --git a/lib/src/rust/api/plugin/models/search.g.dart b/lib/src/rust/api/plugin/models/search.g.dart index d49cbdf5..c1917188 100644 --- a/lib/src/rust/api/plugin/models/search.g.dart +++ b/lib/src/rust/api/plugin/models/search.g.dart @@ -23,8 +23,8 @@ _$SpotubeSearchResponseObjectImpl _$$SpotubeSearchResponseObjectImplFromJson( Map.from(e as Map))) .toList(), tracks: (json['tracks'] as List) - .map((e) => - SpotubeTrackObject.fromJson(Map.from(e as Map))) + .map((e) => SpotubeFullTrackObject.fromJson( + Map.from(e as Map))) .toList(), ); diff --git a/lib/src/rust/api/plugin/models/track.dart b/lib/src/rust/api/plugin/models/track.dart index 4fdb6c2f..8888e4da 100644 --- a/lib/src/rust/api/plugin/models/track.dart +++ b/lib/src/rust/api/plugin/models/track.dart @@ -12,21 +12,53 @@ import 'package:freezed_annotation/freezed_annotation.dart' hide protected; part 'track.freezed.dart'; part 'track.g.dart'; -// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `clone`, `fmt`, `fmt`, `fmt` @freezed -sealed class SpotubeTrackObject with _$SpotubeTrackObject { - const factory SpotubeTrackObject({ +sealed class SpotubeFullTrackObject with _$SpotubeFullTrackObject { + const factory SpotubeFullTrackObject({ required String typeName, required String id, required String name, required String externalUri, required List artists, required SpotubeSimpleAlbumObject album, - required BigInt durationMs, + required int durationMs, required String isrc, required bool explicit, - }) = _SpotubeTrackObject; + }) = _SpotubeFullTrackObject; + + factory SpotubeFullTrackObject.fromJson(Map json) => + _$SpotubeFullTrackObjectFromJson(json); +} + +@freezed +sealed class SpotubeLocalTrackObject with _$SpotubeLocalTrackObject { + const factory SpotubeLocalTrackObject({ + required String typeName, + required String id, + required String name, + required String externalUri, + required List artists, + required SpotubeSimpleAlbumObject album, + required int durationMs, + required String path, + }) = _SpotubeLocalTrackObject; + + factory SpotubeLocalTrackObject.fromJson(Map json) => + _$SpotubeLocalTrackObjectFromJson(json); +} + +@freezed +sealed class SpotubeTrackObject with _$SpotubeTrackObject { + const SpotubeTrackObject._(); + + const factory SpotubeTrackObject.full( + SpotubeFullTrackObject field0, + ) = SpotubeTrackObject_Full; + const factory SpotubeTrackObject.local( + SpotubeLocalTrackObject field0, + ) = SpotubeTrackObject_Local; factory SpotubeTrackObject.fromJson(Map json) => _$SpotubeTrackObjectFromJson(json); diff --git a/lib/src/rust/api/plugin/models/track.freezed.dart b/lib/src/rust/api/plugin/models/track.freezed.dart index 31e62011..d5c4fe1d 100644 --- a/lib/src/rust/api/plugin/models/track.freezed.dart +++ b/lib/src/rust/api/plugin/models/track.freezed.dart @@ -14,12 +14,13 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -SpotubeTrackObject _$SpotubeTrackObjectFromJson(Map json) { - return _SpotubeTrackObject.fromJson(json); +SpotubeFullTrackObject _$SpotubeFullTrackObjectFromJson( + Map json) { + return _SpotubeFullTrackObject.fromJson(json); } /// @nodoc -mixin _$SpotubeTrackObject { +mixin _$SpotubeFullTrackObject { String get typeName => throw _privateConstructorUsedError; String get id => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError; @@ -27,25 +28,25 @@ mixin _$SpotubeTrackObject { List get artists => throw _privateConstructorUsedError; SpotubeSimpleAlbumObject get album => throw _privateConstructorUsedError; - BigInt get durationMs => throw _privateConstructorUsedError; + int get durationMs => throw _privateConstructorUsedError; String get isrc => throw _privateConstructorUsedError; bool get explicit => throw _privateConstructorUsedError; - /// Serializes this SpotubeTrackObject to a JSON map. + /// Serializes this SpotubeFullTrackObject to a JSON map. Map toJson() => throw _privateConstructorUsedError; - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) - $SpotubeTrackObjectCopyWith get copyWith => + $SpotubeFullTrackObjectCopyWith get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class $SpotubeTrackObjectCopyWith<$Res> { - factory $SpotubeTrackObjectCopyWith( - SpotubeTrackObject value, $Res Function(SpotubeTrackObject) then) = - _$SpotubeTrackObjectCopyWithImpl<$Res, SpotubeTrackObject>; +abstract class $SpotubeFullTrackObjectCopyWith<$Res> { + factory $SpotubeFullTrackObjectCopyWith(SpotubeFullTrackObject value, + $Res Function(SpotubeFullTrackObject) then) = + _$SpotubeFullTrackObjectCopyWithImpl<$Res, SpotubeFullTrackObject>; @useResult $Res call( {String typeName, @@ -54,7 +55,7 @@ abstract class $SpotubeTrackObjectCopyWith<$Res> { String externalUri, List artists, SpotubeSimpleAlbumObject album, - BigInt durationMs, + int durationMs, String isrc, bool explicit}); @@ -62,16 +63,17 @@ abstract class $SpotubeTrackObjectCopyWith<$Res> { } /// @nodoc -class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> - implements $SpotubeTrackObjectCopyWith<$Res> { - _$SpotubeTrackObjectCopyWithImpl(this._value, this._then); +class _$SpotubeFullTrackObjectCopyWithImpl<$Res, + $Val extends SpotubeFullTrackObject> + implements $SpotubeFullTrackObjectCopyWith<$Res> { + _$SpotubeFullTrackObjectCopyWithImpl(this._value, this._then); // ignore: unused_field final $Val _value; // ignore: unused_field final $Res Function($Val) _then; - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override @@ -114,7 +116,7 @@ class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> durationMs: null == durationMs ? _value.durationMs : durationMs // ignore: cast_nullable_to_non_nullable - as BigInt, + as int, isrc: null == isrc ? _value.isrc : isrc // ignore: cast_nullable_to_non_nullable @@ -126,7 +128,7 @@ class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> ) as $Val); } - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -138,11 +140,12 @@ class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> } /// @nodoc -abstract class _$$SpotubeTrackObjectImplCopyWith<$Res> - implements $SpotubeTrackObjectCopyWith<$Res> { - factory _$$SpotubeTrackObjectImplCopyWith(_$SpotubeTrackObjectImpl value, - $Res Function(_$SpotubeTrackObjectImpl) then) = - __$$SpotubeTrackObjectImplCopyWithImpl<$Res>; +abstract class _$$SpotubeFullTrackObjectImplCopyWith<$Res> + implements $SpotubeFullTrackObjectCopyWith<$Res> { + factory _$$SpotubeFullTrackObjectImplCopyWith( + _$SpotubeFullTrackObjectImpl value, + $Res Function(_$SpotubeFullTrackObjectImpl) then) = + __$$SpotubeFullTrackObjectImplCopyWithImpl<$Res>; @override @useResult $Res call( @@ -152,7 +155,7 @@ abstract class _$$SpotubeTrackObjectImplCopyWith<$Res> String externalUri, List artists, SpotubeSimpleAlbumObject album, - BigInt durationMs, + int durationMs, String isrc, bool explicit}); @@ -161,14 +164,16 @@ abstract class _$$SpotubeTrackObjectImplCopyWith<$Res> } /// @nodoc -class __$$SpotubeTrackObjectImplCopyWithImpl<$Res> - extends _$SpotubeTrackObjectCopyWithImpl<$Res, _$SpotubeTrackObjectImpl> - implements _$$SpotubeTrackObjectImplCopyWith<$Res> { - __$$SpotubeTrackObjectImplCopyWithImpl(_$SpotubeTrackObjectImpl _value, - $Res Function(_$SpotubeTrackObjectImpl) _then) +class __$$SpotubeFullTrackObjectImplCopyWithImpl<$Res> + extends _$SpotubeFullTrackObjectCopyWithImpl<$Res, + _$SpotubeFullTrackObjectImpl> + implements _$$SpotubeFullTrackObjectImplCopyWith<$Res> { + __$$SpotubeFullTrackObjectImplCopyWithImpl( + _$SpotubeFullTrackObjectImpl _value, + $Res Function(_$SpotubeFullTrackObjectImpl) _then) : super(_value, _then); - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override @@ -183,7 +188,7 @@ class __$$SpotubeTrackObjectImplCopyWithImpl<$Res> Object? isrc = null, Object? explicit = null, }) { - return _then(_$SpotubeTrackObjectImpl( + return _then(_$SpotubeFullTrackObjectImpl( typeName: null == typeName ? _value.typeName : typeName // ignore: cast_nullable_to_non_nullable @@ -211,7 +216,7 @@ class __$$SpotubeTrackObjectImplCopyWithImpl<$Res> durationMs: null == durationMs ? _value.durationMs : durationMs // ignore: cast_nullable_to_non_nullable - as BigInt, + as int, isrc: null == isrc ? _value.isrc : isrc // ignore: cast_nullable_to_non_nullable @@ -226,8 +231,8 @@ class __$$SpotubeTrackObjectImplCopyWithImpl<$Res> /// @nodoc @JsonSerializable() -class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { - const _$SpotubeTrackObjectImpl( +class _$SpotubeFullTrackObjectImpl implements _SpotubeFullTrackObject { + const _$SpotubeFullTrackObjectImpl( {required this.typeName, required this.id, required this.name, @@ -239,8 +244,8 @@ class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { required this.explicit}) : _artists = artists; - factory _$SpotubeTrackObjectImpl.fromJson(Map json) => - _$$SpotubeTrackObjectImplFromJson(json); + factory _$SpotubeFullTrackObjectImpl.fromJson(Map json) => + _$$SpotubeFullTrackObjectImplFromJson(json); @override final String typeName; @@ -261,7 +266,7 @@ class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { @override final SpotubeSimpleAlbumObject album; @override - final BigInt durationMs; + final int durationMs; @override final String isrc; @override @@ -269,14 +274,14 @@ class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { @override String toString() { - return 'SpotubeTrackObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, isrc: $isrc, explicit: $explicit)'; + return 'SpotubeFullTrackObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, isrc: $isrc, explicit: $explicit)'; } @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && - other is _$SpotubeTrackObjectImpl && + other is _$SpotubeFullTrackObjectImpl && (identical(other.typeName, typeName) || other.typeName == typeName) && (identical(other.id, id) || other.id == id) && @@ -306,37 +311,37 @@ class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { isrc, explicit); - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') - _$$SpotubeTrackObjectImplCopyWith<_$SpotubeTrackObjectImpl> get copyWith => - __$$SpotubeTrackObjectImplCopyWithImpl<_$SpotubeTrackObjectImpl>( - this, _$identity); + _$$SpotubeFullTrackObjectImplCopyWith<_$SpotubeFullTrackObjectImpl> + get copyWith => __$$SpotubeFullTrackObjectImplCopyWithImpl< + _$SpotubeFullTrackObjectImpl>(this, _$identity); @override Map toJson() { - return _$$SpotubeTrackObjectImplToJson( + return _$$SpotubeFullTrackObjectImplToJson( this, ); } } -abstract class _SpotubeTrackObject implements SpotubeTrackObject { - const factory _SpotubeTrackObject( +abstract class _SpotubeFullTrackObject implements SpotubeFullTrackObject { + const factory _SpotubeFullTrackObject( {required final String typeName, required final String id, required final String name, required final String externalUri, required final List artists, required final SpotubeSimpleAlbumObject album, - required final BigInt durationMs, + required final int durationMs, required final String isrc, - required final bool explicit}) = _$SpotubeTrackObjectImpl; + required final bool explicit}) = _$SpotubeFullTrackObjectImpl; - factory _SpotubeTrackObject.fromJson(Map json) = - _$SpotubeTrackObjectImpl.fromJson; + factory _SpotubeFullTrackObject.fromJson(Map json) = + _$SpotubeFullTrackObjectImpl.fromJson; @override String get typeName; @@ -351,16 +356,778 @@ abstract class _SpotubeTrackObject implements SpotubeTrackObject { @override SpotubeSimpleAlbumObject get album; @override - BigInt get durationMs; + int get durationMs; @override String get isrc; @override bool get explicit; - /// Create a copy of SpotubeTrackObject + /// Create a copy of SpotubeFullTrackObject /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) - _$$SpotubeTrackObjectImplCopyWith<_$SpotubeTrackObjectImpl> get copyWith => + _$$SpotubeFullTrackObjectImplCopyWith<_$SpotubeFullTrackObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeLocalTrackObject _$SpotubeLocalTrackObjectFromJson( + Map json) { + return _SpotubeLocalTrackObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeLocalTrackObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + List get artists => + throw _privateConstructorUsedError; + SpotubeSimpleAlbumObject get album => throw _privateConstructorUsedError; + int get durationMs => throw _privateConstructorUsedError; + String get path => throw _privateConstructorUsedError; + + /// Serializes this SpotubeLocalTrackObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeLocalTrackObjectCopyWith get copyWith => throw _privateConstructorUsedError; } + +/// @nodoc +abstract class $SpotubeLocalTrackObjectCopyWith<$Res> { + factory $SpotubeLocalTrackObjectCopyWith(SpotubeLocalTrackObject value, + $Res Function(SpotubeLocalTrackObject) then) = + _$SpotubeLocalTrackObjectCopyWithImpl<$Res, SpotubeLocalTrackObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + SpotubeSimpleAlbumObject album, + int durationMs, + String path}); + + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; +} + +/// @nodoc +class _$SpotubeLocalTrackObjectCopyWithImpl<$Res, + $Val extends SpotubeLocalTrackObject> + implements $SpotubeLocalTrackObjectCopyWith<$Res> { + _$SpotubeLocalTrackObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? album = null, + Object? durationMs = null, + Object? path = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + durationMs: null == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as int, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album { + return $SpotubeSimpleAlbumObjectCopyWith<$Res>(_value.album, (value) { + return _then(_value.copyWith(album: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$SpotubeLocalTrackObjectImplCopyWith<$Res> + implements $SpotubeLocalTrackObjectCopyWith<$Res> { + factory _$$SpotubeLocalTrackObjectImplCopyWith( + _$SpotubeLocalTrackObjectImpl value, + $Res Function(_$SpotubeLocalTrackObjectImpl) then) = + __$$SpotubeLocalTrackObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + SpotubeSimpleAlbumObject album, + int durationMs, + String path}); + + @override + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; +} + +/// @nodoc +class __$$SpotubeLocalTrackObjectImplCopyWithImpl<$Res> + extends _$SpotubeLocalTrackObjectCopyWithImpl<$Res, + _$SpotubeLocalTrackObjectImpl> + implements _$$SpotubeLocalTrackObjectImplCopyWith<$Res> { + __$$SpotubeLocalTrackObjectImplCopyWithImpl( + _$SpotubeLocalTrackObjectImpl _value, + $Res Function(_$SpotubeLocalTrackObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? album = null, + Object? durationMs = null, + Object? path = null, + }) { + return _then(_$SpotubeLocalTrackObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + durationMs: null == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as int, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeLocalTrackObjectImpl implements _SpotubeLocalTrackObject { + const _$SpotubeLocalTrackObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.externalUri, + required final List artists, + required this.album, + required this.durationMs, + required this.path}) + : _artists = artists; + + factory _$SpotubeLocalTrackObjectImpl.fromJson(Map json) => + _$$SpotubeLocalTrackObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String externalUri; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + @override + final SpotubeSimpleAlbumObject album; + @override + final int durationMs; + @override + final String path; + + @override + String toString() { + return 'SpotubeLocalTrackObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, path: $path)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeLocalTrackObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + const DeepCollectionEquality().equals(other._artists, _artists) && + (identical(other.album, album) || other.album == album) && + (identical(other.durationMs, durationMs) || + other.durationMs == durationMs) && + (identical(other.path, path) || other.path == path)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, id, name, externalUri, + const DeepCollectionEquality().hash(_artists), album, durationMs, path); + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeLocalTrackObjectImplCopyWith<_$SpotubeLocalTrackObjectImpl> + get copyWith => __$$SpotubeLocalTrackObjectImplCopyWithImpl< + _$SpotubeLocalTrackObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeLocalTrackObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeLocalTrackObject implements SpotubeLocalTrackObject { + const factory _SpotubeLocalTrackObject( + {required final String typeName, + required final String id, + required final String name, + required final String externalUri, + required final List artists, + required final SpotubeSimpleAlbumObject album, + required final int durationMs, + required final String path}) = _$SpotubeLocalTrackObjectImpl; + + factory _SpotubeLocalTrackObject.fromJson(Map json) = + _$SpotubeLocalTrackObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get externalUri; + @override + List get artists; + @override + SpotubeSimpleAlbumObject get album; + @override + int get durationMs; + @override + String get path; + + /// Create a copy of SpotubeLocalTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeLocalTrackObjectImplCopyWith<_$SpotubeLocalTrackObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeTrackObject _$SpotubeTrackObjectFromJson(Map json) { + switch (json['runtimeType']) { + case 'full': + return SpotubeTrackObject_Full.fromJson(json); + case 'local': + return SpotubeTrackObject_Local.fromJson(json); + + default: + throw CheckedFromJsonException(json, 'runtimeType', 'SpotubeTrackObject', + 'Invalid union type "${json['runtimeType']}"!'); + } +} + +/// @nodoc +mixin _$SpotubeTrackObject { + Object get field0 => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeFullTrackObject field0) full, + required TResult Function(SpotubeLocalTrackObject field0) local, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeFullTrackObject field0)? full, + TResult? Function(SpotubeLocalTrackObject field0)? local, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeFullTrackObject field0)? full, + TResult Function(SpotubeLocalTrackObject field0)? local, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeTrackObject_Full value) full, + required TResult Function(SpotubeTrackObject_Local value) local, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeTrackObject_Full value)? full, + TResult? Function(SpotubeTrackObject_Local value)? local, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeTrackObject_Full value)? full, + TResult Function(SpotubeTrackObject_Local value)? local, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + + /// Serializes this SpotubeTrackObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeTrackObjectCopyWith<$Res> { + factory $SpotubeTrackObjectCopyWith( + SpotubeTrackObject value, $Res Function(SpotubeTrackObject) then) = + _$SpotubeTrackObjectCopyWithImpl<$Res, SpotubeTrackObject>; +} + +/// @nodoc +class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> + implements $SpotubeTrackObjectCopyWith<$Res> { + _$SpotubeTrackObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$SpotubeTrackObject_FullImplCopyWith<$Res> { + factory _$$SpotubeTrackObject_FullImplCopyWith( + _$SpotubeTrackObject_FullImpl value, + $Res Function(_$SpotubeTrackObject_FullImpl) then) = + __$$SpotubeTrackObject_FullImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeFullTrackObject field0}); + + $SpotubeFullTrackObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeTrackObject_FullImplCopyWithImpl<$Res> + extends _$SpotubeTrackObjectCopyWithImpl<$Res, + _$SpotubeTrackObject_FullImpl> + implements _$$SpotubeTrackObject_FullImplCopyWith<$Res> { + __$$SpotubeTrackObject_FullImplCopyWithImpl( + _$SpotubeTrackObject_FullImpl _value, + $Res Function(_$SpotubeTrackObject_FullImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeTrackObject_FullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullTrackObject, + )); + } + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullTrackObjectCopyWith<$Res> get field0 { + return $SpotubeFullTrackObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeTrackObject_FullImpl extends SpotubeTrackObject_Full { + const _$SpotubeTrackObject_FullImpl(this.field0, {final String? $type}) + : $type = $type ?? 'full', + super._(); + + factory _$SpotubeTrackObject_FullImpl.fromJson(Map json) => + _$$SpotubeTrackObject_FullImplFromJson(json); + + @override + final SpotubeFullTrackObject field0; + + @JsonKey(name: 'runtimeType') + final String $type; + + @override + String toString() { + return 'SpotubeTrackObject.full(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeTrackObject_FullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeTrackObject_FullImplCopyWith<_$SpotubeTrackObject_FullImpl> + get copyWith => __$$SpotubeTrackObject_FullImplCopyWithImpl< + _$SpotubeTrackObject_FullImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeFullTrackObject field0) full, + required TResult Function(SpotubeLocalTrackObject field0) local, + }) { + return full(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeFullTrackObject field0)? full, + TResult? Function(SpotubeLocalTrackObject field0)? local, + }) { + return full?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeFullTrackObject field0)? full, + TResult Function(SpotubeLocalTrackObject field0)? local, + required TResult orElse(), + }) { + if (full != null) { + return full(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeTrackObject_Full value) full, + required TResult Function(SpotubeTrackObject_Local value) local, + }) { + return full(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeTrackObject_Full value)? full, + TResult? Function(SpotubeTrackObject_Local value)? local, + }) { + return full?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeTrackObject_Full value)? full, + TResult Function(SpotubeTrackObject_Local value)? local, + required TResult orElse(), + }) { + if (full != null) { + return full(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$SpotubeTrackObject_FullImplToJson( + this, + ); + } +} + +abstract class SpotubeTrackObject_Full extends SpotubeTrackObject { + const factory SpotubeTrackObject_Full(final SpotubeFullTrackObject field0) = + _$SpotubeTrackObject_FullImpl; + const SpotubeTrackObject_Full._() : super._(); + + factory SpotubeTrackObject_Full.fromJson(Map json) = + _$SpotubeTrackObject_FullImpl.fromJson; + + @override + SpotubeFullTrackObject get field0; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeTrackObject_FullImplCopyWith<_$SpotubeTrackObject_FullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeTrackObject_LocalImplCopyWith<$Res> { + factory _$$SpotubeTrackObject_LocalImplCopyWith( + _$SpotubeTrackObject_LocalImpl value, + $Res Function(_$SpotubeTrackObject_LocalImpl) then) = + __$$SpotubeTrackObject_LocalImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeLocalTrackObject field0}); + + $SpotubeLocalTrackObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeTrackObject_LocalImplCopyWithImpl<$Res> + extends _$SpotubeTrackObjectCopyWithImpl<$Res, + _$SpotubeTrackObject_LocalImpl> + implements _$$SpotubeTrackObject_LocalImplCopyWith<$Res> { + __$$SpotubeTrackObject_LocalImplCopyWithImpl( + _$SpotubeTrackObject_LocalImpl _value, + $Res Function(_$SpotubeTrackObject_LocalImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeTrackObject_LocalImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeLocalTrackObject, + )); + } + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeLocalTrackObjectCopyWith<$Res> get field0 { + return $SpotubeLocalTrackObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeTrackObject_LocalImpl extends SpotubeTrackObject_Local { + const _$SpotubeTrackObject_LocalImpl(this.field0, {final String? $type}) + : $type = $type ?? 'local', + super._(); + + factory _$SpotubeTrackObject_LocalImpl.fromJson(Map json) => + _$$SpotubeTrackObject_LocalImplFromJson(json); + + @override + final SpotubeLocalTrackObject field0; + + @JsonKey(name: 'runtimeType') + final String $type; + + @override + String toString() { + return 'SpotubeTrackObject.local(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeTrackObject_LocalImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeTrackObject_LocalImplCopyWith<_$SpotubeTrackObject_LocalImpl> + get copyWith => __$$SpotubeTrackObject_LocalImplCopyWithImpl< + _$SpotubeTrackObject_LocalImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeFullTrackObject field0) full, + required TResult Function(SpotubeLocalTrackObject field0) local, + }) { + return local(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeFullTrackObject field0)? full, + TResult? Function(SpotubeLocalTrackObject field0)? local, + }) { + return local?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeFullTrackObject field0)? full, + TResult Function(SpotubeLocalTrackObject field0)? local, + required TResult orElse(), + }) { + if (local != null) { + return local(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeTrackObject_Full value) full, + required TResult Function(SpotubeTrackObject_Local value) local, + }) { + return local(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeTrackObject_Full value)? full, + TResult? Function(SpotubeTrackObject_Local value)? local, + }) { + return local?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeTrackObject_Full value)? full, + TResult Function(SpotubeTrackObject_Local value)? local, + required TResult orElse(), + }) { + if (local != null) { + return local(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$SpotubeTrackObject_LocalImplToJson( + this, + ); + } +} + +abstract class SpotubeTrackObject_Local extends SpotubeTrackObject { + const factory SpotubeTrackObject_Local(final SpotubeLocalTrackObject field0) = + _$SpotubeTrackObject_LocalImpl; + const SpotubeTrackObject_Local._() : super._(); + + factory SpotubeTrackObject_Local.fromJson(Map json) = + _$SpotubeTrackObject_LocalImpl.fromJson; + + @override + SpotubeLocalTrackObject get field0; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeTrackObject_LocalImplCopyWith<_$SpotubeTrackObject_LocalImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/track.g.dart b/lib/src/rust/api/plugin/models/track.g.dart index ac888e4f..2c643a18 100644 --- a/lib/src/rust/api/plugin/models/track.g.dart +++ b/lib/src/rust/api/plugin/models/track.g.dart @@ -6,8 +6,8 @@ part of 'track.dart'; // JsonSerializableGenerator // ************************************************************************** -_$SpotubeTrackObjectImpl _$$SpotubeTrackObjectImplFromJson(Map json) => - _$SpotubeTrackObjectImpl( +_$SpotubeFullTrackObjectImpl _$$SpotubeFullTrackObjectImplFromJson(Map json) => + _$SpotubeFullTrackObjectImpl( typeName: json['typeName'] as String, id: json['id'] as String, name: json['name'] as String, @@ -18,13 +18,13 @@ _$SpotubeTrackObjectImpl _$$SpotubeTrackObjectImplFromJson(Map json) => .toList(), album: SpotubeSimpleAlbumObject.fromJson( Map.from(json['album'] as Map)), - durationMs: BigInt.parse(json['durationMs'] as String), + durationMs: (json['durationMs'] as num).toInt(), isrc: json['isrc'] as String, explicit: json['explicit'] as bool, ); -Map _$$SpotubeTrackObjectImplToJson( - _$SpotubeTrackObjectImpl instance) => +Map _$$SpotubeFullTrackObjectImplToJson( + _$SpotubeFullTrackObjectImpl instance) => { 'typeName': instance.typeName, 'id': instance.id, @@ -32,7 +32,67 @@ Map _$$SpotubeTrackObjectImplToJson( 'externalUri': instance.externalUri, 'artists': instance.artists.map((e) => e.toJson()).toList(), 'album': instance.album.toJson(), - 'durationMs': instance.durationMs.toString(), + 'durationMs': instance.durationMs, 'isrc': instance.isrc, 'explicit': instance.explicit, }; + +_$SpotubeLocalTrackObjectImpl _$$SpotubeLocalTrackObjectImplFromJson( + Map json) => + _$SpotubeLocalTrackObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + externalUri: json['externalUri'] as String, + artists: (json['artists'] as List) + .map((e) => SpotubeSimpleArtistObject.fromJson( + Map.from(e as Map))) + .toList(), + album: SpotubeSimpleAlbumObject.fromJson( + Map.from(json['album'] as Map)), + durationMs: (json['durationMs'] as num).toInt(), + path: json['path'] as String, + ); + +Map _$$SpotubeLocalTrackObjectImplToJson( + _$SpotubeLocalTrackObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'externalUri': instance.externalUri, + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'album': instance.album.toJson(), + 'durationMs': instance.durationMs, + 'path': instance.path, + }; + +_$SpotubeTrackObject_FullImpl _$$SpotubeTrackObject_FullImplFromJson( + Map json) => + _$SpotubeTrackObject_FullImpl( + SpotubeFullTrackObject.fromJson( + Map.from(json['field0'] as Map)), + $type: json['runtimeType'] as String?, + ); + +Map _$$SpotubeTrackObject_FullImplToJson( + _$SpotubeTrackObject_FullImpl instance) => + { + 'field0': instance.field0.toJson(), + 'runtimeType': instance.$type, + }; + +_$SpotubeTrackObject_LocalImpl _$$SpotubeTrackObject_LocalImplFromJson( + Map json) => + _$SpotubeTrackObject_LocalImpl( + SpotubeLocalTrackObject.fromJson( + Map.from(json['field0'] as Map)), + $type: json['runtimeType'] as String?, + ); + +Map _$$SpotubeTrackObject_LocalImplToJson( + _$SpotubeTrackObject_LocalImpl instance) => + { + 'field0': instance.field0.toJson(), + 'runtimeType': instance.$type, + }; diff --git a/lib/src/rust/api/plugin/senders.dart b/lib/src/rust/api/plugin/senders.dart index 501b46a5..b0b251ca 100644 --- a/lib/src/rust/api/plugin/senders.dart +++ b/lib/src/rust/api/plugin/senders.dart @@ -116,7 +116,8 @@ class PluginAudioSourceSender { const PluginAudioSourceSender(); Future> matches( - {required OpaqueSender mpscTx, required SpotubeTrackObject track}) => + {required OpaqueSender mpscTx, + required SpotubeFullTrackObject track}) => RustLib.instance.api.crateApiPluginSendersPluginAudioSourceSenderMatches( that: this, mpscTx: mpscTx, track: track); @@ -126,6 +127,12 @@ class PluginAudioSourceSender { RustLib.instance.api.crateApiPluginSendersPluginAudioSourceSenderStreams( that: this, mpscTx: mpscTx, matched: matched); + Future> supportedPresets( + {required OpaqueSender mpscTx}) => + RustLib.instance.api + .crateApiPluginSendersPluginAudioSourceSenderSupportedPresets( + that: this, mpscTx: mpscTx); + @override int get hashCode => 0; @@ -379,12 +386,12 @@ class PluginSearchSender { class PluginTrackSender { const PluginTrackSender(); - Future getTrack( + Future getTrack( {required OpaqueSender mpscTx, required String id}) => RustLib.instance.api.crateApiPluginSendersPluginTrackSenderGetTrack( that: this, mpscTx: mpscTx, id: id); - Future> radio( + Future> radio( {required OpaqueSender mpscTx, required String id}) => RustLib.instance.api.crateApiPluginSendersPluginTrackSenderRadio( that: this, mpscTx: mpscTx, id: id); diff --git a/lib/src/rust/frb_generated.dart b/lib/src/rust/frb_generated.dart index 2a2c9073..19dc01b8 100644 --- a/lib/src/rust/frb_generated.dart +++ b/lib/src/rust/frb_generated.dart @@ -85,7 +85,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.11.1'; @override - int get rustContentHash => 1716120288; + int get rustContentHash => -1924875688; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -255,7 +255,7 @@ abstract class RustLibApi extends BaseApi { crateApiPluginSendersPluginAudioSourceSenderMatches( {required PluginAudioSourceSender that, required OpaqueSender mpscTx, - required SpotubeTrackObject track}); + required SpotubeFullTrackObject track}); Future> crateApiPluginSendersPluginAudioSourceSenderStreams( @@ -263,6 +263,11 @@ abstract class RustLibApi extends BaseApi { required OpaqueSender mpscTx, required SpotubeAudioSourceMatchObject matched}); + Future> + crateApiPluginSendersPluginAudioSourceSenderSupportedPresets( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx}); + Future crateApiPluginSendersPluginAuthSenderAuthenticate( {required PluginAuthSender that, required OpaqueSender mpscTx}); @@ -287,7 +292,7 @@ abstract class RustLibApi extends BaseApi { int? offset, int? limit}); - Future crateApiPluginModelsCorePluginConfigurationSlug( + String crateApiPluginModelsCorePluginConfigurationSlug( {required PluginConfiguration that}); Future @@ -406,15 +411,16 @@ abstract class RustLibApi extends BaseApi { int? offset, int? limit}); - Future crateApiPluginSendersPluginTrackSenderGetTrack( + Future crateApiPluginSendersPluginTrackSenderGetTrack( {required PluginTrackSender that, required OpaqueSender mpscTx, required String id}); - Future> crateApiPluginSendersPluginTrackSenderRadio( - {required PluginTrackSender that, - required OpaqueSender mpscTx, - required String id}); + Future> + crateApiPluginSendersPluginTrackSenderRadio( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}); Future crateApiPluginSendersPluginTrackSenderSave( {required PluginTrackSender that, @@ -1663,14 +1669,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { crateApiPluginSendersPluginAudioSourceSenderMatches( {required PluginAudioSourceSender that, required OpaqueSender mpscTx, - required SpotubeTrackObject track}) { + required SpotubeFullTrackObject track}) { return handler.executeNormal(NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); - sse_encode_box_autoadd_spotube_track_object(track, serializer); + sse_encode_box_autoadd_spotube_full_track_object(track, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 39, port: port_); }, @@ -1725,6 +1731,39 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: ["that", "mpscTx", "matched"], ); + @override + Future> + crateApiPluginSendersPluginAudioSourceSenderSupportedPresets( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 41, port: port_); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_list_spotube_audio_source_container_preset, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: + kCrateApiPluginSendersPluginAudioSourceSenderSupportedPresetsConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginAudioSourceSenderSupportedPresetsConstMeta => + const TaskConstMeta( + debugName: "plugin_audio_source_sender_supported_presets", + argNames: ["that", "mpscTx"], + ); + @override Future crateApiPluginSendersPluginAuthSenderAuthenticate( {required PluginAuthSender that, required OpaqueSender mpscTx}) { @@ -1735,7 +1774,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 41, port: port_); + funcId: 42, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1764,7 +1803,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 42, port: port_); + funcId: 43, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -1793,7 +1832,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 43, port: port_); + funcId: 44, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1829,7 +1868,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 44, port: port_); + funcId: 45, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1864,7 +1903,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 45, port: port_); + funcId: 46, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1883,14 +1922,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiPluginModelsCorePluginConfigurationSlug( + String crateApiPluginModelsCorePluginConfigurationSlug( {required PluginConfiguration that}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { + return handler.executeSync(SyncTask( + callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_configuration(that, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 46, port: port_); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 47)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -1922,7 +1960,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_box_autoadd_plugin_configuration(pluginConfig, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 47, port: port_); + funcId: 48, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_opt_box_autoadd_plugin_update_available, @@ -1954,7 +1992,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_box_autoadd_scrobble_details(details, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 48, port: port_); + funcId: 49, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1982,7 +2020,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 49, port: port_); + funcId: 50, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2017,7 +2055,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_String(trackIds, serializer); sse_encode_opt_box_autoadd_u_32(position, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 50, port: port_); + funcId: 51, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2058,7 +2096,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_bool(public, serializer); sse_encode_opt_box_autoadd_bool(collaborative, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 51, port: port_); + funcId: 52, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -2108,7 +2146,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 52, port: port_); + funcId: 53, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2142,7 +2180,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 53, port: port_); + funcId: 54, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_full_playlist_object, @@ -2176,7 +2214,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_String(playlistId, serializer); sse_encode_list_String(trackIds, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 54, port: port_); + funcId: 55, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2209,7 +2247,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 55, port: port_); + funcId: 56, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2245,7 +2283,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 56, port: port_); + funcId: 57, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2276,7 +2314,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 57, port: port_); + funcId: 58, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2315,7 +2353,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_bool(public, serializer); sse_encode_opt_box_autoadd_bool(collaborative, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 58, port: port_); + funcId: 59, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2369,7 +2407,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 59, port: port_); + funcId: 60, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2401,7 +2439,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(query, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 60, port: port_); + funcId: 61, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_search_response_object, @@ -2437,7 +2475,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 61, port: port_); + funcId: 62, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2465,7 +2503,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 62, port: port_); + funcId: 63, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_String, @@ -2501,7 +2539,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 63, port: port_); + funcId: 64, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2538,7 +2576,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 64, port: port_); + funcId: 65, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2557,7 +2595,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiPluginSendersPluginTrackSenderGetTrack( + Future crateApiPluginSendersPluginTrackSenderGetTrack( {required PluginTrackSender that, required OpaqueSender mpscTx, required String id}) { @@ -2569,10 +2607,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 65, port: port_); + funcId: 66, port: port_); }, codec: SseCodec( - decodeSuccessData: sse_decode_spotube_track_object, + decodeSuccessData: sse_decode_spotube_full_track_object, decodeErrorData: sse_decode_AnyhowException, ), constMeta: kCrateApiPluginSendersPluginTrackSenderGetTrackConstMeta, @@ -2588,10 +2626,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future> crateApiPluginSendersPluginTrackSenderRadio( - {required PluginTrackSender that, - required OpaqueSender mpscTx, - required String id}) { + Future> + crateApiPluginSendersPluginTrackSenderRadio( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}) { return handler.executeNormal(NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); @@ -2600,10 +2639,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 66, port: port_); + funcId: 67, port: port_); }, codec: SseCodec( - decodeSuccessData: sse_decode_list_spotube_track_object, + decodeSuccessData: sse_decode_list_spotube_full_track_object, decodeErrorData: sse_decode_AnyhowException, ), constMeta: kCrateApiPluginSendersPluginTrackSenderRadioConstMeta, @@ -2631,7 +2670,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 67, port: port_); + funcId: 68, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2662,7 +2701,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 68, port: port_); + funcId: 69, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2690,7 +2729,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 69, port: port_); + funcId: 70, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_user_object, @@ -2724,7 +2763,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 70, port: port_); + funcId: 71, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2759,7 +2798,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 71, port: port_); + funcId: 72, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2794,7 +2833,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 72, port: port_); + funcId: 73, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2829,7 +2868,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 73, port: port_); + funcId: 74, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2857,7 +2896,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_spotube_audio_lossless_container_quality( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 74)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 75)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2887,7 +2926,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_box_autoadd_spotube_audio_lossy_container_quality( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 75, port: port_); + funcId: 76, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2916,7 +2955,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_spotube_audio_source_container_preset( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 76)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 77)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -3124,12 +3163,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw as int; } - @protected - PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return dco_decode_i_64(raw); - } - @protected PluginAlbumSender dco_decode_box_autoadd_plugin_album_sender(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3270,6 +3303,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dco_decode_spotube_full_playlist_object(raw); } + @protected + SpotubeFullTrackObject dco_decode_box_autoadd_spotube_full_track_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_full_track_object(raw); + } + + @protected + SpotubeLocalTrackObject dco_decode_box_autoadd_spotube_local_track_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_local_track_object(raw); + } + @protected SpotubeSimpleAlbumObject dco_decode_box_autoadd_spotube_simple_album_object( dynamic raw) { @@ -3291,12 +3338,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dco_decode_spotube_simple_playlist_object(raw); } - @protected - SpotubeTrackObject dco_decode_box_autoadd_spotube_track_object(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return dco_decode_spotube_track_object(raw); - } - @protected int dco_decode_box_autoadd_u_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3315,12 +3356,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw as int; } - @protected - PlatformInt64 dco_decode_i_64(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeI64(raw); - } - @protected List dco_decode_list_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3369,6 +3404,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { .toList(); } + @protected + List + dco_decode_list_spotube_audio_source_container_preset(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_audio_source_container_preset) + .toList(); + } + @protected List dco_decode_list_spotube_audio_source_match_object(dynamic raw) { @@ -3405,6 +3449,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { .toList(); } + @protected + List dco_decode_list_spotube_full_track_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_full_track_object) + .toList(); + } + @protected List dco_decode_list_spotube_image_object(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3447,12 +3500,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { .toList(); } - @protected - List dco_decode_list_spotube_track_object(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_spotube_track_object).toList(); - } - @protected List dco_decode_list_spotube_user_object(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3483,12 +3530,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw == null ? null : dco_decode_box_autoadd_i_32(raw); } - @protected - PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_i_64(raw); - } - @protected PluginUpdateAvailable? dco_decode_opt_box_autoadd_plugin_update_available( dynamic raw) { @@ -3695,7 +3736,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { title: dco_decode_String(arr[1]), artists: dco_decode_list_scrobble_artist(arr[2]), album: dco_decode_scrobble_album(arr[3]), - timestamp: dco_decode_opt_box_autoadd_i_64(arr[4]), + timestamp: dco_decode_opt_box_autoadd_i_32(arr[4]), durationMs: dco_decode_opt_box_autoadd_u_32(arr[5]), isrc: dco_decode_opt_String(arr[6]), ); @@ -3768,7 +3809,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { id: dco_decode_String(arr[1]), title: dco_decode_String(arr[2]), artists: dco_decode_list_String(arr[3]), - duration: dco_decode_u_64(arr[4]), + duration: dco_decode_u_32(arr[4]), thumbnail: dco_decode_opt_String(arr[5]), externalUri: dco_decode_String(arr[6]), ); @@ -3818,7 +3859,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (raw[0]) { case 0: return SpotubeBrowseSectionResponseObjectItem_Track( - dco_decode_box_autoadd_spotube_track_object(raw[1]), + dco_decode_box_autoadd_spotube_full_track_object(raw[1]), ); case 1: return SpotubeBrowseSectionResponseObjectItem_PlaylistFull( @@ -3908,6 +3949,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); } + @protected + SpotubeFullTrackObject dco_decode_spotube_full_track_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return SpotubeFullTrackObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + artists: dco_decode_list_spotube_simple_artist_object(arr[4]), + album: dco_decode_spotube_simple_album_object(arr[5]), + durationMs: dco_decode_u_32(arr[6]), + isrc: dco_decode_String(arr[7]), + explicit: dco_decode_bool(arr[8]), + ); + } + @protected SpotubeImageObject dco_decode_spotube_image_object(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -3922,6 +3982,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); } + @protected + SpotubeLocalTrackObject dco_decode_spotube_local_track_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return SpotubeLocalTrackObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + artists: dco_decode_list_spotube_simple_artist_object(arr[4]), + album: dco_decode_spotube_simple_album_object(arr[5]), + durationMs: dco_decode_u_32(arr[6]), + path: dco_decode_String(arr[7]), + ); + } + @protected SpotubeMediaCompressionType dco_decode_spotube_media_compression_type( dynamic raw) { @@ -3952,7 +4030,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (raw[0]) { case 0: return SpotubePaginationResponseObjectItem_Track( - dco_decode_box_autoadd_spotube_track_object(raw[1]), + dco_decode_box_autoadd_spotube_full_track_object(raw[1]), ); case 1: return SpotubePaginationResponseObjectItem_PlaylistFull( @@ -3999,7 +4077,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { albums: dco_decode_list_spotube_simple_album_object(arr[1]), artists: dco_decode_list_spotube_full_artist_object(arr[2]), playlists: dco_decode_list_spotube_simple_playlist_object(arr[3]), - tracks: dco_decode_list_spotube_track_object(arr[4]), + tracks: dco_decode_list_spotube_full_track_object(arr[4]), ); } @@ -4058,20 +4136,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected SpotubeTrackObject dco_decode_spotube_track_object(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 9) - throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); - return SpotubeTrackObject( - typeName: dco_decode_String(arr[0]), - id: dco_decode_String(arr[1]), - name: dco_decode_String(arr[2]), - externalUri: dco_decode_String(arr[3]), - artists: dco_decode_list_spotube_simple_artist_object(arr[4]), - album: dco_decode_spotube_simple_album_object(arr[5]), - durationMs: dco_decode_u_64(arr[6]), - isrc: dco_decode_String(arr[7]), - explicit: dco_decode_bool(arr[8]), - ); + switch (raw[0]) { + case 0: + return SpotubeTrackObject_Full( + dco_decode_box_autoadd_spotube_full_track_object(raw[1]), + ); + case 1: + return SpotubeTrackObject_Local( + dco_decode_box_autoadd_spotube_local_track_object(raw[1]), + ); + default: + throw Exception("unreachable"); + } } @protected @@ -4095,12 +4171,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw as int; } - @protected - BigInt dco_decode_u_64(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeU64(raw); - } - @protected int dco_decode_u_8(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -4286,12 +4356,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return (sse_decode_i_32(deserializer)); } - @protected - PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_i_64(deserializer)); - } - @protected PluginAlbumSender sse_decode_box_autoadd_plugin_album_sender( SseDeserializer deserializer) { @@ -4444,6 +4508,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return (sse_decode_spotube_full_playlist_object(deserializer)); } + @protected + SpotubeFullTrackObject sse_decode_box_autoadd_spotube_full_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_full_track_object(deserializer)); + } + + @protected + SpotubeLocalTrackObject sse_decode_box_autoadd_spotube_local_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_local_track_object(deserializer)); + } + @protected SpotubeSimpleAlbumObject sse_decode_box_autoadd_spotube_simple_album_object( SseDeserializer deserializer) { @@ -4466,13 +4544,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return (sse_decode_spotube_simple_playlist_object(deserializer)); } - @protected - SpotubeTrackObject sse_decode_box_autoadd_spotube_track_object( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_spotube_track_object(deserializer)); - } - @protected int sse_decode_box_autoadd_u_32(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4491,12 +4562,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getInt32(); } - @protected - PlatformInt64 sse_decode_i_64(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getPlatformInt64(); - } - @protected List sse_decode_list_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4583,6 +4648,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return ans_; } + @protected + List + sse_decode_list_spotube_audio_source_container_preset( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_audio_source_container_preset(deserializer)); + } + return ans_; + } + @protected List sse_decode_list_spotube_audio_source_match_object( @@ -4639,6 +4718,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return ans_; } + @protected + List sse_decode_list_spotube_full_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_full_track_object(deserializer)); + } + return ans_; + } + @protected List sse_decode_list_spotube_image_object( SseDeserializer deserializer) { @@ -4707,19 +4799,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return ans_; } - @protected - List sse_decode_list_spotube_track_object( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_spotube_track_object(deserializer)); - } - return ans_; - } - @protected List sse_decode_list_spotube_user_object( SseDeserializer deserializer) { @@ -4777,17 +4856,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } - @protected - PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_i_64(deserializer)); - } else { - return null; - } - } - @protected PluginUpdateAvailable? sse_decode_opt_box_autoadd_plugin_update_available( SseDeserializer deserializer) { @@ -4990,7 +5058,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { var var_title = sse_decode_String(deserializer); var var_artists = sse_decode_list_scrobble_artist(deserializer); var var_album = sse_decode_scrobble_album(deserializer); - var var_timestamp = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_timestamp = sse_decode_opt_box_autoadd_i_32(deserializer); var var_durationMs = sse_decode_opt_box_autoadd_u_32(deserializer); var var_isrc = sse_decode_opt_String(deserializer); return ScrobbleDetails( @@ -5072,7 +5140,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { var var_id = sse_decode_String(deserializer); var var_title = sse_decode_String(deserializer); var var_artists = sse_decode_list_String(deserializer); - var var_duration = sse_decode_u_64(deserializer); + var var_duration = sse_decode_u_32(deserializer); var var_thumbnail = sse_decode_opt_String(deserializer); var var_externalUri = sse_decode_String(deserializer); return SpotubeAudioSourceMatchObject( @@ -5139,7 +5207,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (tag_) { case 0: var var_field0 = - sse_decode_box_autoadd_spotube_track_object(deserializer); + sse_decode_box_autoadd_spotube_full_track_object(deserializer); return SpotubeBrowseSectionResponseObjectItem_Track(var_field0); case 1: var var_field0 = @@ -5249,6 +5317,32 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { public: var_public); } + @protected + SpotubeFullTrackObject sse_decode_spotube_full_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_artists = + sse_decode_list_spotube_simple_artist_object(deserializer); + var var_album = sse_decode_spotube_simple_album_object(deserializer); + var var_durationMs = sse_decode_u_32(deserializer); + var var_isrc = sse_decode_String(deserializer); + var var_explicit = sse_decode_bool(deserializer); + return SpotubeFullTrackObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + artists: var_artists, + album: var_album, + durationMs: var_durationMs, + isrc: var_isrc, + explicit: var_explicit); + } + @protected SpotubeImageObject sse_decode_spotube_image_object( SseDeserializer deserializer) { @@ -5264,6 +5358,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { height: var_height); } + @protected + SpotubeLocalTrackObject sse_decode_spotube_local_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_artists = + sse_decode_list_spotube_simple_artist_object(deserializer); + var var_album = sse_decode_spotube_simple_album_object(deserializer); + var var_durationMs = sse_decode_u_32(deserializer); + var var_path = sse_decode_String(deserializer); + return SpotubeLocalTrackObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + artists: var_artists, + album: var_album, + durationMs: var_durationMs, + path: var_path); + } + @protected SpotubeMediaCompressionType sse_decode_spotube_media_compression_type( SseDeserializer deserializer) { @@ -5300,7 +5418,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (tag_) { case 0: var var_field0 = - sse_decode_box_autoadd_spotube_track_object(deserializer); + sse_decode_box_autoadd_spotube_full_track_object(deserializer); return SpotubePaginationResponseObjectItem_Track(var_field0); case 1: var var_field0 = @@ -5344,7 +5462,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { var var_artists = sse_decode_list_spotube_full_artist_object(deserializer); var var_playlists = sse_decode_list_spotube_simple_playlist_object(deserializer); - var var_tracks = sse_decode_list_spotube_track_object(deserializer); + var var_tracks = sse_decode_list_spotube_full_track_object(deserializer); return SpotubeSearchResponseObject( typeName: var_typeName, albums: var_albums, @@ -5419,26 +5537,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { SpotubeTrackObject sse_decode_spotube_track_object( SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_typeName = sse_decode_String(deserializer); - var var_id = sse_decode_String(deserializer); - var var_name = sse_decode_String(deserializer); - var var_externalUri = sse_decode_String(deserializer); - var var_artists = - sse_decode_list_spotube_simple_artist_object(deserializer); - var var_album = sse_decode_spotube_simple_album_object(deserializer); - var var_durationMs = sse_decode_u_64(deserializer); - var var_isrc = sse_decode_String(deserializer); - var var_explicit = sse_decode_bool(deserializer); - return SpotubeTrackObject( - typeName: var_typeName, - id: var_id, - name: var_name, - externalUri: var_externalUri, - artists: var_artists, - album: var_album, - durationMs: var_durationMs, - isrc: var_isrc, - explicit: var_explicit); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = + sse_decode_box_autoadd_spotube_full_track_object(deserializer); + return SpotubeTrackObject_Full(var_field0); + case 1: + var var_field0 = + sse_decode_box_autoadd_spotube_local_track_object(deserializer); + return SpotubeTrackObject_Local(var_field0); + default: + throw UnimplementedError(''); + } } @protected @@ -5464,12 +5576,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getUint32(); } - @protected - BigInt sse_decode_u_64(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getBigUint64(); - } - @protected int sse_decode_u_8(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -5671,13 +5777,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_i_32(self, serializer); } - @protected - void sse_encode_box_autoadd_i_64( - PlatformInt64 self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_64(self, serializer); - } - @protected void sse_encode_box_autoadd_plugin_album_sender( PluginAlbumSender self, SseSerializer serializer) { @@ -5825,6 +5924,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_spotube_full_playlist_object(self, serializer); } + @protected + void sse_encode_box_autoadd_spotube_full_track_object( + SpotubeFullTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_full_track_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_local_track_object( + SpotubeLocalTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_local_track_object(self, serializer); + } + @protected void sse_encode_box_autoadd_spotube_simple_album_object( SpotubeSimpleAlbumObject self, SseSerializer serializer) { @@ -5846,13 +5959,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_spotube_simple_playlist_object(self, serializer); } - @protected - void sse_encode_box_autoadd_spotube_track_object( - SpotubeTrackObject self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_spotube_track_object(self, serializer); - } - @protected void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -5871,12 +5977,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putInt32(self); } - @protected - void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - serializer.buffer.putPlatformInt64(self); - } - @protected void sse_encode_list_String(List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -5945,6 +6045,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } + @protected + void sse_encode_list_spotube_audio_source_container_preset( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_audio_source_container_preset(item, serializer); + } + } + @protected void sse_encode_list_spotube_audio_source_match_object( List self, SseSerializer serializer) { @@ -5986,6 +6096,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } + @protected + void sse_encode_list_spotube_full_track_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_full_track_object(item, serializer); + } + } + @protected void sse_encode_list_spotube_image_object( List self, SseSerializer serializer) { @@ -6037,16 +6157,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } - @protected - void sse_encode_list_spotube_track_object( - List self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_32(self.length, serializer); - for (final item in self) { - sse_encode_spotube_track_object(item, serializer); - } - } - @protected void sse_encode_list_spotube_user_object( List self, SseSerializer serializer) { @@ -6097,17 +6207,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } - @protected - void sse_encode_opt_box_autoadd_i_64( - PlatformInt64? self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - - sse_encode_bool(self != null, serializer); - if (self != null) { - sse_encode_box_autoadd_i_64(self, serializer); - } - } - @protected void sse_encode_opt_box_autoadd_plugin_update_available( PluginUpdateAvailable? self, SseSerializer serializer) { @@ -6281,7 +6380,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_String(self.title, serializer); sse_encode_list_scrobble_artist(self.artists, serializer); sse_encode_scrobble_album(self.album, serializer); - sse_encode_opt_box_autoadd_i_64(self.timestamp, serializer); + sse_encode_opt_box_autoadd_i_32(self.timestamp, serializer); sse_encode_opt_box_autoadd_u_32(self.durationMs, serializer); sse_encode_opt_String(self.isrc, serializer); } @@ -6344,7 +6443,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_String(self.id, serializer); sse_encode_String(self.title, serializer); sse_encode_list_String(self.artists, serializer); - sse_encode_u_64(self.duration, serializer); + sse_encode_u_32(self.duration, serializer); sse_encode_opt_String(self.thumbnail, serializer); sse_encode_String(self.externalUri, serializer); } @@ -6383,7 +6482,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (self) { case SpotubeBrowseSectionResponseObjectItem_Track(field0: final field0): sse_encode_i_32(0, serializer); - sse_encode_box_autoadd_spotube_track_object(field0, serializer); + sse_encode_box_autoadd_spotube_full_track_object(field0, serializer); case SpotubeBrowseSectionResponseObjectItem_PlaylistFull( field0: final field0 ): @@ -6464,6 +6563,21 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_bool(self.public, serializer); } + @protected + void sse_encode_spotube_full_track_object( + SpotubeFullTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_list_spotube_simple_artist_object(self.artists, serializer); + sse_encode_spotube_simple_album_object(self.album, serializer); + sse_encode_u_32(self.durationMs, serializer); + sse_encode_String(self.isrc, serializer); + sse_encode_bool(self.explicit, serializer); + } + @protected void sse_encode_spotube_image_object( SpotubeImageObject self, SseSerializer serializer) { @@ -6474,6 +6588,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_i_32(self.height, serializer); } + @protected + void sse_encode_spotube_local_track_object( + SpotubeLocalTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_list_spotube_simple_artist_object(self.artists, serializer); + sse_encode_spotube_simple_album_object(self.album, serializer); + sse_encode_u_32(self.durationMs, serializer); + sse_encode_String(self.path, serializer); + } + @protected void sse_encode_spotube_media_compression_type( SpotubeMediaCompressionType self, SseSerializer serializer) { @@ -6500,7 +6628,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { switch (self) { case SpotubePaginationResponseObjectItem_Track(field0: final field0): sse_encode_i_32(0, serializer); - sse_encode_box_autoadd_spotube_track_object(field0, serializer); + sse_encode_box_autoadd_spotube_full_track_object(field0, serializer); case SpotubePaginationResponseObjectItem_PlaylistFull( field0: final field0 ): @@ -6545,7 +6673,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_spotube_simple_album_object(self.albums, serializer); sse_encode_list_spotube_full_artist_object(self.artists, serializer); sse_encode_list_spotube_simple_playlist_object(self.playlists, serializer); - sse_encode_list_spotube_track_object(self.tracks, serializer); + sse_encode_list_spotube_full_track_object(self.tracks, serializer); } @protected @@ -6590,15 +6718,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { void sse_encode_spotube_track_object( SpotubeTrackObject self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.typeName, serializer); - sse_encode_String(self.id, serializer); - sse_encode_String(self.name, serializer); - sse_encode_String(self.externalUri, serializer); - sse_encode_list_spotube_simple_artist_object(self.artists, serializer); - sse_encode_spotube_simple_album_object(self.album, serializer); - sse_encode_u_64(self.durationMs, serializer); - sse_encode_String(self.isrc, serializer); - sse_encode_bool(self.explicit, serializer); + switch (self) { + case SpotubeTrackObject_Full(field0: final field0): + sse_encode_i_32(0, serializer); + sse_encode_box_autoadd_spotube_full_track_object(field0, serializer); + case SpotubeTrackObject_Local(field0: final field0): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_spotube_local_track_object(field0, serializer); + } } @protected @@ -6618,12 +6745,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putUint32(self); } - @protected - void sse_encode_u_64(BigInt self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - serializer.buffer.putBigUint64(self); - } - @protected void sse_encode_u_8(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs diff --git a/lib/src/rust/frb_generated.io.dart b/lib/src/rust/frb_generated.io.dart index 47459acc..379d61de 100644 --- a/lib/src/rust/frb_generated.io.dart +++ b/lib/src/rust/frb_generated.io.dart @@ -137,9 +137,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int dco_decode_box_autoadd_i_32(dynamic raw); - @protected - PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw); - @protected PluginAlbumSender dco_decode_box_autoadd_plugin_album_sender(dynamic raw); @@ -215,6 +212,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SpotubeFullPlaylistObject dco_decode_box_autoadd_spotube_full_playlist_object( dynamic raw); + @protected + SpotubeFullTrackObject dco_decode_box_autoadd_spotube_full_track_object( + dynamic raw); + + @protected + SpotubeLocalTrackObject dco_decode_box_autoadd_spotube_local_track_object( + dynamic raw); + @protected SpotubeSimpleAlbumObject dco_decode_box_autoadd_spotube_simple_album_object( dynamic raw); @@ -227,9 +232,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SpotubeSimplePlaylistObject dco_decode_box_autoadd_spotube_simple_playlist_object(dynamic raw); - @protected - SpotubeTrackObject dco_decode_box_autoadd_spotube_track_object(dynamic raw); - @protected int dco_decode_box_autoadd_u_32(dynamic raw); @@ -239,9 +241,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int dco_decode_i_32(dynamic raw); - @protected - PlatformInt64 dco_decode_i_64(dynamic raw); - @protected List dco_decode_list_String(dynamic raw); @@ -265,6 +264,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { List dco_decode_list_spotube_audio_lossy_container_quality(dynamic raw); + @protected + List + dco_decode_list_spotube_audio_source_container_preset(dynamic raw); + @protected List dco_decode_list_spotube_audio_source_match_object(dynamic raw); @@ -281,6 +284,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { List dco_decode_list_spotube_full_artist_object( dynamic raw); + @protected + List dco_decode_list_spotube_full_track_object( + dynamic raw); + @protected List dco_decode_list_spotube_image_object(dynamic raw); @@ -300,9 +307,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { List dco_decode_list_spotube_simple_playlist_object(dynamic raw); - @protected - List dco_decode_list_spotube_track_object(dynamic raw); - @protected List dco_decode_list_spotube_user_object(dynamic raw); @@ -318,9 +322,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int? dco_decode_opt_box_autoadd_i_32(dynamic raw); - @protected - PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw); - @protected PluginUpdateAvailable? dco_decode_opt_box_autoadd_plugin_update_available( dynamic raw); @@ -431,9 +432,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SpotubeFullPlaylistObject dco_decode_spotube_full_playlist_object( dynamic raw); + @protected + SpotubeFullTrackObject dco_decode_spotube_full_track_object(dynamic raw); + @protected SpotubeImageObject dco_decode_spotube_image_object(dynamic raw); + @protected + SpotubeLocalTrackObject dco_decode_spotube_local_track_object(dynamic raw); + @protected SpotubeMediaCompressionType dco_decode_spotube_media_compression_type( dynamic raw); @@ -470,9 +477,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int dco_decode_u_32(dynamic raw); - @protected - BigInt dco_decode_u_64(dynamic raw); - @protected int dco_decode_u_8(dynamic raw); @@ -570,9 +574,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int sse_decode_box_autoadd_i_32(SseDeserializer deserializer); - @protected - PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer); - @protected PluginAlbumSender sse_decode_box_autoadd_plugin_album_sender( SseDeserializer deserializer); @@ -662,6 +663,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SpotubeFullPlaylistObject sse_decode_box_autoadd_spotube_full_playlist_object( SseDeserializer deserializer); + @protected + SpotubeFullTrackObject sse_decode_box_autoadd_spotube_full_track_object( + SseDeserializer deserializer); + + @protected + SpotubeLocalTrackObject sse_decode_box_autoadd_spotube_local_track_object( + SseDeserializer deserializer); + @protected SpotubeSimpleAlbumObject sse_decode_box_autoadd_spotube_simple_album_object( SseDeserializer deserializer); @@ -675,10 +684,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_box_autoadd_spotube_simple_playlist_object( SseDeserializer deserializer); - @protected - SpotubeTrackObject sse_decode_box_autoadd_spotube_track_object( - SseDeserializer deserializer); - @protected int sse_decode_box_autoadd_u_32(SseDeserializer deserializer); @@ -688,9 +693,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int sse_decode_i_32(SseDeserializer deserializer); - @protected - PlatformInt64 sse_decode_i_64(SseDeserializer deserializer); - @protected List sse_decode_list_String(SseDeserializer deserializer); @@ -718,6 +720,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_list_spotube_audio_lossy_container_quality( SseDeserializer deserializer); + @protected + List + sse_decode_list_spotube_audio_source_container_preset( + SseDeserializer deserializer); + @protected List sse_decode_list_spotube_audio_source_match_object( @@ -737,6 +744,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { List sse_decode_list_spotube_full_artist_object( SseDeserializer deserializer); + @protected + List sse_decode_list_spotube_full_track_object( + SseDeserializer deserializer); + @protected List sse_decode_list_spotube_image_object( SseDeserializer deserializer); @@ -759,10 +770,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_list_spotube_simple_playlist_object( SseDeserializer deserializer); - @protected - List sse_decode_list_spotube_track_object( - SseDeserializer deserializer); - @protected List sse_decode_list_spotube_user_object( SseDeserializer deserializer); @@ -779,9 +786,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer); - @protected - PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer); - @protected PluginUpdateAvailable? sse_decode_opt_box_autoadd_plugin_update_available( SseDeserializer deserializer); @@ -908,10 +912,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { SpotubeFullPlaylistObject sse_decode_spotube_full_playlist_object( SseDeserializer deserializer); + @protected + SpotubeFullTrackObject sse_decode_spotube_full_track_object( + SseDeserializer deserializer); + @protected SpotubeImageObject sse_decode_spotube_image_object( SseDeserializer deserializer); + @protected + SpotubeLocalTrackObject sse_decode_spotube_local_track_object( + SseDeserializer deserializer); + @protected SpotubeMediaCompressionType sse_decode_spotube_media_compression_type( SseDeserializer deserializer); @@ -952,9 +964,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected int sse_decode_u_32(SseDeserializer deserializer); - @protected - BigInt sse_decode_u_64(SseDeserializer deserializer); - @protected int sse_decode_u_8(SseDeserializer deserializer); @@ -1054,10 +1063,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer); - @protected - void sse_encode_box_autoadd_i_64( - PlatformInt64 self, SseSerializer serializer); - @protected void sse_encode_box_autoadd_plugin_album_sender( PluginAlbumSender self, SseSerializer serializer); @@ -1142,6 +1147,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_box_autoadd_spotube_full_playlist_object( SpotubeFullPlaylistObject self, SseSerializer serializer); + @protected + void sse_encode_box_autoadd_spotube_full_track_object( + SpotubeFullTrackObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_local_track_object( + SpotubeLocalTrackObject self, SseSerializer serializer); + @protected void sse_encode_box_autoadd_spotube_simple_album_object( SpotubeSimpleAlbumObject self, SseSerializer serializer); @@ -1154,10 +1167,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_box_autoadd_spotube_simple_playlist_object( SpotubeSimplePlaylistObject self, SseSerializer serializer); - @protected - void sse_encode_box_autoadd_spotube_track_object( - SpotubeTrackObject self, SseSerializer serializer); - @protected void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer); @@ -1167,9 +1176,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_i_32(int self, SseSerializer serializer); - @protected - void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer); - @protected void sse_encode_list_String(List self, SseSerializer serializer); @@ -1198,6 +1204,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_list_spotube_audio_lossy_container_quality( List self, SseSerializer serializer); + @protected + void sse_encode_list_spotube_audio_source_container_preset( + List self, SseSerializer serializer); + @protected void sse_encode_list_spotube_audio_source_match_object( List self, SseSerializer serializer); @@ -1215,6 +1225,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_list_spotube_full_artist_object( List self, SseSerializer serializer); + @protected + void sse_encode_list_spotube_full_track_object( + List self, SseSerializer serializer); + @protected void sse_encode_list_spotube_image_object( List self, SseSerializer serializer); @@ -1235,10 +1249,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_list_spotube_simple_playlist_object( List self, SseSerializer serializer); - @protected - void sse_encode_list_spotube_track_object( - List self, SseSerializer serializer); - @protected void sse_encode_list_spotube_user_object( List self, SseSerializer serializer); @@ -1255,10 +1265,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer); - @protected - void sse_encode_opt_box_autoadd_i_64( - PlatformInt64? self, SseSerializer serializer); - @protected void sse_encode_opt_box_autoadd_plugin_update_available( PluginUpdateAvailable? self, SseSerializer serializer); @@ -1386,10 +1392,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_spotube_full_playlist_object( SpotubeFullPlaylistObject self, SseSerializer serializer); + @protected + void sse_encode_spotube_full_track_object( + SpotubeFullTrackObject self, SseSerializer serializer); + @protected void sse_encode_spotube_image_object( SpotubeImageObject self, SseSerializer serializer); + @protected + void sse_encode_spotube_local_track_object( + SpotubeLocalTrackObject self, SseSerializer serializer); + @protected void sse_encode_spotube_media_compression_type( SpotubeMediaCompressionType self, SseSerializer serializer); @@ -1429,9 +1443,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_u_32(int self, SseSerializer serializer); - @protected - void sse_encode_u_64(BigInt self, SseSerializer serializer); - @protected void sse_encode_u_8(int self, SseSerializer serializer); diff --git a/lib/src/rust/internal/core.dart b/lib/src/rust/internal/core.dart deleted file mode 100644 index dabb11a4..00000000 --- a/lib/src/rust/internal/core.dart +++ /dev/null @@ -1,10 +0,0 @@ -// This file is automatically generated, so please do not edit it. -// @generated by `flutter_rust_bridge`@ 2.11.1. - -// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import - -import '../frb_generated.dart'; -import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; - -// Rust type: RustOpaqueMoi> -abstract class PluginCoreEndpoint implements RustOpaqueInterface {} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index d1ecafdf..4121a0f4 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -34,9 +33,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); - g_autoptr(FlPluginRegistrar) flutter_timezone_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterTimezonePlugin"); - flutter_timezone_plugin_register_with_registrar(flutter_timezone_registrar); g_autoptr(FlPluginRegistrar) gtk_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); gtk_plugin_register_with_registrar(gtk_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index faa9c913..4f7f52f5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -7,7 +7,6 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux flutter_new_pipe_extractor flutter_secure_storage_linux - flutter_timezone gtk local_notifier media_kit_libs_linux diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index a7d025e8..dfc52450 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -17,7 +17,6 @@ import file_selector_macos import flutter_inappwebview_macos import flutter_new_pipe_extractor import flutter_secure_storage_macos -import flutter_timezone import local_notifier import media_kit_libs_macos_audio import open_file_mac @@ -44,7 +43,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) FlutterNewPipeExtractorPlugin.register(with: registry.registrar(forPlugin: "FlutterNewPipeExtractorPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) - FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin")) LocalNotifierPlugin.register(with: registry.registrar(forPlugin: "LocalNotifierPlugin")) MediaKitLibsMacosAudioPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosAudioPlugin")) OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) diff --git a/pubspec.lock b/pubspec.lock index 1479273a..f0cec7ea 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -637,14 +637,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" - fast_noise: - dependency: transitive - description: - name: fast_noise - sha256: "271031cebf1602fc064472970e658fa7ff2f3b55a979bb430337b715bd55690b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" ffi: dependency: transitive description: @@ -1045,14 +1037,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_timezone: - dependency: transitive - description: - name: flutter_timezone - sha256: "13b2109ad75651faced4831bf262e32559e44aa549426eab8a597610d385d934" - url: "https://pub.dev" - source: hosted - version: "4.1.1" flutter_undraw: dependency: "direct main" description: @@ -1167,41 +1151,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - hetu_otp_util: - dependency: "direct main" - description: - path: "." - ref: main - resolved-ref: "7790606751828758769596e809ba6cbb756f9b9a" - url: "https://github.com/hetu-community/hetu_otp_util.git" - source: git - version: "1.0.0" - hetu_script: - dependency: "direct main" - description: - name: hetu_script - sha256: a9a3f4f510ae10188d352b79e8fc45e27134cfa81ee1691004067395f45f17cb - url: "https://pub.dev" - source: hosted - version: "0.4.2+1" - hetu_spotube_plugin: - dependency: "direct main" - description: - path: "." - ref: main - resolved-ref: "32828156bc111d147709f8d644804227bbdfe8f1" - url: "https://github.com/KRTirtho/hetu_spotube_plugin.git" - source: git - version: "0.0.2" - hetu_std: - dependency: "direct main" - description: - path: "." - ref: main - resolved-ref: "401fde426339cf8f1e00dee22cc95f64c3e60053" - url: "https://github.com/hetu-community/hetu_std.git" - source: git - version: "1.0.0" home_widget: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0a5690f6..934251d4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -129,19 +129,6 @@ dependencies: http_parser: ^4.1.2 collection: any archive: ^4.0.7 - hetu_script: ^0.4.2+1 - hetu_std: - git: - url: https://github.com/hetu-community/hetu_std.git - ref: main - hetu_otp_util: - git: - url: https://github.com/hetu-community/hetu_otp_util.git - ref: main - hetu_spotube_plugin: - git: - url: https://github.com/KRTirtho/hetu_spotube_plugin.git - ref: main get_it: ^8.0.3 flutter_markdown_plus: ^1.0.3 pub_semver: ^2.2.0 @@ -245,10 +232,6 @@ flutter: - packages/flutter_undraw/assets/undraw/no_data.svg - packages/flutter_undraw/assets/undraw/process.svg - packages/flutter_undraw/assets/undraw/stars.svg - # hetu script bytecode - - packages/hetu_std/assets/bytecode/std.out - - packages/hetu_otp_util/assets/bytecode/otp_util.out - - packages/hetu_spotube_plugin/assets/bytecode/spotube_plugin.out fonts: - family: RadixIcons fonts: diff --git a/rust/src/api/plugin/commands.rs b/rust/src/api/plugin/commands.rs index 214353b5..36c28e7d 100644 --- a/rust/src/api/plugin/commands.rs +++ b/rust/src/api/plugin/commands.rs @@ -8,7 +8,7 @@ use crate::api::plugin::models::core::{ use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; use crate::api::plugin::models::playlist::SpotubeFullPlaylistObject; use crate::api::plugin::models::search::SpotubeSearchResponseObject; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; use crate::api::plugin::models::user::SpotubeUserObject; use tokio::sync::oneshot; @@ -79,7 +79,7 @@ pub enum AudioSourceCommands { response_tx: oneshot::Sender>>, }, Matches { - track: SpotubeTrackObject, + track: SpotubeFullTrackObject, response_tx: oneshot::Sender>>, }, Streams { @@ -223,7 +223,7 @@ pub enum SearchCommands { pub enum TrackCommands { GetTrack { id: String, - response_tx: oneshot::Sender>, + response_tx: oneshot::Sender>, }, Save { ids: Vec, @@ -235,7 +235,7 @@ pub enum TrackCommands { }, Radio { id: String, - response_tx: oneshot::Sender>>, + response_tx: oneshot::Sender>>, }, } diff --git a/rust/src/api/plugin/models/audio_source.rs b/rust/src/api/plugin/models/audio_source.rs index b3b47dea..e91b9ca5 100644 --- a/rust/src/api/plugin/models/audio_source.rs +++ b/rust/src/api/plugin/models/audio_source.rs @@ -89,7 +89,7 @@ pub struct SpotubeAudioSourceMatchObject { pub id: String, pub title: String, pub artists: Vec, - pub duration: u64, // Duration in ms + pub duration: u32, // Duration in ms pub thumbnail: Option, pub external_uri: String, diff --git a/rust/src/api/plugin/models/browse.rs b/rust/src/api/plugin/models/browse.rs index 7a9a9a7e..3c8cebad 100644 --- a/rust/src/api/plugin/models/browse.rs +++ b/rust/src/api/plugin/models/browse.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::api::plugin::models::album::{SpotubeFullAlbumObject, SpotubeSimpleAlbumObject}; use crate::api::plugin::models::artist::{SpotubeFullArtistObject, SpotubeSimpleArtistObject}; use crate::api::plugin::models::playlist::{SpotubeFullPlaylistObject, SpotubeSimplePlaylistObject}; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::{SpotubeFullTrackObject}; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] @@ -21,7 +21,7 @@ pub struct SpotubeBrowseSectionObject { #[serde(rename_all = "camelCase", tag = "type_name")] pub enum SpotubeBrowseSectionResponseObjectItem { #[serde(rename = "track")] - Track(SpotubeTrackObject), + Track(SpotubeFullTrackObject), #[serde(rename = "playlist_full")] PlaylistFull(SpotubeFullPlaylistObject), #[serde(rename = "playlist_simple")] diff --git a/rust/src/api/plugin/models/core.rs b/rust/src/api/plugin/models/core.rs index d1ab9f5a..c34a8925 100644 --- a/rust/src/api/plugin/models/core.rs +++ b/rust/src/api/plugin/models/core.rs @@ -1,3 +1,4 @@ +use flutter_rust_bridge::frb; use heck::ToKebabCase; use serde::{Deserialize, Serialize}; @@ -23,6 +24,7 @@ pub enum PluginAbility { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] pub struct PluginConfiguration { pub name: String, pub description: String, @@ -41,6 +43,7 @@ pub struct PluginConfiguration { } impl PluginConfiguration { + #[frb(sync)] pub fn slug(&self) -> String { self.name.to_kebab_case() } @@ -48,6 +51,7 @@ impl PluginConfiguration { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] pub struct PluginUpdateAvailable { pub download_url: String, pub version: String, @@ -55,24 +59,27 @@ pub struct PluginUpdateAvailable { } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[frb(dart_metadata=("freezed"),json_serializable)] pub struct ScrobbleArtist { pub id: String, pub name: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[frb(dart_metadata=("freezed"),json_serializable)] pub struct ScrobbleAlbum { pub id: String, pub name: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[frb(dart_metadata=("freezed"),json_serializable)] pub struct ScrobbleDetails { pub id: String, pub title: String, pub artists: Vec, pub album: ScrobbleAlbum, - pub timestamp: Option, + pub timestamp: Option, pub duration_ms: Option, pub isrc: Option, } diff --git a/rust/src/api/plugin/models/pagination.rs b/rust/src/api/plugin/models/pagination.rs index 52e1b512..371879e1 100644 --- a/rust/src/api/plugin/models/pagination.rs +++ b/rust/src/api/plugin/models/pagination.rs @@ -4,7 +4,7 @@ use crate::api::plugin::models::album::{SpotubeFullAlbumObject, SpotubeSimpleAlb use crate::api::plugin::models::artist::{SpotubeFullArtistObject, SpotubeSimpleArtistObject}; use crate::api::plugin::models::browse::SpotubeBrowseSectionObject; use crate::api::plugin::models::playlist::{SpotubeFullPlaylistObject, SpotubeSimplePlaylistObject}; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "camelCase")] @@ -21,7 +21,7 @@ pub struct SpotubePaginationResponseObject { #[serde(rename_all = "camelCase", tag = "type_name")] pub enum SpotubePaginationResponseObjectItem { #[serde(rename = "track")] - Track(SpotubeTrackObject), + Track(SpotubeFullTrackObject), #[serde(rename = "playlist_full")] PlaylistFull(SpotubeFullPlaylistObject), #[serde(rename = "playlist_simple")] diff --git a/rust/src/api/plugin/models/search.rs b/rust/src/api/plugin/models/search.rs index 7a753050..be45b3f3 100644 --- a/rust/src/api/plugin/models/search.rs +++ b/rust/src/api/plugin/models/search.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::api::plugin::models::album::SpotubeSimpleAlbumObject; use crate::api::plugin::models::artist::SpotubeFullArtistObject; use crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] @@ -13,5 +13,5 @@ pub struct SpotubeSearchResponseObject { pub albums: Vec, pub artists: Vec, pub playlists: Vec, - pub tracks: Vec, + pub tracks: Vec, } \ No newline at end of file diff --git a/rust/src/api/plugin/models/track.rs b/rust/src/api/plugin/models/track.rs index 943b6f2c..62b55b88 100644 --- a/rust/src/api/plugin/models/track.rs +++ b/rust/src/api/plugin/models/track.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] #[frb(dart_metadata=("freezed"),json_serializable)] -pub struct SpotubeTrackObject { +pub struct SpotubeFullTrackObject { pub type_name: String, pub id: String, pub name: String, @@ -14,7 +14,30 @@ pub struct SpotubeTrackObject { #[serde(default)] pub artists: Vec, pub album: SpotubeSimpleAlbumObject, - pub duration_ms: u64, // Duration in ms + pub duration_ms: u32, // Duration in ms pub isrc: String, pub explicit: bool, } + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(unignore,dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeLocalTrackObject { + pub type_name: String, + pub id: String, + pub name: String, + pub external_uri: String, + #[serde(default)] + pub artists: Vec, + pub album: SpotubeSimpleAlbumObject, + pub duration_ms: u32, // Duration in ms + pub path: String, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(unignore,dart_metadata=("freezed"),json_serializable)] +pub enum SpotubeTrackObject { + Full(SpotubeFullTrackObject), + Local(SpotubeLocalTrackObject), +} \ No newline at end of file diff --git a/rust/src/api/plugin/senders.rs b/rust/src/api/plugin/senders.rs index 2e00a4d3..8cb6e645 100644 --- a/rust/src/api/plugin/senders.rs +++ b/rust/src/api/plugin/senders.rs @@ -5,7 +5,8 @@ use crate::api::plugin::commands::{ use crate::api::plugin::models::album::SpotubeFullAlbumObject; use crate::api::plugin::models::artist::SpotubeFullArtistObject; use crate::api::plugin::models::audio_source::{ - SpotubeAudioSourceMatchObject, SpotubeAudioSourceStreamObject, + SpotubeAudioSourceContainerPreset, SpotubeAudioSourceMatchObject, + SpotubeAudioSourceStreamObject, }; use crate::api::plugin::models::core::{ PluginConfiguration, PluginUpdateAvailable, ScrobbleDetails, @@ -13,7 +14,7 @@ use crate::api::plugin::models::core::{ use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; use crate::api::plugin::models::playlist::SpotubeFullPlaylistObject; use crate::api::plugin::models::search::SpotubeSearchResponseObject; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; use crate::api::plugin::models::user::SpotubeUserObject; use crate::api::plugin::plugin::OpaqueSender; use anyhow::anyhow; @@ -239,10 +240,25 @@ impl PluginAudioSourceSender { Self {} } + pub async fn supported_presets( + &self, + mpsc_tx: &OpaqueSender, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::AudioSource( + AudioSourceCommands::SupportedPresets { response_tx: tx }, + )) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + pub async fn matches( &self, mpsc_tx: &OpaqueSender, - track: SpotubeTrackObject, + track: SpotubeFullTrackObject, ) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); mpsc_tx @@ -749,7 +765,7 @@ impl PluginTrackSender { &self, mpsc_tx: &OpaqueSender, id: String, - ) -> anyhow::Result { + ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -792,7 +808,7 @@ impl PluginTrackSender { &self, mpsc_tx: &OpaqueSender, id: String, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index ce5e55a3..a99de597 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -42,7 +42,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1716120288; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -1924875688; // Section: executor @@ -2140,7 +2140,7 @@ fn wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl( let api_mpsc_tx = , >>::sse_decode(&mut deserializer); - let api_track = ::sse_decode( + let api_track = ::sse_decode( &mut deserializer, ); deserializer.end(); @@ -2207,6 +2207,31 @@ let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decod })().await) } }) } +fn wire__crate__api__plugin__senders__plugin_audio_source_sender_supported_presets_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "plugin_audio_source_sender_supported_presets", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer); +let api_mpsc_tx = >>::sse_decode(&mut deserializer);deserializer.end(); move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>((move || async move { + let mut api_mpsc_tx_guard = None; +let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new(&api_mpsc_tx, 0, false)]); + for i in decode_indices_ { + match i { + 0 => api_mpsc_tx_guard = Some(api_mpsc_tx.lockable_decode_async_ref().await), + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); + let output_ok = crate::api::plugin::senders::PluginAudioSourceSender::supported_presets(&api_that, &*api_mpsc_tx_guard).await?; Ok(output_ok) + })().await) + } }) +} fn wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -2536,16 +2561,15 @@ fn wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl( ) } fn wire__crate__api__plugin__models__core__plugin_configuration_slug_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { debug_name: "plugin_configuration_slug", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -2561,14 +2585,12 @@ fn wire__crate__api__plugin__models__core__plugin_configuration_slug_impl( &mut deserializer, ); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok( - crate::api::plugin::models::core::PluginConfiguration::slug(&api_that), - )?; - Ok(output_ok) - })()) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok( + crate::api::plugin::models::core::PluginConfiguration::slug(&api_that), + )?; + Ok(output_ok) + })()) }, ) } @@ -4601,13 +4623,6 @@ impl SseDecode for i32 { } } -impl SseDecode for i64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_i64::().unwrap() - } -} - impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -4698,6 +4713,20 @@ impl SseDecode } } +impl SseDecode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -4750,6 +4779,22 @@ impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode( + deserializer, + ), + ); + } + return ans_; + } +} + impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -4826,20 +4871,6 @@ impl SseDecode for Vec { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - ::sse_decode(deserializer), - ); - } - return ans_; - } -} - impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -4898,17 +4929,6 @@ impl SseDecode for Option { } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } - } -} - impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -5146,7 +5166,7 @@ impl SseDecode for crate::api::plugin::models::core::ScrobbleDetails { >::sse_decode(deserializer); let mut var_album = ::sse_decode(deserializer); - let mut var_timestamp = >::sse_decode(deserializer); + let mut var_timestamp = >::sse_decode(deserializer); let mut var_durationMs = >::sse_decode(deserializer); let mut var_isrc = >::sse_decode(deserializer); return crate::api::plugin::models::core::ScrobbleDetails { @@ -5231,7 +5251,7 @@ impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioSourceM let mut var_id = ::sse_decode(deserializer); let mut var_title = ::sse_decode(deserializer); let mut var_artists = >::sse_decode(deserializer); - let mut var_duration = ::sse_decode(deserializer); + let mut var_duration = ::sse_decode(deserializer); let mut var_thumbnail = >::sse_decode(deserializer); let mut var_externalUri = ::sse_decode(deserializer); return crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject { @@ -5302,7 +5322,7 @@ impl SseDecode for crate::api::plugin::models::browse::SpotubeBrowseSectionRespo match tag_ { 0 => { let mut var_field0 = - ::sse_decode( + ::sse_decode( deserializer, ); return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(var_field0); @@ -5445,6 +5465,36 @@ impl SseDecode for crate::api::plugin::models::playlist::SpotubeFullPlaylistObje } } +impl SseDecode for crate::api::plugin::models::track::SpotubeFullTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_album = + ::sse_decode(deserializer); + let mut var_durationMs = ::sse_decode(deserializer); + let mut var_isrc = ::sse_decode(deserializer); + let mut var_explicit = ::sse_decode(deserializer); + return crate::api::plugin::models::track::SpotubeFullTrackObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + artists: var_artists, + album: var_album, + duration_ms: var_durationMs, + isrc: var_isrc, + explicit: var_explicit, + }; + } +} + impl SseDecode for crate::api::plugin::models::image::SpotubeImageObject { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -5461,6 +5511,34 @@ impl SseDecode for crate::api::plugin::models::image::SpotubeImageObject { } } +impl SseDecode for crate::api::plugin::models::track::SpotubeLocalTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_album = + ::sse_decode(deserializer); + let mut var_durationMs = ::sse_decode(deserializer); + let mut var_path = ::sse_decode(deserializer); + return crate::api::plugin::models::track::SpotubeLocalTrackObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + artists: var_artists, + album: var_album, + duration_ms: var_durationMs, + path: var_path, + }; + } +} + impl SseDecode for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -5500,7 +5578,7 @@ impl SseDecode for crate::api::plugin::models::pagination::SpotubePaginationResp match tag_ { 0 => { let mut var_field0 = - ::sse_decode( + ::sse_decode( deserializer, ); return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(var_field0); @@ -5577,7 +5655,9 @@ impl SseDecode for crate::api::plugin::models::search::SpotubeSearchResponseObje crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject, >>::sse_decode(deserializer); let mut var_tracks = - >::sse_decode(deserializer); + >::sse_decode( + deserializer, + ); return crate::api::plugin::models::search::SpotubeSearchResponseObject { type_name: var_typeName, albums: var_albums, @@ -5665,30 +5745,26 @@ impl SseDecode for crate::api::plugin::models::playlist::SpotubeSimplePlaylistOb impl SseDecode for crate::api::plugin::models::track::SpotubeTrackObject { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_typeName = ::sse_decode(deserializer); - let mut var_id = ::sse_decode(deserializer); - let mut var_name = ::sse_decode(deserializer); - let mut var_externalUri = ::sse_decode(deserializer); - let mut var_artists = - >::sse_decode( - deserializer, - ); - let mut var_album = - ::sse_decode(deserializer); - let mut var_durationMs = ::sse_decode(deserializer); - let mut var_isrc = ::sse_decode(deserializer); - let mut var_explicit = ::sse_decode(deserializer); - return crate::api::plugin::models::track::SpotubeTrackObject { - type_name: var_typeName, - id: var_id, - name: var_name, - external_uri: var_externalUri, - artists: var_artists, - album: var_album, - duration_ms: var_durationMs, - isrc: var_isrc, - explicit: var_explicit, - }; + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::track::SpotubeTrackObject::Full(var_field0); + } + 1 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::track::SpotubeTrackObject::Local(var_field0); + } + _ => { + unimplemented!(""); + } + } } } @@ -5718,13 +5794,6 @@ impl SseDecode for u32 { } } -impl SseDecode for u64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u64::().unwrap() - } -} - impl SseDecode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -5769,40 +5838,40 @@ fn pde_ffi_dispatcher_primary_impl( 38 => wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), 39 => wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl(port, ptr, rust_vec_len, data_len), 40 => wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl(port, ptr, rust_vec_len, data_len), -41 => wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl(port, ptr, rust_vec_len, data_len), -42 => wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl(port, ptr, rust_vec_len, data_len), -43 => wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl(port, ptr, rust_vec_len, data_len), -44 => wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl(port, ptr, rust_vec_len, data_len), -45 => wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl(port, ptr, rust_vec_len, data_len), -46 => wire__crate__api__plugin__models__core__plugin_configuration_slug_impl(port, ptr, rust_vec_len, data_len), -47 => wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl(port, ptr, rust_vec_len, data_len), -48 => wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl(port, ptr, rust_vec_len, data_len), -49 => wire__crate__api__plugin__senders__plugin_core_sender_support_impl(port, ptr, rust_vec_len, data_len), -50 => wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl(port, ptr, rust_vec_len, data_len), -51 => wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl(port, ptr, rust_vec_len, data_len), -52 => wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl(port, ptr, rust_vec_len, data_len), -53 => wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl(port, ptr, rust_vec_len, data_len), -54 => wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl(port, ptr, rust_vec_len, data_len), -55 => wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl(port, ptr, rust_vec_len, data_len), -56 => wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl(port, ptr, rust_vec_len, data_len), -57 => wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -58 => wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl(port, ptr, rust_vec_len, data_len), -59 => wire__crate__api__plugin__senders__plugin_search_sender_albums_impl(port, ptr, rust_vec_len, data_len), -60 => wire__crate__api__plugin__senders__plugin_search_sender_all_impl(port, ptr, rust_vec_len, data_len), -61 => wire__crate__api__plugin__senders__plugin_search_sender_artists_impl(port, ptr, rust_vec_len, data_len), -62 => wire__crate__api__plugin__senders__plugin_search_sender_chips_impl(port, ptr, rust_vec_len, data_len), -63 => wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl(port, ptr, rust_vec_len, data_len), -64 => wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl(port, ptr, rust_vec_len, data_len), -65 => wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl(port, ptr, rust_vec_len, data_len), -66 => wire__crate__api__plugin__senders__plugin_track_sender_radio_impl(port, ptr, rust_vec_len, data_len), -67 => wire__crate__api__plugin__senders__plugin_track_sender_save_impl(port, ptr, rust_vec_len, data_len), -68 => wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -69 => wire__crate__api__plugin__senders__plugin_user_sender_me_impl(port, ptr, rust_vec_len, data_len), -70 => wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl(port, ptr, rust_vec_len, data_len), -71 => wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl(port, ptr, rust_vec_len, data_len), -72 => wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl(port, ptr, rust_vec_len, data_len), -73 => wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl(port, ptr, rust_vec_len, data_len), -75 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl(port, ptr, rust_vec_len, data_len), +41 => wire__crate__api__plugin__senders__plugin_audio_source_sender_supported_presets_impl(port, ptr, rust_vec_len, data_len), +42 => wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl(port, ptr, rust_vec_len, data_len), +43 => wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl(port, ptr, rust_vec_len, data_len), +44 => wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl(port, ptr, rust_vec_len, data_len), +45 => wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl(port, ptr, rust_vec_len, data_len), +46 => wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl(port, ptr, rust_vec_len, data_len), +48 => wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl(port, ptr, rust_vec_len, data_len), +49 => wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl(port, ptr, rust_vec_len, data_len), +50 => wire__crate__api__plugin__senders__plugin_core_sender_support_impl(port, ptr, rust_vec_len, data_len), +51 => wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl(port, ptr, rust_vec_len, data_len), +52 => wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl(port, ptr, rust_vec_len, data_len), +53 => wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl(port, ptr, rust_vec_len, data_len), +54 => wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl(port, ptr, rust_vec_len, data_len), +55 => wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl(port, ptr, rust_vec_len, data_len), +56 => wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl(port, ptr, rust_vec_len, data_len), +57 => wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +58 => wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +59 => wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl(port, ptr, rust_vec_len, data_len), +60 => wire__crate__api__plugin__senders__plugin_search_sender_albums_impl(port, ptr, rust_vec_len, data_len), +61 => wire__crate__api__plugin__senders__plugin_search_sender_all_impl(port, ptr, rust_vec_len, data_len), +62 => wire__crate__api__plugin__senders__plugin_search_sender_artists_impl(port, ptr, rust_vec_len, data_len), +63 => wire__crate__api__plugin__senders__plugin_search_sender_chips_impl(port, ptr, rust_vec_len, data_len), +64 => wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl(port, ptr, rust_vec_len, data_len), +65 => wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +66 => wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl(port, ptr, rust_vec_len, data_len), +67 => wire__crate__api__plugin__senders__plugin_track_sender_radio_impl(port, ptr, rust_vec_len, data_len), +68 => wire__crate__api__plugin__senders__plugin_track_sender_save_impl(port, ptr, rust_vec_len, data_len), +69 => wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +70 => wire__crate__api__plugin__senders__plugin_user_sender_me_impl(port, ptr, rust_vec_len, data_len), +71 => wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl(port, ptr, rust_vec_len, data_len), +72 => wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl(port, ptr, rust_vec_len, data_len), +73 => wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl(port, ptr, rust_vec_len, data_len), +74 => wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl(port, ptr, rust_vec_len, data_len), +76 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -5839,8 +5908,9 @@ fn pde_ffi_dispatcher_sync_impl( 23 => wire__crate__api__plugin__plugin__SpotubePlugin_auto_accessor_set_user_impl(ptr, rust_vec_len, data_len), 25 => wire__crate__api__plugin__plugin__SpotubePlugin_create_context_impl(ptr, rust_vec_len, data_len), 26 => wire__crate__api__plugin__plugin__SpotubePlugin_new_impl(ptr, rust_vec_len, data_len), -74 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl(ptr, rust_vec_len, data_len), -76 => wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl(ptr, rust_vec_len, data_len), +47 => wire__crate__api__plugin__models__core__plugin_configuration_slug_impl(ptr, rust_vec_len, data_len), +75 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl(ptr, rust_vec_len, data_len), +77 => wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl(ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -6608,6 +6678,34 @@ impl } } // Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::track::SpotubeFullTrackObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.album.into_into_dart().into_dart(), + self.duration_ms.into_into_dart().into_dart(), + self.isrc.into_into_dart().into_dart(), + self.explicit.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::track::SpotubeFullTrackObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::track::SpotubeFullTrackObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::track::SpotubeFullTrackObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::image::SpotubeImageObject { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ @@ -6631,6 +6729,33 @@ impl flutter_rust_bridge::IntoIntoDart flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.album.into_into_dart().into_dart(), + self.duration_ms.into_into_dart().into_dart(), + self.path.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::track::SpotubeLocalTrackObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::track::SpotubeLocalTrackObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::track::SpotubeLocalTrackObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { @@ -6841,18 +6966,17 @@ impl // Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::track::SpotubeTrackObject { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.type_name.into_into_dart().into_dart(), - self.id.into_into_dart().into_dart(), - self.name.into_into_dart().into_dart(), - self.external_uri.into_into_dart().into_dart(), - self.artists.into_into_dart().into_dart(), - self.album.into_into_dart().into_dart(), - self.duration_ms.into_into_dart().into_dart(), - self.isrc.into_into_dart().into_dart(), - self.explicit.into_into_dart().into_dart(), - ] - .into_dart() + match self { + crate::api::plugin::models::track::SpotubeTrackObject::Full(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::plugin::models::track::SpotubeTrackObject::Local(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive @@ -7041,13 +7165,6 @@ impl SseEncode for i32 { } } -impl SseEncode for i64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_i64::(self).unwrap(); - } -} - impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7122,6 +7239,18 @@ impl SseEncode } } +impl SseEncode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7168,6 +7297,18 @@ impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7226,16 +7367,6 @@ impl SseEncode for Vec { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); - } - } -} - impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7286,16 +7417,6 @@ impl SseEncode for Option { } } -impl SseEncode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } - } -} - impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7490,7 +7611,7 @@ impl SseEncode for crate::api::plugin::models::core::ScrobbleDetails { serializer, ); ::sse_encode(self.album, serializer); - >::sse_encode(self.timestamp, serializer); + >::sse_encode(self.timestamp, serializer); >::sse_encode(self.duration_ms, serializer); >::sse_encode(self.isrc, serializer); } @@ -7550,7 +7671,7 @@ impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioSourceM ::sse_encode(self.id, serializer); ::sse_encode(self.title, serializer); >::sse_encode(self.artists, serializer); - ::sse_encode(self.duration, serializer); + ::sse_encode(self.duration, serializer); >::sse_encode(self.thumbnail, serializer); ::sse_encode(self.external_uri, serializer); } @@ -7588,7 +7709,7 @@ impl SseEncode for crate::api::plugin::models::browse::SpotubeBrowseSectionObjec impl SseEncode for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self {crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); + match self {crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); } crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistFull(field0) => { ::sse_encode(1, serializer); ::sse_encode(field0, serializer); } @@ -7670,6 +7791,26 @@ impl SseEncode for crate::api::plugin::models::playlist::SpotubeFullPlaylistObje } } +impl SseEncode for crate::api::plugin::models::track::SpotubeFullTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >::sse_encode( + self.artists, + serializer, + ); + ::sse_encode( + self.album, serializer, + ); + ::sse_encode(self.duration_ms, serializer); + ::sse_encode(self.isrc, serializer); + ::sse_encode(self.explicit, serializer); + } +} + impl SseEncode for crate::api::plugin::models::image::SpotubeImageObject { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7680,6 +7821,25 @@ impl SseEncode for crate::api::plugin::models::image::SpotubeImageObject { } } +impl SseEncode for crate::api::plugin::models::track::SpotubeLocalTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >::sse_encode( + self.artists, + serializer, + ); + ::sse_encode( + self.album, serializer, + ); + ::sse_encode(self.duration_ms, serializer); + ::sse_encode(self.path, serializer); + } +} + impl SseEncode for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7712,7 +7872,7 @@ impl SseEncode for crate::api::plugin::models::pagination::SpotubePaginationResp impl SseEncode for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self {crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); + match self {crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); } crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistFull(field0) => { ::sse_encode(1, serializer); ::sse_encode(field0, serializer); } @@ -7748,7 +7908,7 @@ impl SseEncode for crate::api::plugin::models::search::SpotubeSearchResponseObje self.playlists, serializer, ); - >::sse_encode( + >::sse_encode( self.tracks, serializer, ); @@ -7811,20 +7971,23 @@ impl SseEncode for crate::api::plugin::models::playlist::SpotubeSimplePlaylistOb impl SseEncode for crate::api::plugin::models::track::SpotubeTrackObject { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.type_name, serializer); - ::sse_encode(self.id, serializer); - ::sse_encode(self.name, serializer); - ::sse_encode(self.external_uri, serializer); - >::sse_encode( - self.artists, - serializer, - ); - ::sse_encode( - self.album, serializer, - ); - ::sse_encode(self.duration_ms, serializer); - ::sse_encode(self.isrc, serializer); - ::sse_encode(self.explicit, serializer); + match self { + crate::api::plugin::models::track::SpotubeTrackObject::Full(field0) => { + ::sse_encode(0, serializer); + ::sse_encode( + field0, serializer, + ); + } + crate::api::plugin::models::track::SpotubeTrackObject::Local(field0) => { + ::sse_encode(1, serializer); + ::sse_encode( + field0, serializer, + ); + } + _ => { + unimplemented!(""); + } + } } } @@ -7849,13 +8012,6 @@ impl SseEncode for u32 { } } -impl SseEncode for u64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u64::(self).unwrap(); - } -} - impl SseEncode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { diff --git a/rust/src/internal/audio_source.rs b/rust/src/internal/audio_source.rs index 43ccf2cc..1eedbd7d 100644 --- a/rust/src/internal/audio_source.rs +++ b/rust/src/internal/audio_source.rs @@ -2,7 +2,7 @@ use crate::api::plugin::models::audio_source::{ SpotubeAudioSourceContainerPreset, SpotubeAudioSourceMatchObject, SpotubeAudioSourceStreamObject, }; -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; use crate::internal::utils::{js_invoke_async_method_to_json, js_invoke_method_to_json}; use flutter_rust_bridge::frb; use rquickjs::{async_with, AsyncContext}; @@ -35,7 +35,7 @@ impl<'a> PluginAudioSourceEndpoint<'a> { pub async fn matches( &self, - track: SpotubeTrackObject, + track: SpotubeFullTrackObject, ) -> anyhow::Result> { async_with!(self.0 => |ctx| { Ok( diff --git a/rust/src/internal/track.rs b/rust/src/internal/track.rs index 611fc114..d8f10a95 100644 --- a/rust/src/internal/track.rs +++ b/rust/src/internal/track.rs @@ -1,4 +1,4 @@ -use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::track::SpotubeFullTrackObject; use crate::internal::utils::js_invoke_async_method_to_json; use flutter_rust_bridge::frb; use rquickjs::{async_with, AsyncContext}; @@ -12,7 +12,7 @@ impl<'a> PluginTrackEndpoint<'a> { PluginTrackEndpoint(context) } - pub async fn get_track(&self, id: String) -> anyhow::Result { + pub async fn get_track(&self, id: String) -> anyhow::Result { async_with!(self.0 => |ctx| { Ok( js_invoke_async_method_to_json( @@ -60,10 +60,10 @@ impl<'a> PluginTrackEndpoint<'a> { }).await } - pub async fn radio(&self, id: String) -> anyhow::Result> { + pub async fn radio(&self, id: String) -> anyhow::Result> { async_with!(self.0 => |ctx| { Ok( - js_invoke_async_method_to_json::<_, Vec>( + js_invoke_async_method_to_json::<_, Vec>( ctx.clone(), "track", "radio", diff --git a/website/src/content/docs/developing-plugins/implementing-endpoints.mdx b/website/src/content/docs/developing-plugins/implementing-endpoints.mdx index 2c75c037..11fb6c23 100644 --- a/website/src/content/docs/developing-plugins/implementing-endpoints.mdx +++ b/website/src/content/docs/developing-plugins/implementing-endpoints.mdx @@ -123,7 +123,7 @@ These methods are pretty self-explanatory. You need to implement them to fetch u | Method | Description | Returns | | ------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | | `me()` | Fetches the current user's information. | [`SpotubeUserObject`][SpotubeUserObject] | -| `savedTracks()` | Fetches the user's saved tracks with pagination support. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | +| `savedTracks()` | Fetches the user's saved tracks with pagination support. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeTrackObject`][SpotubeTrackObject] | | `savedPlaylists()` | Fetches the user's saved playlists with pagination support. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | | `savedAlbums()` | Fetches the user's saved albums with pagination support. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject] | | `savedArtists()` | Fetches the user's saved artists with pagination support. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullArtistObject`][SpotubeFullArtistObject] | @@ -165,12 +165,12 @@ class TrackEndpoint { } ``` -| Method | Description | Returns | -| ------------ | ------------------------------------------------------------------------------------ | -------------------------------------------------------- | -| `getTrack()` | Fetches track information by ID. | [SpotubeFullTrackObject][SpotubeFullTrackObject] | -| `save()` | Saves the specified tracks. Accepts a list of track IDs. | void | -| `unsave()` | Removes the specified tracks from saved tracks. Accepts a list of track IDs. | void | -| `radio()` | Fetches related tracks based on specified tracks. Try to return a List of 50 tracks. | [List\][SpotubeFullTrackObject] | +| Method | Description | Returns | +| ------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------ | +| `getTrack()` | Fetches track information by ID. | [SpotubeTrackObject][SpotubeTrackObject] | +| `save()` | Saves the specified tracks. Accepts a list of track IDs. | void | +| `unsave()` | Removes the specified tracks from saved tracks. Accepts a list of track IDs. | void | +| `radio()` | Fetches related tracks based on specified tracks. Try to return a List of 50 tracks. | [List\][SpotubeTrackObject] | {/* Urls */} @@ -208,7 +208,7 @@ class AlbumEndpoint { | Method | Description | Returns | | ------------ | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | `getAlbum()` | Fetches album information by ID. | [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject] | -| `tracks()` | Fetches tracks of the specified album. Accepts an ID and optional pagination parameters. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | +| `tracks()` | Fetches tracks of the specified album. Accepts an ID and optional pagination parameters. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeTrackObject`][SpotubeTrackObject] | | `releases()` | Fetches new album releases user followed artists or globally | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject] | | `save()` | Saves the specified albums. Accepts a list of album IDs. | `void` | | `unsave()` | Removes the specified albums from saved albums. Accepts a list of album IDs. | `void` | @@ -254,7 +254,7 @@ class ArtistEndpoint { | ------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | `getArtist()` | Fetches artist information by ID. | [`SpotubeFullArtistObject`][SpotubeFullArtistObject] | | `related()` | Fetches related artists based on the specified artist ID. Accepts optional pagination. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullArtistObject`][SpotubeFullArtistObject] | -| `topTracks()` | Fetches top tracks of the specified artist. Accepts optional pagination. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | +| `topTracks()` | Fetches top tracks of the specified artist. Accepts optional pagination. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeTrackObject`][SpotubeTrackObject] | | `albums()` | Fetches albums of the specified artist. Accepts optional pagination. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject] | | `save()` | Saves the specified artists. Accepts a list of artist IDs. | `void` | | `unsave()` | Removes the specified artists from saved artists. Accepts a list of artist IDs. | `void` | @@ -319,17 +319,17 @@ class PlaylistEndpoint { } ``` -| Method | Description | Returns | -| ---------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `getPlaylist` | Fetches a playlist by its ID. | [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | -| `tracks` | Fetches tracks in a playlist. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | -| `create` | Creates a new playlist and returns | [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | -| `update` | Updates an existing playlist. | `void` | -| `deletePlaylist` | Deletes a playlist. | `void` | -| `addTracks` | Adds tracks to a playlist. | `void` | -| `removeTracks` | Removes tracks from a playlist. | `void` | -| `save` | Saves a playlist to the user's library. | `void` | -| `unsave` | Removes a playlist from the user's library. | `void` | +| Method | Description | Returns | +| ---------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `getPlaylist` | Fetches a playlist by its ID. | [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | +| `tracks` | Fetches tracks in a playlist. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeTrackObject`][SpotubeTrackObject] | +| `create` | Creates a new playlist and returns | [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | +| `update` | Updates an existing playlist. | `void` | +| `deletePlaylist` | Deletes a playlist. | `void` | +| `addTracks` | Adds tracks to a playlist. | `void` | +| `removeTracks` | Removes tracks from a playlist. | `void` | +| `save` | Saves a playlist to the user's library. | `void` | +| `unsave` | Removes a playlist from the user's library. | `void` | ## SearchEndpoint @@ -375,7 +375,7 @@ class SearchEndpoint { | `all()` | Searches for all types of content. | [`SpotubeSearchResponseObject`][SpotubeSearchResponseObject] | | `albums()` | Searches only for albums. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullAlbumObject`][SpotubeFullAlbumObject] | | `artists()` | Searches only for artists. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullArtistObject`][SpotubeFullArtistObject] | -| `tracks()` | Searches only for tracks. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | +| `tracks()` | Searches only for tracks. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeTrackObject`][SpotubeTrackObject] | | `playlists()` | Searches only for playlists. | [`SpotubePaginationResponseObject`][SpotubePaginationResponseObject] of [`SpotubeFullPlaylistObject`][SpotubeFullPlaylistObject] | ## BrowseEndpoint @@ -487,7 +487,7 @@ class CorePlugin { [SpotubePaginationResponseObject]: /docs/reference/models#pagination-response [SpotubeFullAlbumObject]: /docs/reference/models#spotubefullalbumobject [SpotubeFullArtistObject]: /docs/reference/models#spotubefullartistobject -[SpotubeFullTrackObject]: /docs/reference/models#track +[SpotubeTrackObject]: /docs/reference/models#track [SpotubeFullPlaylistObject]: /docs/reference/models#spotubefullplaylistobject [SpotubeSearchResponseObject]: /docs/reference/models#search-response [SpotubeBrowseSectionObject]: /docs/reference/models#browse-section diff --git a/website/src/content/docs/reference/models.mdx b/website/src/content/docs/reference/models.mdx index 8e29bb6c..841249a4 100644 --- a/website/src/content/docs/reference/models.mdx +++ b/website/src/content/docs/reference/models.mdx @@ -88,7 +88,7 @@ Following is the structure of the `SpotubeFullAlbumObject`: ## Track -Following is the structure of the `SpotubeFullTrackObject`: +Following is the structure of the `SpotubeTrackObject`: | Property | Type | | ---------------------------- | ---------------------------------------------------------------- | @@ -144,7 +144,7 @@ Following is the structure of the `SpotubeSearchResponseObject`: | albums | List of [`SpotubeSimpleAlbumObject`][SpotubeSimpleAlbumObject] | | artists | List of [`SpotubeFullArtistObject`][SpotubeFullArtistObject] | | playlists | List of [`SpotubeSimplePlaylistObject`][SpotubeSimplePlaylistObject] | -| tracks | List of [`SpotubeFullTrackObject`][SpotubeFullTrackObject] | +| tracks | List of [`SpotubeTrackObject`][SpotubeTrackObject] | ## Browse Section @@ -185,6 +185,6 @@ This is the structure of `SpotubePaginationResponseObject`: [SpotubeUserObject]: /docs/reference/models#user [SpotubeFullArtistObject]: /docs/reference/models#spotubefullartistobject [SpotubeSimplePlaylistObject]: /docs/reference/models#spotubesimpleplaylistobject -[SpotubeFullTrackObject]: /docs/reference/models#track +[SpotubeTrackObject]: /docs/reference/models#track [SpotubeFullPlaylistObject]: /docs/reference/models#spotubefullplaylistobject [SpotubeFullAlbumObject]: /docs/reference/models#spotubefullalbumobject diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 2441d2e2..47dd3a8a 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -41,8 +40,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FlutterNewPipeExtractorPluginCApi")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); - FlutterTimezonePluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FlutterTimezonePluginCApi")); LocalNotifierPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("LocalNotifierPlugin")); MediaKitLibsWindowsAudioPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index f8e9414d..6b8fc80d 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -11,7 +11,6 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_inappwebview_windows flutter_new_pipe_extractor flutter_secure_storage_windows - flutter_timezone local_notifier media_kit_libs_windows_audio permission_handler_windows