diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart index 543bc471..eebedf48 100644 --- a/lib/collections/routes.dart +++ b/lib/collections/routes.dart @@ -231,5 +231,9 @@ class AppRouter extends RootStackRouter { page: LastFMLoginRoute.page, // parentNavigatorKey: rootNavigatorKey, ), + AutoRoute( + path: "/webview", + page: WebviewRoute.page, + ), ]; } diff --git a/lib/collections/routes.gr.dart b/lib/collections/routes.gr.dart index 1d608896..93b332b3 100644 --- a/lib/collections/routes.gr.dart +++ b/lib/collections/routes.gr.dart @@ -8,11 +8,12 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:auto_route/auto_route.dart' as _i43; -import 'package:flutter/material.dart' as _i44; -import 'package:shadcn_flutter/shadcn_flutter.dart' as _i46; -import 'package:spotify/spotify.dart' as _i45; -import 'package:spotube/models/spotify/recommendation_seeds.dart' as _i47; +import 'package:auto_route/auto_route.dart' as _i44; +import 'package:flutter/material.dart' as _i45; +import 'package:flutter_inappwebview/flutter_inappwebview.dart' as _i50; +import 'package:shadcn_flutter/shadcn_flutter.dart' as _i47; +import 'package:spotify/spotify.dart' as _i46; +import 'package:spotube/models/spotify/recommendation_seeds.dart' as _i48; import 'package:spotube/pages/album/album.dart' as _i2; import 'package:spotube/pages/artist/artist.dart' as _i3; import 'package:spotube/pages/connect/connect.dart' as _i6; @@ -59,11 +60,13 @@ import 'package:spotube/pages/stats/playlists/playlists.dart' as _i33; import 'package:spotube/pages/stats/stats.dart' as _i32; import 'package:spotube/pages/stats/streams/streams.dart' as _i35; import 'package:spotube/pages/track/track.dart' as _i36; +import 'package:spotube/pages/webview/webview.dart' as _i43; +import 'package:spotube/services/metadata/apis/webview.dart' as _i49; /// generated route for /// [_i1.AboutSpotubePage] -class AboutSpotubeRoute extends _i43.PageRouteInfo { - const AboutSpotubeRoute({List<_i43.PageRouteInfo>? children}) +class AboutSpotubeRoute extends _i44.PageRouteInfo { + const AboutSpotubeRoute({List<_i44.PageRouteInfo>? children}) : super( AboutSpotubeRoute.name, initialChildren: children, @@ -71,7 +74,7 @@ class AboutSpotubeRoute extends _i43.PageRouteInfo { static const String name = 'AboutSpotubeRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i1.AboutSpotubePage(); @@ -81,12 +84,12 @@ class AboutSpotubeRoute extends _i43.PageRouteInfo { /// generated route for /// [_i2.AlbumPage] -class AlbumRoute extends _i43.PageRouteInfo { +class AlbumRoute extends _i44.PageRouteInfo { AlbumRoute({ - _i44.Key? key, + _i45.Key? key, required String id, - required _i45.AlbumSimple album, - List<_i43.PageRouteInfo>? children, + required _i46.AlbumSimple album, + List<_i44.PageRouteInfo>? children, }) : super( AlbumRoute.name, args: AlbumRouteArgs( @@ -100,7 +103,7 @@ class AlbumRoute extends _i43.PageRouteInfo { static const String name = 'AlbumRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -120,11 +123,11 @@ class AlbumRouteArgs { required this.album, }); - final _i44.Key? key; + final _i45.Key? key; final String id; - final _i45.AlbumSimple album; + final _i46.AlbumSimple album; @override String toString() { @@ -134,11 +137,11 @@ class AlbumRouteArgs { /// generated route for /// [_i3.ArtistPage] -class ArtistRoute extends _i43.PageRouteInfo { +class ArtistRoute extends _i44.PageRouteInfo { ArtistRoute({ required String artistId, - _i44.Key? key, - List<_i43.PageRouteInfo>? children, + _i45.Key? key, + List<_i44.PageRouteInfo>? children, }) : super( ArtistRoute.name, args: ArtistRouteArgs( @@ -151,7 +154,7 @@ class ArtistRoute extends _i43.PageRouteInfo { static const String name = 'ArtistRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -173,7 +176,7 @@ class ArtistRouteArgs { final String artistId; - final _i44.Key? key; + final _i45.Key? key; @override String toString() { @@ -183,8 +186,8 @@ class ArtistRouteArgs { /// generated route for /// [_i4.BlackListPage] -class BlackListRoute extends _i43.PageRouteInfo { - const BlackListRoute({List<_i43.PageRouteInfo>? children}) +class BlackListRoute extends _i44.PageRouteInfo { + const BlackListRoute({List<_i44.PageRouteInfo>? children}) : super( BlackListRoute.name, initialChildren: children, @@ -192,7 +195,7 @@ class BlackListRoute extends _i43.PageRouteInfo { static const String name = 'BlackListRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i4.BlackListPage(); @@ -202,8 +205,8 @@ class BlackListRoute extends _i43.PageRouteInfo { /// generated route for /// [_i5.ConnectControlPage] -class ConnectControlRoute extends _i43.PageRouteInfo { - const ConnectControlRoute({List<_i43.PageRouteInfo>? children}) +class ConnectControlRoute extends _i44.PageRouteInfo { + const ConnectControlRoute({List<_i44.PageRouteInfo>? children}) : super( ConnectControlRoute.name, initialChildren: children, @@ -211,7 +214,7 @@ class ConnectControlRoute extends _i43.PageRouteInfo { static const String name = 'ConnectControlRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i5.ConnectControlPage(); @@ -221,8 +224,8 @@ class ConnectControlRoute extends _i43.PageRouteInfo { /// generated route for /// [_i6.ConnectPage] -class ConnectRoute extends _i43.PageRouteInfo { - const ConnectRoute({List<_i43.PageRouteInfo>? children}) +class ConnectRoute extends _i44.PageRouteInfo { + const ConnectRoute({List<_i44.PageRouteInfo>? children}) : super( ConnectRoute.name, initialChildren: children, @@ -230,7 +233,7 @@ class ConnectRoute extends _i43.PageRouteInfo { static const String name = 'ConnectRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i6.ConnectPage(); @@ -240,8 +243,8 @@ class ConnectRoute extends _i43.PageRouteInfo { /// generated route for /// [_i7.GenrePage] -class GenreRoute extends _i43.PageRouteInfo { - const GenreRoute({List<_i43.PageRouteInfo>? children}) +class GenreRoute extends _i44.PageRouteInfo { + const GenreRoute({List<_i44.PageRouteInfo>? children}) : super( GenreRoute.name, initialChildren: children, @@ -249,7 +252,7 @@ class GenreRoute extends _i43.PageRouteInfo { static const String name = 'GenreRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i7.GenrePage(); @@ -259,12 +262,12 @@ class GenreRoute extends _i43.PageRouteInfo { /// generated route for /// [_i8.GenrePlaylistsPage] -class GenrePlaylistsRoute extends _i43.PageRouteInfo { +class GenrePlaylistsRoute extends _i44.PageRouteInfo { GenrePlaylistsRoute({ - _i44.Key? key, + _i45.Key? key, required String id, - required _i45.Category category, - List<_i43.PageRouteInfo>? children, + required _i46.Category category, + List<_i44.PageRouteInfo>? children, }) : super( GenrePlaylistsRoute.name, args: GenrePlaylistsRouteArgs( @@ -278,7 +281,7 @@ class GenrePlaylistsRoute extends _i43.PageRouteInfo { static const String name = 'GenrePlaylistsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -298,11 +301,11 @@ class GenrePlaylistsRouteArgs { required this.category, }); - final _i44.Key? key; + final _i45.Key? key; final String id; - final _i45.Category category; + final _i46.Category category; @override String toString() { @@ -312,8 +315,8 @@ class GenrePlaylistsRouteArgs { /// generated route for /// [_i9.GettingStartedPage] -class GettingStartedRoute extends _i43.PageRouteInfo { - const GettingStartedRoute({List<_i43.PageRouteInfo>? children}) +class GettingStartedRoute extends _i44.PageRouteInfo { + const GettingStartedRoute({List<_i44.PageRouteInfo>? children}) : super( GettingStartedRoute.name, initialChildren: children, @@ -321,7 +324,7 @@ class GettingStartedRoute extends _i43.PageRouteInfo { static const String name = 'GettingStartedRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i9.GettingStartedPage(); @@ -332,11 +335,11 @@ class GettingStartedRoute extends _i43.PageRouteInfo { /// generated route for /// [_i10.HomeFeedSectionPage] class HomeFeedSectionRoute - extends _i43.PageRouteInfo { + extends _i44.PageRouteInfo { HomeFeedSectionRoute({ - _i46.Key? key, + _i47.Key? key, required String sectionUri, - List<_i43.PageRouteInfo>? children, + List<_i44.PageRouteInfo>? children, }) : super( HomeFeedSectionRoute.name, args: HomeFeedSectionRouteArgs( @@ -349,7 +352,7 @@ class HomeFeedSectionRoute static const String name = 'HomeFeedSectionRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -370,7 +373,7 @@ class HomeFeedSectionRouteArgs { required this.sectionUri, }); - final _i46.Key? key; + final _i47.Key? key; final String sectionUri; @@ -382,8 +385,8 @@ class HomeFeedSectionRouteArgs { /// generated route for /// [_i11.HomePage] -class HomeRoute extends _i43.PageRouteInfo { - const HomeRoute({List<_i43.PageRouteInfo>? children}) +class HomeRoute extends _i44.PageRouteInfo { + const HomeRoute({List<_i44.PageRouteInfo>? children}) : super( HomeRoute.name, initialChildren: children, @@ -391,7 +394,7 @@ class HomeRoute extends _i43.PageRouteInfo { static const String name = 'HomeRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i11.HomePage(); @@ -401,8 +404,8 @@ class HomeRoute extends _i43.PageRouteInfo { /// generated route for /// [_i12.LastFMLoginPage] -class LastFMLoginRoute extends _i43.PageRouteInfo { - const LastFMLoginRoute({List<_i43.PageRouteInfo>? children}) +class LastFMLoginRoute extends _i44.PageRouteInfo { + const LastFMLoginRoute({List<_i44.PageRouteInfo>? children}) : super( LastFMLoginRoute.name, initialChildren: children, @@ -410,7 +413,7 @@ class LastFMLoginRoute extends _i43.PageRouteInfo { static const String name = 'LastFMLoginRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i12.LastFMLoginPage(); @@ -420,8 +423,8 @@ class LastFMLoginRoute extends _i43.PageRouteInfo { /// generated route for /// [_i13.LibraryPage] -class LibraryRoute extends _i43.PageRouteInfo { - const LibraryRoute({List<_i43.PageRouteInfo>? children}) +class LibraryRoute extends _i44.PageRouteInfo { + const LibraryRoute({List<_i44.PageRouteInfo>? children}) : super( LibraryRoute.name, initialChildren: children, @@ -429,7 +432,7 @@ class LibraryRoute extends _i43.PageRouteInfo { static const String name = 'LibraryRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i13.LibraryPage(); @@ -439,11 +442,11 @@ class LibraryRoute extends _i43.PageRouteInfo { /// generated route for /// [_i14.LikedPlaylistPage] -class LikedPlaylistRoute extends _i43.PageRouteInfo { +class LikedPlaylistRoute extends _i44.PageRouteInfo { LikedPlaylistRoute({ - _i44.Key? key, - required _i45.PlaylistSimple playlist, - List<_i43.PageRouteInfo>? children, + _i45.Key? key, + required _i46.PlaylistSimple playlist, + List<_i44.PageRouteInfo>? children, }) : super( LikedPlaylistRoute.name, args: LikedPlaylistRouteArgs( @@ -455,7 +458,7 @@ class LikedPlaylistRoute extends _i43.PageRouteInfo { static const String name = 'LikedPlaylistRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -473,9 +476,9 @@ class LikedPlaylistRouteArgs { required this.playlist, }); - final _i44.Key? key; + final _i45.Key? key; - final _i45.PlaylistSimple playlist; + final _i46.PlaylistSimple playlist; @override String toString() { @@ -485,13 +488,13 @@ class LikedPlaylistRouteArgs { /// generated route for /// [_i15.LocalLibraryPage] -class LocalLibraryRoute extends _i43.PageRouteInfo { +class LocalLibraryRoute extends _i44.PageRouteInfo { LocalLibraryRoute({ required String location, - _i44.Key? key, + _i45.Key? key, bool isDownloads = false, bool isCache = false, - List<_i43.PageRouteInfo>? children, + List<_i44.PageRouteInfo>? children, }) : super( LocalLibraryRoute.name, args: LocalLibraryRouteArgs( @@ -505,7 +508,7 @@ class LocalLibraryRoute extends _i43.PageRouteInfo { static const String name = 'LocalLibraryRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -529,7 +532,7 @@ class LocalLibraryRouteArgs { final String location; - final _i44.Key? key; + final _i45.Key? key; final bool isDownloads; @@ -543,8 +546,8 @@ class LocalLibraryRouteArgs { /// generated route for /// [_i16.LogsPage] -class LogsRoute extends _i43.PageRouteInfo { - const LogsRoute({List<_i43.PageRouteInfo>? children}) +class LogsRoute extends _i44.PageRouteInfo { + const LogsRoute({List<_i44.PageRouteInfo>? children}) : super( LogsRoute.name, initialChildren: children, @@ -552,7 +555,7 @@ class LogsRoute extends _i43.PageRouteInfo { static const String name = 'LogsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i16.LogsPage(); @@ -562,8 +565,8 @@ class LogsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i17.LyricsPage] -class LyricsRoute extends _i43.PageRouteInfo { - const LyricsRoute({List<_i43.PageRouteInfo>? children}) +class LyricsRoute extends _i44.PageRouteInfo { + const LyricsRoute({List<_i44.PageRouteInfo>? children}) : super( LyricsRoute.name, initialChildren: children, @@ -571,7 +574,7 @@ class LyricsRoute extends _i43.PageRouteInfo { static const String name = 'LyricsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i17.LyricsPage(); @@ -581,11 +584,11 @@ class LyricsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i18.MiniLyricsPage] -class MiniLyricsRoute extends _i43.PageRouteInfo { +class MiniLyricsRoute extends _i44.PageRouteInfo { MiniLyricsRoute({ - _i46.Key? key, - required _i46.Size prevSize, - List<_i43.PageRouteInfo>? children, + _i47.Key? key, + required _i47.Size prevSize, + List<_i44.PageRouteInfo>? children, }) : super( MiniLyricsRoute.name, args: MiniLyricsRouteArgs( @@ -597,7 +600,7 @@ class MiniLyricsRoute extends _i43.PageRouteInfo { static const String name = 'MiniLyricsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -615,9 +618,9 @@ class MiniLyricsRouteArgs { required this.prevSize, }); - final _i46.Key? key; + final _i47.Key? key; - final _i46.Size prevSize; + final _i47.Size prevSize; @override String toString() { @@ -627,8 +630,8 @@ class MiniLyricsRouteArgs { /// generated route for /// [_i19.PlayerLyricsPage] -class PlayerLyricsRoute extends _i43.PageRouteInfo { - const PlayerLyricsRoute({List<_i43.PageRouteInfo>? children}) +class PlayerLyricsRoute extends _i44.PageRouteInfo { + const PlayerLyricsRoute({List<_i44.PageRouteInfo>? children}) : super( PlayerLyricsRoute.name, initialChildren: children, @@ -636,7 +639,7 @@ class PlayerLyricsRoute extends _i43.PageRouteInfo { static const String name = 'PlayerLyricsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i19.PlayerLyricsPage(); @@ -646,8 +649,8 @@ class PlayerLyricsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i20.PlayerQueuePage] -class PlayerQueueRoute extends _i43.PageRouteInfo { - const PlayerQueueRoute({List<_i43.PageRouteInfo>? children}) +class PlayerQueueRoute extends _i44.PageRouteInfo { + const PlayerQueueRoute({List<_i44.PageRouteInfo>? children}) : super( PlayerQueueRoute.name, initialChildren: children, @@ -655,7 +658,7 @@ class PlayerQueueRoute extends _i43.PageRouteInfo { static const String name = 'PlayerQueueRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i20.PlayerQueuePage(); @@ -665,8 +668,8 @@ class PlayerQueueRoute extends _i43.PageRouteInfo { /// generated route for /// [_i21.PlayerTrackSourcesPage] -class PlayerTrackSourcesRoute extends _i43.PageRouteInfo { - const PlayerTrackSourcesRoute({List<_i43.PageRouteInfo>? children}) +class PlayerTrackSourcesRoute extends _i44.PageRouteInfo { + const PlayerTrackSourcesRoute({List<_i44.PageRouteInfo>? children}) : super( PlayerTrackSourcesRoute.name, initialChildren: children, @@ -674,7 +677,7 @@ class PlayerTrackSourcesRoute extends _i43.PageRouteInfo { static const String name = 'PlayerTrackSourcesRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i21.PlayerTrackSourcesPage(); @@ -685,11 +688,11 @@ class PlayerTrackSourcesRoute extends _i43.PageRouteInfo { /// generated route for /// [_i22.PlaylistGenerateResultPage] class PlaylistGenerateResultRoute - extends _i43.PageRouteInfo { + extends _i44.PageRouteInfo { PlaylistGenerateResultRoute({ - _i46.Key? key, - required _i47.GeneratePlaylistProviderInput state, - List<_i43.PageRouteInfo>? children, + _i47.Key? key, + required _i48.GeneratePlaylistProviderInput state, + List<_i44.PageRouteInfo>? children, }) : super( PlaylistGenerateResultRoute.name, args: PlaylistGenerateResultRouteArgs( @@ -701,7 +704,7 @@ class PlaylistGenerateResultRoute static const String name = 'PlaylistGenerateResultRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -719,9 +722,9 @@ class PlaylistGenerateResultRouteArgs { required this.state, }); - final _i46.Key? key; + final _i47.Key? key; - final _i47.GeneratePlaylistProviderInput state; + final _i48.GeneratePlaylistProviderInput state; @override String toString() { @@ -731,8 +734,8 @@ class PlaylistGenerateResultRouteArgs { /// generated route for /// [_i23.PlaylistGeneratorPage] -class PlaylistGeneratorRoute extends _i43.PageRouteInfo { - const PlaylistGeneratorRoute({List<_i43.PageRouteInfo>? children}) +class PlaylistGeneratorRoute extends _i44.PageRouteInfo { + const PlaylistGeneratorRoute({List<_i44.PageRouteInfo>? children}) : super( PlaylistGeneratorRoute.name, initialChildren: children, @@ -740,7 +743,7 @@ class PlaylistGeneratorRoute extends _i43.PageRouteInfo { static const String name = 'PlaylistGeneratorRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i23.PlaylistGeneratorPage(); @@ -750,12 +753,12 @@ class PlaylistGeneratorRoute extends _i43.PageRouteInfo { /// generated route for /// [_i24.PlaylistPage] -class PlaylistRoute extends _i43.PageRouteInfo { +class PlaylistRoute extends _i44.PageRouteInfo { PlaylistRoute({ - _i44.Key? key, + _i45.Key? key, required String id, - required _i45.PlaylistSimple playlist, - List<_i43.PageRouteInfo>? children, + required _i46.PlaylistSimple playlist, + List<_i44.PageRouteInfo>? children, }) : super( PlaylistRoute.name, args: PlaylistRouteArgs( @@ -769,7 +772,7 @@ class PlaylistRoute extends _i43.PageRouteInfo { static const String name = 'PlaylistRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -789,11 +792,11 @@ class PlaylistRouteArgs { required this.playlist, }); - final _i44.Key? key; + final _i45.Key? key; final String id; - final _i45.PlaylistSimple playlist; + final _i46.PlaylistSimple playlist; @override String toString() { @@ -803,8 +806,8 @@ class PlaylistRouteArgs { /// generated route for /// [_i25.ProfilePage] -class ProfileRoute extends _i43.PageRouteInfo { - const ProfileRoute({List<_i43.PageRouteInfo>? children}) +class ProfileRoute extends _i44.PageRouteInfo { + const ProfileRoute({List<_i44.PageRouteInfo>? children}) : super( ProfileRoute.name, initialChildren: children, @@ -812,7 +815,7 @@ class ProfileRoute extends _i43.PageRouteInfo { static const String name = 'ProfileRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i25.ProfilePage(); @@ -822,8 +825,8 @@ class ProfileRoute extends _i43.PageRouteInfo { /// generated route for /// [_i26.RootAppPage] -class RootAppRoute extends _i43.PageRouteInfo { - const RootAppRoute({List<_i43.PageRouteInfo>? children}) +class RootAppRoute extends _i44.PageRouteInfo { + const RootAppRoute({List<_i44.PageRouteInfo>? children}) : super( RootAppRoute.name, initialChildren: children, @@ -831,7 +834,7 @@ class RootAppRoute extends _i43.PageRouteInfo { static const String name = 'RootAppRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i26.RootAppPage(); @@ -841,8 +844,8 @@ class RootAppRoute extends _i43.PageRouteInfo { /// generated route for /// [_i27.SearchPage] -class SearchRoute extends _i43.PageRouteInfo { - const SearchRoute({List<_i43.PageRouteInfo>? children}) +class SearchRoute extends _i44.PageRouteInfo { + const SearchRoute({List<_i44.PageRouteInfo>? children}) : super( SearchRoute.name, initialChildren: children, @@ -850,7 +853,7 @@ class SearchRoute extends _i43.PageRouteInfo { static const String name = 'SearchRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i27.SearchPage(); @@ -860,8 +863,8 @@ class SearchRoute extends _i43.PageRouteInfo { /// generated route for /// [_i28.SettingsPage] -class SettingsRoute extends _i43.PageRouteInfo { - const SettingsRoute({List<_i43.PageRouteInfo>? children}) +class SettingsRoute extends _i44.PageRouteInfo { + const SettingsRoute({List<_i44.PageRouteInfo>? children}) : super( SettingsRoute.name, initialChildren: children, @@ -869,7 +872,7 @@ class SettingsRoute extends _i43.PageRouteInfo { static const String name = 'SettingsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i28.SettingsPage(); @@ -879,8 +882,8 @@ class SettingsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i29.StatsAlbumsPage] -class StatsAlbumsRoute extends _i43.PageRouteInfo { - const StatsAlbumsRoute({List<_i43.PageRouteInfo>? children}) +class StatsAlbumsRoute extends _i44.PageRouteInfo { + const StatsAlbumsRoute({List<_i44.PageRouteInfo>? children}) : super( StatsAlbumsRoute.name, initialChildren: children, @@ -888,7 +891,7 @@ class StatsAlbumsRoute extends _i43.PageRouteInfo { static const String name = 'StatsAlbumsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i29.StatsAlbumsPage(); @@ -898,8 +901,8 @@ class StatsAlbumsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i30.StatsArtistsPage] -class StatsArtistsRoute extends _i43.PageRouteInfo { - const StatsArtistsRoute({List<_i43.PageRouteInfo>? children}) +class StatsArtistsRoute extends _i44.PageRouteInfo { + const StatsArtistsRoute({List<_i44.PageRouteInfo>? children}) : super( StatsArtistsRoute.name, initialChildren: children, @@ -907,7 +910,7 @@ class StatsArtistsRoute extends _i43.PageRouteInfo { static const String name = 'StatsArtistsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i30.StatsArtistsPage(); @@ -917,8 +920,8 @@ class StatsArtistsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i31.StatsMinutesPage] -class StatsMinutesRoute extends _i43.PageRouteInfo { - const StatsMinutesRoute({List<_i43.PageRouteInfo>? children}) +class StatsMinutesRoute extends _i44.PageRouteInfo { + const StatsMinutesRoute({List<_i44.PageRouteInfo>? children}) : super( StatsMinutesRoute.name, initialChildren: children, @@ -926,7 +929,7 @@ class StatsMinutesRoute extends _i43.PageRouteInfo { static const String name = 'StatsMinutesRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i31.StatsMinutesPage(); @@ -936,8 +939,8 @@ class StatsMinutesRoute extends _i43.PageRouteInfo { /// generated route for /// [_i32.StatsPage] -class StatsRoute extends _i43.PageRouteInfo { - const StatsRoute({List<_i43.PageRouteInfo>? children}) +class StatsRoute extends _i44.PageRouteInfo { + const StatsRoute({List<_i44.PageRouteInfo>? children}) : super( StatsRoute.name, initialChildren: children, @@ -945,7 +948,7 @@ class StatsRoute extends _i43.PageRouteInfo { static const String name = 'StatsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i32.StatsPage(); @@ -955,8 +958,8 @@ class StatsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i33.StatsPlaylistsPage] -class StatsPlaylistsRoute extends _i43.PageRouteInfo { - const StatsPlaylistsRoute({List<_i43.PageRouteInfo>? children}) +class StatsPlaylistsRoute extends _i44.PageRouteInfo { + const StatsPlaylistsRoute({List<_i44.PageRouteInfo>? children}) : super( StatsPlaylistsRoute.name, initialChildren: children, @@ -964,7 +967,7 @@ class StatsPlaylistsRoute extends _i43.PageRouteInfo { static const String name = 'StatsPlaylistsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i33.StatsPlaylistsPage(); @@ -974,8 +977,8 @@ class StatsPlaylistsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i34.StatsStreamFeesPage] -class StatsStreamFeesRoute extends _i43.PageRouteInfo { - const StatsStreamFeesRoute({List<_i43.PageRouteInfo>? children}) +class StatsStreamFeesRoute extends _i44.PageRouteInfo { + const StatsStreamFeesRoute({List<_i44.PageRouteInfo>? children}) : super( StatsStreamFeesRoute.name, initialChildren: children, @@ -983,7 +986,7 @@ class StatsStreamFeesRoute extends _i43.PageRouteInfo { static const String name = 'StatsStreamFeesRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i34.StatsStreamFeesPage(); @@ -993,8 +996,8 @@ class StatsStreamFeesRoute extends _i43.PageRouteInfo { /// generated route for /// [_i35.StatsStreamsPage] -class StatsStreamsRoute extends _i43.PageRouteInfo { - const StatsStreamsRoute({List<_i43.PageRouteInfo>? children}) +class StatsStreamsRoute extends _i44.PageRouteInfo { + const StatsStreamsRoute({List<_i44.PageRouteInfo>? children}) : super( StatsStreamsRoute.name, initialChildren: children, @@ -1002,7 +1005,7 @@ class StatsStreamsRoute extends _i43.PageRouteInfo { static const String name = 'StatsStreamsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i35.StatsStreamsPage(); @@ -1012,11 +1015,11 @@ class StatsStreamsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i36.TrackPage] -class TrackRoute extends _i43.PageRouteInfo { +class TrackRoute extends _i44.PageRouteInfo { TrackRoute({ - _i46.Key? key, + _i47.Key? key, required String trackId, - List<_i43.PageRouteInfo>? children, + List<_i44.PageRouteInfo>? children, }) : super( TrackRoute.name, args: TrackRouteArgs( @@ -1029,7 +1032,7 @@ class TrackRoute extends _i43.PageRouteInfo { static const String name = 'TrackRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1049,7 +1052,7 @@ class TrackRouteArgs { required this.trackId, }); - final _i46.Key? key; + final _i47.Key? key; final String trackId; @@ -1061,8 +1064,8 @@ class TrackRouteArgs { /// generated route for /// [_i37.UserAlbumsPage] -class UserAlbumsRoute extends _i43.PageRouteInfo { - const UserAlbumsRoute({List<_i43.PageRouteInfo>? children}) +class UserAlbumsRoute extends _i44.PageRouteInfo { + const UserAlbumsRoute({List<_i44.PageRouteInfo>? children}) : super( UserAlbumsRoute.name, initialChildren: children, @@ -1070,7 +1073,7 @@ class UserAlbumsRoute extends _i43.PageRouteInfo { static const String name = 'UserAlbumsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i37.UserAlbumsPage(); @@ -1080,8 +1083,8 @@ class UserAlbumsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i38.UserArtistsPage] -class UserArtistsRoute extends _i43.PageRouteInfo { - const UserArtistsRoute({List<_i43.PageRouteInfo>? children}) +class UserArtistsRoute extends _i44.PageRouteInfo { + const UserArtistsRoute({List<_i44.PageRouteInfo>? children}) : super( UserArtistsRoute.name, initialChildren: children, @@ -1089,7 +1092,7 @@ class UserArtistsRoute extends _i43.PageRouteInfo { static const String name = 'UserArtistsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i38.UserArtistsPage(); @@ -1099,8 +1102,8 @@ class UserArtistsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i39.UserDownloadsPage] -class UserDownloadsRoute extends _i43.PageRouteInfo { - const UserDownloadsRoute({List<_i43.PageRouteInfo>? children}) +class UserDownloadsRoute extends _i44.PageRouteInfo { + const UserDownloadsRoute({List<_i44.PageRouteInfo>? children}) : super( UserDownloadsRoute.name, initialChildren: children, @@ -1108,7 +1111,7 @@ class UserDownloadsRoute extends _i43.PageRouteInfo { static const String name = 'UserDownloadsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i39.UserDownloadsPage(); @@ -1118,8 +1121,8 @@ class UserDownloadsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i40.UserLocalLibraryPage] -class UserLocalLibraryRoute extends _i43.PageRouteInfo { - const UserLocalLibraryRoute({List<_i43.PageRouteInfo>? children}) +class UserLocalLibraryRoute extends _i44.PageRouteInfo { + const UserLocalLibraryRoute({List<_i44.PageRouteInfo>? children}) : super( UserLocalLibraryRoute.name, initialChildren: children, @@ -1127,7 +1130,7 @@ class UserLocalLibraryRoute extends _i43.PageRouteInfo { static const String name = 'UserLocalLibraryRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i40.UserLocalLibraryPage(); @@ -1137,8 +1140,8 @@ class UserLocalLibraryRoute extends _i43.PageRouteInfo { /// generated route for /// [_i41.UserPlaylistsPage] -class UserPlaylistsRoute extends _i43.PageRouteInfo { - const UserPlaylistsRoute({List<_i43.PageRouteInfo>? children}) +class UserPlaylistsRoute extends _i44.PageRouteInfo { + const UserPlaylistsRoute({List<_i44.PageRouteInfo>? children}) : super( UserPlaylistsRoute.name, initialChildren: children, @@ -1146,7 +1149,7 @@ class UserPlaylistsRoute extends _i43.PageRouteInfo { static const String name = 'UserPlaylistsRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i41.UserPlaylistsPage(); @@ -1156,8 +1159,8 @@ class UserPlaylistsRoute extends _i43.PageRouteInfo { /// generated route for /// [_i42.WebViewLoginPage] -class WebViewLoginRoute extends _i43.PageRouteInfo { - const WebViewLoginRoute({List<_i43.PageRouteInfo>? children}) +class WebViewLoginRoute extends _i44.PageRouteInfo { + const WebViewLoginRoute({List<_i44.PageRouteInfo>? children}) : super( WebViewLoginRoute.name, initialChildren: children, @@ -1165,10 +1168,75 @@ class WebViewLoginRoute extends _i43.PageRouteInfo { static const String name = 'WebViewLoginRoute'; - static _i43.PageInfo page = _i43.PageInfo( + static _i44.PageInfo page = _i44.PageInfo( name, builder: (data) { return const _i42.WebViewLoginPage(); }, ); } + +/// generated route for +/// [_i43.WebviewPage] +class WebviewRoute extends _i44.PageRouteInfo { + WebviewRoute({ + _i47.Key? key, + _i49.WebviewInitialSettings? initialSettings, + String? url, + void Function( + _i50.InAppWebViewController, + _i50.WebUri?, + )? onLoadStop, + List<_i44.PageRouteInfo>? children, + }) : super( + WebviewRoute.name, + args: WebviewRouteArgs( + key: key, + initialSettings: initialSettings, + url: url, + onLoadStop: onLoadStop, + ), + initialChildren: children, + ); + + static const String name = 'WebviewRoute'; + + static _i44.PageInfo page = _i44.PageInfo( + name, + builder: (data) { + final args = + data.argsAs(orElse: () => const WebviewRouteArgs()); + return _i43.WebviewPage( + key: args.key, + initialSettings: args.initialSettings, + url: args.url, + onLoadStop: args.onLoadStop, + ); + }, + ); +} + +class WebviewRouteArgs { + const WebviewRouteArgs({ + this.key, + this.initialSettings, + this.url, + this.onLoadStop, + }); + + final _i47.Key? key; + + final _i49.WebviewInitialSettings? initialSettings; + + final String? url; + + final void Function( + _i50.InAppWebViewController, + _i50.WebUri?, + )? onLoadStop; + + @override + String toString() { + return 'WebviewRouteArgs{key: $key, initialSettings: $initialSettings, url: $url, onLoadStop: $onLoadStop}'; + } +} diff --git a/lib/pages/webview/webview.dart b/lib/pages/webview/webview.dart new file mode 100644 index 00000000..b4ce47b3 --- /dev/null +++ b/lib/pages/webview/webview.dart @@ -0,0 +1,56 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:spotube/components/button/back_button.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/services/metadata/apis/webview.dart'; + +@RoutePage() +class WebviewPage extends StatelessWidget { + final WebviewInitialSettings? initialSettings; + final String? url; + final void Function(InAppWebViewController controller, WebUri? url)? + onLoadStop; + + const WebviewPage({ + super.key, + this.initialSettings, + this.url, + this.onLoadStop, + }); + + @override + Widget build(BuildContext context) { + return SafeArea( + bottom: false, + child: Scaffold( + headers: const [ + TitleBar( + leading: [BackButton(color: Colors.white)], + backgroundColor: Colors.transparent, + ), + ], + floatingHeader: true, + child: InAppWebView( + initialSettings: InAppWebViewSettings( + userAgent: initialSettings?.userAgent ?? + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 safari/537.36", + incognito: initialSettings?.incognito ?? false, + clearCache: initialSettings?.clearCache ?? false, + clearSessionCache: initialSettings?.clearSessionCache ?? false, + ), + initialUrlRequest: URLRequest( + url: WebUri("https://accounts.spotify.com/"), + ), + onPermissionRequest: (controller, permissionRequest) async { + return PermissionResponse( + resources: permissionRequest.resources, + action: PermissionResponseAction.GRANT, + ); + }, + onLoadStop: onLoadStop, + ), + ), + ); + } +} diff --git a/lib/services/metadata/apis/set_interval.dart b/lib/services/metadata/apis/set_interval.dart new file mode 100644 index 00000000..349fbdeb --- /dev/null +++ b/lib/services/metadata/apis/set_interval.dart @@ -0,0 +1,73 @@ +import 'dart:async'; + +import 'package:flutter_js/flutter_js.dart'; + +class PluginSetIntervalApi { + final JavascriptRuntime runtime; + + final Map _timers = {}; + + PluginSetIntervalApi(this.runtime) { + runtime.evaluate( + """ + var __NATIVE_FLUTTER_JS__setIntervalCount = -1; + var __NATIVE_FLUTTER_JS__setIntervalCallbacks = {}; + function setInterval(fnInterval, interval) { + try { + __NATIVE_FLUTTER_JS__setIntervalCount += 1; + var intervalIndex = '' + __NATIVE_FLUTTER_JS__setIntervalCount; + __NATIVE_FLUTTER_JS__setIntervalCallbacks[intervalIndex] = fnInterval; + ; + sendMessage('PluginSetIntervalApi.setInterval', JSON.stringify({ intervalIndex, interval})); + return intervalIndex; + } catch (e) { + console.error('ERROR HERE',e.message); + } + }; + + function clearInterval(intervalIndex) { + try { + delete __NATIVE_FLUTTER_JS__setIntervalCallbacks[intervalIndex]; + sendMessage('PluginSetIntervalApi.clearInterval', JSON.stringify({ intervalIndex})); + } catch (e) { + console.error('ERROR HERE',e.message); + } + }; + 1 + """, + ); + + runtime.onMessage('PluginSetIntervalApi.setInterval', (dynamic args) { + try { + int duration = args['interval'] ?? 0; + String idx = args['intervalIndex']; + + _timers[idx] = + Timer.periodic(Duration(milliseconds: duration), (timer) { + runtime.evaluate(""" + __NATIVE_FLUTTER_JS__setIntervalCallbacks[$idx].call(); + delete __NATIVE_FLUTTER_JS__setIntervalCallbacks[$idx]; + """); + }); + } on Exception catch (e) { + print('Exception no setInterval: $e'); + } on Error catch (e) { + print('Erro no setInterval: $e'); + } + }); + + runtime.onMessage('PluginSetIntervalApi.clearInterval', (dynamic args) { + try { + String idx = args['intervalIndex']; + if (_timers.containsKey(idx)) { + _timers[idx]?.cancel(); + _timers.remove(idx); + } + } on Exception catch (e) { + print('Exception no clearInterval: $e'); + } on Error catch (e) { + print('Erro no clearInterval: $e'); + } + }); + } +} diff --git a/lib/services/metadata/apis/totp.dart b/lib/services/metadata/apis/totp.dart new file mode 100644 index 00000000..7dad4f78 --- /dev/null +++ b/lib/services/metadata/apis/totp.dart @@ -0,0 +1,40 @@ +import 'package:flutter_js/javascript_runtime.dart'; +import 'package:otp_util/otp_util.dart'; +// ignore: implementation_imports +import 'package:otp_util/src/utils/generic_util.dart'; + +class PluginTotpGenerator { + final JavascriptRuntime runtime; + + PluginTotpGenerator(this.runtime) { + runtime.onMessage("TotpGenerator.generate", (args) { + final opts = args[0]; + if (opts is! Map) { + return; + } + + final totp = TOTP( + secret: opts["secret"] as String, + algorithm: OTPAlgorithm.values.firstWhere( + (e) => e.name == opts["algorithm"], + orElse: () => OTPAlgorithm.SHA1, + ), + digits: opts["digits"] as int? ?? 6, + interval: opts["interval"] as int? ?? 30, + ); + + final otp = totp.generateOTP( + input: Util.timeFormat( + time: DateTime.fromMillisecondsSinceEpoch(opts["period"]), + interval: 30, + ), + ); + + runtime.evaluate( + """ + eventEmitter.emit('Totp.generate', '$otp'); + """, + ); + }); + } +} diff --git a/lib/services/metadata/apis/webview.dart b/lib/services/metadata/apis/webview.dart new file mode 100644 index 00000000..630324a0 --- /dev/null +++ b/lib/services/metadata/apis/webview.dart @@ -0,0 +1,160 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:auto_route/auto_route.dart'; +import 'package:desktop_webview_window/desktop_webview_window.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:flutter_js/flutter_js.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; +import 'package:spotube/collections/routes.dart'; +import 'package:spotube/collections/routes.gr.dart'; +import 'package:spotube/pages/mobile_login/no_webview_runtime_dialog.dart'; +import 'package:spotube/utils/platform.dart'; + +class WebviewInitialSettings { + final String? userAgent; + final bool? incognito; + final bool? clearCache; + final bool? clearSessionCache; + + WebviewInitialSettings({ + this.userAgent, + this.incognito, + this.clearCache, + this.clearSessionCache, + }); + + factory WebviewInitialSettings.fromJson(Map json) { + return WebviewInitialSettings( + userAgent: json["userAgent"], + incognito: json["incognito"], + clearCache: json["clearCache"], + clearSessionCache: json["clearSessionCache"], + ); + } +} + +class PluginWebViewApi { + JavascriptRuntime runtime; + + PluginWebViewApi({ + required this.runtime, + }) { + runtime.onMessage("WebView.show", (args) { + if (args[0] is! Map) { + return; + } + showWebView( + url: args[0]["url"] as String, + initialSettings: WebviewInitialSettings.fromJson( + args[0]["initialSettings"], + ), + ); + }); + } + + Future showWebView({ + required String url, + WebviewInitialSettings? initialSettings, + }) async { + if (rootNavigatorKey.currentContext == null) { + return; + } + final context = rootNavigatorKey.currentContext!; + final theme = Theme.of(context); + + if (kIsMobile || kIsMacOS) { + context.pushRoute(WebviewRoute( + initialSettings: initialSettings, + url: url, + onLoadStop: (controller, uri) async { + if (uri == null) return; + final cookies = await CookieManager().getAllCookies(); + + final jsonCookies = cookies.map((e) { + return { + "name": e.name, + "value": e.value, + "domain": e.domain, + "path": e.path, + }; + }); + + runtime.onMessage("WebView.close", (args) { + context.back(); + }); + + runtime.evaluate( + """ + eventEmitter.emit('WebView.onLoadFinish', {url: '${uri.toString()}', cookies: ${jsonEncode(jsonCookies)}}); + """, + ); + }, + )); + return; + } + + try { + final applicationSupportDir = await getApplicationSupportDirectory(); + final userDataFolder = Directory( + join(applicationSupportDir.path, "webview_window_Webview2"), + ); + + if (!await userDataFolder.exists()) { + await userDataFolder.create(); + } + + final webview = await WebviewWindow.create( + configuration: CreateConfiguration( + title: "Webview", + titleBarTopPadding: kIsMacOS ? 20 : 0, + windowHeight: 720, + windowWidth: 1280, + userDataFolderWindows: userDataFolder.path, + ), + ); + + runtime.onMessage("WebView.close", (args) { + webview.close(); + }); + + webview + ..setBrightness(theme.colorScheme.brightness) + ..launch(url) + ..setOnUrlRequestCallback((url) { + () async { + final cookies = await webview.getAllCookies(); + final jsonCookies = cookies.map((e) { + return { + "name": e.name, + "value": e.value, + "domain": e.domain, + "path": e.path, + }; + }); + + runtime.evaluate( + """ + eventEmitter.emit('WebView.onLoadFinish', {url: '$url', cookies: ${jsonEncode(jsonCookies)}}); + """, + ); + }(); + return false; + }); + } on PlatformException catch (_) { + if (!await WebviewWindow.isWebviewAvailable()) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + showDialog( + context: context, + builder: (context) { + return const NoWebviewRuntimeDialog(); + }, + ); + }); + } + } + } +} diff --git a/lib/services/metadata/metadata.dart b/lib/services/metadata/metadata.dart index 1188f342..a24d49b1 100644 --- a/lib/services/metadata/metadata.dart +++ b/lib/services/metadata/metadata.dart @@ -8,16 +8,45 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/metadata/apis/localstorage.dart'; +import 'package:spotube/services/metadata/apis/set_interval.dart'; +import 'package:spotube/services/metadata/apis/totp.dart'; +import 'package:spotube/services/metadata/apis/webview.dart'; const defaultMetadataLimit = "20"; +class MetadataSignatureFlags { + final bool requiresAuth; + + const MetadataSignatureFlags({ + this.requiresAuth = false, + }); + + factory MetadataSignatureFlags.fromJson(Map json) { + return MetadataSignatureFlags( + requiresAuth: json["requiresAuth"] ?? false, + ); + } +} + /// Signature for metadata and related methods that will return Spotube native /// objects e.g. SpotubeTrack, SpotubePlaylist, etc. class MetadataApiSignature { final JavascriptRuntime runtime; final PluginLocalStorageApi localStorageApi; + final PluginWebViewApi webViewApi; + final PluginTotpGenerator totpGenerator; + final PluginSetIntervalApi setIntervalApi; + late MetadataSignatureFlags _signatureFlags; - MetadataApiSignature._(this.runtime, this.localStorageApi); + MetadataSignatureFlags get signatureFlags => _signatureFlags; + + MetadataApiSignature._( + this.runtime, + this.localStorageApi, + this.webViewApi, + this.totpGenerator, + this.setIntervalApi, + ); static Future init( String libraryCode, PluginConfiguration config) async { @@ -52,10 +81,21 @@ class MetadataApiSignature { pluginName: config.slug, ); - return MetadataApiSignature._( + final webViewApi = PluginWebViewApi(runtime: runtime); + final totpGenerator = PluginTotpGenerator(runtime); + final setIntervalApi = PluginSetIntervalApi(runtime); + + final metadataApi = MetadataApiSignature._( runtime, localStorageApi, + webViewApi, + totpGenerator, + setIntervalApi, ); + + metadataApi._signatureFlags = await metadataApi._getSignatureFlags(); + + return metadataApi; } void dispose() { @@ -104,6 +144,18 @@ class MetadataApiSignature { return completer.future; } + Future _getSignatureFlags() async { + final res = await invoke("metadataApi.getSignatureFlags"); + + return MetadataSignatureFlags.fromJson(res); + } + + // ----- Authentication ------ + + Future authenticate() async { + await invoke("metadataApi.authenticate"); + } + // ----- Track ------ Future getTrack(String id) async { final result = await invoke("metadataApi.getTrack", [id]);