From 3c45732b0a8a798300c8f463f831744fbc6eed3d Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Thu, 17 Oct 2024 22:20:26 +0600 Subject: [PATCH 01/11] fix: UI glitch when loading more user artists and albums --- lib/modules/library/user_albums.dart | 64 ++++++++++++------------ lib/modules/library/user_artists.dart | 70 +++++++++++++-------------- pubspec.lock | 57 +++++++++++++--------- pubspec.yaml | 20 ++------ 4 files changed, 106 insertions(+), 105 deletions(-) diff --git a/lib/modules/library/user_albums.dart b/lib/modules/library/user_albums.dart index c2c91293..37fca7c0 100644 --- a/lib/modules/library/user_albums.dart +++ b/lib/modules/library/user_albums.dart @@ -73,41 +73,41 @@ class UserAlbums extends HookConsumerWidget { ), ), const SliverGap(10), - Skeletonizer.sliver( - enabled: albumsQuery.isLoading, - child: SliverLayoutBuilder(builder: (context, constrains) { - return SliverGrid.builder( - itemCount: albums.isEmpty ? 6 : albums.length + 1, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 200, - mainAxisExtent: constrains.smAndDown ? 225 : 250, - crossAxisSpacing: 8, - mainAxisSpacing: 8, - ), - itemBuilder: (context, index) { - if (albums.isNotEmpty && index == albums.length) { - if (albumsQuery.asData?.value.hasMore != true) { - return const SizedBox.shrink(); - } - - return Waypoint( - controller: controller, - isGrid: true, - onTouchEdge: albumsQueryNotifier.fetchMore, - child: Skeletonizer( - enabled: true, - child: AlbumCard(FakeData.albumSimple), - ), - ); + SliverLayoutBuilder(builder: (context, constrains) { + return SliverGrid.builder( + itemCount: albums.isEmpty ? 6 : albums.length + 1, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 200, + mainAxisExtent: constrains.smAndDown ? 225 : 250, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + if (albums.isNotEmpty && index == albums.length) { + if (albumsQuery.asData?.value.hasMore != true) { + return const SizedBox.shrink(); } - return AlbumCard( - albums.elementAtOrNull(index) ?? FakeData.albumSimple, + return Waypoint( + controller: controller, + isGrid: true, + onTouchEdge: albumsQueryNotifier.fetchMore, + child: Skeletonizer( + enabled: true, + child: AlbumCard(FakeData.albumSimple), + ), ); - }, - ); - }), - ), + } + + return Skeletonizer( + enabled: albumsQuery.isLoading, + child: AlbumCard( + albums.elementAtOrNull(index) ?? FakeData.albumSimple, + ), + ); + }, + ); + }), ], ), ), diff --git a/lib/modules/library/user_artists.dart b/lib/modules/library/user_artists.dart index dd097080..7968d91c 100644 --- a/lib/modules/library/user_artists.dart +++ b/lib/modules/library/user_artists.dart @@ -74,45 +74,45 @@ class UserArtists extends HookConsumerWidget { ), ), const SliverGap(10), - Skeletonizer.sliver( - enabled: artistQuery.isLoading, - child: SliverLayoutBuilder(builder: (context, constrains) { - return SliverGrid.builder( - itemCount: filteredArtists.isEmpty - ? 6 - : filteredArtists.length + 1, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 200, - mainAxisExtent: constrains.smAndDown ? 225 : 250, - crossAxisSpacing: 8, - mainAxisSpacing: 8, - ), - itemBuilder: (context, index) { - if (filteredArtists.isNotEmpty && - index == filteredArtists.length) { - if (artistQuery.asData?.value.hasMore != true) { - return const SizedBox.shrink(); - } - - return Waypoint( - controller: controller, - isGrid: true, - onTouchEdge: artistQueryNotifier.fetchMore, - child: Skeletonizer( - enabled: true, - child: ArtistCard(FakeData.artist), - ), - ); + SliverLayoutBuilder(builder: (context, constrains) { + return SliverGrid.builder( + itemCount: filteredArtists.isEmpty + ? 6 + : filteredArtists.length + 1, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 200, + mainAxisExtent: constrains.smAndDown ? 225 : 250, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + if (filteredArtists.isNotEmpty && + index == filteredArtists.length) { + if (artistQuery.asData?.value.hasMore != true) { + return const SizedBox.shrink(); } - return ArtistCard( + return Waypoint( + controller: controller, + isGrid: true, + onTouchEdge: artistQueryNotifier.fetchMore, + child: Skeletonizer( + enabled: true, + child: ArtistCard(FakeData.artist), + ), + ); + } + + return Skeletonizer( + enabled: artistQuery.isLoading, + child: ArtistCard( filteredArtists.elementAtOrNull(index) ?? FakeData.artist, - ); - }, - ); - }), - ), + ), + ); + }, + ); + }), ], ), ), diff --git a/pubspec.lock b/pubspec.lock index 77193ca0..b653c2fd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -731,12 +731,11 @@ packages: flutter_discord_rpc: dependency: "direct main" description: - path: "packages/flutter_discord_rpc" - ref: cargokit - resolved-ref: "331636d8e378e3ac9ad30a4b0d3eed17d5a85fe9" - url: "https://github.com/KRTirtho/frb_plugins.git" - source: git - version: "0.1.0+1" + name: flutter_discord_rpc + sha256: "9363a803863d56fd89c0a21639c70b126245fcbafaeb0a3d091e7ac06951d03f" + url: "https://pub.dev" + source: hosted + version: "1.0.0" flutter_displaymode: dependency: "direct main" description: @@ -895,10 +894,10 @@ packages: dependency: transitive description: name: flutter_rust_bridge - sha256: fac14d2dd67eeba29a20e5d99fac0d4d9fcd552cdf6bf4f8945f7679c6b07b1d + sha256: "0ad5079de35d317650fec59b26cb4d0c116ebc2ce703a29f9367513b8a91c287" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.5.0" flutter_secure_storage: dependency: "direct main" description: @@ -1319,6 +1318,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" local_notifier: dependency: "direct main" description: @@ -1450,12 +1457,11 @@ packages: metadata_god: dependency: "direct main" description: - path: "packages/metadata_god" - ref: cargokit - resolved-ref: "331636d8e378e3ac9ad30a4b0d3eed17d5a85fe9" - url: "https://github.com/KRTirtho/frb_plugins.git" - source: git - version: "0.5.3" + name: metadata_god + sha256: "025d8149059f62f44108ab9d74ebd77aa8f0af98b238f3f25121a4711ee3e5d0" + url: "https://pub.dev" + source: hosted + version: "1.0.0" mime: dependency: "direct main" description: @@ -1945,12 +1951,11 @@ packages: smtc_windows: dependency: "direct main" description: - path: "packages/smtc_windows" - ref: cargokit - resolved-ref: "331636d8e378e3ac9ad30a4b0d3eed17d5a85fe9" - url: "https://github.com/KRTirtho/frb_plugins.git" - source: git - version: "0.1.3" + name: smtc_windows + sha256: "80f7c10867da485ffdf87f842bf27e6763589933c18c11af5dc1cd1e158c3154" + url: "https://pub.dev" + source: hosted + version: "1.0.0" source_gen: dependency: transitive description: @@ -2183,6 +2188,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" universal_io: dependency: transitive description: @@ -2427,10 +2440,10 @@ packages: dependency: "direct main" description: name: youtube_explode_dart - sha256: "28dca07fefb4b6518beab95f0c1ef81031f921ed0fe87ebcd9c51378546edfee" + sha256: "523a01ef948607d3e8fdcdcdcef1ce805c7d26480f609e3b209d1c73520a6c3c" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" sdks: dart: ">=3.5.0 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index df8e668d..3c5c5ccb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,11 +62,7 @@ dependencies: logger: ^2.0.2 media_kit: ^1.1.10+1 media_kit_libs_audio: ^1.0.4 - metadata_god: - git: - url: https://github.com/KRTirtho/frb_plugins.git - path: packages/metadata_god - ref: cargokit + metadata_god: ^1.0.0 mime: ^1.0.2 package_info_plus: ^6.0.0 palette_generator: ^0.3.3 @@ -82,11 +78,7 @@ dependencies: scroll_to_index: ^3.0.1 sidebarx: ^0.17.1 shared_preferences: ^2.2.3 - smtc_windows: - git: - url: https://github.com/KRTirtho/frb_plugins.git - path: packages/smtc_windows - ref: cargokit + smtc_windows: ^1.0.0 stroke_text: ^0.0.2 system_theme: ^2.1.0 titlebar_buttons: ^1.0.0 @@ -95,7 +87,7 @@ dependencies: version: ^3.0.2 visibility_detector: ^0.4.0+2 window_manager: ^0.3.9 - youtube_explode_dart: ^2.2.3 + youtube_explode_dart: ^2.3.1 simple_icons: ^10.1.3 jiosaavn: ^0.1.0 draggable_scrollbar: @@ -105,11 +97,7 @@ dependencies: very_good_infinite_list: ^0.7.1 gap: ^3.0.1 sliver_tools: ^0.2.12 - flutter_discord_rpc: - git: - url: https://github.com/KRTirtho/frb_plugins.git - path: packages/flutter_discord_rpc - ref: cargokit + flutter_discord_rpc: ^1.0.0 html_unescape: ^2.0.0 wikipedia_api: ^0.1.0 skeletonizer: ^1.1.1 From 9f2d423cfe5f9a0a12ef6e7aa64011f26715799c Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Thu, 17 Oct 2024 22:33:03 +0600 Subject: [PATCH 02/11] feat: add invidious audio source and fix auto skipping tracks (#2005) * feat: add invidious audio source with automatic track switch even on server playback endpoint * fix: switching to different source on playback endpoint error not working * chore: update invidious version * feat: invidious instances customizability --- assets/invidious.jpg | Bin 0 -> 100201 bytes build.yaml | 2 + drift_schemas/app_db/drift_schema_v1.json | 1 + drift_schemas/app_db/drift_schema_v2.json | 1 + lib/collections/assets.gen.dart | 2 + lib/l10n/app_en.arb | 4 + lib/models/connect/connect.g.dart | 4 +- lib/models/database/database.dart | 16 +- lib/models/database/database.g.dart | 3170 ++++++++++------ lib/models/database/database.steps.dart | 652 ++++ lib/models/database/tables/preferences.dart | 6 +- lib/modules/player/sibling_tracks_sheet.dart | 12 + .../getting_started/sections/playback.dart | 9 +- lib/pages/settings/sections/playback.dart | 73 +- .../sources/invidious_instances_provider.dart | 12 + .../sources}/piped_instances_provider.dart | 0 lib/provider/server/routes/playback.dart | 44 +- lib/provider/server/sourced_track.dart | 56 +- .../user_preferences_provider.dart | 4 + .../sourced_track/models/source_info.g.dart | 2 +- .../sourced_track/models/video_info.dart | 21 + lib/services/sourced_track/sourced_track.dart | 76 +- .../sourced_track/sources/invidious.dart | 266 ++ pubspec.lock | 122 +- pubspec.yaml | 8 +- test/drift/app_db/generated/schema.dart | 23 + test/drift/app_db/generated/schema_v1.dart | 3333 ++++++++++++++++ test/drift/app_db/generated/schema_v2.dart | 3366 +++++++++++++++++ test/drift/app_db/migration_test.dart | 128 + untranslated_messages.json | 184 +- 30 files changed, 10402 insertions(+), 1195 deletions(-) create mode 100644 assets/invidious.jpg create mode 100644 drift_schemas/app_db/drift_schema_v1.json create mode 100644 drift_schemas/app_db/drift_schema_v2.json create mode 100644 lib/models/database/database.steps.dart create mode 100644 lib/provider/audio_player/sources/invidious_instances_provider.dart rename lib/provider/{ => audio_player/sources}/piped_instances_provider.dart (100%) create mode 100644 lib/services/sourced_track/sources/invidious.dart create mode 100644 test/drift/app_db/generated/schema.dart create mode 100644 test/drift/app_db/generated/schema_v1.dart create mode 100644 test/drift/app_db/generated/schema_v2.dart create mode 100644 test/drift/app_db/migration_test.dart diff --git a/assets/invidious.jpg b/assets/invidious.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12c5f10762bb28f352c190e2afb29225d582b56b GIT binary patch literal 100201 zcmeFad0f)j{y&am(>|4vTCR=GXjxk1RxZ%o(QE-32gzK}Mhg=aQxwg$rfG6#ylvt} zX`$klAtDmmluEggB5sI|yQsLNf*bm!d+*%e?{V)eZTH^KA02$~#&ce;*YkN^?>Fat z-sil|VYPkr7r?fY$4(pr$jN;Iz{_5M)n0(Rb%+-l0D!>&dH?`mJ>XNh?Erb%Cpp;* zAg2QO^lzU5fRl2n|NQ)|+@62P$Rs}j{(tf^+1E*C`L*`nkE?vZ*8urXUZ>aZ^0KsM z?V8tV{o1vkuHCSH&$evcwoPH%#?9M-+qVH_pSQg> zBKKNTe$9HB;^9eEP}j;xpT1o{*Q9`&542x^?T<%dh(sAoq!^aIM0+_1ixOeFe1pZik|hmVdyN z4cdqP^6mFY%3r(x^{QvBktnNNEkHBYa00yfLbs-+;W0Du6RkN!>l4}S*Q{m&x zHql8f|MK&>O`KIgbRmzhd{Vgft84Al5)B899!&3dGb^d~>Zs%)bIn|yZp`x* zap@PKOD<7jjhzJc#>hB zI(gBiG8M18yt}vPRjAL4Re))WB?jE({Oy(ptAH21cafYI<)j>EN$_m#zLl|`wp^3t zwv8q5dY-a2tpW}|Uj;nZz`_Tny8>+%G!aI8>I&VK;kT5RqXBjsSQ@>hwj3AY>)k!+ zjnnFpIOS-VxP7Nl);}|j6+JG5G+`9kkT&{p3$=+F*1d;})G(b!6ll!DzM3>n8GwuB zH5$h|+9J$JHv=nOiU_kx?yG>hd+J(Ic!ThyL!0I&~%9{C%< z((=P@V{Ouv_oSd98`kaoUteW!jc*B4^~Of9-Kcy%&Yrh#IB`Nry>5oXjMe(;p%J() zBD`&hdYy|prIAwUY?c?2W>a$j30(zv?rv96KAZ6n1A;YpIPlA1z+u=W(*rJqr?EPu z`70SCtAHENlrlu2s{nh0E@@s!sEZxD0~M^hGGdsZ`Owe0WJTnZi0$X;NiS5UT9@mN z$Ki#^E4v#4D{4`sl0;oi^1K6u;F2G=pthpCFL~w3`9-%Ai>S;7V=v1i{KK~pgQ#?! zYU3!Uy+dE!XlJvlX|Q;2rEz}t>;*a$0gXrk4E&2P)@`xX(DAMGAjYAk4C$#7YrEwy zcD80WN8a(agO~>n`wTX?6$GCwM!H=?b)VgdFX%9*ii^8brDoN|_6x|ETTz;XM|%pj zm*jrL2(E_iBX#G=n+JH&BJ&*^=qQl5x-LlOm~G!VaR#Qid9itXDf~GVH0WmtB@aV< z?On17qt6e*JRa(vo+49b6MinGsc6^gNcpC^Q$ZQX=l|J%HM+anmpCD) zICBRKW|8GG4bghW2;IAcPEICNsXF_LL1W#&OtdAHP8)e67hGDX1>EHe^qxY9%2y?& zZ38ncc_~=GEm{4J(b9cpSVf0RO9n0}AuIQ309O;ApU zyZ(IS?hdDQUx!+jY7v`4z3KUFHX{PYRqL_hC5aZLvSb%6&!kwyMORbw`I(2wv3sMV z2|pYKKlxoBYTi%)fk5@gLB3HBP=*4_QTmoA{Drx;VZ4}x!A2@d!kXrf8<+Nuqh4AD zvre0IH8d4E47;Y20wC8+b;`A;?yJ;YT!C9^3?N-wMvtK_*p_^!L`7xBJPbdYMW8cx z^Y}L&(wze@6b>b+=rFB9xVAcej~JloxF##BmD#KI6Rrt!&KH8mx*{yw9*Uf$`)018 z@E$9Vl2afhJA?21aQSz+|6eJnGs!+tPOQ+16_cx5X{yE?g(UCoWySLXidOXUIn_HD z{MOMGS{Jiyro@+p4w-BU)(Y@rcffK|bQh;SYbaTgn{7KaArPddI<{fC!`6ip>M0eS z9xS)1LOFUV$Fm|jc`r(5~M zjMxg$uuSdenrHviIr2NZ1R!DStJsyB;|V}SVWl}^=jl=Ayh}ez^M|W;*o>4~l)zQMH!s*(Y`##?ReM;P8;3yJv%90$K4PK8mYw70oCUj9?^|1*Jg!N;473w|crrr#CrD!+}2%JKkeFx&K&_L6nJVw8G%7%;Hi zgX0ZbRsG!C`b9xL(V2yi4m(Acn0X{rK2)^z#RBzUZl+k=okGsTA5O{t#W_o<4J=Gy z&LK5-PH@^k>nSmlYhooRjqwHG<_nd6i4(T4qFZh;lIl9vXlCS#%RcL)WvOqs=G`~+ zg8UPK>bi4&&R{lPq_69ccsTaa^d1HZg3nEygZMz@PhnS{S?=uG(Z#%rp!n9uKK5EL zfOb=X)0vZ@A@kPuSC9E=JdwhhmL%fH%KHIsq8frv#huFb^PA{!L&6P;{zM6z=6M}ifbO^b;tDORIw@L z7v|gSZSc|aJP@GAS^J@%J*~$x>9H}&(5IibczUSv)<9K69d3LTFcb;+$y~GefVH@Y z`n+}8FxUj82Ib|rPIOF$_38oXso>x2fr1+AG5zn>ZG+> zBl@j;0`|^~D?wrhceGjCfsn>FAkake+QM#Da`~4P(gz}hM{n=>uAxXI85e_NK?*>A zv3evH^y<+`zZcUtY)W1TTbD8iBFQ>bZzg22z^aNPb&0r3NFAg0oCysU8BACvkq+O^ zMB^?B7i=vMO9)hjd-PJ*apU&4V)@??mT%!R9dOw3`DStHl^je5Zn;szGMExAsYd{- z!abjC-+ETOZ4}=ZcPWgE__=eQW(DPE9C}r@bQ8J5rr!-Tu_mrPJw9|V72SRM!TkZO zOXp#dH>GQ`GnN%Xg<1nOH}(~ksM6uw5~=R?ZqkFZ9=&}Xi6Z7saV{MjEwMJLvXX!F z_7#;!`4w`~HAfGWFc~Jt*40kn3{zv^FCLk9FBJ9wU8EBpzpNKkLUeilqC<;bEcc=# z*_#}*VwMkd62?=bqO~KXBT+~*FJur_L?k7|S#cJ8DG?P$?8;95Q1Yn)sbVW!6|yCIk$7g!K-DG18uM)5<38YT)e5qjipwai_ZHFNOT_h(_H(v&Ri7 zWYS1Sbn1=X!3Gd;a!s00@?GLB-&o&4zs+e4yi_<46q;L89W(Eg8OB}W)x*nFR{?+F zm#=N(jx?8c$6S5T%a^L|44HML11BfA3Tn$=ja+`G`pLhdcoh;e%iSrML>-+YF_$r} zckyRN=-;p&EQ@mePBb#=8?i~CI2>_?NY?V@K~!>xYtW;*XA2fG!(6&E#*$Oxlrk{c z%G&WRWrRQ+xUrJXg14_9WR(6W>`3`R7)JHOs2sD$Rp-}-7QpN@N@mn#t^bhRzjpE8 ziT#IBdST)Kqxab1BENc6S{hjppcm_1*ih8qG%TKg@333q0&WNnkIRvwIy~o21tAh_ zt|7fT;fh^LdMuYJvwi=NzlMs`$_AJ=}i=rz%ZvJZ2iNSC{dQszm) z7U6O!@4?nW6o&Pca;A2QpidJlh=0O|VEU|*HwLgx?-}LPZ z{w^90UyBaIwXT9XSwwf$Y%_xNUi8 z+?0!YU=pM*x)ByMy2Ia|&(vUViLFq|yi`OGB0&%;Aju3*B#+FWE)i(MYo1mW!||

j^Z;wilFgqYneD(7CG5rwQ5l%F`v~&L%IF3&7uQ`Cp%vfts2Z4bSN@*9igAC7!jC$SD(3Se{+0 zrCo!Lc#@>PZ~R0{`j}FXw_(OT-`my=YYTmQj(c-^Qk}- zUo|wY{Fc%5>D<)naSCf0397D$Xt4%??{<8M%Lf3cp>tqj$hUznnuAOE&v^T-;8co8 z4MjB^!w&ePfYao&3d$7e_j3slK1T3GD;QU-#+x~P4`p=D=Bc1(k>>&M9}J?mn7$arVpf_ z3hx}B7B1@2MU7FxOdO)FPmJP3wIwemflHcpu%D=|e>ZCXuC=pqQCP|zb-iPDOw3PC zNl%W63+l>_D@8~6b|va%Mvk+qwn_3(KbR^dh-i^FMsWr1HpaF@BFf~|2q8$>Vh=+M z$4Ab7ua7A|mUj=MJe%$Zd-0^9CXW%Oslz)x;hZNx8e2i-bN(Irzm?Oi{`q)9%S4WK z0s^8s(s~USn`H{_s^*u#3-Z8<$liXS1D-fbT+<;m^>if$Mm8`P*AjN6JVsPEIGbq= zK{*JN@hyzvfQld94C=cQf%d=K~Q&?R8|!3>bld2bb7@ zEkd~9;@#JzZsXP!c)!wCvrC~vBh43v80=X0v?U|y^C_mdX)aqVr+T2hGA?w;1ePLl zrP((H2m%|7?d;(|Ag~_@9Qj`jHmt1?+8hnN(W*v?j2q#4!^jmP5#m5Ug}Rt5;ul!Bqu69UTki3|m>d*9ERH2pU=sX$9A!P6|y+dA|MO ztAM-CLq%y9ed`-2mXd-Ho}Xy3WfgGhrOKHPO70Dft)rEgxQ_Oe^9m}dv-=AWU`f1F zv5jTBlrl=nvj&YJ5egbpFpW68>PwSVz{4(e$4YOf7VX%P=KT8Q#QLQ|WUndNvU|ru zl_aZbJ8A1yAiSD(^-7$ls!Fv2mX~T|y~CMokxNdViY5fgC%+-9Hx-jx00GsYA)kQf zQj06$iwUn1yfN0SqN1)L27}<2292$3bs{torIf=n#N?c9!MW+0J<>0DVBhW(_4-f) zq*4En)AEo3yhiYRirCL)S|Bxw0ngqP{lm#ca$!i`4m&6hiKw!&F+8+kUz0&~7&CmC zbTMdq-jd(fMX|z~l#s?3*}YJ(JKYzsKM`^VJ*=mvxj$F3x~NZpEQ7 zbUd$9i?WaG5kt-)ZHOV9SOXio^PR}hAwHq5se_h{p6_C03W{V8bi?2p#wx%V(nQJ~ ztZLe}-nnqZthIv|U}X91!GN&yM}1UXdxyzT>^-@@jr!(Fa>Sk< zb*HwyFH6x$t}y$0+hfSa3+!rgl#{6OaCTetG$mvz=F`i8hL48WBZH|?a_G)jM+uxDh7=fX9)=;urDP(lSIgRJgaFdeAwJwl_$;2S>@G5H8CY6E51%Co`z-;qy9cSNC8R~f&|{1h{@26o+4f@2FKzf zJJf;Atc(PALt5&r^^p|XqBb8T;aWwR`jL3DabRO;z-MV6mfycy+Z+|{W0~9HTN&ju zsjks@?`l}h-onF$yl{U-KE>if;gPB26=CwH;rPqrwDR&JkrT}OFp)RL!L6l%Ola)G zfp?rkXedm?_K$LA(e6K8_~qXrK6s9w28VT9V&izo*Soy3v`L&^z6v;!ic~|@^@U$x z$IM7zxH%8@ELrELGp_X==5E>iC`}*V&$JrTv-@p$bgYGUUTgU%No6#{0z)LOEBoLC z|IJ|kb2huK7^kdP&206vGnsH^K#{P(dViyO_zzX=yPx}A=&o@%Sb=0MnqNhAMHPe@ zew9_jjHI46EwCFKU+$l~G)4YI)4>`)MiJDaQ*w#1xygO*5zSkl{2SB<&ahbCy`4|> z^hiqx9$-%9g_we7dp5N@=|4}wo?EOA?r)5>Y`Mf6s|v9P1}iJ8u2X4MQnJhs58Hvj z^78CuPd%C1(c~15r&`)iwd86)FuC6}r%kx9^1=y%xbUJ|b$ctASe~gfIOe+JOiQ-F z?SZmqbLC!AvovS@rv)P^6@1>K68$jS$}2hFxuiPol#HZ!)9pi{Q9kgSY#>1RoAy6k z=8;(`#2ndJO!i6+e)Q^9Ap%n!X9Np2a4@Vwz(Dx%E1H?-azJC-6<<_{m4w35fft?3%2SMM=>&@^c!Kf;QWFDPq?eOnp#uh4 zK%qxHe)%J;_b!{mm-4#I+fY?}bLW$lIirp=$^LelhT$ZUI7Ln-?4qD$!@K8{zU<&r zmAXe7KV#v}#Ho-)&*|0UjguzRS{^lm#BdhZE!}N>hTI1pHTnI@?bJMDW=vh=l#afX z7?{dN+ZB;la-7JP73weM$Pr!{+AOPixW)~IgNntxjHHQ`#0l?IT#$Rj$%Ue=CN0qR zdKz#s5W2{|Zp2A292Oqh`OWWRy?2THm%?FNx|_YJ37FTZ;_K)bTtN%sT+0vhhd2$^ zR-R5C<}`+DX`$V}*nj6<`lp={3NOJY$ac0^>K&`_UW!Ym)}U}^!fr{aFFcn}dg&*h zU*4P2n;LKz*a%CxqvZDIovD@Z_;}|^CthbrTv=PlBHfp_NV9>QW6Pr53;_j+^uPo7 zz*GLVsrmdg);>K-wyo@W6XdNEJxgk5C=6S1YK|m+q0;rH$Zs#Vi+&>1h8fB(*B7yh z5~_FjyP|#DN#9-fCUFZrTEj!g78ue2$IFj0l4ip$1bX{4(Zv-9LgyMqmpUX~1V18P zdp3`BJkgU04M6~9m;dJf;@q)ZuOI40Y56t!A#ve2SAW=R;pQ|_F$8JtdaKDH-I$$* z)Ht}2KQ`$psB8Kxj2YJHDH`YBP{C*Km`9F{7f$!Wo)eztBzm;&Ha`0Ho_jM5`LnZb znarXB=ah8dS2UA@{zEBq>L&+*CdK-kN^xF>F4GEbI2BF2{HT#QTjw=P@^0^Bo?6%5 zPM@3XDT-m;3MQ!1_2wv1KiDY95}@|Uo8f*CDY=1(g1ozazVe1X*oZ@|k*OrC>>(w< zLduneCEHm*ks2Tn5Kz$gl9eu5XBEWp_3j)N#gE-kiOdpAlf$J66Bc_J3S)!zHlQ)s z=l`h*2DwLOnlDA1Rsl!F_6F=sx$Aze>w{be8ZZuSn}D+R1&FqCYcwWAL{U>_BZEK@X4NhY}8)iY+!uJDHpJZ3`tU1vEn9Ws3`u zRT8gd&*+$+9I;Q^oju4*51^N?zF8Vn?aY!lDC2mE^#t1iKB*{QMPp+~(gzdxyex8MVgnRUR;6$RPd8)-ojviloM zjrEU}AEC!#JXiEa``l9^JOv7da%gAyv%ZN$Q8+BCWJ+6gof2tRhO9e!W6=SNT;%cC z@zNwUE32dD&i*^Ze>P{UslTWJh#w)Q;{1iBxY@2HgtxZFI1U!b5m!}BgFyX21yI$K zeYg@g&j`OvCrPb;L@BhNno7Edy zeFdIAqNT{%YBdz6v5=U027hF_uqXmC2m=Sf%eBy-G?e>s6N;Kyd2uE94CUhLV)ZdP zrVl$HNKTyN--@Im*d4M)xytJ3q09dPmVaXMl5@8Ah&lIYJzq5yMkA4j`Kb=$U4#vU z6EQR7oD3a3!p`Iv!nV`&3$~oaNh?#$0G$bZSIa(1px`fF%Ml6P7FvU#d087iw&TYK ze}eV)#cLh71}WIcd~6pgi{>BkV5!G-Zm}=owtjN*B#HsP$%gpUSJ@bX0Mv}X&Sv=p zhF$0vq39kgP<4HMtuUHNj3TJsS_K3m2BH3%yEgx42ZesSdUAb!mPESg3csN&w;qD%_UpWebN6>vEiNf>)kjgt*LolQ;CEl*uRK!j<4n+iH zc(C9dpx%R@$@UQaut{8sZs;;!1qA#evMjoC+BJ)WV_>6Yj~`OZD2Yc-9zsWG$$6@8 z87UNuWHiz536qZ5KDe<%&@#6nEA|z3dQhVnn}Ob&&8-O^LVxY?VadIrHF=d$T{xa& zZ$d`D6ok0;Y}GrGSsoIXEb*Ad^7H1rvq_J_-7m!?|CEm{p1q0-^bB_8n@Jf=_X_MU zo_5gc{5rLHB)mN56@_Hx*#iWA{{7`QM1C_dc}CWSMRG6C-^dcUb^;w4)am2V-HyKDE8f)kXKd^ylgay$N1o_Tv-1y}d&25A5(Q2PMfDvFwZ>HU9O-%qiUK(qp*_kT3)uc4gFN2K?<$o= ztj#aW1tk=2fL5yk{VL4CsNgSN)3gBDQ$0?@5L>9FV`-sdaaQpbL)^%q(v}6q45OuF zr`sgF&wwLC!-%JW01g_}%ldV_vd6&Q-7{~6|0lw08pnM*O7~_1^PMN6QOoXZFe+O!9Ok)Mn;pRm24;#)EWt z@#nQ4j;89qyXi`;W*w}83un5ynkT9zdU!am?5EWkQOAg+tzK@x9c;dZKlFPJexkdn zlzjbKsaX7JzP>q}3X2a@>VF#Ru{0EpM$7)t;pg6R1A{e@+SS)2`*=z#2Ds79mz#K>P=DpzPM&*d`GVbH#}rPt($E?3hXg zc7rg`Ffs`Kz^Dp_04HtVWIZx`Vs=ZSPZ}yaldJ4!GfbV)$=Fx-T-No(O%P6cG$%(- zXQ016@+bBCy<&A3;&k&Y)ND@O)2`;{YI+qiOiN@k5<}WElp8%LF22r;E!20E1x8-7 z@&*s5D#t%Ns}Ea7KF^HqH-=h;ozImVz<@J^KveqnMm#+i596YykL&`yxH!t!`Gs)Kpo^SQcZ8W_=0^_HRFcBxK z=}Si(49>x)$-c5~%?XdJG<^t%Wxrr$!_NP{-^`EQ1{pk9f>t4EsJ*P1@pdU{eMMn2cC|ygMX2b>P zuBiUB?9e23u*YKxEj?BN4$W;a)vv6?qD~3~=BC&C*9)w|N5To`F7rdYM$Dq*;v;gR zb}zOp!&B1xqG}e$bTM89oXi>qzB>NU@~~~Ot@#FKT9d;v8ZywqM-;IP1wl;&Kc{p< zJx1StjD2+ssb|Qyo^wB#F|S4Z@dcU@2tzuLA=HFD6a5osIu4vrwM?&friYD;k(f9t zSTI{ZZ|zk21r&+{{*s{U_rBfVz_|!rSX;?sma^kh+MTQE=*Qu4${s0LXUbs;arq0y z8=d>^rI4)X=^-Y46UTa5$a$T%=j}K~xPFW*sN#f;Y#~fc?BgSS^7fa1?}B=}e8`1N z<}EH(V2DIQWlNcGhTxG;r~?+W+_--+>;z#~-lBrV(hzA2+T8q+ z=}f|bo^hwiVTU`{;}eu-je75^Ppwc@l88=-JsVP|x-?|!tz>HZs*B(DO*$Nh zk<9poNVFJzf*gsRRfLnrQ;RHiWBBP6w_Cl3m{Hc(GWRA%%nVzcCsGUU)|dXc3YgxN z&{25FX3tb~LX%K+;jzP4H8Q4h56yyFS%ciV(&^$?l$O90v=$4Z!${G}xJ2@Fi06|a z2lDD?jA}vYI6#eJLyd1Y(t1)gF9!DGF{a*{2I z((UiBngL9`8;O6_T0qqc@DTz!Md7Uy-iWX4MHaom(?JRX?Xf`e>^FO3NunzUzqDHJAM#8cltvzXUF~%=sw9$8OyjFw^&5oc#~D@! z%4X3D>ZRU6>;gk}Z!f5->J*7Mm>kaEdRkRMrD`g}-*UQNwrxn4=-d&psVAtU{~^-L z-aip(V}?FbwF>C+0&P!a%13yqf6WhBx_%;KIBMpSl3oUe%~DVw)$JJu0>^;c?^44l zE3nwS&!UW*1`)X9~(aV!fgzR!7ax{wBhoX0jzilTX`I;oo#E z6f4$zS=r!3?C{%Qj%7^zV7(jw zUe7ub_L7Z$)TswaW}wJ=v|b@CsJ@;Pzs$_Ki4E+&9{+dJYpX_r?Ir>xAsuPV8CwDc zX=@T;xM*Yp`F3&wIs<7+saRjpdM+vLEcyZ=KPv)kIXyPrbT$x23-W37g}UaQQVt|n zj7;P$qJvi)Z??w7B)W(1Fh2`9`lmkmLjk#UOrOBDMn3#>_s%meXNS6CgX)xoQ`E@Z zzO?A*S7b(?-bz~4ykz)t%pcl$!@?~qSMOn%B&VnRP7TF+*4K8G$H0~;+BM~)8Cqb4 zN#a!W&^e`~mlHn;)pxdsFx}QM!pw$usbrk9NwkGl1(PkqZmuMNCJ5p6&waMNA?Ck` z$?aNloT#0|IN8>+84LN|QHRe}LH$kjhEn~(LUM9pWZh3RGmE;+)L{R)V+-T#n|>r8 z;kajFsv)CrE&MfL3R66&ZWzmurMX!j+XU(h4nC3>tm`C_qFe)o_ZPXK zqQrvu`0UHS8h*Fq7IMJ@ug(eLoh-~e{?!yNzm1UOK7fPO1=%PfARA&nb;Ex@(wNnR zT8jD$#lW>`CalBE7HPMFui}g#!Kg*uQQkaULGh^ZhX}M!V?~z(XO!-!pY56t$Ee)O zrDr)Y;0f`V$9k3hgGi2E)V=!o>a(}czFS=Z>-AeL-B~z_>J5_$h-td3z6Ja`o}-i* zwKI!UeYe!(vz^e)YW3M_w^31ed!=9TOtMJl(DVh zs?$&y~{K@p<%A3<*5w zKZluzTi~Fd6w)GezkM0x!UCRo#)wJ368gHks~ua=MGm15mvrP>el_^cN4YZQ!N8M~ zj;7LbV{=8RS`#|H;Pi03_4DCTkE*4y;n4597z(Bkf}+Qhn1P91pH_I-XY^?oC%i_~{ZNz&nsr zvXEB8-Pd-%E5NUMTPCh&j;7u?^Yo>Wi`gsc+@@I%564UkZ-#8dcG;8jQi;?AzA21Q zZ{MkEvyKt0r#+~Why<}~11QmxZ4wVzpJ|qyJU6iGmtPIO?Q!F5*G}0Sz{&%1SK_{^ zdX{_6JlBQ20^4_|YtiM)yrjkyPyV*2M;eIF(1+s;CEgUvTTly0LBp>&s<=mDeMfaW z^7thWuLWh#aUz*8ea|@zmwQv#g9J^J{@OBvukY%#Es5Xuyq4uN&cf^Qy!=(52{D73TEH87Vy8>YgZEBn5>&7Q5!8Nb z$d=^==y9Fh?^;#B=j&W%%}O*V-eRp3X@;v!T>;NN@}_HaVIf!ng|zvl(&Uu#&c_+` zV-?A=*wYCDJ|5S640Qy{b@$>1;o1lqkG&xit(H4gj{kGEVZ){l)xS_!Hf~+CCKm*{ zI$sqjYl~7wC)?DP`Wb$Uwe0&oE?sQj^Kfj)q@*Is7a7@i~KB&(jTccEXg zTFyf}CqwG{xS;N2QYQtyC%fMse)G7#A(VU22xY2#yt!DvulGC0EKQAuvOd`$t89eT z-Lgqx+m@H_%tV{xtxrNN!}f){ccx^krb7;S5c^`u7@9-5mR?GqXAkP&qjJmo%(y#; z7KcUn+?fRKM03QKR)M@E7+=XS)lO`#xL~{JS*v?yhN6(`ZTRcOEvHa8&^uCCSL6{W zvE?2rfIS{B#8JIueq#n`kJiI)a;@yFmc4FAbhn5mJ39ucA;iZhO$!JITW#Gd5iR zy#Jh^zlL3ab_|K17(TYf_E&{>J8J3V#(KpNN$aCOy@N-LR0ZD1K3z20UhL=ZJ$($F z)lDcsXF!YzOG$=?nlz+qntaf^;k?$`Y8v1xH4nOQgdcpG-c!w?B2&|>aBwgZ!MPqv z?8_mYhz`9N!c11P-kECnz`n6qDuHhZF@%=Z_+4dQsj4Y)iHVW+*XV|aJY6>-&7=4f zRHv5C#YJ?*o8N#sXlCJKrpbeljae}(FQ#KIgcpIRDZLk}9eW)Ngu}qWRe%qiG?1L0 zUT<)IK1YNw&%R|>n=_RxzL-9JVAo6k%YUz!?@FWK0OPT#x;Y8S9zNDoSRIbk*tH8( z)npacN7_h{w)c;Pd?juJ$1^t_HaDERqul{NGS{m?ec?0fP(0@uGG9M!FSRDNLX7<@ zv}-dAg=&Kbb}$kDF#mUucYB|f;CW4wijJ1j+rO~Ii;=m6)0T@7?z*)U&t{5eY-WUx z)>rnd6YXYfXmDxXBU-KQph}RC99InA(L)29OmL@UO~O15G`xNDxp!mm53S?anh4dE zZzQXLW~n!@@}4hdq!NUJIA|L-@+#vI?8u@=$)t@}+>gEoiZR_O)H!cMcuFbvWcp?A%9Gl)!v zm7Q2`a+wwa-@8PuI8yb@7Y=PP^8L%oElRJTx~{rV76OOQ(96t`Rb*xU>C7{CUw08A zvf2)5`1HHKg4)$=oui93#bsV#K!qR+kEKBi9n+d&N6DqXRcmcfbHz>X2pBI@5bIsj z?4K81-;ff%mjE8rq`9!Ovn@E;Ai>?v{a|ZPCwdo&3U3U{>VFFKjc-pwx4D;OQQe86 zHbE~u0x{8VK}%7MI@*k{AjI7rNxs?t-FHo0bSz00-#un%QC~kV3#5pxai8><M>isKy~pus_&ex zRrMr>kM62*v4gi(Uf~!=P_bz5B`WTh^=p2WewX8xA;Nu(*-F9nd%~TxfnkjDNKFmZ zCcW+!ZwD6|K|Q$1VPq0!)cx1lrBfXt>a`Od&SD~6m}!Tc9Ji zEeKfHYG8oK4hE`02VUoI{gD;NRJu3|Lvq$f6N#^){R~pX?ybfc5k_#7!ZO{IT$r{g z$fovy4N0*+#F=nltIFg4SkG$L;jl~SdRSVi8832guZA6`cc{D+ac|jHkK%u1T&k}5 zy)F%mQ_UslW2A>}sDKF%MpS$gw5^{|uU}7q2k=tur(v>boHW^$%ZZm=ym?jb27MC^ zV{$v;T_2c>=3IE6Pg}~tZ(vT z5-?>Fs7+{5ugl@&il1L_6{2Nm8TEd|hJhKE=V8X2|E@Uq+z>C_`pG@;> z9DFg4utM4|?^a@$;wNsE;Kk{sM$i!Il?VOK)$FX+J(u>C*F z+J`IEJQ;N(k>bWH8Ta$d!X~a{#R(Gk(xXV6PQoKuyK9kYfY7+ybo5;*>hzq=xD_6E zvL%#G>5mM9u(G{SBd@41w+x16Xj!aQcz;KmaQB_N?`r=)qSun1z38Bh6dudU?)3h&kn zp`6yjs4N%=iI^gP<+J4MD-45Ry_n9{)bWRb`OYDwd*>#apf<84do#p2*<#)IX(iv4 z`XA`+gV3^1Mcn`wpu3*bh(p1>lbB@7_P!JyN~Jl*Qk&^!s33&d%b&XZ2R8noXhTxF z@`EOnz&X!}YcUt{ksF%aZ(1LtXstG#5OvJh4b%XswpMaR6Whw2L zwBuC7tfl|4(cdYR(_LCW%Mofw8%8y<2;EQlCajG8JPk!ODkeHvBGH#*_Zm0tChh(m z^|#2D-!{s&E2+5YqwWwkdegf7XIc#y62?5TOA(G2l#vn;Y8+rS$bR~ljRM}1bx`&h zf#O8%VoZMDAgsq5TVsI4Py5t~>;pm+&I1 zL5a4{q(2sGZD(0GYxBU^--7+X4txXtdD)Y<;QA+`$20^i!vyxjgNxU)`z6%UhVCIK zSHrkhkQ_7I)5Yi_{eX1&{*%jpV&ylB6@Z2c3iX_upKzJxf!(sLBT+!CTk-guYU_$y zZiqibkEtNr0=Xu7g1@xqvd`V$wDDG%a%-6pL3#zJ0)&R#H zx$&;XAKCxivM%+T<^IcAb2m<~>)7IQbR5Lo6Q{;C>P!{~!Yf$;zE$i3%gKxTfB9Vt zZ(a~&jDoMTYMwDpw_SF8_Jqy2m4q+S({FmcCz{v_`u%-V@kC<}pX=1^L9rW{r}Ov|;KalMBG^@>JfWUKO~DY73AIG?k| z`p>NVR=LuKcDHQ1QZtVv7S1OaM?Y;-LN~Sn+I~r-$aa$)D)Mru(fR4b(ce;iyF9tO zOm9C&79Fe=SA`3h$EC_vZuiQ`qCky!pCv%g&?C-PwxkXRCIQb}OhDqt^fM&I4eL9JSSF;j;zk5J=5*8k)j zc{NkG$eCL(iS_~SIrs9RMUWDFlTjqb;@>}H=MGC@3gJm1U`dWl>PaCv7 zB{$eFuxtISTo|CGj2coYagCoWNYgz%cJaaN*n<|4uZ?ykMYK0-W8th6Gc}|;Fc+zy z=)9y~#Yz5R_gg{#q435=kw5pja24QW>{wMiJ}ZjUK2y~P&WCl7yrH2XsMuvoEw8oj z5SAjhH*8Jd(s027C1~9t_Ti;4)q!~$G{hD;pG=HdNhmASl|I;=arO_%y-}fjc0Q)e zN$Eyv!Dw)1s|G0nw@+(eFAfDC9|8vt$v+ycs`qSK_5u^dQaw z4_4qPOkKXT8vroLMn~pEeTi~xro}%dc-|j1oWW+-PeaczLDesoZdEHvZ`Ox?|8jZx ztmfS}V)Z6M>znx0?8*~n9&xOTU4p;mqjm*8{ znggqV%oGg+Yl3HbzMWZxC#Xs?X$4aN3*+ptL_+v+lc_hM_$M+ir6s|SMH(@lUS)0M zc-D&~zms%9UTkL94637FU}R?mUpoG&-({JVO$Wz`ysd)=?uYCcKDPvO^P7G!9Gsn! z7rU2mJ|M!A<;Se&q}#WC_VP~<-=cWN)THN$AS@WcS9zd5Zt1XnLVdoU%?OAgqro5! zX!_G*Sd=^jGocUn87&DmG|Fd|1^06+u?$(chK45K(%rWJ`$PcCvgk(nk+;S94f&&yJ?5Rp z8CgPeU5#0!C-#>m=N5MQkt1qI5O@{PV2AdYJg)V(hO9e1aq-@AMv%AiDb90osI4$I zus*{x_5#ar1s)JtJIvtRw64v5sdW4|P~I`?6V_7TI3x?@P|O7R1cOX%)lDhMiQ0oE zA@l%kNyIJL-S#WhCvR(f&EsWKs?s4^dUcCWo<-ADbo#z6xw2^zTl|{k_92Q@Y>lAP#tuoAwe$1UMPBw1FHf)ko8E@K?Kld= zsyrdg9ph*zFb}fZ;W!EB(NnQHzMN;3@K8eh66E6kZNCBXZdr28t+Vm^KWBN4nBA)M zipg~sR8`uDoEcVJ`=|{+*&h?~JDBi*QKs9siHAzk>e?N`4-e%9H5h`XGL8^RG|s#w z>gJ;ROC}X}=X9|?qZcT7p&9ouf)$ItDtM^K?OM4v>4{PsR-lwa=9O#x|JD-9&Auhf z|6}dS1Cq+VKiWDqEskls_O1EqsAXfgG%ipxIyNPmqe!V}qot{dxq&-Y)8vv-Uo%Bh z$_f<}GetsNs!=J|6mdbp(nLW)%>@;~-*dh>-&tzXnIHe$_b%st?zs={d-vUQ&gZ;O z{9m4Zt9gko9&G}?nLx~;1)iwA*X)s#=HMxcA;1>H-gu0AR&#LFvXeysbix(2lDKo{D8AFw6l^?mCDh^ z+y0O{b%)-k#NVn@Y3sanMz(FxtR7uO5gYbBqoyeFV-G|Bd6@B{!9q@a>-B5zr$={~wO)sN~xh?h57jjr&b2u1gATB&sA@t?6%D#nz|>tI}9>q^lGV??~$(zqm_CAYhIX< z#>nK&CJc-v?qa5vX6?=vcf?9jaPz2LIgTU}i3pIjdW7N$UtRw%h{AxV>}ih3>}eLt zR~6tNZD@Y$+t=GBP-(Ka3REjF_17Cz{&KBn`}RgFp=w=|gov|`NOq{ooV9BNqbjsT zby5LEn;514{J?vZ`g>IhF%y`x)l$JVKF8LFg9I}Cw79dFW8*9y6?(bmEa8cYjvhev z6B4~NcoSon^yFOc6RFlKD!dZYqId?WQ18BA3w`Ej%8D|P?=od?QJ&_xQ|1wb@17N0 z_WAjm7tP#Od1_?C@uhY2UTKT+?zBdJM*2Xfj@mdY+_f=Hk`pW28xazlLMZM-6CrOd zu2>k5hUF<#jzm|O{y94!LKj1Y=>X~Bc34Plr!YP-xZoGdU%t1Czf}p>bU`P-jCv@p zr(5KEdNe!;keiu?Sj2ZBY3i3ZYvG=3*|;>^F64gCmC4ccR}l zRpUM9mJomDa;!(2$i3k2YVK)t1y&-IppL*xoBf#8toC&$NK03V%iB&z4`GvExbseg zDi0o4=9VhxkCnjH?9>vKK@$sb?^kFEwaeGf-r0VP&%1Nhq`ICW%JZ=%ZyTx%t3?@;S%5gQ4PeKan9{F2BvDz#n$~hW!xx8U%IPaC-Y3Awh>}AkZ zQQ-IVp;7%IA3A1mej_23M0mFQ@bR={WF2>VynR>6)yh8aj^si=|GsXzbDL?zSJy+I zEFfz1pSqSaOZ%>6<{0VpSh#g6b)T*_!9)eF#_5XW@O5Iw2wsTCpN%ZY|Krl~T34sF zfjEv$;ZW;kjO-J&!{#AUox~v@Tw&TxE7?oL`K9&oNX$%g8ekp{(iS_3U0Z=9sl1V~ z$)r&fcDudPO5xJL-YdP$q}X9>X3xudglfIup3Zp}>iv$Mh;V9M8)hU8NC+gkqw>H1 z#iwb+w88HML}?SPJh>hbRGNxHpfqv59#MIjx3Lt9qZ_#DXJ_p3~8GMsflFE3DlCTY?UuMuc0 z$llkUZDD5tWO1?kg`{oQlC}U8>Mvcnk2)C(e?b}#`bnC_ZtAq}nDUfZJU zR7KK!<}dR1ZjtNTTFG}keex^FO4nxVyPiR`Y)8Y%XTxmkmFC~VNS?Ek2CfdG3Jlo1 zamTcc^1xbGmcibgp0G;xcwOp&FUN9i6LDd&{IpwxL~UX=K+1E(|M1{~Sp_=3 zKK;8U43Zq#>Bz?q`D8$kPMSr)p)GW8D9GaFQabny_ZAD-7bi4bx@h|(d4g>=4~bY0 zk@V&$luZqQZnQbR6twrtDnthlhRPHMvvi$x>5k4-Ur1|!uAM}POf%b4zJnHfwIq>@zMEqzx+DmM!JVGKT z*>s-U7z6^Wy-GoWUw3ngUva~KHm`0eN;gsG4{n)u=wV*V&yLBcAo8y?lBBdprvYI7ZmAPK!R#H6ay@UF7Fl8v!{E|!bJN3XBalx88_hm<$ zBuOOlZJ*7N*CI*S^vZl8Hw$+%W~ND|?X@EJbzhHg%PsIoeiK$*gKLz_%?u@$XkYUp zX|`%;e7@t!$H%%Ti7$0aMJZg_cHXv6ohFlY1&I8PEL?M$hgsfZd0EL}`{+fXyc62D z>``%d0{x}gy?FS}PJBp`w@Ra$L3nr)l87ZE^(M`i{eLVX*EEYRm&#LuStqF;!`RJ- zGkG}A*tcoU_3g8OGb0q_bqKT~0}XHQJ~Xq3HoE`hWN2z0o&9$9Af5scsMsp2O;J^I z2qm8)ij%)9&lqpTcqAuuw;J9@B<*aUX*s|)j4 zYU$4HB}5yn9VZb+Mha%yzVzwuuwl~m;OeX6%wGNH(1QFwEFmbTOp%Hs-5hQ)pDY6~ zeL>Ez`LTO@R9RN(gec$H$~rOU^y`qBDn^o>@>FHOhK)<;5J;gD03^}u$n>EHWCIlQ z4IZ8`(avh^O?jev>V46mGe*C3`xg7rzA8pgle*-vAbJVl?-yP6f}3_l`K&0?HK>0M z)HHr|`!sD&hDl3jrgskn%v74Zc$W%020qd9Xd?3KA#P1WMWBW(aHdU%^(3v#IITD@VoHxz z%-fh~T_;)?*MZVWEYTr)0UJLlB+Uj5vr{U*oc#|F#+K}z$NbzoNa;GdQLYc*5W9o` z&$zE7P4;k0@tAPk>4o96BUcE6#s3M09^ob;{V#M+Yh+nK^J4?tbVeppBXnXWQg^97 zaFg9mQ+?}CX`0XJ!w7CNWx>HaDl3_{t(IM10Q!gJinEiIofVcd()>1y^1gJ3tC8P! zGb_APC|I8D`EB+~K=(jyX@cCC@bMgAS%zIr@KNS4XG%~kICg|}d|%2EfIcK@S>Cn1 zaiGnDGJw{V1YmT1Z*Pgo(4N${q0*tAEkwNZ73Coa*uGlzs61G>vatNX-Z9U^Pp|r@ zScRTG4gBSyYZtb!_DIf&Z$?4|m&22-s)q-++f}6bG1MLTdn?1kpsQo@3$f;fGxe z%itzU8FM0+zkXex!FyY zG=3~|Th!gC#=!mlZ;))%n3`G5#S^U zTZLWB3%3Y*)c>9F10c<@s(0407v#Pfq+Q=Znnp+#!KKd@u1;^v{*_>0+3CqpVM4=y zf{z{TqEXn^_^ABr!kf&SJzXhrq~12V9?V~@&{FMAQ72{}mj>&Evydv4aF~6g9uQnv zd1>H7<6K(3!nW}60qDW;OE#@}P4)GAP8P!9;d#z9r1BhSQ|F4P=*7c*f|!QrhddXq z6mHlB+)Vh5!-LmwLC66+1HUiE8?HXo*CYzQnf)E6}1uDlo|N}$iWF6KR1Jl1mFY=)!F zqfVzV zfM&;-O?9d_se-%083Zz#1G$+cj}!7jX6mKLAtdz*<~Yd%lFJ3c=pRc%=>|;cmnWVB zQKMENRNQ}L<{rtHY)HzoszB5h0g+I-PKjWc z=}f({iY<6hKTx>t*TonInP!}Y_^yOZ^a(}qd5Hw5k?;n1!d>kRvtLsT-_$nTgU20r z+-G11*8|uoE9Vy@${^VvhW9s5)m#M4T5XdJ`FGe#dO4>~yII-Xtf~#Rn**h2y(M{P z<`A<}0P=Dm*VokIdsw@1Nb5mF_si~El8|(p6E!dTyEj!aTmb^2!@C!c@*zoubroNH zJ0@=DaLt&EUL?ZcD(S27YrZE5qKa9CPeCB%-iL;@(*$A(W$ZbXTlTn6mQH#+ziFK6 z<}QCkZjwIyXLpz+B1Fud1pb5 zz3~P8@QRzLq!Y~sI|yF6A{0M8kw;FYoai0f>?tB@#NtQsH2axL;R`MPVX3`8ClzkI z*;e8ZZ(+tcZ;(6W?LMRLN=cDFUun2_?6rr6$i(WTjyaI0dzC4y?id|BI!O~d&w;iW zK3P1>ha`b_O{(G8jBne%+BEN>ws>N9g3fkkN}PW$U<3MuzFAxL%KN;+1d3bRrbYFR zBU9+}OGCal5cL=BggI6mS$2t4#wg4trsN-G4Rw_1Ps76*^_+@r{G8dtH-TQ4^@zv_ z5yDMYf&!9HH6c|j=NIJ4%4!eS6o^(d50>o_UL#WhTE%ojk?X$ZK|*UK9jtE&?$@`1 zqdZ&B;wM%KWdzpCEVHpY5bP`m=z51?n(7U=y4ek!uRDOJ4hsN)-q+U zq_J9IW}(?XE44d|_-SJZ7YT7chSA*;Wyh2{1tI(8U-~Qo*U8c{XgDB)oaKU*P3kpVNm*PoHYk}79{Pkw?iahv@#>p)yrJbgi4j| zQL>>l$$NFueEQG)Ud3nleE#?>JSu6gDd56=d2@N=V(g%t{r_QSZI7kjzWy=wqvwm0;<=sD z>{14tEJ?hw@n>_OBQpfD??IaLDHv9Vr3>%vo}XVKjkj4<_Et0O-)yZItvYj!jQw|{ z!_()DFD4yzsnuyY7*bE17R9}TOE@A%RMySd8AzXcF8XTzrJ!P2c$iy6THa&Yl+21vV_m?WS`5Qj|QWh)-@aDVU&~Vl$~YT!7pB z?AdJgD*ya~x~i@nMx^c#`|Cz9L`hk*w{WenK;mb@PZ_YF~n082c8XhU@1*w8>zSPYRp5_F$U_!FV6cR-_{X zG6+|IoD$Lu3q-bVRV8O>sFch&fW14_?O;rFWb`lE^}MKN)>kvGB)i48?r(yViwCn( zeKNCqyiy1UQ}EGn1k(7-jb>}2xAbe0&a}#Ah#j$uJnxyU;n6iVsMl-WD6&2N<;Hg- zUCAFJu>Iatkfv-2i9_Sar(Bl7`tecNPGN-sI&u%)bw}d^1BbQ$KmG;Fx6Iyk2xqi; zy#an(q!3ER5JnX>KXT1~^ED?j`Aa#nO@w#97EWga=|nN!K;p}1?;Z-j5nS@20+Hc7 z485Darj5uJ^BriL&b9+@4wGHd6LX+I*h_~~AVn+m+75!*gw1iTWJr?hTL#JZL=3%o z6Nti1`$znGW8Z^7soj+A7fj^I9`s@+U}P{-E`mDp*9EGv2-pCMj>H1O;;s4B1gGG^ zO$y7K%^AP9ax%)MsI>^9&$TQwWh3qF)Eb7Q(s6$~0las6fI(u}!rw<`P5A{Zttg!J3NL9Vv$0Ks*KwIZr3p6)*MU*%V=_fXTl8;f0Lq82~ZVJIvNV?XDo-GuLeTQPI3 zte$8S^2+pU1V-Oe6VlMB{i^ldep%f7>8_)*zVOD}%1Fno$(-yhU;Gygv(@#gSK6d9=?E7$(LxS!wlsQ{0>iy^RhkHmRDqlTQT zZwm|byosU2b0=b`7Pcd#FNPzjM-19Q{j8Ays@1G7Sg{@v5HM`(R$me^NGZuob%S)I ztSCLlrNtK(-%2PNA!=0PF1W9Wd)!+#G!Pfg8qN5MaP?BhLZ9DSca>?)ARdm+#6ED7 zQ1|77w<0;f*2A{`!N5UC14Ub6Vc>lI(5`p#%bu%ZI>LeH6zyox?9dSKVkOw&RYCw3 zdE}es7~RH-3QKejL01xHra(Ki(8oV0H&(ojv#SzaaxG8)9{OX?97wntwP-j+i^&az zo5Q-p=yK0*YA8^iW7h1Uhc6f1{sV$5H@Eus&k}+P1I0p=)MRQ~WMd*+{5*dQjpZW_ zY5O%+9|CPpd!$x7bEXZs2Guc{QlgGMSs_z*XFeiG*p4gkzXHE%eEKu{%K-iQZ`7_{ zb!NcZD?AKHWo5?s?Q0mwT=>h7P~##AB_T@Rx_HR^)k?M|v_$ zZPa!Oy>W+r*!2!`U0=sCQum7rxc@lUa()I8=)^u?2KjRFvsE2Z9X!z^Vs~1S&7Hj| zziRRK4-`I~1AUQ;m6a3bK!$T5fx@Rx77g~D^^=>JlBOKEbbFu%R#vT#<*!}7=++++ zw6LjBD3$xRbJjDN41I3v7^${mQ)Bwoun4Ub2@LZ^${fgJ_2(c^T6bcb?(;-TAc_3pv+JYXTqJBGTGI-T3_%L6Ak zq;3W<7Q5vK*&$ynU$xL+w}*y?W^A0k`c@}}d}SSMI}_#!*}3>$D=0OC`| zVFrPHb!@e0&Z~uXf4@}R7G-;4CLKz+Mh2d#7q>1RDG{4Eb1m#?p0g~S76rZLU?h(w z+*y3{_e-wn65TEBMF%r&pBA8XsyZJ}7Lo0&rZ9q7I%YIJ8E~h3vkZ94+~-s{S(kpP zsXmXU%Sj8>KV_Gc1hcKOjhe0RyxGVl(X)n#3J;?f`cPmEY1|+{*czlK;=4&am1**46Si{fHekY31l6(hl$lAk_F>D` zEkOERW12b0t!J`4&4HKJ3|t8#HOew9gvhgmzL983h-V2$;u9g!j~3+rL8-6~`^Ehz zpHnvDR2y;Ca=k@EDSQFd>{qWTE*qXP3!DSJX>Jk>@^GIp6cM(>r%5q>dvzuwR%t zbZ$S&fV5Vl?xJ!@kyEX6ps&K^NR^B2PyW}bk`K-EXw;2!L)KYdC%8j0dNl-th5*kO z;RqfGJ_rb%vZ&!lT=>=HSiOi1SFs3!1G`3J%F30M7n{P3g1^tm3(B`@JCI*h@3a!) z$95-deNI!F24+ybfs{^if4Tk0|9bqpM;qJT#@X4o&kJ1#x~NDnU?qA6JaX)0jsh|ESlH#AySlJtN(=h?$*YkLa+{fZekkvgkVZ>xWZm{MK~Gw!EqF+0)*F9M zUWk9Y;%fAQ{NFC;?{Ft)%AmMk?r@4rxx=X^$|=S#a_xpYzfzwA>1_J-MdEKOv&+wq z+rKUUxIQcqht{UvJ!K6Wh<#geL(i-OcbS3aLuN1TjRx&aF1S^f{@^7Sd_V>Sz?|=9 zkdblsm<;|?1JBFuz)9c?mTzzKR!jqW=>`(D4WV`-#XVEC1{Ht9<@@UY-cgGwk zqjOpx+faa*I{d?;+kZfC79Z#4O>*09>Tz0SKU>y^I3AWx$NY#)yG7mkwde#3g4HC3 z-*O+J!IY+!Z3L-Z>wH;=`Sx}5WNW(8SB{i3w{><*V*m@E9q@{CM|C38Yl{>1+b1uB zI-?quVO7*v+`Ng;e8I%`KP7@D()U=mjbG)iMO0_)S#_LAk5BZ@*SSTWe;cQEvr#Rc>8Ns^uF;ocmIJLDGq4)K$cgg(ChN=;3yPbnylSB!~pjl+4cBcn`J_FXR&Tm zR8>u07Y)b*5@e%dXKw>U)c5Twk~eZ~sqFG(fm0@N`xL$SJT+-E}|pb33SlS-wg#I+&Ei;>TL=vmKP*!o%i9c zb566HnVetLLDZD_Yi4mQSSLAYn*!;%PRD+i}f|il1qvSn@Kx$gdmKqN^8l z{!FL92wwhUum&3NPwr~Qcw)9?jLV!ti^hh$r!aI<_m$gh%g3ra7UchS`6Kowq&!%Z zyUHhXgWuT9LRxwcg?ET=AbE*{|h=(*Qg(;5X? zNTU^{btT~;zB{n(EWb9H zPl5XD<%^#T3J;~GXJ+FmCc7o37;3JMYa5v^-{qM7hfbDwx?yc3>Z)&Ip+P-2X;Xcf zx}w|@?RiaRZwrR0``Rffjb696_HeO|Le37=vXReU(BXqL?J)v-5WAls1l)_x*Nxfc0Bugtu{cO?&WLsXjU0-p2@2=l#vGlV; zjWuh-%UbH`xW<9AwyqP8beU6!RihUTbY`bceS%Sr^c!0eWzS|8*07Z{^LCu(9B7x* z;z8cq+v?Yy`Jpm(!HV<(w;{V5^g>ZPDI)~WES%=>p;7zHXSG)VE(RLvZzLTVEND>h zs@-ju;~mDYI?6OiL|xvjn^vLBYdQN5*vrjDgUy8GffjlCub_pI20I`ezb7pg~GSAO+9Jo5h|lDL?tv z`4ora9rJS7ZzB%kNwbpd{$ACxB*4~J@&{~yoL(f_kM@;Wp7TMQ6|c-m2vpvUJDFMH zp&2`#(w_p5(_go5J6`ON!^#`XJ(uT(pSDg+gkJ+}EHMnrbjA%e;XtZ4?(*?ZL*5}P z{F|{p*l7TeC}YVGnsg!xaMqBrBb`E9EL(cH-C3z-V~E1&6aVxUsgq1w?^4+ngc{+V4%p(-)a zeeE`}2b|-3vcLj?0*cG|sb~z`?P6&!| zr9<_b-gHxk0!4PStw?nTk!hHDV=HceeFS{{cPcFTLHyfp93V-dcoiN*yG#7{ zj>$?d!4{9C*kW=}c!NB?|8!rKv(#*N!+z*cC{+$R7rl6lKT9fPha>zBb|63P3RR_4 zZFQt(H|x!Yq>?Hoe0qU7mMaJ49tSN?9Qs!wBud!oAgu5#!xb0Jh;0#SN;j}+L6#F{ zMRL%?<9|e6l~jV}C6%Ii52#dzTH7jkH9bCx;3D#8>Oqn$Z`<6jJfiIrb&iY3>SQ81 z!q}!~1Yf~>*@zt$H4y`JC8@zX9=COcd8CUO zuQ?_)%D@h#06p|aJ(hM3w>%58?6-dG7eSGjas71E36t>pijifmi-%Es97MCB2ZflD{KmeZB+L;v)^XNj--0d-y0bbB~Bwt_B3=g@^u?K?CX`mQitA`8y9x46dEr8Bo+Pc-eG81$n=TivlVU= z%2f_x+j(D0X^-3Is<2-)>H2UrO3mAr_| zJ>1RboN&X`T{mAX9_G)IfK%&{VQ3c8hilAcl+F5lm3Sdu&y+P((6i4RNZ)Zb6(C4I zoCjK^tEORnH`#sJdccHu0A=R^WZ)X4|R(_k;^`nf|Q zI0D+f2D=25&xYTI`aqceeml#6w7JbA1waCHSyFHlcn)L?eW)C?1gJlWZoxT7lFXoj zj5j>B=2TrlNhD{KpRe_tWOB2udfQ#K}kiz5ee-AYhBZE38 z#hl@u0X94LH1^xQA)N$Cp*M8n$%TE6-*)vAw`|6)n?{@nKT5(c_2FVKHm-<2lfO)^1q>%%4P;JBg-C zYt>FqVyF{{RtZIXWt&`3#73UArWT>(Tpj_;(Z})5xYGy#zPP`&^&-j z5_rNX5-}MpHd=R(jsA)5Lr=Tkhe*K0q{K}T)(HA1yt9B@KW?W0U#b6o6u(C+15dd6 zzGT)u;0bpDxB$>gJObIzFfPIkc*J%2Pj+VRsZ)OW9&Hv~rNpHD#2E9m$n~;ERE1R+ z;M_=&lLJIXA@s7n?d&O)Ut=N`foQ1inSe5sI88b{fJfGNA`0W-E<(S?0zBc$=Fe40 zi$M6G$eLbJL8<&^Fk}DG0!&##@#tPbkw0R7f6*r(s-4syfbF<+I2yF?n?hpU{BC95 zT_kmWw=&B}TjLppj6LpRziTNlusYc@xlj9f>55bWb$?A+&r0Mb65lVN@#_2}}UhpNcy89_k$n332OUyETFqd@Ua zn*eXHauSK}QeVMLj_M0UI!A$bjYR_?`Rmfm4hzwojxlf4$(G=?_HS5f^CkpI7GOdM zoKocM-kkzuVvfPBj#)ME9&MIY@;WV#cBdV4=-_b6C)M)eT?}6I;xj!Uc|kyIMQWxt zF5$~Hc&^kH-eGdjp5w^P_e{Uv=Ui2`BLuGBs04@1cwf_wodCFvuP?wS?ffw;Z)~Ng zUJyl2)BO~)=UeN!Ewr(>LdbF^vQzw-zZlEpm|+Tv*2zc#k6#xJ`Ad? zc#yCfPxP~yzhx!J)Fx22fd7+=iNx9{X{ceXVS8=$ursTp7g;l8-AEM}s~~eyCcPfXFuHO+2Tn zIKDi;N3E`IK3WoZ0*%m6LpI&fHVe1E-)r!715c(kdD7SqQFPmnjGccNw#!0dCxOV3 zn6yB!)UdbZ9cvmu{@U4Wfc)lb_W6l2O^w_LE<{$E8{RVA$*{168(4Pefr{7PoLFTe z#MzAd4rfWuPXDZ?xtk4cEO?$JPlQ!W?Y<5~C@%i9cE!-v$MWETNteq3<*2i%WrIPi#w2nPD*!+1L+T${ zp163dKS>_8saaMkKhI-e-QBsd)O)Ym(xS8o{rT)lJNxjSc>B5tT}3SrXfLL~x-LDh z>C=7I^Hx*;K9`okVM`T@ayM?aR3pvbIda7B;h(_gD?&_$J-v{JI%dl2TC@9=9jfxx zN*?ol*${o_EJ7*Zr}N%B8xv?b9>NbOny8pk1p}u9QoiX_v^lc)bLS}9Mw2m^2N$c zAd?a`T-xK{Jm?{ouhgpSn0Bk08I&5(=MU4H^-%D0!hG|r(*$ePnd)oS1=CsIpb|qE zM-Rkl$)87u?Ru{sikr}r0-G0w<6?^7V0T)rSWrSkn^IWnDGaEu9{bQwKdkM0lNSrmaZ+p0)jB~c7poiR= z89Hesn4$T~MgH~??y(aq?HACNT&`2=p|tNUUXeJXW2Yu z3SZEL7T1@ieyLLhaMZ+Q$^`KaLL39`kLa+vNCKQ0Sq0bX5<1)V85zp5^Eab$%Won=bowaqiJg$9wyxh(lHvOC<(rx#CkO$W&G$J;is)wi8e zF`!S1bBZvk52zCiH74}f3wrzw%dDt4qJ~?fTL>Q@@%UWr)H~G`PoUQcX?0Q@^no$O zW=lz1xDjmF=JHoTcGER`fEh_BZY#fI9sT=(F5&E(4K-WoJt)ySymx8Xs4CpEB)CaUz=syzyF!u z&8#i7kiw(bDt5rX^VzAL(M##&ce3WLHS0>{$7sb3PnnFJv$Nz>B1{jWhhm%6`a{={ z=+3g@r>hTvl=I(W&%Iz3e_K(0U?0pV__px;5X`pUqsp}2zOlrIVQ*92{z3kx)s~%Y z51_l*LE=2Y!LE}nCMD=RE>35hHJw%{$&StRtT9Vhd$jte1;vKXI`SSAPvow9dhbmG z1f6!nPiNau)Pwn#MFQ?>C@>e#ROs`F=V0pLf=G_9Fr*1tYilaq-ZX)7A~2lc>S|w2 ztUSJew$xIwDBKN2xGxK9J4*|!aQ`;5I@vq)?PL&!V)+`)h;F{KB)}rw+HkS}^EI02 zi!qUm6lhwNDVx?=o7s71M1d{zZF=6t{wxXfoiIS?9$G5L2e%>Pjmn6+S2mq(g{UzJ zKI+4yl6Al$r5F-_uJMiZfs?xz!n4Em8B4@YvSDcS_wUEnQ674HXdpnW;JJkT*;36D z9mbWGFD9J5bE_hG9_&UF%)9xwWd%%Zw#=TBD!*4u%?&LeJb2Sp_55D5PG(MQPo(?L zDTEU}hx-?X^zW=w4djTneBn+__M?z$wzOl$6L774kx6Li#8seD$RZkqs<@Pwf(7JX zO5>TI(7MSN5_9-n@gY;Ud@91|GRH4~=sfJ|*cFGwNI%U$lo`UGA1In|?wqEDW<-_M z@ab~S1%CAJa6WRP=qI;{?0B0_D?!5s2~MjHv_5dd6Sfj3b^^S_=A3&ouab9t1mc5V zoBHKGf^7twQT6mT^)6H6f8~Zjo-cjco6n!av8w<)Pk0cu};-BP*m9^4eDf!+}`^6U+fnnKJbg_vnQE)uOScDN56wtbe>!zq}6j8?lvQxG~>4s!jCrt z3s`G_;~d=;Dbxbe&{Y^AaxeNVH29EOAE;mLH~lru53}8C=$H}Kn!zcC?U?pgtErm< zRbi(TH!lr!gN={RbT}eFV3M}dvu~TV@6}Eh(?EDh&tu%sigK^iYa02)9`E+eZhS-E z_)t|JTq_U&3kOeCJ~7$#0sTH!y=D$15|qlrg&8ZG3c}0WeFfuHHCRv0J@H9%pxStK z&T4>Ov{3DNIC#MC>msc(&yGHybeY>6h}r2slqIV-yg+~Q!9F(n&bnRPD14TPI-IQp+}wZp04&AzPf5NotaVq3u6ak}JV~+pJCfqz z*xp#&34FAZrnRIvxy3i}-Y`I$y`r!l#XQ zbTti6O^0vAd8&&^MSnYA1Z2Mp73WbJFVUi**kEKZ+tfn860iiXSFkNR!llvp@~-XA z#@WE%kGi(QuqPjg__P}uka0`^Du#!^w_q z1aw+hhG~=c5ED{89_fSFBW~N&SiRf5Ma6`2mUFACHLz%%`?lN&k;!hpE{s$#&Cl@=Ge! zbjQ0McN(4baVp#&OTB-}wVs40G*1S>Y;8KhN`Nsz-NZ=Kw*Gkw7**eOl}zO^fL$A; z9oW9H6TIv7lDYzcj^)3YD1#i!7b7nuhR16Sn1>Xf@jf^QGH?$W1-qC_w0j~)Q7E|d4jG85j~Oy31gN``1?!}C z4u+hkjAUL4pWqi@mQ>=|TZI9(;Xnm{rNLnro|)Eka^R^6yYH%dm7RMxd@p8R-Wp^# zp##j~3`nOPBw%&s0>b!YbuX~t-owIt8;fo47lazVEf^dhZZaJOSjPK)VH!UpkdM#5 z6X_=i?!o8ZiR_}j=m*}3lFgFKw}Ni4rYzl+nt-b>f%0J^-(CMR;IB1qk@oG|u=a*43m+M%iS)92>kW0;JEYsk zWj+Wf`Z3Y7dj~UH8+)?ZVCOQ2`j-4jxkjWnEw!CwDLI>mL>@~NenMFgUs9Qm;)Zt$HY4_m&V_S_ zd1p|c3oQ%;Jh%^x{=X6{q?|PM;FE~+$!hiEad|pp`?Jl zaul5q#MZ}@*WB5@amld1G*AiTU_xaF2c!C1M9ATu*JmO+5-P`({M5{D*F|VkQiTAC z%u5A{M}1d(>*$aZsjri2vB}md&;SmuG`Fm{?u3I)CgsIGM9Ukgo8~|x>5vA47g;ro z0;}+&6=CJ$@?C$KLS^|zQFk*T1>>^WJ}4I@R;{Skz01X|0e_JtWJ9C4&}yz7g!W|4e%t^QdrrV>2cr-t}N= z@xHB_SanvNqzD}vLOl;=3kQ!95C0u5>18=2VThw{GCo&ml-a7W(yWdw(X5FNvNM1~ ze>A_CDaqj1@xo~*=A$!ZuEvvRg6hV)hT9A*^hRP*Vx|t6o_aToMHg1XFDA;RtrAVx zqx=w-zRwnb_QOUse{>F{5i<2$+*?+#{G)CcT*o zRQlEwBj|r^w3`c%&3ygap8j;~w)3Pwyvn{Lay}fXPnqC0ACA=De%fv#&shQ_z-v_V z2U2`x8zA>XzhQ&*k%(=j5nXE~dXM(D%{Yjg>;Y2A(b(AN;6v|_l{Y`Mgv+iuJZRqO zq$zYA_I9+4%Gd6JLcJmFF?1#M!hp!b`cM9(#z!j@?uL8$m-P@> z5mCWA`j4#^b-qX4&$oYUzm-0h;3h%Kds}vsZ^~N@O)Y}4btLA<^+R8RmN(23(!_^n zWuH_n<@0dyu4-ak9!^v+t8n12J3Z9E1;WZrO23>*2jXSV8*Sb)&21l{rCC5!Yyd;m zwW!WufYEN>f}&=T_eu zW|8?g7rx{6*Ny=^{Z)5f)&Hf?704 zHNGR>BXZTiPwgySj`)m6&uo8Uoj;=JIl)T_y6r3}4jZ)H>M#3Uxt%RfKQ)2K3TvpT z6WawERb(Sf(@x47-BWAMh64zYL2#FKIek9MC{S;wHMxeRk1tA!2M4j4oXPSdpd zGlse--eTr|$MQMov`mk)*=YE9@nl10Dlr{#ywGi&)ep;%7PrAZ zV}KJgg_sHu-=yHah*|aW{TeOQ?y^KtZpyat9+w?$E?|^Iy_s$GL__9%vBn6PqRidE z4rriob?JimBpL^y_zl8CpM86bwF-72Lx$%Gmt z>_#V#^z0vmoG8PbtZw3@?wQmBdy&AhCYS{Tk3|4P-$jW2 zz<}OWFIzLHY5nC)J}ce*%o~YTS&}E`2N&|Z%OsUF4Y*ADn})IsEVH$7$Dhp*X}j+8*k+FI)8AzT>`@31bHZC*j9b$!meM(wP=Mw3abEO48ym#^O(hG zRkIH9DYvecw_dR$Y02JVr&wI1ekUcWHag}NXsz;)Ng*U*+$8}mqlm5h8W?GHOcje% z%?>AAp%7soIdbGtBw#=2{iTO(%v;+yPO$gx#IRFhCg_AL0a zE$i$s0fsZh=_f>0)jI5K&ip!H3LC4Bj zs~oCmNq}Qv3hAp6J zM;*?SD0YnUdclv%b*8wTLrhAK#D$K>30M4T>|erg6iFtB{0?@PxpSSavD@hhE|DSa zR6BsdJYG*VkF6e-x;wu(XJt8PXM&M+Eqh`IQqzWN6j12bgmdef-|Wv!bsq(`^BS5u zAE$leJs?G_lH=~5YJWyE_2UV= z?VEk%p1Qa^Z%X7I0vXywx&t>vsk)@4-N^FnZFARD6`}ncDF*?6O%FGKWJUv+x6c-O zNj1A@oG0?103OaAP{+pb?|~$CGl}z4_jH|e430yGM5nx35ME^YFQ}jReni&yO<^aq z-URxsC!_~&A!5@>8fp4A)mp=B=1k4$jkAjc`<+;%BLiK<+22lwGj0jv1}OL*AmKv_ z5M#3oG4rlCWp>} zG`U(`(&Bhtja-!wpywkw-8IW4Oeeiua~lLgWiX{+0S*~-bl5RIr9{QZAbys4lhd=$ z=5-juZc4HC$;UcUaOFOpu^T^z?GUa^PT;bPY`{0TII^E{3=jg;(VZ11H?Vl}ZS*^s zRg416Ph^(t_5EQp)$#-5w@C-S$jaE=r}r932l9Ra_S|PVD;|l=>L2)-QHiLs^%Ck+ zw!d%R3396z=_@f?Jb%G}D3n#XAJgmi-y5fvlP}!$`l^JNa|3qO464R=u;7$t(=5Pn zc$Cs-Yi`@01719*7>VhL&4^5|&_T;<&H~xFFYjU=`aR;}&OWPnXlb|S z2zOi7v56hm^r$78CW_jG)ipGmel1)Ax|cAMEx8yJy*RMnNbM%{fp~UV=OUN6_i|HF zgD2S@u5q3X4Q8em29|(H+=^M?X6Ymc+RBHQxIO$&Mfha%bEYhQdVtzhpp&6`H7HLbDpYp!@C3Oy16XJYo}n0 z2A2Yt>IHk%iH2S~x zz67kPYim1btF2ZoMI1oELJJClMJ8oP>@A2@AjJ?+AYefQgsDsk5~kK#8HDJE$V`-! z011N#AwUdRMFN-*Aq0dFP>>;kfItQY1OK7-+I!po)?(|u-~T_4;o(Wn*?X_G_Daq< zdsypz-81Xa#8jFXwfH!)TJH`ym~ChiY2kwx0C!o)jz2Rjq?-E#?d9i&bbjNHNSsDb zTIT9>a==Om15^DagOK4cc3+&&4bZzKVOx;V3S-hPp7VazoupG+&z^%B06apqv=Hry z6+oi+b$3_#@#>fIG!I(<`64pm=t9RdEz5m;3PJn%I?l5!i87xy@WAD;VxAm*@((HN z8*X9p$Q;(_k3n`S-|*e91*VZdtD&lhquqaaXTOPtL8Xc<&}_wQG7 zcP#>7ij1^95B%G%?R>Razb;jnH{9CDb!@bXV6t!MaH_mv+9dj^F4N7H^R>hw=h>Ld zp{Fx`FatXWnJ}v?X6_dnf?tdI!y_%mnZTkbvK=?luJ~DK=mu1$xP}xZf*WivW%Rgl z+-$_-_#>~LivBwt=NB)y+~Y-VE~ugCEY@VXe>%aF*Z>UjcHyySkLhejbcJHJQHugM z9j{+t+e@LkBm=xO4IR(wlBE66l zEmD}yilg9;hGXy4|62d6j}(5yBEnD1n+WugTI-;dU8dSt+xvqNq(q&<*>11Nb_=To zI097q)vKlaUa3NA7$+KKX*>{VBI{V>B06S#YY{bhE1(QiJ$8RSs&M+<+dh$9xiw<{ z-LW<;05r-;1~mZQ(#V$ouPo&GOfJt-B;DTmeObK5zk-%OPxx$!zaEBc9%Rs3AqEgS)+(a}aO8TgBL?XRpt zwem2}y8!aH$W&GKiKaNONiD4Xh*8lh zI{fddtO=KH5mxzOT}=zJ%Akj{wjYj+jg0cUU-pvk@7kZ>`+M(W-ZJQXQ(?VW@9GMG zQvMludW=R?`7^k>lNW$nmG3q6oh}dxoLxa=<`N#U4(R+0pwv$z^H%_r+#YPJnX@CK zg>u2VnSW>WZ_X){VUL8>cRMY3kOTbCg50Bg$O`y87r0c7Y`|9??SNHs>yQoQbmXL^ zaC)kj#OJ~7l-q&%t+CZKz~BJ;=$HA&JN*;N+@Ktz0Gl7Ps-dRhHtEd*Od(sXuE8=8 zEDE;{9tU@nAOBoG?l&g9;&5Go$eimVfE=f6ve~GiH*Qv9pIguf?IMbTEypWld#B*+ zbSzEnM#;|1%n|R#S4etg(Yn(ec{hZ+^#>MAWE>jT9)DFShHJ>6GRQz6`dquABKz7j zIIen=sxybW?&`%d!A{4sPlP+9GZj;?zcXrPEP9^VefO10ep?7UV-$Ba>-d$>S|h*Z zTC!=yG|~Q1;dZc{bAuX=1rQyiTZ8T&Sx>00+Rx|IRM9DgR`yP%ncf@NV8mkDgRQgA zM?Md7(NDd2!)MNHTee@%pzq_Z3WKo~epX;8c~3)u|685^?)Y7_v{L|m?fv%87r4^^AJEF!7&IGm6ch1t9IlcO?PVBo3<5l0;UO5(OSqL!D%BtX~4pI90r6X zW{MMwvWiCsH=gA!OlH;@=|O^ll;PO5uqJ9cF2usT3*cic%n;{kH(7oHEW@t)rRzso z2Ems>*YZebeY4Qes&+IZ*1mC)ZPZ6snqRDtb}QQ2M%bAM@L&1dUA5HTR_uFQ#Jl=%qRXQ(UGu9>OGXVmL zGkzi~Z7a&tNs^7|IXFi7W-Sh!JGcSBZ3>!fq!|K?#s=Y7DQ$((SW0j4Az z-UYu&JMD-7mTB17X+`W>$0mZ#gBW@*Ay3Ov2e%LRWkOtJ+;0WH@;Kh(nrdVe-il`l zVbCR&A^NCV$Hr*`>l!IKKYH5OIV7f6;eCMCg?CGfIZr4wYZ5n8jQaa_E;X@W3y;aaAJg9=Wgp(i~2ihFfSC+0gOxV_UFa#R*bpyXV)6JZMsi* zX8mIK36*|#z95I&=!5}y$T!Cp) zQk5i{QygOlDOYK1Lk%gbh~!h2NhEnEB&29*_iefR59#lWPN;H&@=W?;kB7VEg;cpq z1GD?_Diylq*=sg^wa$=p{T9XVyfTjGU+q-UrpQid5)sBUg70Yr3meLD-*x~UL&@G1 z94Wh>h)VQ~TI4n|u6;*6@~_Qa^K+zY&^JQf2@j6U6d#zxGt5uI|;amH9WH;FJ@$SVf$D~(@#S>U-*)=zy^);#}3|j4aMs(G??0( zH1|Y~Otnt3=$dPmJkYW3q`jF$Ts5f%*s52~Oi#t9$C@7$IR`!KBZ+uG_%X1~%9K|g z+`LDj(%i(KU5N1S?X`S}c;UD6YSB3>#y>%&d%(4(d-Xd2U60hq zC&WU`HTakP{leYp=wUZlV4@eml_QRi&wTfkWQx>-_*!UBs6*1O7P{j9#}|!yE{(Wm zE3>fFAt3?Ge3;smO@Adv74*K|VxHTQ9rtV7tpphw@_-Lp1i{ z1=bDm``>$YSAJEhplXf@@_A%tms~Z0n0z)FCDh|W!G_6RNoj0}{Bm^KG2Jnc!ew*EQD7Jl~w5iFjK@2>5ouAWeZLWNJ=4JI)zrRBPW=pe{{!9*^z%WD z^M$-_wXO*UW847%|NqV+4z$0aVyS)M(?`i0$k%C^DtzZ~Y`jqVCIUbvuLVAX(Lz`B%Q*B}$9!xT}^5{P=Bsv>7T18l!?!z7Nd3nEI=h~5S zV^mBlQZbR;O&p(Z(9qUky_`)QJkGd+zWeX&`R%#&7wTns$s87e6l57Q6}s^RBb(a@RR)M*lEQ#&Y7#)qJM`HG z!T^?iTDWbJYns=9X~-s>g-6x^4C!I>4uSYF4iLo~rJ?X7?zggE>(~V29dqlf*sthu zmZWzQP8gZKL_S@ZIpxJQkPKR)03-}c?*v@e6&Ecncl{W>oQeHOnCY1S4w}Uaw|4By zFB$<5&Dwx%m)GH?HZvQkxJa#XlgGkpC#H@1Tz{3yZWS0EYZ^Xj2MZO#L(|AecNTr< zsWK20kb(O?^sdESg}(NxJEft{Kec~TJarbe)1<7xw4=gEPkp`B zT|#YA;gHLNN@yLw&NItv&T4JVYF%TjjoO?RtHa;dY4l=O5WosyA$0LpWWf>n+H@3H zzFX*NLF4y`-~IZ0#Ict$-yeE>f;4ap{e!oyv0I)L-9M_mmJX1(D2GRI)G8+?;f$V; zc-)@j-@I(_s&|Doi$URKrcT3zg6!A>^a7vl*oEXU=*1Uf2`QsZdRENn1=6V4^Yd+Y zUnS*_%M=b{H-}dnm#WoY3EbZnDz4L^6S_mnRUg-f_l!i1^sx=pD=cg-g07$WV_E;G zp*a;mpBF<3>0uxE@tOSg)T8ejC_QlS#J9PVCkC^8@Y1-lE1-3K6ZmQX^LE_tacxk8 zw|#?qAv!{?{{V+7IhFgBT>~Nlqn%oroCbqIcnp<7K=2F6*NP4n`FFpJGr@;hImLtWdZCbD>QC-z_h9j z`T1%VgsbPh^f_!fM(4a&>ANIGG;?g>3pqhw`1rmIxXmP7C!-Sf1S#K z0O1Gs?p3-UwO&kpU?OT)0s@66;}fpH86J@h_^y~6!;`Lg9bK8YHvP0@=h;)8%xOb) zs^cu&W9Lxo9+fA*uVZy33U|!+N}9^9PLaa+LHfQtGr6PJsH{*pgqWdTeLl&Yb`~SO zn|$L=TN(p#3kYRvM=roqKD&BW*Y)2vU}EsM(8$U=l*71G!4AwpWM-aafrI+Vz9#hrE&-)P>MkrbUiy2wMiX?20w@cytgbQ%xAClxv%U9I;D@9mxI4!Q?6 z!o(tr-^pL4ymyX>X1OZCVXOl`*16k^R-y`FT#Zb*suA-+cBqV;Q0CQUnX4px57^pT z6S4%gU34}H6m<+1Noy8zFDDZCb`JqG>>*V7llPIU)Cg4DWYF7C0BOB++|V1^B+csj zw!gD#X(ALJ-5YC;vh;4Sv9Kw1e6*qMr9=hD;wFi!0Qpk`hwrT2P%QGrrDB95{`^{QFAeX~ zlbrej1d}20cf^pGk0cLF=urq3eDGC%p z(?@`qk-&$$eH+IHz9Kbuqsojn1v0-DD#L8KCR#cp{7KCwY^9-+;t;>AI6gBz?zH~Z z5`pRkXeHUlB~Sn6#jDWBuA|1ifv#m>Wtibdo5xnukH6Q^)uuQfkNuxE^62TiP0~pH z+P1<%j8~!$v97S!1$S)HnQ0XXGs6B<2-x`ZYvxx@~a?n8C`Pe<=|t(A#T` zlJV5=-JJ5XFYwTg>G9U)T880P*sf{CamRV9NM>W?cN?cB`z=p&RUSC~*d=BipEFpT zWEyz7P*I?&{$Rz8Xr<_HXWi%aa=NDuHFCBc;RXB7)QIP1>nw?cTevR=I4g<*y%wf{F zdqa;Uh7M$$xZ0n;3~I2t(8Um?^=h$q%O$86HU%u*EiX)Ns5NN^2GYEOMYqHDH%NOi z0Jp?R(&q-Lbfr4Swf+&s0E4{R;^`l)!_U z=6s-f)rlIzci%p?UO%}^g9ZEeR|DV^rz#?pxdN@qZl-X zTZSxMuOV`WjXLdTF1|n!hFIXLyIOy&$p{({4ZsLI+T@|qef?(Ur6jjy(9r`h00K_X zxaLq>?Pg~;4?|1nQ0*oBU_;-t4Xec=eh!(Vah}pLiEjXe>^a7#@y_ds-kl!a#|2s`?JOC1dWq13T9pY+!p=H$=osFLRERw3fNmI&u-= zP#|G8hq=)F%U;u~)%-!JLQ8V$)k|0X4tykkXgc9+_s}_jYXlJgunin-ffXo*!JgZB z5BZUdaeek>J%D{3W1nnoB2kUm`XV2v6XJ^tcZXY@hqJ%8;xq@|`U71c#aXIxZTU@8 z60Vb5p@W|zEQ3CC{_0;^y+1w=o)QsY%0H!1P903#UF z9Xf1p>P)ZAJ;?j*#2X`FoXhIJ-a zpX<5wiFEgPo8XU)ti}wRbfpft5olb?Wci+h>0ZNo-Gg$ zisdYu&E=D{J>$+juqx$UvmD#0E$E{b%b@VP!SEhTc_&nfqX&In)(Mw>#FlOVDAF*`Y)cevhXeJ1NZCKwZHZ4`OfPN{%JSCik&MC}VemHIfRq6;B zS_XNZT?S38XNqAZSD#vb+8-<3?7Vb0irb!Yt9>DQZ@mO&LW5b2t8(hnYC^!s}k z%Qpu5s9aAs7H-q;Ei~OWoKT(}s%!@YU0MY1dj9@u6B4$x76W{rS@~L8hcfW{;+!sd zm_q_txK6pNT`$eXiT!AXJde%|-MCIPj-Ket#Gf;?HdHhMz{~(tF*`%yrfBF1vs_0^ zv7l`%L)LWl>N4oou503S5`|$D#t!GI&9&e5egRr61o~Qbm{35gE1L7kG+Y8ja{zyI z57`_yO>@Im?FR-?AaKJ~_uH{E=|G(GYVssgFW;k|YeP@_W2|)0| zHv#fVZ_UI?*9y&4yAtozL1_)URW%@YH)9bB;{gL3%;0sJQ@&K+rMdNJ2D0qVS*CS; z`gkyV;e=y5fIfXjtu&=MH$Ox}D(!M5 zJ3K|iB(xv}SSP~22W;_VzUu=lHPw5#V6Jh9{MsOYfim3Bw!(rz5tB7)9)mYy1q|9)BL$$=Eh(a3V3>h)fOvi9MLgsTh>O2mtwT5ZL zf>kg<~G8<8@ zpG;3jm+u7)BoP#S~&WLabjxwZoE^NT}f`NLt?4# zDL7Qnt%mW7pO%J&DuL$*Glufc=<2$48wWfrLHaFBM)&c*085-_4)F6(wZN`5`~Fi! z;7<)S7Wd{XUz@$&+|ZU)Q6%Vb4!&Ix2#b6$4rdwjfI(wcaR!i19-ndL^me5Fqd5eU zclF0{=h9RBI(X4#p1}iyw7^60%~UnP^Td3}(PDAJkE(ayoMEpgX$Q`6A-B5j%gPy9 z%y7d4nn53fK`ctDbso{Cq2lqUhnk`_w7l;rIP-0VN1qAHrkMTac+G~Zsg^t^-%M#l zm#23vsxK0@OI`_NU>P3#;MD8se|2qzagkn6`9$=C3w70PH{G`t6!Md*13B_4u6n60 z1Bkg)0)QC~jX_<*Hdl)_7?*7EP9hCjn^5c^4XjhL2>D(~c6hL%orgd4@-dVDrC;&d zW`1`0=Z_aL=HY?<3!jPkW}SQ>Fa~oCW_upEtO2x(%gn|#6?LL67Pgdjj~)bRNG|Zi zl=?=-VzYup0E^R)edPEo(xQfihC=DxS3B%AOBJq%-7n6@|F}rojuA!W4UZf4HF(zI z&!r)e=3Ql0=Q$S96+mRL0jRPqO=9CO!T5MiiYjA;ZZG=njYHMCKY9TqdAnhU@_R0y@DK|XFG3%OU_Le=-u)F}pRG@hFvW5GTycrzybQ;O=^eEPXQx-!2@wmAvm z{JdNifO3h3PY3C4p@|+se*>*YSgWmHgQMwejm^9k8 zrP46=_lzN6KcV^01JnJ}qSyYk+2V52j_dm8&UsLgtSqhJhv_Q9=jX>J8{6a>Tg@uj&NTvCkAE=Ff5W!_EN(q3yge|n%&jcTho}XhqC~{U&t_gZ zQr5M*h&c(DPbJ7e@=%HIzB2P`s?d8a(e8nrTA zUr7^%0{7hza4=^u$`^kizz_dkt)k$mvQ;oR_1I~Xp1$5~(~oY+^m{u?Mg_IfK~a*l zFoR_22?Q^!WLfT5`Cni3AF%P&B45({YG!7N-`Oeh>diN`7#1^#z2CoRw`G+&!z!KS zCSLdadoz~&q$GLl-i3xA6%V~y=ASE7#Z^*$N-_Cnqb(u%lQG?FniBq7C6?3ZLtfA5 zJ>B?OoKF6sJS~kg`;!6!5gQ|XPGQpnP)?!ZzQthlgGCqOM|AoJ|TLPQ2*lz?)udZZYG}W*eYAs69PSGI!t+|>w z&RZNfa=&lU14h9UM_r}YgIw{DXhXFyt`gJEa0u9I-10_8Dz7s9=Q4#^M3`$nIbD~S zwJ!m<%=0t=YSptJ22mh>I@ANL3jv%>fAj4CQ*xp3N@t~P0h|m|bE0eg>{H;^`Fb(D ze`w7w6;xesAZ}o^zmN#Z7*%Xu52aCPcDB0_E)WHTKDBGcc>upp{FiaJ5vg=3`zz^) zmax|)_l^jnpXXbK-%!e3=yZnW8Z%0cSw8wj=6~Ts@IZstwg=1{a@RyprBz>T$gqQ* z5loTEH3Tavs@?dOUu^E&-!B;snzv*W>#^b14rN4z)ve)f_q%6PIj}obZu72;N!D$VTm^2Y#M0cFGh-a!Vb-L! z?bEt)U^wOG5Xe{D#e&1ZilFj-jwOkrR`krHCtE{4p;v$^6Y=tl5S=61VzPwT4R$;a zEO=YMj@f+ne~W)pXOIXTVbi2w-6*9NP4vd(?S0r-YiM#%6gp(x8jDjJRT=`_c2Aa+ zdrQcHO%+sNS2rM@Xej1UY^aT8(aRu;)tt-^_x_x%?GgVE-;_~*DCfK@AxtDszj~-mvdY7kjxF8E^~thw=a^hK?w4G)mu){N zOn6R9J8PsdzC!yM2*3Dy|=$orv?1>D3&$-3V(mcJJNS4zJj`L812PakI|GXiu z)lwl*qFIc!DR4ze$NE*$4$X-}?Xn%G;SvLCr@Ob|uK#Vn$ z>-6lYPYs1BSb&p80(x-z^3VmDmW2=>1Qkg$GaIfut zEwCfL-`U8G>UQ4N_WYVCX^<$mAY3gcAhUC0ml40c(X}Gg!U0zdy%sF6?vdkk3dK>2 zw?6vnb@l$a`YMc4d2|o|qxKjFGU77dTPq=FlMXj{dl2-Rv)kOFdDJ}DKwzL~_+-P7 zFvwAcbE58MwcIh@*AUv26NNfVY|^X6Kcd(`oGfbbJMo7zuXyhHbB3(8)w{-U0GZJk zNTdc93k>$8%X6?u1c$KQOLD=4_PBoAHxgc|v9n*t-WCZ7FUbpD=wlckv2%;M9CZhK zJ|bPzUlAE!8#r8-PtpZ;0!dmHz%1AE%&xfA>i-M%)_~E8B99wk`CNHv6^X%>o#hyD zZ7j!CqL?vhJ-Ci?exNqqr6xt=Zw;ne!`;*vN?Hw7zc|*Rv(itRK63!hf$ zsWdI?7Oop$^eukjTv;TTH(23vP|?Ae=@O%SNS3}C3F~WCr}VGXnrnz@GtSOD43Lwf z0I2APY22+GYlB_DTI=^#Hbo!feA;>>?()uT zRvQBBt#p6~lc$hJ=FY}4& zkyWVuOI6g?Ne5g3pul(KtUJa@X6Scun|3L;ZU`$jkZf4Zdd@K5m33^ zT^qZrc5mm6WuMd;%rWyDl%BPkgI{$#&nU0Nk=5ve_$$Ap8T=)y{;2W#(4$@90d$g= zU*tBz)o<~aLi8UuSA_V~1{O&Y;_Sg}c~w|$_e?+m7hAL7Ug^B81Xb~1M{W3dD>t03 zF}p#m1yH}gcO^~Hz(7ff3B7hf{6`x9S~<$SMtY@ZxAHym_Jb3s>>ot+Qj=8AnkfME zA0fOGou#+C0~~1LHjRl)d>0}bzxP>-m5k2xAlIWda#%|*_|$xsLZnA zR^i_l!;s$hG&DOEx0KVXD{gsd`-Y(;J9nzPbRDI^4dCRM)E#2>#n7eOUbIC6AXDZY z{Z8W#MJA%3+XwRymu1iv#=*8Cq?koawHem*{zdq{X)3WTlL zH{6zFXQU%N4?HH1pK8g6oD?o((L)b$zI5zVcvMP93 zH8#Xq5!!q((5AAvTyEVms5>gvPNcUR?79%~S1kGcwx5+1N-lgImUL{s`~0}ksj^|i zLyw(m%C)t;I{5YH@pKEAS|#Y)=pYfI!Hi}qcH2ODWWt3Ry||$EY|%C=w!1IId?4gd z;efJj$fiBNujW5e@{TPBpjGN}`0@S5ru;znhL~rr)WD2cU_dvh0Y3O%dRKp6Z%npGI%TuJJvVh% zyF2A-(CoHRxn1ot=rE*%ESx(JS8D#4_@pmVI?gR0=cPNhc2Yhd(YgW3bh~iwWQupI zW-G9LXR$}^oBu!;UM+Gm~2;Oc(d)^7m+-Nqt_6dE^sen&D3sMI2WAD(ZGLNezg<~XBhst<#ey(jhWOWKfWQ&C|K0w(j# zuW!I#Z?Opoh<}9ma%|GhNJMuJF{&-6V~;aOM)acQSq5wqA-*@?)BAp&*IlJ_LN2*3 zfE!;~FwmOZP@^9VW%YD>?xVRaoTfdsW8cP7Vr@EA-|&XY4jWkHLr(uy!GL~$q=>e? z3})>0r02zmlT9C0%_0(0nCR7Y=EJ0t+}jHmI-x;?0G+acfDQFNS;3RbpzCL0OSi?r z`~-Q{q1lW~l7iX_XbF&C*MvOs*FE=VBy2gbW8K1-%wPYA zxYKd|Z*p}d!kiHuuo*8<9?yRG&DVlcVY7;eg*no*#!!BK#sZfsSMfai;VhX?ljOp9 zV{{D;sbjh@OWTQ+pLJUo7fo|F;w_@4pla8eHS$Wy!a6A-*11cvKj%eX7EN~hU?4YS zxRow}J2IQi;{J^L-b9XWIz7%K?$gs`fk5?5)j%`u}OKj&nKxzK53-(tY2S^W3ijHZNlj`Fb&!=`dwMrbt21k2TI z^m~2_%^2gAhpl3yZCxxTYH0Rt+4Uwo{AXpLjYKCL+Gk6Ik@hi1w;?SZ5IL8z6xWrx zED&C*r9A{nwcIP>&`r84IwI4*6{kWA6JuQcXntmV@cc~vl;YGR7aZ#N-Pd8GC3I6^ z*?x~6EM8Ur1+1TT(QR=**chcz3%nG5HRnibHvRJzq>YdiE_M*RBk|EyczP`ks=Luad)G?yQ; zGh>x>9ylP#QhhrBxEQyONQ%h7UtVJqMx|Njt+92lr+U)>|SINZ`N3tp2jMP1J^y zCZ_fPL_m(LdgP~$5~gjt-FOb4#sB~|XAz+?&(D?Wig`n(n!N&q=A)$(Hpvh(VVJeE z_D~?xmZLV8HBz4Z*?XmRvb^yDvjUg4slJ`P)#u!%F*+07eF<_Guhzs^f~{4Q!q7{V z|9kISdUebAVE{6xW4G-CN3Jb^_&02@rypS;O5nETE$-ia;;X_iU&ml|Ev_z!+zFe^ z2Qpt6b>{pz+_85kf(C%=v)bBF=|xJaNI0l#5dXr}YVE%{M>0;L>yeUNq2bTkFWAnS#Xv`=k(Qo% z-Ao5|Njo1O|0&dNF-m0V+H)q{FsT30jCLZb?We@s2FPe63DV}E{@&Dg$3+37RkC`# z3bDN}GNwG~DT{eR+&5{v09OQ%h2M|=6VSr{?BV8WLb0F@tjs^*+-Yztct3FOjMWmE zl(wrakVu{y;72w~1a!aP=%b_>?8$?s$eT6>>Yw1xB`HS*!POuE03Y^;)-eTW%J_B% zdf6_&SR3)f97eM^lf>jg>u7ftkKeHv${Y17;%ube(;)v35Zp`9t&1*1gWCd} z^qLjNdCGyg^yrgODArZ%TBPK+UGTw}*~K=^XIYKbDJU5XlSu)C9r_dS-87;EBX=crV_<8bXMuxOOSmnQ&?i+;YsK~ zme=5WEuH!UixRSf=tuNSGo%Z1e{{PG0&ac()%zH4d4XX=4K)%3SCw%LfIr^+Jw08(T zHNuK&2gYHIAK9E)`pSZ5;J2k1d+>66ibjb@qkcFFJHl!i^qwfom|JsnLjRFmT?n~d zNyQL%@1#b=|HQ(lp2ajE_m!u-khhQ&D(?PT>1vJ?5`*kXVdI5p6pe10l3BprDjR&j zYlklk4cKL!uXTQE`<>a;IL$0%?#W9byr%{F{*> zyD;{8o%}kRQ$p7hh>V-222|YN9gm6V=k-2|t)=z@D<|)1F3r8TVGdi{>nUCa`5=Ye zURl1aow}F(ES5SQppkWirmtMi(L{CI_Nz07%8;;c9Vi3=6D`s5Jii8GJgkkRJ3ragQp;TRJdC z93m#U^g9u%XHd_xLMxENWwLv~|D~p)A5{qfQ+7A+1TVoUrbpArz40U78}*a;1N5y- z7Ub-O-c|QAoU$8g*J0q-#-)7Vzuzy$xWAcZSGR8wMe^LEf{T#Wj@h#lMQu}sE-eH+ z(??pUO_#bo2M}s^7zNI}xT#VwR*So3q6RiP?~q3J$fnq0EK6g#ACPOzlrc;5MH!80z>YiME;Gw3aQqI$^>-8E)ElojBOT1dGNS^i$($$O-I zqf@>a18r{L=TFhhg6RqcRc1bL5IPmR8 zLXJzVdjr~`JUC1d#N`nv9-mhi#`N1SHFh3oXK$-&)qR*%$XDhiP}P&a+GJh_kQdos z@@nut3tYXX`calN9iKWaz1BXfeKNdtFZHQi&gIM&ifxo${}fF9uBxlQR4kOH@+mb& z^o?#*^#TN1he3zX13lxHZkYVQe{s|N3oTzlc-W#7N3M0}1M>M`>9m_m#?nBeDkKO^ zAKUhHFuuQ?$j6UJcDYs`TJ)P_sZX!<8gpIr3XGWupby^^raGq`io8hXNQ3QQdt`CH z-z|l%PGd{cFBv(du&wHyVSdCXw^ye>3}sTh6lA`R)fUs6pHaTF$Gg{b_+6oi5zL-;TPh8+ z$r<8e)ryylop&vP+KggbRjY$AULJz#;)F%mrQ9IRIqNXqx_|=o$e2BW@$g_c-w+Q; z^W``L{OKh-Q_^}b-Ed)Gp5@wgh-3{f;HJS1I0`XO;ktlsD`=`Rlv- z1Yz{eh21~S&eRu+dKc@1le6t@mbORi_@R_{qEedOe>u86yBH1?4*CMb&9?(#RuGO*qT z;MncZr|?qC7E0hd4%g}9*y+txLR7{wDArUV&X0c6j8`*Q)VYvbF7uP?7~C%0mM~{$ zf~{cOk2_P_n{u;wAgA<%xu(9v9dm$B8ivhr0i>bd_VNFT-_om$7`@+VC|=C#UTdnU z($HHOLeidVyr6Mc*x(pe4-OC>9eWTzlVnzJt@uLY*4a~*1$EPf!80*Me(>p~ykXO2 z(6q)4?BnQ)MJvx><)FHQ`*0_E-9G`49$f%zIBZ02o!NLYqndtWICv@Beh4pwAG7oi z9FTiZ8_x!m5+W_9lTrb0j-hFJoEXUQ-fRDY2x+a}b|EB|+fTQVF)uXu&0HD>9t(KE z4|tEh&hf%UQM37Vpk~1sjve+xV&Q_B7|0OkG@EaYaj@`}g8}-gO1A`H!Q>|v5KyXF z0Hp7eb(bC&0>sZ3rj|ifUsy{7fkASz%`#|k{jkTiFOK0J36N*ybrb^t3gFxO&cjOg zQn0z7Hh?F?YjDe;8=E&aTsv8=Yx!~f9Jf4Fel=xt?m+9uB~bAFf{d_exl3I`UFX`H zu`?HgTpGsc;C29MxT=NjA^T>Fx#rBb;hyy|C#s~m4Gmse4U=@xOb87vVQAvLf&x8f zmy)1m5li&eZ->rFABi@mDs98W=pTTLg_ZaMs5RC{o>yWWB#RJyP$%C$FZPiu#d~S^ z!!2terHC_~gT8IT6k)CHeETeY!57a@%vVT8sa|mB*3NTWI}OeIWB0a{jY7II*B^P+ z*Z;Qctq0zE;H?MVdf=@G-g@Az2i|(%tq0zE;H?MVdf=@G-g@Az2i|(%tq0zE;H?MV Qdf=@G{{Q!Y`f|_z0f&V`6aWAK literal 0 HcmV?d00001 diff --git a/build.yaml b/build.yaml index 8dbfe45d..17d5bc50 100644 --- a/build.yaml +++ b/build.yaml @@ -10,6 +10,8 @@ targets: explicit_to_json: true drift_dev: options: + databases: + app_db: lib/models/database/database.dart sql: dialect: sqlite options: diff --git a/drift_schemas/app_db/drift_schema_v1.json b/drift_schemas/app_db/drift_schema_v1.json new file mode 100644 index 00000000..b894446c --- /dev/null +++ b/drift_schemas/app_db/drift_schema_v1.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"authentication_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"cookie","getter_name":"cookie","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"access_token","getter_name":"accessToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"expiration","getter_name":"expiration","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"blacklist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"element_type","getter_name":"elementType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BlacklistedType.values)","dart_type_name":"BlacklistedType"}},{"name":"element_id","getter_name":"elementId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"preferences_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_quality","getter_name":"audioQuality","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceQualities.high.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceQualities.values)","dart_type_name":"SourceQualities"}},{"name":"album_color_sync","getter_name":"albumColorSync","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"album_color_sync\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"album_color_sync\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"amoled_dark_theme","getter_name":"amoledDarkTheme","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"amoled_dark_theme\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"amoled_dark_theme\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"check_update","getter_name":"checkUpdate","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"check_update\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"check_update\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"normalize_audio","getter_name":"normalizeAudio","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"normalize_audio\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"normalize_audio\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"show_system_tray_icon","getter_name":"showSystemTrayIcon","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"show_system_tray_icon\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"show_system_tray_icon\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"system_title_bar","getter_name":"systemTitleBar","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"system_title_bar\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"system_title_bar\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"skip_non_music","getter_name":"skipNonMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"skip_non_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"skip_non_music\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"close_behavior","getter_name":"closeBehavior","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(CloseBehavior.close.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CloseBehavior.values)","dart_type_name":"CloseBehavior"}},{"name":"accent_color_scheme","getter_name":"accentColorScheme","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"Blue:0xFF2196F3\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeColorConverter()","dart_type_name":"SpotubeColor"}},{"name":"layout_mode","getter_name":"layoutMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(LayoutMode.adaptive.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(LayoutMode.values)","dart_type_name":"LayoutMode"}},{"name":"locale","getter_name":"locale","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('{\"languageCode\":\"system\",\"countryCode\":\"system\"}')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const LocaleConverter()","dart_type_name":"Locale"}},{"name":"market","getter_name":"market","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(Market.US.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(Market.values)","dart_type_name":"Market"}},{"name":"search_mode","getter_name":"searchMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SearchMode.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SearchMode.values)","dart_type_name":"SearchMode"}},{"name":"download_location","getter_name":"downloadLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[]},{"name":"local_library_location","getter_name":"localLibraryLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}},{"name":"piped_instance","getter_name":"pipedInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://pipedapi.kavin.rocks\")","default_client_dart":null,"dsl_features":[]},{"name":"theme_mode","getter_name":"themeMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(ThemeMode.system.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ThemeMode.values)","dart_type_name":"ThemeMode"}},{"name":"audio_source","getter_name":"audioSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(AudioSource.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(AudioSource.values)","dart_type_name":"AudioSource"}},{"name":"stream_music_codec","getter_name":"streamMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.weba.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"download_music_codec","getter_name":"downloadMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.m4a.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"discord_presence","getter_name":"discordPresence","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"discord_presence\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"discord_presence\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"endless_playback","getter_name":"endlessPlayback","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"endless_playback\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"endless_playback\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"enable_connect","getter_name":"enableConnect","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"enable_connect\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"enable_connect\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"scrobbler_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"password_hash","getter_name":"passwordHash","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"skip_segment_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"start","getter_name":"start","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end","getter_name":"end","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"source_match_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_id","getter_name":"sourceId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_type","getter_name":"sourceType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceType.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceType.values)","dart_type_name":"SourceType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[],"type":"table","data":{"name":"audio_player_state_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playing","getter_name":"playing","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"playing\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"playing\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"loop_mode","getter_name":"loopMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(PlaylistMode.values)","dart_type_name":"PlaylistMode"}},{"name":"shuffled","getter_name":"shuffled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"shuffled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"shuffled\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"collections","getter_name":"collections","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"references":[6],"type":"table","data":{"name":"playlist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_player_state_id","getter_name":"audioPlayerStateId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES audio_player_state_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES audio_player_state_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"index","getter_name":"index","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":8,"references":[7],"type":"table","data":{"name":"playlist_media_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playlist_id","getter_name":"playlistId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES playlist_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES playlist_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"uri","getter_name":"uri","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"extras","getter_name":"extras","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}},{"name":"http_headers","getter_name":"httpHeaders","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":9,"references":[],"type":"table","data":{"name":"history_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(HistoryEntryType.values)","dart_type_name":"HistoryEntryType"}},{"name":"item_id","getter_name":"itemId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[],"type":"table","data":{"name":"lyrics_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"SubtitleTypeConverter()","dart_type_name":"SubtitleSimple"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":11,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":12,"references":[5],"type":"index","data":{"on":5,"name":"uniq_track_match","sql":null,"unique":true,"columns":["track_id","source_id","source_type"]}}]} \ No newline at end of file diff --git a/drift_schemas/app_db/drift_schema_v2.json b/drift_schemas/app_db/drift_schema_v2.json new file mode 100644 index 00000000..668afb3f --- /dev/null +++ b/drift_schemas/app_db/drift_schema_v2.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"authentication_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"cookie","getter_name":"cookie","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"access_token","getter_name":"accessToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"expiration","getter_name":"expiration","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"blacklist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"element_type","getter_name":"elementType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BlacklistedType.values)","dart_type_name":"BlacklistedType"}},{"name":"element_id","getter_name":"elementId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"preferences_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_quality","getter_name":"audioQuality","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceQualities.high.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceQualities.values)","dart_type_name":"SourceQualities"}},{"name":"album_color_sync","getter_name":"albumColorSync","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"album_color_sync\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"album_color_sync\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"amoled_dark_theme","getter_name":"amoledDarkTheme","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"amoled_dark_theme\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"amoled_dark_theme\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"check_update","getter_name":"checkUpdate","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"check_update\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"check_update\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"normalize_audio","getter_name":"normalizeAudio","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"normalize_audio\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"normalize_audio\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"show_system_tray_icon","getter_name":"showSystemTrayIcon","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"show_system_tray_icon\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"show_system_tray_icon\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"system_title_bar","getter_name":"systemTitleBar","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"system_title_bar\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"system_title_bar\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"skip_non_music","getter_name":"skipNonMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"skip_non_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"skip_non_music\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"close_behavior","getter_name":"closeBehavior","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(CloseBehavior.close.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CloseBehavior.values)","dart_type_name":"CloseBehavior"}},{"name":"accent_color_scheme","getter_name":"accentColorScheme","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"Blue:0xFF2196F3\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeColorConverter()","dart_type_name":"SpotubeColor"}},{"name":"layout_mode","getter_name":"layoutMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(LayoutMode.adaptive.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(LayoutMode.values)","dart_type_name":"LayoutMode"}},{"name":"locale","getter_name":"locale","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('{\"languageCode\":\"system\",\"countryCode\":\"system\"}')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const LocaleConverter()","dart_type_name":"Locale"}},{"name":"market","getter_name":"market","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(Market.US.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(Market.values)","dart_type_name":"Market"}},{"name":"search_mode","getter_name":"searchMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SearchMode.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SearchMode.values)","dart_type_name":"SearchMode"}},{"name":"download_location","getter_name":"downloadLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[]},{"name":"local_library_location","getter_name":"localLibraryLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}},{"name":"piped_instance","getter_name":"pipedInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://pipedapi.kavin.rocks\")","default_client_dart":null,"dsl_features":[]},{"name":"invidious_instance","getter_name":"invidiousInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://inv.nadeko.net\")","default_client_dart":null,"dsl_features":[]},{"name":"theme_mode","getter_name":"themeMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(ThemeMode.system.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ThemeMode.values)","dart_type_name":"ThemeMode"}},{"name":"audio_source","getter_name":"audioSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(AudioSource.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(AudioSource.values)","dart_type_name":"AudioSource"}},{"name":"stream_music_codec","getter_name":"streamMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.weba.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"download_music_codec","getter_name":"downloadMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.m4a.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"discord_presence","getter_name":"discordPresence","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"discord_presence\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"discord_presence\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"endless_playback","getter_name":"endlessPlayback","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"endless_playback\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"endless_playback\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"enable_connect","getter_name":"enableConnect","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"enable_connect\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"enable_connect\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"scrobbler_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"password_hash","getter_name":"passwordHash","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"skip_segment_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"start","getter_name":"start","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end","getter_name":"end","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"source_match_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_id","getter_name":"sourceId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_type","getter_name":"sourceType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceType.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceType.values)","dart_type_name":"SourceType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[],"type":"table","data":{"name":"audio_player_state_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playing","getter_name":"playing","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"playing\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"playing\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"loop_mode","getter_name":"loopMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(PlaylistMode.values)","dart_type_name":"PlaylistMode"}},{"name":"shuffled","getter_name":"shuffled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"shuffled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"shuffled\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"collections","getter_name":"collections","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"references":[6],"type":"table","data":{"name":"playlist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_player_state_id","getter_name":"audioPlayerStateId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES audio_player_state_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES audio_player_state_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"index","getter_name":"index","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":8,"references":[7],"type":"table","data":{"name":"playlist_media_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playlist_id","getter_name":"playlistId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES playlist_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES playlist_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"uri","getter_name":"uri","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"extras","getter_name":"extras","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}},{"name":"http_headers","getter_name":"httpHeaders","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":9,"references":[],"type":"table","data":{"name":"history_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(HistoryEntryType.values)","dart_type_name":"HistoryEntryType"}},{"name":"item_id","getter_name":"itemId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[],"type":"table","data":{"name":"lyrics_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"SubtitleTypeConverter()","dart_type_name":"SubtitleSimple"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":11,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":12,"references":[5],"type":"index","data":{"on":5,"name":"uniq_track_match","sql":null,"unique":true,"columns":["track_id","source_id","source_type"]}}]} \ No newline at end of file diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart index cff5b74f..f10242e8 100644 --- a/lib/collections/assets.gen.dart +++ b/lib/collections/assets.gen.dart @@ -49,6 +49,7 @@ class Assets { AssetGenImage('assets/bengali-patterns-bg.jpg'); static const AssetGenImage branding = AssetGenImage('assets/branding.png'); static const AssetGenImage emptyBox = AssetGenImage('assets/empty_box.png'); + static const AssetGenImage invidious = AssetGenImage('assets/invidious.jpg'); static const AssetGenImage jiosaavn = AssetGenImage('assets/jiosaavn.png'); static const AssetGenImage likedTracks = AssetGenImage('assets/liked-tracks.jpg'); @@ -95,6 +96,7 @@ class Assets { bengaliPatternsBg, branding, emptyBox, + invidious, jiosaavn, likedTracks, placeholder, diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c63f8543..27a64c87 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -190,6 +190,9 @@ "piped_instance": "Piped Server Instance", "piped_description": "The Piped server instance to use for track matching", "piped_warning": "Some of them might not work well. So use at your own risk", + "invidious_instance": "Invidious Server Instance", + "invidious_description": "The Invidious server instance to use for track matching", + "invidious_warning": "Some of them might not work well. So use at your own risk", "generate_playlist": "Generate Playlist", "track_exists": "Track {track} already exists", "replace_downloaded_tracks": "Replace all downloaded tracks", @@ -307,6 +310,7 @@ "youtube_source_description": "Recommended and works best.", "piped_source_description": "Feeling free? Same as YouTube but a lot free.", "jiosaavn_source_description": "Best for South Asian region.", + "invidious_source_description": "Similar to Piped but with higher availability.", "highest_quality": "Highest Quality: {quality}", "select_audio_source": "Select Audio Source", "endless_playback_description": "Automatically append new songs\nto the end of the queue", diff --git a/lib/models/connect/connect.g.dart b/lib/models/connect/connect.g.dart index f297024b..10f46c65 100644 --- a/lib/models/connect/connect.g.dart +++ b/lib/models/connect/connect.g.dart @@ -16,7 +16,7 @@ _$WebSocketLoadEventDataPlaylistImpl ? null : PlaylistSimple.fromJson( Map.from(json['collection'] as Map)), - initialIndex: json['initialIndex'] as int?, + initialIndex: (json['initialIndex'] as num?)?.toInt(), $type: json['runtimeType'] as String?, ); @@ -39,7 +39,7 @@ _$WebSocketLoadEventDataAlbumImpl _$$WebSocketLoadEventDataAlbumImplFromJson( ? null : AlbumSimple.fromJson( Map.from(json['collection'] as Map)), - initialIndex: json['initialIndex'] as int?, + initialIndex: (json['initialIndex'] as num?)?.toInt(), $type: json['runtimeType'] as String?, ); diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart index 412e6868..8bb32bd5 100644 --- a/lib/models/database/database.dart +++ b/lib/models/database/database.dart @@ -9,6 +9,7 @@ import 'package:media_kit/media_kit.dart' hide Track; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:spotify/spotify.dart' hide Playlist; +import 'package:spotube/models/database/database.steps.dart'; import 'package:spotube/models/lyrics.dart'; import 'package:spotube/services/kv_store/encrypted_kv_store.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; @@ -57,7 +58,20 @@ class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); @override - int get schemaVersion => 1; + int get schemaVersion => 2; + + @override + MigrationStrategy get migration { + return MigrationStrategy( + onUpgrade: stepByStep(from1To2: (m, schema) async { + // Add invidiousInstance column to preferences table + await m.addColumn( + schema.preferencesTable, + schema.preferencesTable.invidiousInstance, + ); + }), + ); + } } LazyDatabase _openConnection() { diff --git a/lib/models/database/database.g.dart b/lib/models/database/database.g.dart index 1e585fa8..def70bd2 100644 --- a/lib/models/database/database.g.dart +++ b/lib/models/database/database.g.dart @@ -167,6 +167,17 @@ class AuthenticationTableData extends DataClass accessToken: accessToken ?? this.accessToken, expiration: expiration ?? this.expiration, ); + AuthenticationTableData copyWithCompanion(AuthenticationTableCompanion data) { + return AuthenticationTableData( + id: data.id.present ? data.id.value : this.id, + cookie: data.cookie.present ? data.cookie.value : this.cookie, + accessToken: + data.accessToken.present ? data.accessToken.value : this.accessToken, + expiration: + data.expiration.present ? data.expiration.value : this.expiration, + ); + } + @override String toString() { return (StringBuffer('AuthenticationTableData(') @@ -430,6 +441,16 @@ class BlacklistTableData extends DataClass elementType: elementType ?? this.elementType, elementId: elementId ?? this.elementId, ); + BlacklistTableData copyWithCompanion(BlacklistTableCompanion data) { + return BlacklistTableData( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + elementType: + data.elementType.present ? data.elementType.value : this.elementType, + elementId: data.elementId.present ? data.elementId.value : this.elementId, + ); + } + @override String toString() { return (StringBuffer('BlacklistTableData(') @@ -712,6 +733,14 @@ class $PreferencesTableTable extends PreferencesTable type: DriftSqlType.string, requiredDuringInsert: false, defaultValue: const Constant("https://pipedapi.kavin.rocks")); + static const VerificationMeta _invidiousInstanceMeta = + const VerificationMeta('invidiousInstance'); + @override + late final GeneratedColumn invidiousInstance = + GeneratedColumn('invidious_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://inv.nadeko.net")); static const VerificationMeta _themeModeMeta = const VerificationMeta('themeMode'); @override @@ -803,6 +832,7 @@ class $PreferencesTableTable extends PreferencesTable downloadLocation, localLibraryLocation, pipedInstance, + invidiousInstance, themeMode, audioSource, streamMusicCodec, @@ -888,6 +918,12 @@ class $PreferencesTableTable extends PreferencesTable pipedInstance.isAcceptableOrUnknown( data['piped_instance']!, _pipedInstanceMeta)); } + if (data.containsKey('invidious_instance')) { + context.handle( + _invidiousInstanceMeta, + invidiousInstance.isAcceptableOrUnknown( + data['invidious_instance']!, _invidiousInstanceMeta)); + } context.handle(_themeModeMeta, const VerificationResult.success()); context.handle(_audioSourceMeta, const VerificationResult.success()); context.handle(_streamMusicCodecMeta, const VerificationResult.success()); @@ -964,6 +1000,8 @@ class $PreferencesTableTable extends PreferencesTable data['${effectivePrefix}local_library_location'])!), pipedInstance: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}piped_instance'])!, + invidiousInstance: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}invidious_instance'])!, themeMode: $PreferencesTableTable.$converterthemeMode.fromSql( attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}theme_mode'])!), @@ -1040,6 +1078,7 @@ class PreferencesTableData extends DataClass final String downloadLocation; final List localLibraryLocation; final String pipedInstance; + final String invidiousInstance; final ThemeMode themeMode; final AudioSource audioSource; final SourceCodecs streamMusicCodec; @@ -1066,6 +1105,7 @@ class PreferencesTableData extends DataClass required this.downloadLocation, required this.localLibraryLocation, required this.pipedInstance, + required this.invidiousInstance, required this.themeMode, required this.audioSource, required this.streamMusicCodec, @@ -1120,6 +1160,7 @@ class PreferencesTableData extends DataClass .toSql(localLibraryLocation)); } map['piped_instance'] = Variable(pipedInstance); + map['invidious_instance'] = Variable(invidiousInstance); { map['theme_mode'] = Variable( $PreferencesTableTable.$converterthemeMode.toSql(themeMode)); @@ -1164,6 +1205,7 @@ class PreferencesTableData extends DataClass downloadLocation: Value(downloadLocation), localLibraryLocation: Value(localLibraryLocation), pipedInstance: Value(pipedInstance), + invidiousInstance: Value(invidiousInstance), themeMode: Value(themeMode), audioSource: Value(audioSource), streamMusicCodec: Value(streamMusicCodec), @@ -1203,6 +1245,7 @@ class PreferencesTableData extends DataClass localLibraryLocation: serializer.fromJson>(json['localLibraryLocation']), pipedInstance: serializer.fromJson(json['pipedInstance']), + invidiousInstance: serializer.fromJson(json['invidiousInstance']), themeMode: $PreferencesTableTable.$converterthemeMode .fromJson(serializer.fromJson(json['themeMode'])), audioSource: $PreferencesTableTable.$converteraudioSource @@ -1244,6 +1287,7 @@ class PreferencesTableData extends DataClass 'localLibraryLocation': serializer.toJson>(localLibraryLocation), 'pipedInstance': serializer.toJson(pipedInstance), + 'invidiousInstance': serializer.toJson(invidiousInstance), 'themeMode': serializer.toJson( $PreferencesTableTable.$converterthemeMode.toJson(themeMode)), 'audioSource': serializer.toJson( @@ -1279,6 +1323,7 @@ class PreferencesTableData extends DataClass String? downloadLocation, List? localLibraryLocation, String? pipedInstance, + String? invidiousInstance, ThemeMode? themeMode, AudioSource? audioSource, SourceCodecs? streamMusicCodec, @@ -1305,6 +1350,7 @@ class PreferencesTableData extends DataClass downloadLocation: downloadLocation ?? this.downloadLocation, localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, themeMode: themeMode ?? this.themeMode, audioSource: audioSource ?? this.audioSource, streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, @@ -1313,6 +1359,77 @@ class PreferencesTableData extends DataClass endlessPlayback: endlessPlayback ?? this.endlessPlayback, enableConnect: enableConnect ?? this.enableConnect, ); + PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) { + return PreferencesTableData( + id: data.id.present ? data.id.value : this.id, + audioQuality: data.audioQuality.present + ? data.audioQuality.value + : this.audioQuality, + albumColorSync: data.albumColorSync.present + ? data.albumColorSync.value + : this.albumColorSync, + amoledDarkTheme: data.amoledDarkTheme.present + ? data.amoledDarkTheme.value + : this.amoledDarkTheme, + checkUpdate: + data.checkUpdate.present ? data.checkUpdate.value : this.checkUpdate, + normalizeAudio: data.normalizeAudio.present + ? data.normalizeAudio.value + : this.normalizeAudio, + showSystemTrayIcon: data.showSystemTrayIcon.present + ? data.showSystemTrayIcon.value + : this.showSystemTrayIcon, + systemTitleBar: data.systemTitleBar.present + ? data.systemTitleBar.value + : this.systemTitleBar, + skipNonMusic: data.skipNonMusic.present + ? data.skipNonMusic.value + : this.skipNonMusic, + closeBehavior: data.closeBehavior.present + ? data.closeBehavior.value + : this.closeBehavior, + accentColorScheme: data.accentColorScheme.present + ? data.accentColorScheme.value + : this.accentColorScheme, + layoutMode: + data.layoutMode.present ? data.layoutMode.value : this.layoutMode, + locale: data.locale.present ? data.locale.value : this.locale, + market: data.market.present ? data.market.value : this.market, + searchMode: + data.searchMode.present ? data.searchMode.value : this.searchMode, + downloadLocation: data.downloadLocation.present + ? data.downloadLocation.value + : this.downloadLocation, + localLibraryLocation: data.localLibraryLocation.present + ? data.localLibraryLocation.value + : this.localLibraryLocation, + pipedInstance: data.pipedInstance.present + ? data.pipedInstance.value + : this.pipedInstance, + invidiousInstance: data.invidiousInstance.present + ? data.invidiousInstance.value + : this.invidiousInstance, + themeMode: data.themeMode.present ? data.themeMode.value : this.themeMode, + audioSource: + data.audioSource.present ? data.audioSource.value : this.audioSource, + streamMusicCodec: data.streamMusicCodec.present + ? data.streamMusicCodec.value + : this.streamMusicCodec, + downloadMusicCodec: data.downloadMusicCodec.present + ? data.downloadMusicCodec.value + : this.downloadMusicCodec, + discordPresence: data.discordPresence.present + ? data.discordPresence.value + : this.discordPresence, + endlessPlayback: data.endlessPlayback.present + ? data.endlessPlayback.value + : this.endlessPlayback, + enableConnect: data.enableConnect.present + ? data.enableConnect.value + : this.enableConnect, + ); + } + @override String toString() { return (StringBuffer('PreferencesTableData(') @@ -1334,6 +1451,7 @@ class PreferencesTableData extends DataClass ..write('downloadLocation: $downloadLocation, ') ..write('localLibraryLocation: $localLibraryLocation, ') ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') ..write('themeMode: $themeMode, ') ..write('audioSource: $audioSource, ') ..write('streamMusicCodec: $streamMusicCodec, ') @@ -1365,6 +1483,7 @@ class PreferencesTableData extends DataClass downloadLocation, localLibraryLocation, pipedInstance, + invidiousInstance, themeMode, audioSource, streamMusicCodec, @@ -1395,6 +1514,7 @@ class PreferencesTableData extends DataClass other.downloadLocation == this.downloadLocation && other.localLibraryLocation == this.localLibraryLocation && other.pipedInstance == this.pipedInstance && + other.invidiousInstance == this.invidiousInstance && other.themeMode == this.themeMode && other.audioSource == this.audioSource && other.streamMusicCodec == this.streamMusicCodec && @@ -1423,6 +1543,7 @@ class PreferencesTableCompanion extends UpdateCompanion { final Value downloadLocation; final Value> localLibraryLocation; final Value pipedInstance; + final Value invidiousInstance; final Value themeMode; final Value audioSource; final Value streamMusicCodec; @@ -1449,6 +1570,7 @@ class PreferencesTableCompanion extends UpdateCompanion { this.downloadLocation = const Value.absent(), this.localLibraryLocation = const Value.absent(), this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), this.themeMode = const Value.absent(), this.audioSource = const Value.absent(), this.streamMusicCodec = const Value.absent(), @@ -1476,6 +1598,7 @@ class PreferencesTableCompanion extends UpdateCompanion { this.downloadLocation = const Value.absent(), this.localLibraryLocation = const Value.absent(), this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), this.themeMode = const Value.absent(), this.audioSource = const Value.absent(), this.streamMusicCodec = const Value.absent(), @@ -1503,6 +1626,7 @@ class PreferencesTableCompanion extends UpdateCompanion { Expression? downloadLocation, Expression? localLibraryLocation, Expression? pipedInstance, + Expression? invidiousInstance, Expression? themeMode, Expression? audioSource, Expression? streamMusicCodec, @@ -1532,6 +1656,7 @@ class PreferencesTableCompanion extends UpdateCompanion { if (localLibraryLocation != null) 'local_library_location': localLibraryLocation, if (pipedInstance != null) 'piped_instance': pipedInstance, + if (invidiousInstance != null) 'invidious_instance': invidiousInstance, if (themeMode != null) 'theme_mode': themeMode, if (audioSource != null) 'audio_source': audioSource, if (streamMusicCodec != null) 'stream_music_codec': streamMusicCodec, @@ -1562,6 +1687,7 @@ class PreferencesTableCompanion extends UpdateCompanion { Value? downloadLocation, Value>? localLibraryLocation, Value? pipedInstance, + Value? invidiousInstance, Value? themeMode, Value? audioSource, Value? streamMusicCodec, @@ -1588,6 +1714,7 @@ class PreferencesTableCompanion extends UpdateCompanion { downloadLocation: downloadLocation ?? this.downloadLocation, localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, themeMode: themeMode ?? this.themeMode, audioSource: audioSource ?? this.audioSource, streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, @@ -1667,6 +1794,9 @@ class PreferencesTableCompanion extends UpdateCompanion { if (pipedInstance.present) { map['piped_instance'] = Variable(pipedInstance.value); } + if (invidiousInstance.present) { + map['invidious_instance'] = Variable(invidiousInstance.value); + } if (themeMode.present) { map['theme_mode'] = Variable( $PreferencesTableTable.$converterthemeMode.toSql(themeMode.value)); @@ -1719,6 +1849,7 @@ class PreferencesTableCompanion extends UpdateCompanion { ..write('downloadLocation: $downloadLocation, ') ..write('localLibraryLocation: $localLibraryLocation, ') ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') ..write('themeMode: $themeMode, ') ..write('audioSource: $audioSource, ') ..write('streamMusicCodec: $streamMusicCodec, ') @@ -1890,6 +2021,17 @@ class ScrobblerTableData extends DataClass username: username ?? this.username, passwordHash: passwordHash ?? this.passwordHash, ); + ScrobblerTableData copyWithCompanion(ScrobblerTableCompanion data) { + return ScrobblerTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + username: data.username.present ? data.username.value : this.username, + passwordHash: data.passwordHash.present + ? data.passwordHash.value + : this.passwordHash, + ); + } + @override String toString() { return (StringBuffer('ScrobblerTableData(') @@ -2165,6 +2307,16 @@ class SkipSegmentTableData extends DataClass trackId: trackId ?? this.trackId, createdAt: createdAt ?? this.createdAt, ); + SkipSegmentTableData copyWithCompanion(SkipSegmentTableCompanion data) { + return SkipSegmentTableData( + id: data.id.present ? data.id.value : this.id, + start: data.start.present ? data.start.value : this.start, + end: data.end.present ? data.end.value : this.end, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + @override String toString() { return (StringBuffer('SkipSegmentTableData(') @@ -2463,6 +2615,17 @@ class SourceMatchTableData extends DataClass sourceType: sourceType ?? this.sourceType, createdAt: createdAt ?? this.createdAt, ); + SourceMatchTableData copyWithCompanion(SourceMatchTableCompanion data) { + return SourceMatchTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId, + sourceType: + data.sourceType.present ? data.sourceType.value : this.sourceType, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + @override String toString() { return (StringBuffer('SourceMatchTableData(') @@ -2769,6 +2932,18 @@ class AudioPlayerStateTableData extends DataClass shuffled: shuffled ?? this.shuffled, collections: collections ?? this.collections, ); + AudioPlayerStateTableData copyWithCompanion( + AudioPlayerStateTableCompanion data) { + return AudioPlayerStateTableData( + id: data.id.present ? data.id.value : this.id, + playing: data.playing.present ? data.playing.value : this.playing, + loopMode: data.loopMode.present ? data.loopMode.value : this.loopMode, + shuffled: data.shuffled.present ? data.shuffled.value : this.shuffled, + collections: + data.collections.present ? data.collections.value : this.collections, + ); + } + @override String toString() { return (StringBuffer('AudioPlayerStateTableData(') @@ -3019,6 +3194,16 @@ class PlaylistTableData extends DataClass audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, index: index ?? this.index, ); + PlaylistTableData copyWithCompanion(PlaylistTableCompanion data) { + return PlaylistTableData( + id: data.id.present ? data.id.value : this.id, + audioPlayerStateId: data.audioPlayerStateId.present + ? data.audioPlayerStateId.value + : this.audioPlayerStateId, + index: data.index.present ? data.index.value : this.index, + ); + } + @override String toString() { return (StringBuffer('PlaylistTableData(') @@ -3210,11 +3395,11 @@ class $PlaylistMediaTableTable extends PlaylistMediaTable } static TypeConverter, String> $converterextras = - const MapTypeConverter(); + const MapTypeConverter(); static TypeConverter?, String?> $converterextrasn = NullAwareTypeConverter.wrap($converterextras); static TypeConverter, String> $converterhttpHeaders = - const MapTypeConverter(); + const MapTypeConverter(); static TypeConverter?, String?> $converterhttpHeadersn = NullAwareTypeConverter.wrap($converterhttpHeaders); } @@ -3299,6 +3484,18 @@ class PlaylistMediaTableData extends DataClass extras: extras.present ? extras.value : this.extras, httpHeaders: httpHeaders.present ? httpHeaders.value : this.httpHeaders, ); + PlaylistMediaTableData copyWithCompanion(PlaylistMediaTableCompanion data) { + return PlaylistMediaTableData( + id: data.id.present ? data.id.value : this.id, + playlistId: + data.playlistId.present ? data.playlistId.value : this.playlistId, + uri: data.uri.present ? data.uri.value : this.uri, + extras: data.extras.present ? data.extras.value : this.extras, + httpHeaders: + data.httpHeaders.present ? data.httpHeaders.value : this.httpHeaders, + ); + } + @override String toString() { return (StringBuffer('PlaylistMediaTableData(') @@ -3514,7 +3711,7 @@ class $HistoryTableTable extends HistoryTable static JsonTypeConverter2 $convertertype = const EnumNameConverter(HistoryEntryType.values); static TypeConverter, String> $converterdata = - const MapTypeConverter(); + const MapTypeConverter(); } class HistoryTableData extends DataClass @@ -3595,6 +3792,16 @@ class HistoryTableData extends DataClass itemId: itemId ?? this.itemId, data: data ?? this.data, ); + HistoryTableData copyWithCompanion(HistoryTableCompanion data) { + return HistoryTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + type: data.type.present ? data.type.value : this.type, + itemId: data.itemId.present ? data.itemId.value : this.itemId, + data: data.data.present ? data.data.value : this.data, + ); + } + @override String toString() { return (StringBuffer('HistoryTableData(') @@ -3837,6 +4044,14 @@ class LyricsTableData extends DataClass implements Insertable { trackId: trackId ?? this.trackId, data: data ?? this.data, ); + LyricsTableData copyWithCompanion(LyricsTableCompanion data) { + return LyricsTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + data: data.data.present ? data.data.value : this.data, + ); + } + @override String toString() { return (StringBuffer('LyricsTableData(') @@ -3923,7 +4138,7 @@ class LyricsTableCompanion extends UpdateCompanion { abstract class _$AppDatabase extends GeneratedDatabase { _$AppDatabase(QueryExecutor e) : super(e); - _$AppDatabaseManager get managers => _$AppDatabaseManager(this); + $AppDatabaseManager get managers => $AppDatabaseManager(this); late final $AuthenticationTableTable authenticationTable = $AuthenticationTableTable(this); late final $BlacklistTableTable blacklistTable = $BlacklistTableTable(this); @@ -3966,7 +4181,7 @@ abstract class _$AppDatabase extends GeneratedDatabase { ]; } -typedef $$AuthenticationTableTableInsertCompanionBuilder +typedef $$AuthenticationTableTableCreateCompanionBuilder = AuthenticationTableCompanion Function({ Value id, required DecryptedText cookie, @@ -3981,27 +4196,107 @@ typedef $$AuthenticationTableTableUpdateCompanionBuilder Value expiration, }); +class $$AuthenticationTableTableFilterComposer + extends Composer<_$AppDatabase, $AuthenticationTableTable> { + $$AuthenticationTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get cookie => $composableBuilder( + column: $table.cookie, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get accessToken => $composableBuilder( + column: $table.accessToken, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get expiration => $composableBuilder( + column: $table.expiration, builder: (column) => ColumnFilters(column)); +} + +class $$AuthenticationTableTableOrderingComposer + extends Composer<_$AppDatabase, $AuthenticationTableTable> { + $$AuthenticationTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get cookie => $composableBuilder( + column: $table.cookie, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get accessToken => $composableBuilder( + column: $table.accessToken, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get expiration => $composableBuilder( + column: $table.expiration, builder: (column) => ColumnOrderings(column)); +} + +class $$AuthenticationTableTableAnnotationComposer + extends Composer<_$AppDatabase, $AuthenticationTableTable> { + $$AuthenticationTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumnWithTypeConverter get cookie => + $composableBuilder(column: $table.cookie, builder: (column) => column); + + GeneratedColumnWithTypeConverter get accessToken => + $composableBuilder( + column: $table.accessToken, builder: (column) => column); + + GeneratedColumn get expiration => $composableBuilder( + column: $table.expiration, builder: (column) => column); +} + class $$AuthenticationTableTableTableManager extends RootTableManager< _$AppDatabase, $AuthenticationTableTable, AuthenticationTableData, $$AuthenticationTableTableFilterComposer, $$AuthenticationTableTableOrderingComposer, - $$AuthenticationTableTableProcessedTableManager, - $$AuthenticationTableTableInsertCompanionBuilder, - $$AuthenticationTableTableUpdateCompanionBuilder> { + $$AuthenticationTableTableAnnotationComposer, + $$AuthenticationTableTableCreateCompanionBuilder, + $$AuthenticationTableTableUpdateCompanionBuilder, + ( + AuthenticationTableData, + BaseReferences<_$AppDatabase, $AuthenticationTableTable, + AuthenticationTableData> + ), + AuthenticationTableData, + PrefetchHooks Function()> { $$AuthenticationTableTableTableManager( _$AppDatabase db, $AuthenticationTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: $$AuthenticationTableTableFilterComposer( - ComposerState(db, table)), - orderingComposer: $$AuthenticationTableTableOrderingComposer( - ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$AuthenticationTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$AuthenticationTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$AuthenticationTableTableOrderingComposer( + $db: db, $table: table), + createComputedFieldComposer: () => + $$AuthenticationTableTableAnnotationComposer( + $db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value cookie = const Value.absent(), Value accessToken = const Value.absent(), @@ -4013,7 +4308,7 @@ class $$AuthenticationTableTableTableManager extends RootTableManager< accessToken: accessToken, expiration: expiration, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required DecryptedText cookie, required DecryptedText accessToken, @@ -4025,75 +4320,30 @@ class $$AuthenticationTableTableTableManager extends RootTableManager< accessToken: accessToken, expiration: expiration, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$AuthenticationTableTableProcessedTableManager - extends ProcessedTableManager< - _$AppDatabase, - $AuthenticationTableTable, - AuthenticationTableData, - $$AuthenticationTableTableFilterComposer, - $$AuthenticationTableTableOrderingComposer, - $$AuthenticationTableTableProcessedTableManager, - $$AuthenticationTableTableInsertCompanionBuilder, - $$AuthenticationTableTableUpdateCompanionBuilder> { - $$AuthenticationTableTableProcessedTableManager(super.$state); -} - -class $$AuthenticationTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $AuthenticationTableTable> { - $$AuthenticationTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get cookie => $state.composableBuilder( - column: $state.table.cookie, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get accessToken => $state.composableBuilder( - column: $state.table.accessToken, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get expiration => $state.composableBuilder( - column: $state.table.expiration, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); -} - -class $$AuthenticationTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $AuthenticationTableTable> { - $$AuthenticationTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get cookie => $state.composableBuilder( - column: $state.table.cookie, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get accessToken => $state.composableBuilder( - column: $state.table.accessToken, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get expiration => $state.composableBuilder( - column: $state.table.expiration, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$BlacklistTableTableInsertCompanionBuilder = BlacklistTableCompanion +typedef $$AuthenticationTableTableProcessedTableManager = ProcessedTableManager< + _$AppDatabase, + $AuthenticationTableTable, + AuthenticationTableData, + $$AuthenticationTableTableFilterComposer, + $$AuthenticationTableTableOrderingComposer, + $$AuthenticationTableTableAnnotationComposer, + $$AuthenticationTableTableCreateCompanionBuilder, + $$AuthenticationTableTableUpdateCompanionBuilder, + ( + AuthenticationTableData, + BaseReferences<_$AppDatabase, $AuthenticationTableTable, + AuthenticationTableData> + ), + AuthenticationTableData, + PrefetchHooks Function()>; +typedef $$BlacklistTableTableCreateCompanionBuilder = BlacklistTableCompanion Function({ Value id, required String name, @@ -4108,27 +4358,102 @@ typedef $$BlacklistTableTableUpdateCompanionBuilder = BlacklistTableCompanion Value elementId, }); +class $$BlacklistTableTableFilterComposer + extends Composer<_$AppDatabase, $BlacklistTableTable> { + $$BlacklistTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get elementType => $composableBuilder( + column: $table.elementType, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get elementId => $composableBuilder( + column: $table.elementId, builder: (column) => ColumnFilters(column)); +} + +class $$BlacklistTableTableOrderingComposer + extends Composer<_$AppDatabase, $BlacklistTableTable> { + $$BlacklistTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get elementType => $composableBuilder( + column: $table.elementType, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get elementId => $composableBuilder( + column: $table.elementId, builder: (column) => ColumnOrderings(column)); +} + +class $$BlacklistTableTableAnnotationComposer + extends Composer<_$AppDatabase, $BlacklistTableTable> { + $$BlacklistTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumnWithTypeConverter get elementType => + $composableBuilder( + column: $table.elementType, builder: (column) => column); + + GeneratedColumn get elementId => + $composableBuilder(column: $table.elementId, builder: (column) => column); +} + class $$BlacklistTableTableTableManager extends RootTableManager< _$AppDatabase, $BlacklistTableTable, BlacklistTableData, $$BlacklistTableTableFilterComposer, $$BlacklistTableTableOrderingComposer, - $$BlacklistTableTableProcessedTableManager, - $$BlacklistTableTableInsertCompanionBuilder, - $$BlacklistTableTableUpdateCompanionBuilder> { + $$BlacklistTableTableAnnotationComposer, + $$BlacklistTableTableCreateCompanionBuilder, + $$BlacklistTableTableUpdateCompanionBuilder, + ( + BlacklistTableData, + BaseReferences<_$AppDatabase, $BlacklistTableTable, BlacklistTableData> + ), + BlacklistTableData, + PrefetchHooks Function()> { $$BlacklistTableTableTableManager( _$AppDatabase db, $BlacklistTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$BlacklistTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$BlacklistTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$BlacklistTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$BlacklistTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$BlacklistTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$BlacklistTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value name = const Value.absent(), Value elementType = const Value.absent(), @@ -4140,7 +4465,7 @@ class $$BlacklistTableTableTableManager extends RootTableManager< elementType: elementType, elementId: elementId, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required String name, required BlacklistedType elementType, @@ -4152,72 +4477,29 @@ class $$BlacklistTableTableTableManager extends RootTableManager< elementType: elementType, elementId: elementId, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$BlacklistTableTableProcessedTableManager extends ProcessedTableManager< +typedef $$BlacklistTableTableProcessedTableManager = ProcessedTableManager< _$AppDatabase, $BlacklistTableTable, BlacklistTableData, $$BlacklistTableTableFilterComposer, $$BlacklistTableTableOrderingComposer, - $$BlacklistTableTableProcessedTableManager, - $$BlacklistTableTableInsertCompanionBuilder, - $$BlacklistTableTableUpdateCompanionBuilder> { - $$BlacklistTableTableProcessedTableManager(super.$state); -} - -class $$BlacklistTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $BlacklistTableTable> { - $$BlacklistTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get name => $state.composableBuilder( - column: $state.table.name, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get elementType => $state.composableBuilder( - column: $state.table.elementType, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get elementId => $state.composableBuilder( - column: $state.table.elementId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); -} - -class $$BlacklistTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $BlacklistTableTable> { - $$BlacklistTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get name => $state.composableBuilder( - column: $state.table.name, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get elementType => $state.composableBuilder( - column: $state.table.elementType, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get elementId => $state.composableBuilder( - column: $state.table.elementId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$PreferencesTableTableInsertCompanionBuilder + $$BlacklistTableTableAnnotationComposer, + $$BlacklistTableTableCreateCompanionBuilder, + $$BlacklistTableTableUpdateCompanionBuilder, + ( + BlacklistTableData, + BaseReferences<_$AppDatabase, $BlacklistTableTable, BlacklistTableData> + ), + BlacklistTableData, + PrefetchHooks Function()>; +typedef $$PreferencesTableTableCreateCompanionBuilder = PreferencesTableCompanion Function({ Value id, Value audioQuality, @@ -4237,6 +4519,7 @@ typedef $$PreferencesTableTableInsertCompanionBuilder Value downloadLocation, Value> localLibraryLocation, Value pipedInstance, + Value invidiousInstance, Value themeMode, Value audioSource, Value streamMusicCodec, @@ -4265,6 +4548,7 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder Value downloadLocation, Value> localLibraryLocation, Value pipedInstance, + Value invidiousInstance, Value themeMode, Value audioSource, Value streamMusicCodec, @@ -4274,27 +4558,358 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder Value enableConnect, }); +class $$PreferencesTableTableFilterComposer + extends Composer<_$AppDatabase, $PreferencesTableTable> { + $$PreferencesTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get audioQuality => $composableBuilder( + column: $table.audioQuality, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get albumColorSync => $composableBuilder( + column: $table.albumColorSync, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get amoledDarkTheme => $composableBuilder( + column: $table.amoledDarkTheme, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get checkUpdate => $composableBuilder( + column: $table.checkUpdate, builder: (column) => ColumnFilters(column)); + + ColumnFilters get normalizeAudio => $composableBuilder( + column: $table.normalizeAudio, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get showSystemTrayIcon => $composableBuilder( + column: $table.showSystemTrayIcon, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get systemTitleBar => $composableBuilder( + column: $table.systemTitleBar, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get skipNonMusic => $composableBuilder( + column: $table.skipNonMusic, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get closeBehavior => $composableBuilder( + column: $table.closeBehavior, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get accentColorScheme => $composableBuilder( + column: $table.accentColorScheme, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get layoutMode => $composableBuilder( + column: $table.layoutMode, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters get locale => + $composableBuilder( + column: $table.locale, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters get market => + $composableBuilder( + column: $table.market, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get searchMode => $composableBuilder( + column: $table.searchMode, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get downloadLocation => $composableBuilder( + column: $table.downloadLocation, + builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters, List, String> + get localLibraryLocation => $composableBuilder( + column: $table.localLibraryLocation, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get pipedInstance => $composableBuilder( + column: $table.pipedInstance, builder: (column) => ColumnFilters(column)); + + ColumnFilters get invidiousInstance => $composableBuilder( + column: $table.invidiousInstance, + builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters get themeMode => + $composableBuilder( + column: $table.themeMode, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get audioSource => $composableBuilder( + column: $table.audioSource, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get streamMusicCodec => $composableBuilder( + column: $table.streamMusicCodec, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters + get downloadMusicCodec => $composableBuilder( + column: $table.downloadMusicCodec, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get discordPresence => $composableBuilder( + column: $table.discordPresence, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get endlessPlayback => $composableBuilder( + column: $table.endlessPlayback, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get enableConnect => $composableBuilder( + column: $table.enableConnect, builder: (column) => ColumnFilters(column)); +} + +class $$PreferencesTableTableOrderingComposer + extends Composer<_$AppDatabase, $PreferencesTableTable> { + $$PreferencesTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get audioQuality => $composableBuilder( + column: $table.audioQuality, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get albumColorSync => $composableBuilder( + column: $table.albumColorSync, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get amoledDarkTheme => $composableBuilder( + column: $table.amoledDarkTheme, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get checkUpdate => $composableBuilder( + column: $table.checkUpdate, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get normalizeAudio => $composableBuilder( + column: $table.normalizeAudio, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get showSystemTrayIcon => $composableBuilder( + column: $table.showSystemTrayIcon, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get systemTitleBar => $composableBuilder( + column: $table.systemTitleBar, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get skipNonMusic => $composableBuilder( + column: $table.skipNonMusic, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get closeBehavior => $composableBuilder( + column: $table.closeBehavior, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get accentColorScheme => $composableBuilder( + column: $table.accentColorScheme, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get layoutMode => $composableBuilder( + column: $table.layoutMode, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get locale => $composableBuilder( + column: $table.locale, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get market => $composableBuilder( + column: $table.market, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get searchMode => $composableBuilder( + column: $table.searchMode, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get downloadLocation => $composableBuilder( + column: $table.downloadLocation, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get localLibraryLocation => $composableBuilder( + column: $table.localLibraryLocation, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get pipedInstance => $composableBuilder( + column: $table.pipedInstance, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get invidiousInstance => $composableBuilder( + column: $table.invidiousInstance, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get themeMode => $composableBuilder( + column: $table.themeMode, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get audioSource => $composableBuilder( + column: $table.audioSource, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get streamMusicCodec => $composableBuilder( + column: $table.streamMusicCodec, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get downloadMusicCodec => $composableBuilder( + column: $table.downloadMusicCodec, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get discordPresence => $composableBuilder( + column: $table.discordPresence, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get endlessPlayback => $composableBuilder( + column: $table.endlessPlayback, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get enableConnect => $composableBuilder( + column: $table.enableConnect, + builder: (column) => ColumnOrderings(column)); +} + +class $$PreferencesTableTableAnnotationComposer + extends Composer<_$AppDatabase, $PreferencesTableTable> { + $$PreferencesTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumnWithTypeConverter get audioQuality => + $composableBuilder( + column: $table.audioQuality, builder: (column) => column); + + GeneratedColumn get albumColorSync => $composableBuilder( + column: $table.albumColorSync, builder: (column) => column); + + GeneratedColumn get amoledDarkTheme => $composableBuilder( + column: $table.amoledDarkTheme, builder: (column) => column); + + GeneratedColumn get checkUpdate => $composableBuilder( + column: $table.checkUpdate, builder: (column) => column); + + GeneratedColumn get normalizeAudio => $composableBuilder( + column: $table.normalizeAudio, builder: (column) => column); + + GeneratedColumn get showSystemTrayIcon => $composableBuilder( + column: $table.showSystemTrayIcon, builder: (column) => column); + + GeneratedColumn get systemTitleBar => $composableBuilder( + column: $table.systemTitleBar, builder: (column) => column); + + GeneratedColumn get skipNonMusic => $composableBuilder( + column: $table.skipNonMusic, builder: (column) => column); + + GeneratedColumnWithTypeConverter get closeBehavior => + $composableBuilder( + column: $table.closeBehavior, builder: (column) => column); + + GeneratedColumnWithTypeConverter + get accentColorScheme => $composableBuilder( + column: $table.accentColorScheme, builder: (column) => column); + + GeneratedColumnWithTypeConverter get layoutMode => + $composableBuilder( + column: $table.layoutMode, builder: (column) => column); + + GeneratedColumnWithTypeConverter get locale => + $composableBuilder(column: $table.locale, builder: (column) => column); + + GeneratedColumnWithTypeConverter get market => + $composableBuilder(column: $table.market, builder: (column) => column); + + GeneratedColumnWithTypeConverter get searchMode => + $composableBuilder( + column: $table.searchMode, builder: (column) => column); + + GeneratedColumn get downloadLocation => $composableBuilder( + column: $table.downloadLocation, builder: (column) => column); + + GeneratedColumnWithTypeConverter, String> + get localLibraryLocation => $composableBuilder( + column: $table.localLibraryLocation, builder: (column) => column); + + GeneratedColumn get pipedInstance => $composableBuilder( + column: $table.pipedInstance, builder: (column) => column); + + GeneratedColumn get invidiousInstance => $composableBuilder( + column: $table.invidiousInstance, builder: (column) => column); + + GeneratedColumnWithTypeConverter get themeMode => + $composableBuilder(column: $table.themeMode, builder: (column) => column); + + GeneratedColumnWithTypeConverter get audioSource => + $composableBuilder( + column: $table.audioSource, builder: (column) => column); + + GeneratedColumnWithTypeConverter get streamMusicCodec => + $composableBuilder( + column: $table.streamMusicCodec, builder: (column) => column); + + GeneratedColumnWithTypeConverter + get downloadMusicCodec => $composableBuilder( + column: $table.downloadMusicCodec, builder: (column) => column); + + GeneratedColumn get discordPresence => $composableBuilder( + column: $table.discordPresence, builder: (column) => column); + + GeneratedColumn get endlessPlayback => $composableBuilder( + column: $table.endlessPlayback, builder: (column) => column); + + GeneratedColumn get enableConnect => $composableBuilder( + column: $table.enableConnect, builder: (column) => column); +} + class $$PreferencesTableTableTableManager extends RootTableManager< _$AppDatabase, $PreferencesTableTable, PreferencesTableData, $$PreferencesTableTableFilterComposer, $$PreferencesTableTableOrderingComposer, - $$PreferencesTableTableProcessedTableManager, - $$PreferencesTableTableInsertCompanionBuilder, - $$PreferencesTableTableUpdateCompanionBuilder> { + $$PreferencesTableTableAnnotationComposer, + $$PreferencesTableTableCreateCompanionBuilder, + $$PreferencesTableTableUpdateCompanionBuilder, + ( + PreferencesTableData, + BaseReferences<_$AppDatabase, $PreferencesTableTable, + PreferencesTableData> + ), + PreferencesTableData, + PrefetchHooks Function()> { $$PreferencesTableTableTableManager( _$AppDatabase db, $PreferencesTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$PreferencesTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$PreferencesTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$PreferencesTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$PreferencesTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$PreferencesTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$PreferencesTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value audioQuality = const Value.absent(), Value albumColorSync = const Value.absent(), @@ -4313,6 +4928,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< Value downloadLocation = const Value.absent(), Value> localLibraryLocation = const Value.absent(), Value pipedInstance = const Value.absent(), + Value invidiousInstance = const Value.absent(), Value themeMode = const Value.absent(), Value audioSource = const Value.absent(), Value streamMusicCodec = const Value.absent(), @@ -4340,6 +4956,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< downloadLocation: downloadLocation, localLibraryLocation: localLibraryLocation, pipedInstance: pipedInstance, + invidiousInstance: invidiousInstance, themeMode: themeMode, audioSource: audioSource, streamMusicCodec: streamMusicCodec, @@ -4348,7 +4965,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< endlessPlayback: endlessPlayback, enableConnect: enableConnect, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), Value audioQuality = const Value.absent(), Value albumColorSync = const Value.absent(), @@ -4367,6 +4984,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< Value downloadLocation = const Value.absent(), Value> localLibraryLocation = const Value.absent(), Value pipedInstance = const Value.absent(), + Value invidiousInstance = const Value.absent(), Value themeMode = const Value.absent(), Value audioSource = const Value.absent(), Value streamMusicCodec = const Value.absent(), @@ -4394,6 +5012,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< downloadLocation: downloadLocation, localLibraryLocation: localLibraryLocation, pipedInstance: pipedInstance, + invidiousInstance: invidiousInstance, themeMode: themeMode, audioSource: audioSource, streamMusicCodec: streamMusicCodec, @@ -4402,305 +5021,30 @@ class $$PreferencesTableTableTableManager extends RootTableManager< endlessPlayback: endlessPlayback, enableConnect: enableConnect, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$PreferencesTableTableProcessedTableManager - extends ProcessedTableManager< - _$AppDatabase, - $PreferencesTableTable, - PreferencesTableData, - $$PreferencesTableTableFilterComposer, - $$PreferencesTableTableOrderingComposer, - $$PreferencesTableTableProcessedTableManager, - $$PreferencesTableTableInsertCompanionBuilder, - $$PreferencesTableTableUpdateCompanionBuilder> { - $$PreferencesTableTableProcessedTableManager(super.$state); -} - -class $$PreferencesTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $PreferencesTableTable> { - $$PreferencesTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get audioQuality => $state.composableBuilder( - column: $state.table.audioQuality, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get albumColorSync => $state.composableBuilder( - column: $state.table.albumColorSync, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get amoledDarkTheme => $state.composableBuilder( - column: $state.table.amoledDarkTheme, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get checkUpdate => $state.composableBuilder( - column: $state.table.checkUpdate, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get normalizeAudio => $state.composableBuilder( - column: $state.table.normalizeAudio, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get showSystemTrayIcon => $state.composableBuilder( - column: $state.table.showSystemTrayIcon, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get systemTitleBar => $state.composableBuilder( - column: $state.table.systemTitleBar, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get skipNonMusic => $state.composableBuilder( - column: $state.table.skipNonMusic, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get closeBehavior => $state.composableBuilder( - column: $state.table.closeBehavior, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get accentColorScheme => $state.composableBuilder( - column: $state.table.accentColorScheme, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get layoutMode => $state.composableBuilder( - column: $state.table.layoutMode, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters get locale => - $state.composableBuilder( - column: $state.table.locale, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters get market => - $state.composableBuilder( - column: $state.table.market, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get searchMode => $state.composableBuilder( - column: $state.table.searchMode, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get downloadLocation => $state.composableBuilder( - column: $state.table.downloadLocation, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters, List, String> - get localLibraryLocation => $state.composableBuilder( - column: $state.table.localLibraryLocation, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get pipedInstance => $state.composableBuilder( - column: $state.table.pipedInstance, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters get themeMode => - $state.composableBuilder( - column: $state.table.themeMode, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get audioSource => $state.composableBuilder( - column: $state.table.audioSource, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get streamMusicCodec => $state.composableBuilder( - column: $state.table.streamMusicCodec, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get downloadMusicCodec => $state.composableBuilder( - column: $state.table.downloadMusicCodec, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get discordPresence => $state.composableBuilder( - column: $state.table.discordPresence, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get endlessPlayback => $state.composableBuilder( - column: $state.table.endlessPlayback, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get enableConnect => $state.composableBuilder( - column: $state.table.enableConnect, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); -} - -class $$PreferencesTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $PreferencesTableTable> { - $$PreferencesTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get audioQuality => $state.composableBuilder( - column: $state.table.audioQuality, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get albumColorSync => $state.composableBuilder( - column: $state.table.albumColorSync, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get amoledDarkTheme => $state.composableBuilder( - column: $state.table.amoledDarkTheme, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get checkUpdate => $state.composableBuilder( - column: $state.table.checkUpdate, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get normalizeAudio => $state.composableBuilder( - column: $state.table.normalizeAudio, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get showSystemTrayIcon => $state.composableBuilder( - column: $state.table.showSystemTrayIcon, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get systemTitleBar => $state.composableBuilder( - column: $state.table.systemTitleBar, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get skipNonMusic => $state.composableBuilder( - column: $state.table.skipNonMusic, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get closeBehavior => $state.composableBuilder( - column: $state.table.closeBehavior, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get accentColorScheme => $state.composableBuilder( - column: $state.table.accentColorScheme, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get layoutMode => $state.composableBuilder( - column: $state.table.layoutMode, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get locale => $state.composableBuilder( - column: $state.table.locale, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get market => $state.composableBuilder( - column: $state.table.market, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get searchMode => $state.composableBuilder( - column: $state.table.searchMode, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get downloadLocation => $state.composableBuilder( - column: $state.table.downloadLocation, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get localLibraryLocation => $state.composableBuilder( - column: $state.table.localLibraryLocation, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get pipedInstance => $state.composableBuilder( - column: $state.table.pipedInstance, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get themeMode => $state.composableBuilder( - column: $state.table.themeMode, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get audioSource => $state.composableBuilder( - column: $state.table.audioSource, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get streamMusicCodec => $state.composableBuilder( - column: $state.table.streamMusicCodec, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get downloadMusicCodec => $state.composableBuilder( - column: $state.table.downloadMusicCodec, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get discordPresence => $state.composableBuilder( - column: $state.table.discordPresence, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get endlessPlayback => $state.composableBuilder( - column: $state.table.endlessPlayback, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get enableConnect => $state.composableBuilder( - column: $state.table.enableConnect, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$ScrobblerTableTableInsertCompanionBuilder = ScrobblerTableCompanion +typedef $$PreferencesTableTableProcessedTableManager = ProcessedTableManager< + _$AppDatabase, + $PreferencesTableTable, + PreferencesTableData, + $$PreferencesTableTableFilterComposer, + $$PreferencesTableTableOrderingComposer, + $$PreferencesTableTableAnnotationComposer, + $$PreferencesTableTableCreateCompanionBuilder, + $$PreferencesTableTableUpdateCompanionBuilder, + ( + PreferencesTableData, + BaseReferences<_$AppDatabase, $PreferencesTableTable, + PreferencesTableData> + ), + PreferencesTableData, + PrefetchHooks Function()>; +typedef $$ScrobblerTableTableCreateCompanionBuilder = ScrobblerTableCompanion Function({ Value id, Value createdAt, @@ -4715,27 +5059,103 @@ typedef $$ScrobblerTableTableUpdateCompanionBuilder = ScrobblerTableCompanion Value passwordHash, }); +class $$ScrobblerTableTableFilterComposer + extends Composer<_$AppDatabase, $ScrobblerTableTable> { + $$ScrobblerTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnFilters(column)); + + ColumnFilters get username => $composableBuilder( + column: $table.username, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get passwordHash => $composableBuilder( + column: $table.passwordHash, + builder: (column) => ColumnWithTypeConverterFilters(column)); +} + +class $$ScrobblerTableTableOrderingComposer + extends Composer<_$AppDatabase, $ScrobblerTableTable> { + $$ScrobblerTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get username => $composableBuilder( + column: $table.username, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get passwordHash => $composableBuilder( + column: $table.passwordHash, + builder: (column) => ColumnOrderings(column)); +} + +class $$ScrobblerTableTableAnnotationComposer + extends Composer<_$AppDatabase, $ScrobblerTableTable> { + $$ScrobblerTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get username => + $composableBuilder(column: $table.username, builder: (column) => column); + + GeneratedColumnWithTypeConverter get passwordHash => + $composableBuilder( + column: $table.passwordHash, builder: (column) => column); +} + class $$ScrobblerTableTableTableManager extends RootTableManager< _$AppDatabase, $ScrobblerTableTable, ScrobblerTableData, $$ScrobblerTableTableFilterComposer, $$ScrobblerTableTableOrderingComposer, - $$ScrobblerTableTableProcessedTableManager, - $$ScrobblerTableTableInsertCompanionBuilder, - $$ScrobblerTableTableUpdateCompanionBuilder> { + $$ScrobblerTableTableAnnotationComposer, + $$ScrobblerTableTableCreateCompanionBuilder, + $$ScrobblerTableTableUpdateCompanionBuilder, + ( + ScrobblerTableData, + BaseReferences<_$AppDatabase, $ScrobblerTableTable, ScrobblerTableData> + ), + ScrobblerTableData, + PrefetchHooks Function()> { $$ScrobblerTableTableTableManager( _$AppDatabase db, $ScrobblerTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$ScrobblerTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$ScrobblerTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$ScrobblerTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$ScrobblerTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ScrobblerTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ScrobblerTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value createdAt = const Value.absent(), Value username = const Value.absent(), @@ -4747,7 +5167,7 @@ class $$ScrobblerTableTableTableManager extends RootTableManager< username: username, passwordHash: passwordHash, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), Value createdAt = const Value.absent(), required String username, @@ -4759,72 +5179,29 @@ class $$ScrobblerTableTableTableManager extends RootTableManager< username: username, passwordHash: passwordHash, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$ScrobblerTableTableProcessedTableManager extends ProcessedTableManager< +typedef $$ScrobblerTableTableProcessedTableManager = ProcessedTableManager< _$AppDatabase, $ScrobblerTableTable, ScrobblerTableData, $$ScrobblerTableTableFilterComposer, $$ScrobblerTableTableOrderingComposer, - $$ScrobblerTableTableProcessedTableManager, - $$ScrobblerTableTableInsertCompanionBuilder, - $$ScrobblerTableTableUpdateCompanionBuilder> { - $$ScrobblerTableTableProcessedTableManager(super.$state); -} - -class $$ScrobblerTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $ScrobblerTableTable> { - $$ScrobblerTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get username => $state.composableBuilder( - column: $state.table.username, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get passwordHash => $state.composableBuilder( - column: $state.table.passwordHash, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); -} - -class $$ScrobblerTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $ScrobblerTableTable> { - $$ScrobblerTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get username => $state.composableBuilder( - column: $state.table.username, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get passwordHash => $state.composableBuilder( - column: $state.table.passwordHash, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$SkipSegmentTableTableInsertCompanionBuilder + $$ScrobblerTableTableAnnotationComposer, + $$ScrobblerTableTableCreateCompanionBuilder, + $$ScrobblerTableTableUpdateCompanionBuilder, + ( + ScrobblerTableData, + BaseReferences<_$AppDatabase, $ScrobblerTableTable, ScrobblerTableData> + ), + ScrobblerTableData, + PrefetchHooks Function()>; +typedef $$SkipSegmentTableTableCreateCompanionBuilder = SkipSegmentTableCompanion Function({ Value id, required int start, @@ -4841,27 +5218,109 @@ typedef $$SkipSegmentTableTableUpdateCompanionBuilder Value createdAt, }); +class $$SkipSegmentTableTableFilterComposer + extends Composer<_$AppDatabase, $SkipSegmentTableTable> { + $$SkipSegmentTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get start => $composableBuilder( + column: $table.start, builder: (column) => ColumnFilters(column)); + + ColumnFilters get end => $composableBuilder( + column: $table.end, builder: (column) => ColumnFilters(column)); + + ColumnFilters get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnFilters(column)); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnFilters(column)); +} + +class $$SkipSegmentTableTableOrderingComposer + extends Composer<_$AppDatabase, $SkipSegmentTableTable> { + $$SkipSegmentTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get start => $composableBuilder( + column: $table.start, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get end => $composableBuilder( + column: $table.end, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnOrderings(column)); +} + +class $$SkipSegmentTableTableAnnotationComposer + extends Composer<_$AppDatabase, $SkipSegmentTableTable> { + $$SkipSegmentTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get start => + $composableBuilder(column: $table.start, builder: (column) => column); + + GeneratedColumn get end => + $composableBuilder(column: $table.end, builder: (column) => column); + + GeneratedColumn get trackId => + $composableBuilder(column: $table.trackId, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); +} + class $$SkipSegmentTableTableTableManager extends RootTableManager< _$AppDatabase, $SkipSegmentTableTable, SkipSegmentTableData, $$SkipSegmentTableTableFilterComposer, $$SkipSegmentTableTableOrderingComposer, - $$SkipSegmentTableTableProcessedTableManager, - $$SkipSegmentTableTableInsertCompanionBuilder, - $$SkipSegmentTableTableUpdateCompanionBuilder> { + $$SkipSegmentTableTableAnnotationComposer, + $$SkipSegmentTableTableCreateCompanionBuilder, + $$SkipSegmentTableTableUpdateCompanionBuilder, + ( + SkipSegmentTableData, + BaseReferences<_$AppDatabase, $SkipSegmentTableTable, + SkipSegmentTableData> + ), + SkipSegmentTableData, + PrefetchHooks Function()> { $$SkipSegmentTableTableTableManager( _$AppDatabase db, $SkipSegmentTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$SkipSegmentTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$SkipSegmentTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$SkipSegmentTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$SkipSegmentTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SkipSegmentTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SkipSegmentTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value start = const Value.absent(), Value end = const Value.absent(), @@ -4875,7 +5334,7 @@ class $$SkipSegmentTableTableTableManager extends RootTableManager< trackId: trackId, createdAt: createdAt, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required int start, required int end, @@ -4889,81 +5348,30 @@ class $$SkipSegmentTableTableTableManager extends RootTableManager< trackId: trackId, createdAt: createdAt, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$SkipSegmentTableTableProcessedTableManager - extends ProcessedTableManager< - _$AppDatabase, - $SkipSegmentTableTable, - SkipSegmentTableData, - $$SkipSegmentTableTableFilterComposer, - $$SkipSegmentTableTableOrderingComposer, - $$SkipSegmentTableTableProcessedTableManager, - $$SkipSegmentTableTableInsertCompanionBuilder, - $$SkipSegmentTableTableUpdateCompanionBuilder> { - $$SkipSegmentTableTableProcessedTableManager(super.$state); -} - -class $$SkipSegmentTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $SkipSegmentTableTable> { - $$SkipSegmentTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get start => $state.composableBuilder( - column: $state.table.start, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get end => $state.composableBuilder( - column: $state.table.end, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); -} - -class $$SkipSegmentTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $SkipSegmentTableTable> { - $$SkipSegmentTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get start => $state.composableBuilder( - column: $state.table.start, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get end => $state.composableBuilder( - column: $state.table.end, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$SourceMatchTableTableInsertCompanionBuilder +typedef $$SkipSegmentTableTableProcessedTableManager = ProcessedTableManager< + _$AppDatabase, + $SkipSegmentTableTable, + SkipSegmentTableData, + $$SkipSegmentTableTableFilterComposer, + $$SkipSegmentTableTableOrderingComposer, + $$SkipSegmentTableTableAnnotationComposer, + $$SkipSegmentTableTableCreateCompanionBuilder, + $$SkipSegmentTableTableUpdateCompanionBuilder, + ( + SkipSegmentTableData, + BaseReferences<_$AppDatabase, $SkipSegmentTableTable, + SkipSegmentTableData> + ), + SkipSegmentTableData, + PrefetchHooks Function()>; +typedef $$SourceMatchTableTableCreateCompanionBuilder = SourceMatchTableCompanion Function({ Value id, required String trackId, @@ -4980,27 +5388,112 @@ typedef $$SourceMatchTableTableUpdateCompanionBuilder Value createdAt, }); +class $$SourceMatchTableTableFilterComposer + extends Composer<_$AppDatabase, $SourceMatchTableTable> { + $$SourceMatchTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnFilters(column)); + + ColumnFilters get sourceId => $composableBuilder( + column: $table.sourceId, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get sourceType => $composableBuilder( + column: $table.sourceType, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnFilters(column)); +} + +class $$SourceMatchTableTableOrderingComposer + extends Composer<_$AppDatabase, $SourceMatchTableTable> { + $$SourceMatchTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get sourceId => $composableBuilder( + column: $table.sourceId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get sourceType => $composableBuilder( + column: $table.sourceType, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnOrderings(column)); +} + +class $$SourceMatchTableTableAnnotationComposer + extends Composer<_$AppDatabase, $SourceMatchTableTable> { + $$SourceMatchTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get trackId => + $composableBuilder(column: $table.trackId, builder: (column) => column); + + GeneratedColumn get sourceId => + $composableBuilder(column: $table.sourceId, builder: (column) => column); + + GeneratedColumnWithTypeConverter get sourceType => + $composableBuilder( + column: $table.sourceType, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); +} + class $$SourceMatchTableTableTableManager extends RootTableManager< _$AppDatabase, $SourceMatchTableTable, SourceMatchTableData, $$SourceMatchTableTableFilterComposer, $$SourceMatchTableTableOrderingComposer, - $$SourceMatchTableTableProcessedTableManager, - $$SourceMatchTableTableInsertCompanionBuilder, - $$SourceMatchTableTableUpdateCompanionBuilder> { + $$SourceMatchTableTableAnnotationComposer, + $$SourceMatchTableTableCreateCompanionBuilder, + $$SourceMatchTableTableUpdateCompanionBuilder, + ( + SourceMatchTableData, + BaseReferences<_$AppDatabase, $SourceMatchTableTable, + SourceMatchTableData> + ), + SourceMatchTableData, + PrefetchHooks Function()> { $$SourceMatchTableTableTableManager( _$AppDatabase db, $SourceMatchTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$SourceMatchTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$SourceMatchTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$SourceMatchTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$SourceMatchTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SourceMatchTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SourceMatchTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value trackId = const Value.absent(), Value sourceId = const Value.absent(), @@ -5014,7 +5507,7 @@ class $$SourceMatchTableTableTableManager extends RootTableManager< sourceType: sourceType, createdAt: createdAt, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required String trackId, required String sourceId, @@ -5028,83 +5521,30 @@ class $$SourceMatchTableTableTableManager extends RootTableManager< sourceType: sourceType, createdAt: createdAt, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$SourceMatchTableTableProcessedTableManager - extends ProcessedTableManager< - _$AppDatabase, - $SourceMatchTableTable, - SourceMatchTableData, - $$SourceMatchTableTableFilterComposer, - $$SourceMatchTableTableOrderingComposer, - $$SourceMatchTableTableProcessedTableManager, - $$SourceMatchTableTableInsertCompanionBuilder, - $$SourceMatchTableTableUpdateCompanionBuilder> { - $$SourceMatchTableTableProcessedTableManager(super.$state); -} - -class $$SourceMatchTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $SourceMatchTableTable> { - $$SourceMatchTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get sourceId => $state.composableBuilder( - column: $state.table.sourceId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get sourceType => $state.composableBuilder( - column: $state.table.sourceType, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); -} - -class $$SourceMatchTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $SourceMatchTableTable> { - $$SourceMatchTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get sourceId => $state.composableBuilder( - column: $state.table.sourceId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get sourceType => $state.composableBuilder( - column: $state.table.sourceType, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$AudioPlayerStateTableTableInsertCompanionBuilder +typedef $$SourceMatchTableTableProcessedTableManager = ProcessedTableManager< + _$AppDatabase, + $SourceMatchTableTable, + SourceMatchTableData, + $$SourceMatchTableTableFilterComposer, + $$SourceMatchTableTableOrderingComposer, + $$SourceMatchTableTableAnnotationComposer, + $$SourceMatchTableTableCreateCompanionBuilder, + $$SourceMatchTableTableUpdateCompanionBuilder, + ( + SourceMatchTableData, + BaseReferences<_$AppDatabase, $SourceMatchTableTable, + SourceMatchTableData> + ), + SourceMatchTableData, + PrefetchHooks Function()>; +typedef $$AudioPlayerStateTableTableCreateCompanionBuilder = AudioPlayerStateTableCompanion Function({ Value id, required bool playing, @@ -5121,27 +5561,176 @@ typedef $$AudioPlayerStateTableTableUpdateCompanionBuilder Value> collections, }); +final class $$AudioPlayerStateTableTableReferences extends BaseReferences< + _$AppDatabase, $AudioPlayerStateTableTable, AudioPlayerStateTableData> { + $$AudioPlayerStateTableTableReferences( + super.$_db, super.$_table, super.$_typedResult); + + static MultiTypedResultKey<$PlaylistTableTable, List> + _playlistTableRefsTable(_$AppDatabase db) => + MultiTypedResultKey.fromTable(db.playlistTable, + aliasName: $_aliasNameGenerator(db.audioPlayerStateTable.id, + db.playlistTable.audioPlayerStateId)); + + $$PlaylistTableTableProcessedTableManager get playlistTableRefs { + final manager = $$PlaylistTableTableTableManager($_db, $_db.playlistTable) + .filter((f) => f.audioPlayerStateId.id($_item.id)); + + final cache = $_typedResult.readTableOrNull(_playlistTableRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache)); + } +} + +class $$AudioPlayerStateTableTableFilterComposer + extends Composer<_$AppDatabase, $AudioPlayerStateTableTable> { + $$AudioPlayerStateTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get playing => $composableBuilder( + column: $table.playing, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get loopMode => $composableBuilder( + column: $table.loopMode, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get shuffled => $composableBuilder( + column: $table.shuffled, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters, List, String> + get collections => $composableBuilder( + column: $table.collections, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + Expression playlistTableRefs( + Expression Function($$PlaylistTableTableFilterComposer f) f) { + final $$PlaylistTableTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.playlistTable, + getReferencedColumn: (t) => t.audioPlayerStateId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistTableTableFilterComposer( + $db: $db, + $table: $db.playlistTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } +} + +class $$AudioPlayerStateTableTableOrderingComposer + extends Composer<_$AppDatabase, $AudioPlayerStateTableTable> { + $$AudioPlayerStateTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get playing => $composableBuilder( + column: $table.playing, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get loopMode => $composableBuilder( + column: $table.loopMode, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get shuffled => $composableBuilder( + column: $table.shuffled, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get collections => $composableBuilder( + column: $table.collections, builder: (column) => ColumnOrderings(column)); +} + +class $$AudioPlayerStateTableTableAnnotationComposer + extends Composer<_$AppDatabase, $AudioPlayerStateTableTable> { + $$AudioPlayerStateTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get playing => + $composableBuilder(column: $table.playing, builder: (column) => column); + + GeneratedColumnWithTypeConverter get loopMode => + $composableBuilder(column: $table.loopMode, builder: (column) => column); + + GeneratedColumn get shuffled => + $composableBuilder(column: $table.shuffled, builder: (column) => column); + + GeneratedColumnWithTypeConverter, String> get collections => + $composableBuilder( + column: $table.collections, builder: (column) => column); + + Expression playlistTableRefs( + Expression Function($$PlaylistTableTableAnnotationComposer a) f) { + final $$PlaylistTableTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.playlistTable, + getReferencedColumn: (t) => t.audioPlayerStateId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistTableTableAnnotationComposer( + $db: $db, + $table: $db.playlistTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } +} + class $$AudioPlayerStateTableTableTableManager extends RootTableManager< _$AppDatabase, $AudioPlayerStateTableTable, AudioPlayerStateTableData, $$AudioPlayerStateTableTableFilterComposer, $$AudioPlayerStateTableTableOrderingComposer, - $$AudioPlayerStateTableTableProcessedTableManager, - $$AudioPlayerStateTableTableInsertCompanionBuilder, - $$AudioPlayerStateTableTableUpdateCompanionBuilder> { + $$AudioPlayerStateTableTableAnnotationComposer, + $$AudioPlayerStateTableTableCreateCompanionBuilder, + $$AudioPlayerStateTableTableUpdateCompanionBuilder, + (AudioPlayerStateTableData, $$AudioPlayerStateTableTableReferences), + AudioPlayerStateTableData, + PrefetchHooks Function({bool playlistTableRefs})> { $$AudioPlayerStateTableTableTableManager( _$AppDatabase db, $AudioPlayerStateTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: $$AudioPlayerStateTableTableFilterComposer( - ComposerState(db, table)), - orderingComposer: $$AudioPlayerStateTableTableOrderingComposer( - ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$AudioPlayerStateTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$AudioPlayerStateTableTableFilterComposer( + $db: db, $table: table), + createOrderingComposer: () => + $$AudioPlayerStateTableTableOrderingComposer( + $db: db, $table: table), + createComputedFieldComposer: () => + $$AudioPlayerStateTableTableAnnotationComposer( + $db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value playing = const Value.absent(), Value loopMode = const Value.absent(), @@ -5155,7 +5744,7 @@ class $$AudioPlayerStateTableTableTableManager extends RootTableManager< shuffled: shuffled, collections: collections, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required bool playing, required PlaylistMode loopMode, @@ -5169,98 +5758,55 @@ class $$AudioPlayerStateTableTableTableManager extends RootTableManager< shuffled: shuffled, collections: collections, ), + withReferenceMapper: (p0) => p0 + .map((e) => ( + e.readTable(table), + $$AudioPlayerStateTableTableReferences(db, table, e) + )) + .toList(), + prefetchHooksCallback: ({playlistTableRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (playlistTableRefs) db.playlistTable + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (playlistTableRefs) + await $_getPrefetchedData( + currentTable: table, + referencedTable: $$AudioPlayerStateTableTableReferences + ._playlistTableRefsTable(db), + managerFromTypedResult: (p0) => + $$AudioPlayerStateTableTableReferences( + db, table, p0) + .playlistTableRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems + .where((e) => e.audioPlayerStateId == item.id), + typedResults: items) + ]; + }, + ); + }, )); } -class $$AudioPlayerStateTableTableProcessedTableManager - extends ProcessedTableManager< +typedef $$AudioPlayerStateTableTableProcessedTableManager + = ProcessedTableManager< _$AppDatabase, $AudioPlayerStateTableTable, AudioPlayerStateTableData, $$AudioPlayerStateTableTableFilterComposer, $$AudioPlayerStateTableTableOrderingComposer, - $$AudioPlayerStateTableTableProcessedTableManager, - $$AudioPlayerStateTableTableInsertCompanionBuilder, - $$AudioPlayerStateTableTableUpdateCompanionBuilder> { - $$AudioPlayerStateTableTableProcessedTableManager(super.$state); -} - -class $$AudioPlayerStateTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $AudioPlayerStateTableTable> { - $$AudioPlayerStateTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get playing => $state.composableBuilder( - column: $state.table.playing, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get loopMode => $state.composableBuilder( - column: $state.table.loopMode, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get shuffled => $state.composableBuilder( - column: $state.table.shuffled, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters, List, String> - get collections => $state.composableBuilder( - column: $state.table.collections, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ComposableFilter playlistTableRefs( - ComposableFilter Function($$PlaylistTableTableFilterComposer f) f) { - final $$PlaylistTableTableFilterComposer composer = $state.composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $state.db.playlistTable, - getReferencedColumn: (t) => t.audioPlayerStateId, - builder: (joinBuilder, parentComposers) => - $$PlaylistTableTableFilterComposer(ComposerState($state.db, - $state.db.playlistTable, joinBuilder, parentComposers))); - return f(composer); - } -} - -class $$AudioPlayerStateTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $AudioPlayerStateTableTable> { - $$AudioPlayerStateTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get playing => $state.composableBuilder( - column: $state.table.playing, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get loopMode => $state.composableBuilder( - column: $state.table.loopMode, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get shuffled => $state.composableBuilder( - column: $state.table.shuffled, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get collections => $state.composableBuilder( - column: $state.table.collections, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$PlaylistTableTableInsertCompanionBuilder = PlaylistTableCompanion + $$AudioPlayerStateTableTableAnnotationComposer, + $$AudioPlayerStateTableTableCreateCompanionBuilder, + $$AudioPlayerStateTableTableUpdateCompanionBuilder, + (AudioPlayerStateTableData, $$AudioPlayerStateTableTableReferences), + AudioPlayerStateTableData, + PrefetchHooks Function({bool playlistTableRefs})>; +typedef $$PlaylistTableTableCreateCompanionBuilder = PlaylistTableCompanion Function({ Value id, required int audioPlayerStateId, @@ -5273,26 +5819,224 @@ typedef $$PlaylistTableTableUpdateCompanionBuilder = PlaylistTableCompanion Value index, }); +final class $$PlaylistTableTableReferences extends BaseReferences<_$AppDatabase, + $PlaylistTableTable, PlaylistTableData> { + $$PlaylistTableTableReferences( + super.$_db, super.$_table, super.$_typedResult); + + static $AudioPlayerStateTableTable _audioPlayerStateIdTable( + _$AppDatabase db) => + db.audioPlayerStateTable.createAlias($_aliasNameGenerator( + db.playlistTable.audioPlayerStateId, db.audioPlayerStateTable.id)); + + $$AudioPlayerStateTableTableProcessedTableManager? get audioPlayerStateId { + if ($_item.audioPlayerStateId == null) return null; + final manager = $$AudioPlayerStateTableTableTableManager( + $_db, $_db.audioPlayerStateTable) + .filter((f) => f.id($_item.audioPlayerStateId!)); + final item = $_typedResult.readTableOrNull(_audioPlayerStateIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item])); + } + + static MultiTypedResultKey<$PlaylistMediaTableTable, + List> _playlistMediaTableRefsTable( + _$AppDatabase db) => + MultiTypedResultKey.fromTable(db.playlistMediaTable, + aliasName: $_aliasNameGenerator( + db.playlistTable.id, db.playlistMediaTable.playlistId)); + + $$PlaylistMediaTableTableProcessedTableManager get playlistMediaTableRefs { + final manager = + $$PlaylistMediaTableTableTableManager($_db, $_db.playlistMediaTable) + .filter((f) => f.playlistId.id($_item.id)); + + final cache = + $_typedResult.readTableOrNull(_playlistMediaTableRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache)); + } +} + +class $$PlaylistTableTableFilterComposer + extends Composer<_$AppDatabase, $PlaylistTableTable> { + $$PlaylistTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get index => $composableBuilder( + column: $table.index, builder: (column) => ColumnFilters(column)); + + $$AudioPlayerStateTableTableFilterComposer get audioPlayerStateId { + final $$AudioPlayerStateTableTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.audioPlayerStateId, + referencedTable: $db.audioPlayerStateTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$AudioPlayerStateTableTableFilterComposer( + $db: $db, + $table: $db.audioPlayerStateTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } + + Expression playlistMediaTableRefs( + Expression Function($$PlaylistMediaTableTableFilterComposer f) f) { + final $$PlaylistMediaTableTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.playlistMediaTable, + getReferencedColumn: (t) => t.playlistId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistMediaTableTableFilterComposer( + $db: $db, + $table: $db.playlistMediaTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } +} + +class $$PlaylistTableTableOrderingComposer + extends Composer<_$AppDatabase, $PlaylistTableTable> { + $$PlaylistTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get index => $composableBuilder( + column: $table.index, builder: (column) => ColumnOrderings(column)); + + $$AudioPlayerStateTableTableOrderingComposer get audioPlayerStateId { + final $$AudioPlayerStateTableTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.audioPlayerStateId, + referencedTable: $db.audioPlayerStateTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$AudioPlayerStateTableTableOrderingComposer( + $db: $db, + $table: $db.audioPlayerStateTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } +} + +class $$PlaylistTableTableAnnotationComposer + extends Composer<_$AppDatabase, $PlaylistTableTable> { + $$PlaylistTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get index => + $composableBuilder(column: $table.index, builder: (column) => column); + + $$AudioPlayerStateTableTableAnnotationComposer get audioPlayerStateId { + final $$AudioPlayerStateTableTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.audioPlayerStateId, + referencedTable: $db.audioPlayerStateTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$AudioPlayerStateTableTableAnnotationComposer( + $db: $db, + $table: $db.audioPlayerStateTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } + + Expression playlistMediaTableRefs( + Expression Function($$PlaylistMediaTableTableAnnotationComposer a) f) { + final $$PlaylistMediaTableTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.playlistMediaTable, + getReferencedColumn: (t) => t.playlistId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistMediaTableTableAnnotationComposer( + $db: $db, + $table: $db.playlistMediaTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } +} + class $$PlaylistTableTableTableManager extends RootTableManager< _$AppDatabase, $PlaylistTableTable, PlaylistTableData, $$PlaylistTableTableFilterComposer, $$PlaylistTableTableOrderingComposer, - $$PlaylistTableTableProcessedTableManager, - $$PlaylistTableTableInsertCompanionBuilder, - $$PlaylistTableTableUpdateCompanionBuilder> { + $$PlaylistTableTableAnnotationComposer, + $$PlaylistTableTableCreateCompanionBuilder, + $$PlaylistTableTableUpdateCompanionBuilder, + (PlaylistTableData, $$PlaylistTableTableReferences), + PlaylistTableData, + PrefetchHooks Function( + {bool audioPlayerStateId, bool playlistMediaTableRefs})> { $$PlaylistTableTableTableManager(_$AppDatabase db, $PlaylistTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$PlaylistTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$PlaylistTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$PlaylistTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$PlaylistTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$PlaylistTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$PlaylistTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value audioPlayerStateId = const Value.absent(), Value index = const Value.absent(), @@ -5302,7 +6046,7 @@ class $$PlaylistTableTableTableManager extends RootTableManager< audioPlayerStateId: audioPlayerStateId, index: index, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required int audioPlayerStateId, required int index, @@ -5312,99 +6056,81 @@ class $$PlaylistTableTableTableManager extends RootTableManager< audioPlayerStateId: audioPlayerStateId, index: index, ), + withReferenceMapper: (p0) => p0 + .map((e) => ( + e.readTable(table), + $$PlaylistTableTableReferences(db, table, e) + )) + .toList(), + prefetchHooksCallback: ( + {audioPlayerStateId = false, playlistMediaTableRefs = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (playlistMediaTableRefs) db.playlistMediaTable + ], + addJoins: < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic>>(state) { + if (audioPlayerStateId) { + state = state.withJoin( + currentTable: table, + currentColumn: table.audioPlayerStateId, + referencedTable: $$PlaylistTableTableReferences + ._audioPlayerStateIdTable(db), + referencedColumn: $$PlaylistTableTableReferences + ._audioPlayerStateIdTable(db) + .id, + ) as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return [ + if (playlistMediaTableRefs) + await $_getPrefetchedData( + currentTable: table, + referencedTable: $$PlaylistTableTableReferences + ._playlistMediaTableRefsTable(db), + managerFromTypedResult: (p0) => + $$PlaylistTableTableReferences(db, table, p0) + .playlistMediaTableRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems + .where((e) => e.playlistId == item.id), + typedResults: items) + ]; + }, + ); + }, )); } -class $$PlaylistTableTableProcessedTableManager extends ProcessedTableManager< +typedef $$PlaylistTableTableProcessedTableManager = ProcessedTableManager< _$AppDatabase, $PlaylistTableTable, PlaylistTableData, $$PlaylistTableTableFilterComposer, $$PlaylistTableTableOrderingComposer, - $$PlaylistTableTableProcessedTableManager, - $$PlaylistTableTableInsertCompanionBuilder, - $$PlaylistTableTableUpdateCompanionBuilder> { - $$PlaylistTableTableProcessedTableManager(super.$state); -} - -class $$PlaylistTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $PlaylistTableTable> { - $$PlaylistTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get index => $state.composableBuilder( - column: $state.table.index, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - $$AudioPlayerStateTableTableFilterComposer get audioPlayerStateId { - final $$AudioPlayerStateTableTableFilterComposer composer = - $state.composerBuilder( - composer: this, - getCurrentColumn: (t) => t.audioPlayerStateId, - referencedTable: $state.db.audioPlayerStateTable, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, parentComposers) => - $$AudioPlayerStateTableTableFilterComposer(ComposerState( - $state.db, - $state.db.audioPlayerStateTable, - joinBuilder, - parentComposers))); - return composer; - } - - ComposableFilter playlistMediaTableRefs( - ComposableFilter Function($$PlaylistMediaTableTableFilterComposer f) f) { - final $$PlaylistMediaTableTableFilterComposer composer = $state - .composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $state.db.playlistMediaTable, - getReferencedColumn: (t) => t.playlistId, - builder: (joinBuilder, parentComposers) => - $$PlaylistMediaTableTableFilterComposer(ComposerState( - $state.db, - $state.db.playlistMediaTable, - joinBuilder, - parentComposers))); - return f(composer); - } -} - -class $$PlaylistTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $PlaylistTableTable> { - $$PlaylistTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get index => $state.composableBuilder( - column: $state.table.index, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - $$AudioPlayerStateTableTableOrderingComposer get audioPlayerStateId { - final $$AudioPlayerStateTableTableOrderingComposer composer = - $state.composerBuilder( - composer: this, - getCurrentColumn: (t) => t.audioPlayerStateId, - referencedTable: $state.db.audioPlayerStateTable, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, parentComposers) => - $$AudioPlayerStateTableTableOrderingComposer(ComposerState( - $state.db, - $state.db.audioPlayerStateTable, - joinBuilder, - parentComposers))); - return composer; - } -} - -typedef $$PlaylistMediaTableTableInsertCompanionBuilder + $$PlaylistTableTableAnnotationComposer, + $$PlaylistTableTableCreateCompanionBuilder, + $$PlaylistTableTableUpdateCompanionBuilder, + (PlaylistTableData, $$PlaylistTableTableReferences), + PlaylistTableData, + PrefetchHooks Function( + {bool audioPlayerStateId, bool playlistMediaTableRefs})>; +typedef $$PlaylistMediaTableTableCreateCompanionBuilder = PlaylistMediaTableCompanion Function({ Value id, required int playlistId, @@ -5421,27 +6147,184 @@ typedef $$PlaylistMediaTableTableUpdateCompanionBuilder Value?> httpHeaders, }); +final class $$PlaylistMediaTableTableReferences extends BaseReferences< + _$AppDatabase, $PlaylistMediaTableTable, PlaylistMediaTableData> { + $$PlaylistMediaTableTableReferences( + super.$_db, super.$_table, super.$_typedResult); + + static $PlaylistTableTable _playlistIdTable(_$AppDatabase db) => + db.playlistTable.createAlias($_aliasNameGenerator( + db.playlistMediaTable.playlistId, db.playlistTable.id)); + + $$PlaylistTableTableProcessedTableManager? get playlistId { + if ($_item.playlistId == null) return null; + final manager = $$PlaylistTableTableTableManager($_db, $_db.playlistTable) + .filter((f) => f.id($_item.playlistId!)); + final item = $_typedResult.readTableOrNull(_playlistIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item])); + } +} + +class $$PlaylistMediaTableTableFilterComposer + extends Composer<_$AppDatabase, $PlaylistMediaTableTable> { + $$PlaylistMediaTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get uri => $composableBuilder( + column: $table.uri, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters?, Map, + String> + get extras => $composableBuilder( + column: $table.extras, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnWithTypeConverterFilters?, Map, + String> + get httpHeaders => $composableBuilder( + column: $table.httpHeaders, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + $$PlaylistTableTableFilterComposer get playlistId { + final $$PlaylistTableTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.playlistId, + referencedTable: $db.playlistTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistTableTableFilterComposer( + $db: $db, + $table: $db.playlistTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } +} + +class $$PlaylistMediaTableTableOrderingComposer + extends Composer<_$AppDatabase, $PlaylistMediaTableTable> { + $$PlaylistMediaTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get uri => $composableBuilder( + column: $table.uri, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get extras => $composableBuilder( + column: $table.extras, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get httpHeaders => $composableBuilder( + column: $table.httpHeaders, builder: (column) => ColumnOrderings(column)); + + $$PlaylistTableTableOrderingComposer get playlistId { + final $$PlaylistTableTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.playlistId, + referencedTable: $db.playlistTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistTableTableOrderingComposer( + $db: $db, + $table: $db.playlistTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } +} + +class $$PlaylistMediaTableTableAnnotationComposer + extends Composer<_$AppDatabase, $PlaylistMediaTableTable> { + $$PlaylistMediaTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get uri => + $composableBuilder(column: $table.uri, builder: (column) => column); + + GeneratedColumnWithTypeConverter?, String> get extras => + $composableBuilder(column: $table.extras, builder: (column) => column); + + GeneratedColumnWithTypeConverter?, String> + get httpHeaders => $composableBuilder( + column: $table.httpHeaders, builder: (column) => column); + + $$PlaylistTableTableAnnotationComposer get playlistId { + final $$PlaylistTableTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.playlistId, + referencedTable: $db.playlistTable, + getReferencedColumn: (t) => t.id, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$PlaylistTableTableAnnotationComposer( + $db: $db, + $table: $db.playlistTable, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return composer; + } +} + class $$PlaylistMediaTableTableTableManager extends RootTableManager< _$AppDatabase, $PlaylistMediaTableTable, PlaylistMediaTableData, $$PlaylistMediaTableTableFilterComposer, $$PlaylistMediaTableTableOrderingComposer, - $$PlaylistMediaTableTableProcessedTableManager, - $$PlaylistMediaTableTableInsertCompanionBuilder, - $$PlaylistMediaTableTableUpdateCompanionBuilder> { + $$PlaylistMediaTableTableAnnotationComposer, + $$PlaylistMediaTableTableCreateCompanionBuilder, + $$PlaylistMediaTableTableUpdateCompanionBuilder, + (PlaylistMediaTableData, $$PlaylistMediaTableTableReferences), + PlaylistMediaTableData, + PrefetchHooks Function({bool playlistId})> { $$PlaylistMediaTableTableTableManager( _$AppDatabase db, $PlaylistMediaTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$PlaylistMediaTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: $$PlaylistMediaTableTableOrderingComposer( - ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$PlaylistMediaTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$PlaylistMediaTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$PlaylistMediaTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$PlaylistMediaTableTableAnnotationComposer( + $db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value playlistId = const Value.absent(), Value uri = const Value.absent(), @@ -5455,7 +6338,7 @@ class $$PlaylistMediaTableTableTableManager extends RootTableManager< extras: extras, httpHeaders: httpHeaders, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required int playlistId, required String uri, @@ -5469,102 +6352,64 @@ class $$PlaylistMediaTableTableTableManager extends RootTableManager< extras: extras, httpHeaders: httpHeaders, ), + withReferenceMapper: (p0) => p0 + .map((e) => ( + e.readTable(table), + $$PlaylistMediaTableTableReferences(db, table, e) + )) + .toList(), + prefetchHooksCallback: ({playlistId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic>>(state) { + if (playlistId) { + state = state.withJoin( + currentTable: table, + currentColumn: table.playlistId, + referencedTable: $$PlaylistMediaTableTableReferences + ._playlistIdTable(db), + referencedColumn: $$PlaylistMediaTableTableReferences + ._playlistIdTable(db) + .id, + ) as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, )); } -class $$PlaylistMediaTableTableProcessedTableManager - extends ProcessedTableManager< - _$AppDatabase, - $PlaylistMediaTableTable, - PlaylistMediaTableData, - $$PlaylistMediaTableTableFilterComposer, - $$PlaylistMediaTableTableOrderingComposer, - $$PlaylistMediaTableTableProcessedTableManager, - $$PlaylistMediaTableTableInsertCompanionBuilder, - $$PlaylistMediaTableTableUpdateCompanionBuilder> { - $$PlaylistMediaTableTableProcessedTableManager(super.$state); -} - -class $$PlaylistMediaTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $PlaylistMediaTableTable> { - $$PlaylistMediaTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get uri => $state.composableBuilder( - column: $state.table.uri, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters?, Map, - String> - get extras => $state.composableBuilder( - column: $state.table.extras, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters?, Map, - String> - get httpHeaders => $state.composableBuilder( - column: $state.table.httpHeaders, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - $$PlaylistTableTableFilterComposer get playlistId { - final $$PlaylistTableTableFilterComposer composer = $state.composerBuilder( - composer: this, - getCurrentColumn: (t) => t.playlistId, - referencedTable: $state.db.playlistTable, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, parentComposers) => - $$PlaylistTableTableFilterComposer(ComposerState($state.db, - $state.db.playlistTable, joinBuilder, parentComposers))); - return composer; - } -} - -class $$PlaylistMediaTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $PlaylistMediaTableTable> { - $$PlaylistMediaTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get uri => $state.composableBuilder( - column: $state.table.uri, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get extras => $state.composableBuilder( - column: $state.table.extras, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get httpHeaders => $state.composableBuilder( - column: $state.table.httpHeaders, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - $$PlaylistTableTableOrderingComposer get playlistId { - final $$PlaylistTableTableOrderingComposer composer = - $state.composerBuilder( - composer: this, - getCurrentColumn: (t) => t.playlistId, - referencedTable: $state.db.playlistTable, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, parentComposers) => - $$PlaylistTableTableOrderingComposer(ComposerState($state.db, - $state.db.playlistTable, joinBuilder, parentComposers))); - return composer; - } -} - -typedef $$HistoryTableTableInsertCompanionBuilder = HistoryTableCompanion +typedef $$PlaylistMediaTableTableProcessedTableManager = ProcessedTableManager< + _$AppDatabase, + $PlaylistMediaTableTable, + PlaylistMediaTableData, + $$PlaylistMediaTableTableFilterComposer, + $$PlaylistMediaTableTableOrderingComposer, + $$PlaylistMediaTableTableAnnotationComposer, + $$PlaylistMediaTableTableCreateCompanionBuilder, + $$PlaylistMediaTableTableUpdateCompanionBuilder, + (PlaylistMediaTableData, $$PlaylistMediaTableTableReferences), + PlaylistMediaTableData, + PrefetchHooks Function({bool playlistId})>; +typedef $$HistoryTableTableCreateCompanionBuilder = HistoryTableCompanion Function({ Value id, Value createdAt, @@ -5581,26 +6426,112 @@ typedef $$HistoryTableTableUpdateCompanionBuilder = HistoryTableCompanion Value> data, }); +class $$HistoryTableTableFilterComposer + extends Composer<_$AppDatabase, $HistoryTableTable> { + $$HistoryTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnWithTypeConverterFilters(column)); + + ColumnFilters get itemId => $composableBuilder( + column: $table.itemId, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters, Map, + String> + get data => $composableBuilder( + column: $table.data, + builder: (column) => ColumnWithTypeConverterFilters(column)); +} + +class $$HistoryTableTableOrderingComposer + extends Composer<_$AppDatabase, $HistoryTableTable> { + $$HistoryTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get type => $composableBuilder( + column: $table.type, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get itemId => $composableBuilder( + column: $table.itemId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get data => $composableBuilder( + column: $table.data, builder: (column) => ColumnOrderings(column)); +} + +class $$HistoryTableTableAnnotationComposer + extends Composer<_$AppDatabase, $HistoryTableTable> { + $$HistoryTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumnWithTypeConverter get type => + $composableBuilder(column: $table.type, builder: (column) => column); + + GeneratedColumn get itemId => + $composableBuilder(column: $table.itemId, builder: (column) => column); + + GeneratedColumnWithTypeConverter, String> get data => + $composableBuilder(column: $table.data, builder: (column) => column); +} + class $$HistoryTableTableTableManager extends RootTableManager< _$AppDatabase, $HistoryTableTable, HistoryTableData, $$HistoryTableTableFilterComposer, $$HistoryTableTableOrderingComposer, - $$HistoryTableTableProcessedTableManager, - $$HistoryTableTableInsertCompanionBuilder, - $$HistoryTableTableUpdateCompanionBuilder> { + $$HistoryTableTableAnnotationComposer, + $$HistoryTableTableCreateCompanionBuilder, + $$HistoryTableTableUpdateCompanionBuilder, + ( + HistoryTableData, + BaseReferences<_$AppDatabase, $HistoryTableTable, HistoryTableData> + ), + HistoryTableData, + PrefetchHooks Function()> { $$HistoryTableTableTableManager(_$AppDatabase db, $HistoryTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$HistoryTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$HistoryTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$HistoryTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$HistoryTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$HistoryTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$HistoryTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value createdAt = const Value.absent(), Value type = const Value.absent(), @@ -5614,7 +6545,7 @@ class $$HistoryTableTableTableManager extends RootTableManager< itemId: itemId, data: data, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), Value createdAt = const Value.absent(), required HistoryEntryType type, @@ -5628,85 +6559,29 @@ class $$HistoryTableTableTableManager extends RootTableManager< itemId: itemId, data: data, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$HistoryTableTableProcessedTableManager extends ProcessedTableManager< +typedef $$HistoryTableTableProcessedTableManager = ProcessedTableManager< _$AppDatabase, $HistoryTableTable, HistoryTableData, $$HistoryTableTableFilterComposer, $$HistoryTableTableOrderingComposer, - $$HistoryTableTableProcessedTableManager, - $$HistoryTableTableInsertCompanionBuilder, - $$HistoryTableTableUpdateCompanionBuilder> { - $$HistoryTableTableProcessedTableManager(super.$state); -} - -class $$HistoryTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $HistoryTableTable> { - $$HistoryTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get type => $state.composableBuilder( - column: $state.table.type, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); - - ColumnFilters get itemId => $state.composableBuilder( - column: $state.table.itemId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters, Map, - String> - get data => $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); -} - -class $$HistoryTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $HistoryTableTable> { - $$HistoryTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get type => $state.composableBuilder( - column: $state.table.type, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get itemId => $state.composableBuilder( - column: $state.table.itemId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get data => $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -typedef $$LyricsTableTableInsertCompanionBuilder = LyricsTableCompanion + $$HistoryTableTableAnnotationComposer, + $$HistoryTableTableCreateCompanionBuilder, + $$HistoryTableTableUpdateCompanionBuilder, + ( + HistoryTableData, + BaseReferences<_$AppDatabase, $HistoryTableTable, HistoryTableData> + ), + HistoryTableData, + PrefetchHooks Function()>; +typedef $$LyricsTableTableCreateCompanionBuilder = LyricsTableCompanion Function({ Value id, required String trackId, @@ -5719,26 +6594,91 @@ typedef $$LyricsTableTableUpdateCompanionBuilder = LyricsTableCompanion Value data, }); +class $$LyricsTableTableFilterComposer + extends Composer<_$AppDatabase, $LyricsTableTable> { + $$LyricsTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); + + ColumnFilters get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get data => $composableBuilder( + column: $table.data, + builder: (column) => ColumnWithTypeConverterFilters(column)); +} + +class $$LyricsTableTableOrderingComposer + extends Composer<_$AppDatabase, $LyricsTableTable> { + $$LyricsTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get trackId => $composableBuilder( + column: $table.trackId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get data => $composableBuilder( + column: $table.data, builder: (column) => ColumnOrderings(column)); +} + +class $$LyricsTableTableAnnotationComposer + extends Composer<_$AppDatabase, $LyricsTableTable> { + $$LyricsTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get trackId => + $composableBuilder(column: $table.trackId, builder: (column) => column); + + GeneratedColumnWithTypeConverter get data => + $composableBuilder(column: $table.data, builder: (column) => column); +} + class $$LyricsTableTableTableManager extends RootTableManager< _$AppDatabase, $LyricsTableTable, LyricsTableData, $$LyricsTableTableFilterComposer, $$LyricsTableTableOrderingComposer, - $$LyricsTableTableProcessedTableManager, - $$LyricsTableTableInsertCompanionBuilder, - $$LyricsTableTableUpdateCompanionBuilder> { + $$LyricsTableTableAnnotationComposer, + $$LyricsTableTableCreateCompanionBuilder, + $$LyricsTableTableUpdateCompanionBuilder, + ( + LyricsTableData, + BaseReferences<_$AppDatabase, $LyricsTableTable, LyricsTableData> + ), + LyricsTableData, + PrefetchHooks Function()> { $$LyricsTableTableTableManager(_$AppDatabase db, $LyricsTableTable table) : super(TableManagerState( db: db, table: table, - filteringComposer: - $$LyricsTableTableFilterComposer(ComposerState(db, table)), - orderingComposer: - $$LyricsTableTableOrderingComposer(ComposerState(db, table)), - getChildManagerBuilder: (p) => - $$LyricsTableTableProcessedTableManager(p), - getUpdateCompanionBuilder: ({ + createFilteringComposer: () => + $$LyricsTableTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$LyricsTableTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$LyricsTableTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: ({ Value id = const Value.absent(), Value trackId = const Value.absent(), Value data = const Value.absent(), @@ -5748,7 +6688,7 @@ class $$LyricsTableTableTableManager extends RootTableManager< trackId: trackId, data: data, ), - getInsertCompanionBuilder: ({ + createCompanionCallback: ({ Value id = const Value.absent(), required String trackId, required SubtitleSimple data, @@ -5758,64 +6698,32 @@ class $$LyricsTableTableTableManager extends RootTableManager< trackId: trackId, data: data, ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, )); } -class $$LyricsTableTableProcessedTableManager extends ProcessedTableManager< +typedef $$LyricsTableTableProcessedTableManager = ProcessedTableManager< _$AppDatabase, $LyricsTableTable, LyricsTableData, $$LyricsTableTableFilterComposer, $$LyricsTableTableOrderingComposer, - $$LyricsTableTableProcessedTableManager, - $$LyricsTableTableInsertCompanionBuilder, - $$LyricsTableTableUpdateCompanionBuilder> { - $$LyricsTableTableProcessedTableManager(super.$state); -} + $$LyricsTableTableAnnotationComposer, + $$LyricsTableTableCreateCompanionBuilder, + $$LyricsTableTableUpdateCompanionBuilder, + ( + LyricsTableData, + BaseReferences<_$AppDatabase, $LyricsTableTable, LyricsTableData> + ), + LyricsTableData, + PrefetchHooks Function()>; -class $$LyricsTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $LyricsTableTable> { - $$LyricsTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnFilters get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); - - ColumnWithTypeConverterFilters - get data => $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); -} - -class $$LyricsTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $LyricsTableTable> { - $$LyricsTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get trackId => $state.composableBuilder( - column: $state.table.trackId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); - - ColumnOrderings get data => $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); -} - -class _$AppDatabaseManager { +class $AppDatabaseManager { final _$AppDatabase _db; - _$AppDatabaseManager(this._db); + $AppDatabaseManager(this._db); $$AuthenticationTableTableTableManager get authenticationTable => $$AuthenticationTableTableTableManager(_db, _db.authenticationTable); $$BlacklistTableTableTableManager get blacklistTable => diff --git a/lib/models/database/database.steps.dart b/lib/models/database/database.steps.dart new file mode 100644 index 00000000..4814fa5a --- /dev/null +++ b/lib/models/database/database.steps.dart @@ -0,0 +1,652 @@ +import 'package:drift/internal/versioned_schema.dart' as i0; +import 'package:drift/drift.dart' as i1; +import 'package:drift/drift.dart'; +import 'package:flutter/material.dart'; +import 'package:spotify/spotify.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/utils/migrations/adapters.dart'; // ignore_for_file: type=lint,unused_import + +// GENERATED BY drift_dev, DO NOT MODIFY. +final class Schema2 extends i0.VersionedSchema { + Schema2({required super.database}) : super(version: 2); + @override + late final List entities = [ + authenticationTable, + blacklistTable, + preferencesTable, + scrobblerTable, + skipSegmentTable, + sourceMatchTable, + audioPlayerStateTable, + playlistTable, + playlistMediaTable, + historyTable, + lyricsTable, + uniqueBlacklist, + uniqTrackMatch, + ]; + late final Shape0 authenticationTable = Shape0( + source: i0.VersionedTable( + entityName: 'authentication_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 blacklistTable = Shape1( + source: i0.VersionedTable( + entityName: 'blacklist_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_4, + _column_5, + _column_6, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape2 preferencesTable = Shape2( + source: i0.VersionedTable( + entityName: 'preferences_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_7, + _column_8, + _column_9, + _column_10, + _column_11, + _column_12, + _column_13, + _column_14, + _column_15, + _column_16, + _column_17, + _column_18, + _column_19, + _column_20, + _column_21, + _column_22, + _column_23, + _column_24, + _column_25, + _column_26, + _column_27, + _column_28, + _column_29, + _column_30, + _column_31, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 scrobblerTable = Shape3( + source: i0.VersionedTable( + entityName: 'scrobbler_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_32, + _column_33, + _column_34, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape4 skipSegmentTable = Shape4( + source: i0.VersionedTable( + entityName: 'skip_segment_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_35, + _column_36, + _column_37, + _column_32, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 sourceMatchTable = Shape5( + source: i0.VersionedTable( + entityName: 'source_match_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_37, + _column_38, + _column_39, + _column_32, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 audioPlayerStateTable = Shape6( + source: i0.VersionedTable( + entityName: 'audio_player_state_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_40, + _column_41, + _column_42, + _column_43, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape7 playlistTable = Shape7( + source: i0.VersionedTable( + entityName: 'playlist_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_44, + _column_45, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape8 playlistMediaTable = Shape8( + source: i0.VersionedTable( + entityName: 'playlist_media_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_46, + _column_47, + _column_48, + _column_49, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape9 historyTable = Shape9( + source: i0.VersionedTable( + entityName: 'history_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_32, + _column_50, + _column_51, + _column_52, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape10 lyricsTable = Shape10( + source: i0.VersionedTable( + entityName: 'lyrics_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_37, + _column_52, + ], + attachedDatabase: database, + ), + alias: null); + final i1.Index uniqueBlacklist = i1.Index('unique_blacklist', + 'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)'); + final i1.Index uniqTrackMatch = i1.Index('uniq_track_match', + 'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)'); +} + +class Shape0 extends i0.VersionedTable { + Shape0({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get cookie => + columnsByName['cookie']! as i1.GeneratedColumn; + i1.GeneratedColumn get accessToken => + columnsByName['access_token']! as i1.GeneratedColumn; + i1.GeneratedColumn get expiration => + columnsByName['expiration']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_0(String aliasedName) => + i1.GeneratedColumn('id', aliasedName, false, + hasAutoIncrement: true, + type: i1.DriftSqlType.int, + defaultConstraints: + i1.GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); +i1.GeneratedColumn _column_1(String aliasedName) => + i1.GeneratedColumn('cookie', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_2(String aliasedName) => + i1.GeneratedColumn('access_token', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_3(String aliasedName) => + i1.GeneratedColumn('expiration', aliasedName, false, + type: i1.DriftSqlType.dateTime); + +class Shape1 extends i0.VersionedTable { + Shape1({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get name => + columnsByName['name']! as i1.GeneratedColumn; + i1.GeneratedColumn get elementType => + columnsByName['element_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get elementId => + columnsByName['element_id']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_4(String aliasedName) => + i1.GeneratedColumn('name', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_5(String aliasedName) => + i1.GeneratedColumn('element_type', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_6(String aliasedName) => + i1.GeneratedColumn('element_id', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape2 extends i0.VersionedTable { + Shape2({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioQuality => + columnsByName['audio_quality']! as i1.GeneratedColumn; + i1.GeneratedColumn get albumColorSync => + columnsByName['album_color_sync']! as i1.GeneratedColumn; + i1.GeneratedColumn get amoledDarkTheme => + columnsByName['amoled_dark_theme']! as i1.GeneratedColumn; + i1.GeneratedColumn get checkUpdate => + columnsByName['check_update']! as i1.GeneratedColumn; + i1.GeneratedColumn get normalizeAudio => + columnsByName['normalize_audio']! as i1.GeneratedColumn; + i1.GeneratedColumn get showSystemTrayIcon => + columnsByName['show_system_tray_icon']! as i1.GeneratedColumn; + i1.GeneratedColumn get systemTitleBar => + columnsByName['system_title_bar']! as i1.GeneratedColumn; + i1.GeneratedColumn get skipNonMusic => + columnsByName['skip_non_music']! as i1.GeneratedColumn; + i1.GeneratedColumn get closeBehavior => + columnsByName['close_behavior']! as i1.GeneratedColumn; + i1.GeneratedColumn get accentColorScheme => + columnsByName['accent_color_scheme']! as i1.GeneratedColumn; + i1.GeneratedColumn get layoutMode => + columnsByName['layout_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get locale => + columnsByName['locale']! as i1.GeneratedColumn; + i1.GeneratedColumn get market => + columnsByName['market']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchMode => + columnsByName['search_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadLocation => + columnsByName['download_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get localLibraryLocation => + columnsByName['local_library_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get pipedInstance => + columnsByName['piped_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get invidiousInstance => + columnsByName['invidious_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get themeMode => + columnsByName['theme_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioSource => + columnsByName['audio_source']! as i1.GeneratedColumn; + i1.GeneratedColumn get streamMusicCodec => + columnsByName['stream_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadMusicCodec => + columnsByName['download_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get discordPresence => + columnsByName['discord_presence']! as i1.GeneratedColumn; + i1.GeneratedColumn get endlessPlayback => + columnsByName['endless_playback']! as i1.GeneratedColumn; + i1.GeneratedColumn get enableConnect => + columnsByName['enable_connect']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_7(String aliasedName) => + i1.GeneratedColumn('audio_quality', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(SourceQualities.high.name)); +i1.GeneratedColumn _column_8(String aliasedName) => + i1.GeneratedColumn('album_color_sync', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("album_color_sync" IN (0, 1))'), + defaultValue: const Constant(true)); +i1.GeneratedColumn _column_9(String aliasedName) => + i1.GeneratedColumn('amoled_dark_theme', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("amoled_dark_theme" IN (0, 1))'), + defaultValue: const Constant(false)); +i1.GeneratedColumn _column_10(String aliasedName) => + i1.GeneratedColumn('check_update', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("check_update" IN (0, 1))'), + defaultValue: const Constant(true)); +i1.GeneratedColumn _column_11(String aliasedName) => + i1.GeneratedColumn('normalize_audio', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("normalize_audio" IN (0, 1))'), + defaultValue: const Constant(false)); +i1.GeneratedColumn _column_12(String aliasedName) => + i1.GeneratedColumn('show_system_tray_icon', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("show_system_tray_icon" IN (0, 1))'), + defaultValue: const Constant(false)); +i1.GeneratedColumn _column_13(String aliasedName) => + i1.GeneratedColumn('system_title_bar', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("system_title_bar" IN (0, 1))'), + defaultValue: const Constant(false)); +i1.GeneratedColumn _column_14(String aliasedName) => + i1.GeneratedColumn('skip_non_music', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("skip_non_music" IN (0, 1))'), + defaultValue: const Constant(false)); +i1.GeneratedColumn _column_15(String aliasedName) => + i1.GeneratedColumn('close_behavior', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(CloseBehavior.close.name)); +i1.GeneratedColumn _column_16(String aliasedName) => + i1.GeneratedColumn('accent_color_scheme', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: const Constant("Blue:0xFF2196F3")); +i1.GeneratedColumn _column_17(String aliasedName) => + i1.GeneratedColumn('layout_mode', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(LayoutMode.adaptive.name)); +i1.GeneratedColumn _column_18(String aliasedName) => + i1.GeneratedColumn('locale', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: + const Constant('{"languageCode":"system","countryCode":"system"}')); +i1.GeneratedColumn _column_19(String aliasedName) => + i1.GeneratedColumn('market', aliasedName, false, + type: i1.DriftSqlType.string, defaultValue: Constant(Market.US.name)); +i1.GeneratedColumn _column_20(String aliasedName) => + i1.GeneratedColumn('search_mode', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(SearchMode.youtube.name)); +i1.GeneratedColumn _column_21(String aliasedName) => + i1.GeneratedColumn('download_location', aliasedName, false, + type: i1.DriftSqlType.string, defaultValue: const Constant("")); +i1.GeneratedColumn _column_22(String aliasedName) => + i1.GeneratedColumn('local_library_location', aliasedName, false, + type: i1.DriftSqlType.string, defaultValue: const Constant("")); +i1.GeneratedColumn _column_23(String aliasedName) => + i1.GeneratedColumn('piped_instance', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: const Constant("https://pipedapi.kavin.rocks")); +i1.GeneratedColumn _column_24(String aliasedName) => + i1.GeneratedColumn('invidious_instance', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: const Constant("https://inv.nadeko.net")); +i1.GeneratedColumn _column_25(String aliasedName) => + i1.GeneratedColumn('theme_mode', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(ThemeMode.system.name)); +i1.GeneratedColumn _column_26(String aliasedName) => + i1.GeneratedColumn('audio_source', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(AudioSource.youtube.name)); +i1.GeneratedColumn _column_27(String aliasedName) => + i1.GeneratedColumn('stream_music_codec', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(SourceCodecs.weba.name)); +i1.GeneratedColumn _column_28(String aliasedName) => + i1.GeneratedColumn('download_music_codec', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(SourceCodecs.m4a.name)); +i1.GeneratedColumn _column_29(String aliasedName) => + i1.GeneratedColumn('discord_presence', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("discord_presence" IN (0, 1))'), + defaultValue: const Constant(true)); +i1.GeneratedColumn _column_30(String aliasedName) => + i1.GeneratedColumn('endless_playback', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("endless_playback" IN (0, 1))'), + defaultValue: const Constant(true)); +i1.GeneratedColumn _column_31(String aliasedName) => + i1.GeneratedColumn('enable_connect', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("enable_connect" IN (0, 1))'), + defaultValue: const Constant(false)); + +class Shape3 extends i0.VersionedTable { + Shape3({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get username => + columnsByName['username']! as i1.GeneratedColumn; + i1.GeneratedColumn get passwordHash => + columnsByName['password_hash']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_32(String aliasedName) => + i1.GeneratedColumn('created_at', aliasedName, false, + type: i1.DriftSqlType.dateTime, defaultValue: currentDateAndTime); +i1.GeneratedColumn _column_33(String aliasedName) => + i1.GeneratedColumn('username', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_34(String aliasedName) => + i1.GeneratedColumn('password_hash', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape4 extends i0.VersionedTable { + Shape4({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get start => + columnsByName['start']! as i1.GeneratedColumn; + i1.GeneratedColumn get end => + columnsByName['end']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => + columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_35(String aliasedName) => + i1.GeneratedColumn('start', aliasedName, false, + type: i1.DriftSqlType.int); +i1.GeneratedColumn _column_36(String aliasedName) => + i1.GeneratedColumn('end', aliasedName, false, + type: i1.DriftSqlType.int); +i1.GeneratedColumn _column_37(String aliasedName) => + i1.GeneratedColumn('track_id', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape5 extends i0.VersionedTable { + Shape5({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => + columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sourceId => + columnsByName['source_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sourceType => + columnsByName['source_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_38(String aliasedName) => + i1.GeneratedColumn('source_id', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_39(String aliasedName) => + i1.GeneratedColumn('source_type', aliasedName, false, + type: i1.DriftSqlType.string, + defaultValue: Constant(SourceType.youtube.name)); + +class Shape6 extends i0.VersionedTable { + Shape6({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get playing => + columnsByName['playing']! as i1.GeneratedColumn; + i1.GeneratedColumn get loopMode => + columnsByName['loop_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get shuffled => + columnsByName['shuffled']! as i1.GeneratedColumn; + i1.GeneratedColumn get collections => + columnsByName['collections']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_40(String aliasedName) => + i1.GeneratedColumn('playing', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("playing" IN (0, 1))')); +i1.GeneratedColumn _column_41(String aliasedName) => + i1.GeneratedColumn('loop_mode', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_42(String aliasedName) => + i1.GeneratedColumn('shuffled', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("shuffled" IN (0, 1))')); +i1.GeneratedColumn _column_43(String aliasedName) => + i1.GeneratedColumn('collections', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape7 extends i0.VersionedTable { + Shape7({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioPlayerStateId => + columnsByName['audio_player_state_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get index => + columnsByName['index']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_44(String aliasedName) => + i1.GeneratedColumn('audio_player_state_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'REFERENCES audio_player_state_table (id)')); +i1.GeneratedColumn _column_45(String aliasedName) => + i1.GeneratedColumn('index', aliasedName, false, + type: i1.DriftSqlType.int); + +class Shape8 extends i0.VersionedTable { + Shape8({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get playlistId => + columnsByName['playlist_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get uri => + columnsByName['uri']! as i1.GeneratedColumn; + i1.GeneratedColumn get extras => + columnsByName['extras']! as i1.GeneratedColumn; + i1.GeneratedColumn get httpHeaders => + columnsByName['http_headers']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_46(String aliasedName) => + i1.GeneratedColumn('playlist_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'REFERENCES playlist_table (id)')); +i1.GeneratedColumn _column_47(String aliasedName) => + i1.GeneratedColumn('uri', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_48(String aliasedName) => + i1.GeneratedColumn('extras', aliasedName, true, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_49(String aliasedName) => + i1.GeneratedColumn('http_headers', aliasedName, true, + type: i1.DriftSqlType.string); + +class Shape9 extends i0.VersionedTable { + Shape9({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get type => + columnsByName['type']! as i1.GeneratedColumn; + i1.GeneratedColumn get itemId => + columnsByName['item_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get data => + columnsByName['data']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_50(String aliasedName) => + i1.GeneratedColumn('type', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_51(String aliasedName) => + i1.GeneratedColumn('item_id', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_52(String aliasedName) => + i1.GeneratedColumn('data', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape10 extends i0.VersionedTable { + Shape10({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => + columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get data => + columnsByName['data']! as i1.GeneratedColumn; +} + +i0.MigrationStepWithVersion migrationSteps({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) { + return (currentVersion, database) async { + switch (currentVersion) { + case 1: + final schema = Schema2(database: database); + final migrator = i1.Migrator(database, schema); + await from1To2(migrator, schema); + return 2; + default: + throw ArgumentError.value('Unknown migration from $currentVersion'); + } + }; +} + +i1.OnUpgrade stepByStep({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) => + i0.VersionedSchema.stepByStepHelper( + step: migrationSteps( + from1To2: from1To2, + )); diff --git a/lib/models/database/tables/preferences.dart b/lib/models/database/tables/preferences.dart index ae4ec1e8..96132de8 100644 --- a/lib/models/database/tables/preferences.dart +++ b/lib/models/database/tables/preferences.dart @@ -14,7 +14,8 @@ enum CloseBehavior { enum AudioSource { youtube, piped, - jiosaavn; + jiosaavn, + invidious; String get label => name[0].toUpperCase() + name.substring(1); } @@ -77,6 +78,8 @@ class PreferencesTable extends Table { text().withDefault(const Constant("")).map(const StringListConverter())(); TextColumn get pipedInstance => text().withDefault(const Constant("https://pipedapi.kavin.rocks"))(); + TextColumn get invidiousInstance => + text().withDefault(const Constant("https://inv.nadeko.net"))(); TextColumn get themeMode => textEnum().withDefault(Constant(ThemeMode.system.name))(); TextColumn get audioSource => @@ -113,6 +116,7 @@ class PreferencesTable extends Table { downloadLocation: "", localLibraryLocation: [], pipedInstance: "https://pipedapi.kavin.rocks", + invidiousInstance: "https://inv.nadeko.net", themeMode: ThemeMode.system, audioSource: AudioSource.youtube, streamMusicCodec: SourceCodecs.weba, diff --git a/lib/modules/player/sibling_tracks_sheet.dart b/lib/modules/player/sibling_tracks_sheet.dart index b58a5894..3a31d88e 100644 --- a/lib/modules/player/sibling_tracks_sheet.dart +++ b/lib/modules/player/sibling_tracks_sheet.dart @@ -23,6 +23,7 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/video_info.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; +import 'package:spotube/services/sourced_track/sources/invidious.dart'; import 'package:spotube/services/sourced_track/sources/jiosaavn.dart'; import 'package:spotube/services/sourced_track/sources/piped.dart'; import 'package:spotube/services/sourced_track/sources/youtube.dart'; @@ -42,6 +43,17 @@ final sourceInfoToIconMap = { ), ), PipedSourceInfo: const Icon(SpotubeIcons.piped), + InvidiousSourceInfo: Container( + height: 18, + width: 18, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(90), + image: DecorationImage( + image: Assets.invidious.provider(), + fit: BoxFit.cover, + ), + ), + ), }; class SiblingTracksSheet extends HookConsumerWidget { diff --git a/lib/pages/getting_started/sections/playback.dart b/lib/pages/getting_started/sections/playback.dart index e7087afd..dbf0bda2 100644 --- a/lib/pages/getting_started/sections/playback.dart +++ b/lib/pages/getting_started/sections/playback.dart @@ -17,6 +17,10 @@ final audioSourceToIconMap = { size: 30, ), AudioSource.piped: const Icon(SpotubeIcons.piped, size: 30), + AudioSource.invidious: ClipRRect( + borderRadius: BorderRadius.circular(48), + child: Assets.invidious.image(width: 48, height: 48), + ), AudioSource.jiosaavn: Assets.jiosaavn.image(width: 48, height: 48), }; @@ -45,6 +49,7 @@ class GettingStartedPagePlaybackSection extends HookConsumerWidget { AudioSource.jiosaavn: "${context.l10n.jiosaavn_source_description}\n" "${context.l10n.highest_quality("320kbps mp")}", + AudioSource.invidious: context.l10n.invidious_source_description, }, []); @@ -104,7 +109,9 @@ class GettingStartedPagePlaybackSection extends HookConsumerWidget { title: Align( alignment: switch (preferences.audioSource) { AudioSource.youtube => Alignment.centerLeft, - AudioSource.piped => Alignment.center, + AudioSource.piped || + AudioSource.invidious => + Alignment.center, AudioSource.jiosaavn => Alignment.centerRight, }, child: Text( diff --git a/lib/pages/settings/sections/playback.dart b/lib/pages/settings/sections/playback.dart index 6273c557..1101f424 100644 --- a/lib/pages/settings/sections/playback.dart +++ b/lib/pages/settings/sections/playback.dart @@ -10,7 +10,8 @@ import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/extensions/context.dart'; -import 'package:spotube/provider/piped_instances_provider.dart'; +import 'package:spotube/provider/audio_player/sources/invidious_instances_provider.dart'; +import 'package:spotube/provider/audio_player/sources/piped_instances_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/sourced_track/enums.dart'; @@ -135,6 +136,73 @@ class SettingsPlaybackSection extends HookConsumerWidget { ); }), ), + AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: preferences.audioSource != AudioSource.invidious + ? const SizedBox.shrink() + : Consumer(builder: (context, ref, child) { + final instanceList = ref.watch(invidiousInstancesProvider); + + return instanceList.when( + data: (data) { + return AdaptiveSelectTile( + secondary: const Icon(SpotubeIcons.piped), + title: Text(context.l10n.invidious_instance), + subtitle: RichText( + text: TextSpan( + children: [ + TextSpan( + text: context.l10n.invidious_description, + style: theme.textTheme.bodyMedium, + ), + const TextSpan(text: "\n"), + TextSpan( + text: context.l10n.invidious_warning, + style: theme.textTheme.labelMedium, + ) + ], + ), + ), + value: preferences.invidiousInstance, + showValueWhenUnfolded: false, + options: data + .sortedBy((e) => e.name) + .map( + (e) => DropdownMenuItem( + value: e.details.uri, + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: "${e.name.trim()}\n", + style: theme.textTheme.labelLarge, + ), + TextSpan( + text: countryCodeToEmoji( + e.details.region, + ), + style: GoogleFonts.notoColorEmoji(), + ), + ], + ), + ), + ), + ) + .toList(), + onChanged: (value) { + if (value != null) { + preferencesNotifier.setInvidiousInstance(value); + } + }, + ); + }, + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (error, stackTrace) => Text(error.toString()), + ); + }), + ), AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: preferences.audioSource != AudioSource.piped @@ -159,7 +227,8 @@ class SettingsPlaybackSection extends HookConsumerWidget { duration: const Duration(milliseconds: 300), child: preferences.searchMode == SearchMode.youtube && (preferences.audioSource == AudioSource.piped || - preferences.audioSource == AudioSource.youtube) + preferences.audioSource == AudioSource.youtube || + preferences.audioSource == AudioSource.invidious) ? SwitchListTile( secondary: const Icon(SpotubeIcons.skip), title: Text(context.l10n.skip_non_music), diff --git a/lib/provider/audio_player/sources/invidious_instances_provider.dart b/lib/provider/audio_player/sources/invidious_instances_provider.dart new file mode 100644 index 00000000..c04ac765 --- /dev/null +++ b/lib/provider/audio_player/sources/invidious_instances_provider.dart @@ -0,0 +1,12 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:spotube/services/sourced_track/sources/invidious.dart'; + +final invidiousInstancesProvider = FutureProvider((ref) async { + final invidious = ref.watch(invidiousProvider); + + final instances = await invidious.instances(); + + return instances + .where((instance) => instance.details.type == "https") + .toList(); +}); diff --git a/lib/provider/piped_instances_provider.dart b/lib/provider/audio_player/sources/piped_instances_provider.dart similarity index 100% rename from lib/provider/piped_instances_provider.dart rename to lib/provider/audio_player/sources/piped_instances_provider.dart diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index 30322a6f..93f5dac2 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -20,6 +20,17 @@ class ServerPlaybackRoutes { /// @get('/stream/') Future getStreamTrackId(Request request, String trackId) async { + final options = Options( + headers: { + ...request.headers, + "User-Agent": + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "Cache-Control": "max-age=0", + "Connection": "keep-alive", + }, + responseType: ResponseType.stream, + validateStatus: (status) => status! < 400, + ); try { final track = playlist.tracks.firstWhere((element) => element.id == trackId); @@ -30,22 +41,33 @@ class ServerPlaybackRoutes { : await ref.read(sourcedTrackProvider(SpotubeMedia(track)).future); ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); - - final res = await dio.get( + final res = await dio + .get( sourcedTrack!.url, - options: Options( + options: options.copyWith( headers: { - ...request.headers, - "User-Agent": - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + ...options.headers!, "host": Uri.parse(sourcedTrack.url).host, - "Cache-Control": "max-age=0", - "Connection": "keep-alive", }, - responseType: ResponseType.stream, - validateStatus: (status) => status! < 500, ), - ); + ) + .catchError((e, stack) async { + final sourcedTrack = await ref + .read(sourcedTrackProvider(SpotubeMedia(track)).notifier) + .switchToAlternativeSources(); + + ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); + + return await dio.get( + sourcedTrack!.url, + options: options.copyWith( + headers: { + ...options.headers!, + "host": Uri.parse(sourcedTrack.url).host, + }, + ), + ); + }); final audioStream = (res.data?.stream as Stream?)?.asBroadcastStream(); diff --git a/lib/provider/server/sourced_track.dart b/lib/provider/server/sourced_track.dart index 53a04023..58531523 100644 --- a/lib/provider/server/sourced_track.dart +++ b/lib/provider/server/sourced_track.dart @@ -5,24 +5,44 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; -final sourcedTrackProvider = - FutureProvider.family((ref, media) async { - final track = media?.track; - if (track == null || track is LocalTrack) { - return null; +class SourcedTrackNotifier + extends FamilyAsyncNotifier { + @override + build(media) async { + final track = media?.track; + if (track == null || track is LocalTrack) { + return null; + } + + ref.listen( + audioPlayerProvider.select((value) => value.tracks), + (old, next) { + if (next.isEmpty || next.none((element) => element.id == track.id)) { + ref.invalidateSelf(); + } + }, + ); + + final sourcedTrack = + await SourcedTrack.fetchFromTrack(track: track, ref: ref); + + return sourcedTrack; } - ref.listen( - audioPlayerProvider.select((value) => value.tracks), - (old, next) { - if (next.isEmpty || next.none((element) => element.id == track.id)) { - ref.invalidateSelf(); - } - }, - ); + Future switchToAlternativeSources() async { + if (arg == null) { + return null; + } + return await update((prev) async { + return await SourcedTrack.fetchFromTrackAltSource( + track: arg!.track, + ref: ref, + ); + }); + } +} - final sourcedTrack = - await SourcedTrack.fetchFromTrack(track: track, ref: ref); - - return sourcedTrack; -}); +final sourcedTrackProvider = AsyncNotifierProviderFamily( + () => SourcedTrackNotifier(), +); diff --git a/lib/provider/user_preferences/user_preferences_provider.dart b/lib/provider/user_preferences/user_preferences_provider.dart index 23479b71..5fe3cb11 100644 --- a/lib/provider/user_preferences/user_preferences_provider.dart +++ b/lib/provider/user_preferences/user_preferences_provider.dart @@ -167,6 +167,10 @@ class UserPreferencesNotifier extends Notifier { setData(PreferencesTableCompanion(pipedInstance: Value(instance))); } + void setInvidiousInstance(String instance) { + setData(PreferencesTableCompanion(invidiousInstance: Value(instance))); + } + void setSearchMode(SearchMode mode) { setData(PreferencesTableCompanion(searchMode: Value(mode))); } diff --git a/lib/services/sourced_track/models/source_info.g.dart b/lib/services/sourced_track/models/source_info.g.dart index 5fe136ce..54671f63 100644 --- a/lib/services/sourced_track/models/source_info.g.dart +++ b/lib/services/sourced_track/models/source_info.g.dart @@ -12,7 +12,7 @@ SourceInfo _$SourceInfoFromJson(Map json) => SourceInfo( artist: json['artist'] as String, thumbnail: json['thumbnail'] as String, pageUrl: json['pageUrl'] as String, - duration: Duration(microseconds: json['duration'] as int), + duration: Duration(microseconds: (json['duration'] as num).toInt()), artistUrl: json['artistUrl'] as String, album: json['album'] as String?, ); diff --git a/lib/services/sourced_track/models/video_info.dart b/lib/services/sourced_track/models/video_info.dart index 58dd0280..e3452c61 100644 --- a/lib/services/sourced_track/models/video_info.dart +++ b/lib/services/sourced_track/models/video_info.dart @@ -1,3 +1,4 @@ +import 'package:invidious/invidious.dart'; import 'package:piped_client/piped_client.dart'; import 'package:spotube/models/database/database.dart'; @@ -112,4 +113,24 @@ class YoutubeVideoInfo { channelId: stream.uploaderUrl, ); } + + factory YoutubeVideoInfo.fromSearchResponse( + InvidiousSearchResponseVideo searchResponse, + SearchMode searchMode, + ) { + return YoutubeVideoInfo( + searchMode: searchMode, + title: searchResponse.title, + duration: Duration(seconds: searchResponse.lengthSeconds), + thumbnailUrl: searchResponse.videoThumbnails.first.url, + id: searchResponse.videoId, + likes: 0, + dislikes: 0, + views: searchResponse.viewCount, + channelName: searchResponse.author, + channelId: searchResponse.authorId, + publishedAt: + DateTime.fromMillisecondsSinceEpoch(searchResponse.published * 1000), + ); + } } diff --git a/lib/services/sourced_track/sourced_track.dart b/lib/services/sourced_track/sourced_track.dart index 977b980b..38f01498 100644 --- a/lib/services/sourced_track/sourced_track.dart +++ b/lib/services/sourced_track/sourced_track.dart @@ -12,6 +12,7 @@ import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_map.dart'; +import 'package:spotube/services/sourced_track/sources/invidious.dart'; import 'package:spotube/services/sourced_track/sources/jiosaavn.dart'; import 'package:spotube/services/sourced_track/sources/piped.dart'; import 'package:spotube/services/sourced_track/sources/youtube.dart'; @@ -85,6 +86,13 @@ abstract class SourcedTrack extends Track { sourceInfo: sourceInfo, track: track, ), + AudioSource.invidious => InvidiousSourcedTrack( + ref: ref, + source: source, + siblings: siblings, + sourceInfo: sourceInfo, + track: track, + ), }; } @@ -104,6 +112,49 @@ abstract class SourcedTrack extends Track { return "$title - ${artists.join(", ")}"; } + static fetchFromTrackAltSource({ + required Track track, + required Ref ref, + }) async { + final preferences = ref.read(userPreferencesProvider); + try { + return switch (preferences.audioSource) { + AudioSource.piped || + AudioSource.invidious || + AudioSource.jiosaavn => + await YoutubeSourcedTrack.fetchFromTrack(track: track, ref: ref), + AudioSource.youtube => + await JioSaavnSourcedTrack.fetchFromTrack(track: track, ref: ref), + }; + } on TrackNotFoundError catch (_) { + return switch (preferences.audioSource) { + AudioSource.piped || + AudioSource.youtube || + AudioSource.invidious => + await JioSaavnSourcedTrack.fetchFromTrack( + track: track, + ref: ref, + weakMatch: true, + ), + AudioSource.jiosaavn => + await YoutubeSourcedTrack.fetchFromTrack(track: track, ref: ref), + }; + } on HttpClientClosedException catch (_) { + return await PipedSourcedTrack.fetchFromTrack(track: track, ref: ref); + } on VideoUnplayableException catch (_) { + return await InvidiousSourcedTrack.fetchFromTrack(track: track, ref: ref); + } catch (e) { + if (e is DioException || e is ClientException || e is SocketException) { + return await JioSaavnSourcedTrack.fetchFromTrack( + track: track, + ref: ref, + weakMatch: preferences.audioSource == AudioSource.jiosaavn, + ); + } + rethrow; + } + } + static Future fetchFromTrack({ required Track track, required Ref ref, @@ -117,11 +168,14 @@ abstract class SourcedTrack extends Track { await YoutubeSourcedTrack.fetchFromTrack(track: track, ref: ref), AudioSource.jiosaavn => await JioSaavnSourcedTrack.fetchFromTrack(track: track, ref: ref), + AudioSource.invidious => + await InvidiousSourcedTrack.fetchFromTrack(track: track, ref: ref), }; } on TrackNotFoundError catch (_) { return switch (preferences.audioSource) { AudioSource.piped || - AudioSource.youtube => + AudioSource.youtube || + AudioSource.invidious => await JioSaavnSourcedTrack.fetchFromTrack( track: track, ref: ref, @@ -136,11 +190,19 @@ abstract class SourcedTrack extends Track { return await PipedSourcedTrack.fetchFromTrack(track: track, ref: ref); } catch (e) { if (e is DioException || e is ClientException || e is SocketException) { - return await JioSaavnSourcedTrack.fetchFromTrack( - track: track, - ref: ref, - weakMatch: preferences.audioSource == AudioSource.jiosaavn, - ); + return switch (preferences.audioSource) { + AudioSource.piped || + AudioSource.invidious => + await YoutubeSourcedTrack.fetchFromTrack( + track: track, + ref: ref, + ), + _ => await JioSaavnSourcedTrack.fetchFromTrack( + track: track, + ref: ref, + weakMatch: preferences.audioSource == AudioSource.jiosaavn, + ) + }; } rethrow; } @@ -159,6 +221,8 @@ abstract class SourcedTrack extends Track { YoutubeSourcedTrack.fetchSiblings(track: track, ref: ref), AudioSource.jiosaavn => JioSaavnSourcedTrack.fetchSiblings(track: track, ref: ref), + AudioSource.invidious => + InvidiousSourcedTrack.fetchSiblings(track: track, ref: ref), }; } diff --git a/lib/services/sourced_track/sources/invidious.dart b/lib/services/sourced_track/sources/invidious.dart new file mode 100644 index 00000000..2ec5068e --- /dev/null +++ b/lib/services/sourced_track/sources/invidious.dart @@ -0,0 +1,266 @@ +import 'package:collection/collection.dart'; +import 'package:drift/drift.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:spotify/spotify.dart'; +import 'package:spotube/models/database/database.dart'; +import 'package:spotube/provider/database/database.dart'; +import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/services/sourced_track/exceptions.dart'; +import 'package:spotube/services/sourced_track/models/source_info.dart'; +import 'package:spotube/services/sourced_track/models/source_map.dart'; +import 'package:spotube/services/sourced_track/models/video_info.dart'; +import 'package:spotube/services/sourced_track/sourced_track.dart'; +import 'package:invidious/invidious.dart'; +import 'package:spotube/services/sourced_track/sources/youtube.dart'; +import 'package:spotube/utils/service_utils.dart'; + +final invidiousProvider = Provider( + (ref) { + final invidiousInstance = ref.watch( + userPreferencesProvider.select((s) => s.invidiousInstance), + ); + return InvidiousClient(server: invidiousInstance); + }, +); + +class InvidiousSourceInfo extends SourceInfo { + InvidiousSourceInfo({ + required super.id, + required super.title, + required super.artist, + required super.thumbnail, + required super.pageUrl, + required super.duration, + required super.artistUrl, + required super.album, + }); +} + +class InvidiousSourcedTrack extends SourcedTrack { + InvidiousSourcedTrack({ + required super.ref, + required super.source, + required super.siblings, + required super.sourceInfo, + required super.track, + }); + + static Future fetchFromTrack({ + required Track track, + required Ref ref, + }) async { + final database = ref.read(databaseProvider); + final cachedSource = await (database.select(database.sourceMatchTable) + ..where((s) => s.trackId.equals(track.id!)) + ..limit(1) + ..orderBy([ + (s) => + OrderingTerm(expression: s.createdAt, mode: OrderingMode.desc), + ])) + .getSingleOrNull(); + final invidiousClient = ref.read(invidiousProvider); + + if (cachedSource == null) { + final siblings = await fetchSiblings(ref: ref, track: track); + if (siblings.isEmpty) { + throw TrackNotFoundError(track); + } + + await database.into(database.sourceMatchTable).insert( + SourceMatchTableCompanion.insert( + trackId: track.id!, + sourceId: siblings.first.info.id, + sourceType: const Value(SourceType.youtube), + ), + ); + + return InvidiousSourcedTrack( + ref: ref, + siblings: siblings.map((s) => s.info).skip(1).toList(), + source: siblings.first.source as SourceMap, + sourceInfo: siblings.first.info, + track: track, + ); + } else { + final manifest = + await invidiousClient.videos.get(cachedSource.sourceId, local: true); + + return InvidiousSourcedTrack( + ref: ref, + siblings: [], + source: toSourceMap(manifest), + sourceInfo: InvidiousSourceInfo( + id: manifest.videoId, + artist: manifest.author, + artistUrl: manifest.authorUrl, + pageUrl: "https://www.youtube.com/watch?v=${manifest.videoId}", + thumbnail: manifest.videoThumbnails.first.url, + title: manifest.title, + duration: Duration(seconds: manifest.lengthSeconds), + album: null, + ), + track: track, + ); + } + } + + static SourceMap toSourceMap(InvidiousVideoResponse manifest) { + final m4a = manifest.adaptiveFormats + .where((audio) => audio.type.contains("audio/mp4")) + .sorted((a, b) => int.parse(a.bitrate).compareTo(int.parse(b.bitrate))); + + final weba = manifest.adaptiveFormats + .where((audio) => audio.type.contains("audio/webm")) + .sorted((a, b) => int.parse(a.bitrate).compareTo(int.parse(b.bitrate))); + + return SourceMap( + m4a: SourceQualityMap( + high: m4a.first.url.toString(), + medium: (m4a.elementAtOrNull(m4a.length ~/ 2) ?? m4a[1]).url.toString(), + low: m4a.last.url.toString(), + ), + weba: SourceQualityMap( + high: weba.first.url.toString(), + medium: + (weba.elementAtOrNull(weba.length ~/ 2) ?? weba[1]).url.toString(), + low: weba.last.url.toString(), + ), + ); + } + + static Future toSiblingType( + int index, + YoutubeVideoInfo item, + InvidiousClient invidiousClient, + ) async { + SourceMap? sourceMap; + if (index == 0) { + final manifest = await invidiousClient.videos.get(item.id, local: true); + sourceMap = toSourceMap(manifest); + } + + final SiblingType sibling = ( + info: InvidiousSourceInfo( + id: item.id, + artist: item.channelName, + artistUrl: "https://www.youtube.com/${item.channelId}", + pageUrl: "https://www.youtube.com/watch?v=${item.id}", + thumbnail: item.thumbnailUrl, + title: item.title, + duration: item.duration, + album: null, + ), + source: sourceMap, + ); + + return sibling; + } + + static Future> fetchSiblings({ + required Track track, + required Ref ref, + }) async { + final invidiousClient = ref.read(invidiousProvider); + final preference = ref.read(userPreferencesProvider); + + final query = SourcedTrack.getSearchTerm(track); + + final searchResults = await invidiousClient.search.list( + query, + type: InvidiousSearchType.video, + ); + + if (ServiceUtils.onlyContainsEnglish(query)) { + return await Future.wait( + searchResults + .whereType() + .map( + (result) => YoutubeVideoInfo.fromSearchResponse( + result, + preference.searchMode, + ), + ) + .mapIndexed((i, r) => toSiblingType(i, r, invidiousClient)), + ); + } + + final rankedSiblings = YoutubeSourcedTrack.rankResults( + searchResults + .whereType() + .map( + (result) => YoutubeVideoInfo.fromSearchResponse( + result, + preference.searchMode, + ), + ) + .toList(), + track, + ); + + return await Future.wait( + rankedSiblings.mapIndexed((i, r) => toSiblingType(i, r, invidiousClient)), + ); + } + + @override + Future copyWithSibling() async { + if (siblings.isNotEmpty) { + return this; + } + final fetchedSiblings = await fetchSiblings(ref: ref, track: this); + + return InvidiousSourcedTrack( + ref: ref, + siblings: fetchedSiblings + .where((s) => s.info.id != sourceInfo.id) + .map((s) => s.info) + .toList(), + source: source, + sourceInfo: sourceInfo, + track: this, + ); + } + + @override + Future swapWithSibling(SourceInfo sibling) async { + if (sibling.id == sourceInfo.id) { + return null; + } + + // a sibling source that was fetched from the search results + final isStepSibling = siblings.none((s) => s.id == sibling.id); + + final newSourceInfo = isStepSibling + ? sibling + : siblings.firstWhere((s) => s.id == sibling.id); + final newSiblings = siblings.where((s) => s.id != sibling.id).toList() + ..insert(0, sourceInfo); + + final pipedClient = ref.read(invidiousProvider); + + final manifest = + await pipedClient.videos.get(newSourceInfo.id, local: true); + + final database = ref.read(databaseProvider); + await database.into(database.sourceMatchTable).insert( + SourceMatchTableCompanion.insert( + trackId: id!, + sourceId: newSourceInfo.id, + sourceType: const Value(SourceType.youtube), + // Because we're sorting by createdAt in the query + // we have to update it to indicate priority + createdAt: Value(DateTime.now()), + ), + mode: InsertMode.replace, + ); + + return InvidiousSourcedTrack( + ref: ref, + siblings: newSiblings, + source: toSourceMap(manifest), + sourceInfo: newSourceInfo, + track: this, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index b653c2fd..37aa3d54 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -245,10 +245,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 + sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.4.13" build_runner_core: dependency: transitive description: @@ -393,6 +393,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5 + url: "https://pub.dev" + source: hosted + version: "1.9.2" cross_file: dependency: transitive description: @@ -518,10 +526,18 @@ packages: dependency: "direct main" description: name: dio - sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" url: "https://pub.dev" source: hosted - version: "5.4.3+1" + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + url: "https://pub.dev" + source: hosted + version: "2.0.0" disable_battery_optimization: dependency: "direct main" description: @@ -543,18 +559,18 @@ packages: dependency: "direct main" description: name: drift - sha256: "6acedc562ffeed308049f78fb1906abad3d65714580b6745441ee6d50ec564cd" + sha256: df027d168a2985a2e9da900adeba2ab0136f0d84436592cf3cd5135f82c8579c url: "https://pub.dev" source: hosted - version: "2.18.0" + version: "2.21.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: d9b020736ea85fff1568699ce18b89fabb3f0f042e8a7a05e84a3ec20d39acde + sha256: "27bab15e7869b69259663590381180117873b9b273a1ea9ebb21bb73133d1233" url: "https://pub.dev" source: hosted - version: "2.18.0" + version: "2.21.0" duration: dependency: "direct main" description: @@ -992,10 +1008,10 @@ packages: dependency: "direct main" description: name: freezed_annotation - sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.4" frontend_server_client: dependency: transitive description: @@ -1246,6 +1262,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + invidious: + dependency: "direct main" + description: + name: invidious + sha256: "7cb879c0b4b99aa06ec720af84f6988ff0080bb0434d041f6fb0c4add680ee36" + url: "https://pub.dev" + source: hosted + version: "0.1.0" io: dependency: "direct dev" description: @@ -1274,18 +1298,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "6.8.0" leak_tracker: dependency: transitive description: @@ -1470,6 +1494,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" oauth2: dependency: transitive description: @@ -1887,6 +1919,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" shelf_router: dependency: "direct main" description: @@ -1895,6 +1935,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.4" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" shelf_web_socket: dependency: "direct main" description: @@ -1972,6 +2020,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.4" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" source_span: dependency: transitive description: @@ -2032,10 +2096,10 @@ packages: dependency: transitive description: name: sqlparser - sha256: ade9a67fd70d0369329ed3373208de7ebd8662470e8c396fc8d0d60f9acdfc9f + sha256: c5f63dff8677407ddcddfa4744c176ea6dc44286c47ba9e69e76d8071398034d url: "https://pub.dev" source: hosted - version: "0.36.0" + version: "0.39.1" stack_trace: dependency: transitive description: @@ -2124,6 +2188,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + test: + dependency: "direct main" + description: + name: test + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + url: "https://pub.dev" + source: hosted + version: "1.25.7" test_api: dependency: transitive description: @@ -2132,6 +2204,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.2" + test_core: + dependency: transitive + description: + name: test_core + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + url: "https://pub.dev" + source: hosted + version: "0.6.4" time: dependency: transitive description: @@ -2380,6 +2460,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" wikipedia_api: dependency: "direct main" description: @@ -2445,5 +2533,5 @@ packages: source: hosted version: "2.3.1" sdks: - dart: ">=3.5.0 <4.0.0" + dart: ">=3.5.3 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3c5c5ccb..2923cc3b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,6 +58,7 @@ dependencies: html: ^0.15.1 image_picker: ^1.1.0 intl: any + invidious: ^0.1.0 json_annotation: ^4.8.1 logger: ^2.0.2 media_kit: ^1.1.10+1 @@ -118,14 +119,15 @@ dependencies: tray_manager: ^0.2.2 http: ^1.2.1 riverpod: ^2.5.1 - drift: ^2.18.0 + drift: ^2.21.0 sqlite3_flutter_libs: ^0.5.23 sqlite3: ^2.4.3 encrypt: ^5.0.3 go_router: ^14.2.7 + test: ^1.25.7 dev_dependencies: - build_runner: ^2.4.9 + build_runner: ^2.4.13 crypto: ^3.0.3 envied_generator: ^0.5.4+1 flutter_gen_runner: ^5.4.0 @@ -145,7 +147,7 @@ dev_dependencies: pub_api_client: ^2.7.0 xml: ^6.5.0 io: ^1.0.4 - drift_dev: ^2.18.0 + drift_dev: ^2.21.0 dependency_overrides: web: ^1.1.0 diff --git a/test/drift/app_db/generated/schema.dart b/test/drift/app_db/generated/schema.dart new file mode 100644 index 00000000..1b2142be --- /dev/null +++ b/test/drift/app_db/generated/schema.dart @@ -0,0 +1,23 @@ +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +//@dart=2.12 +import 'package:drift/drift.dart'; +import 'package:drift/internal/migrations.dart'; +import 'schema_v2.dart' as v2; +import 'schema_v1.dart' as v1; + +class GeneratedHelper implements SchemaInstantiationHelper { + @override + GeneratedDatabase databaseForVersion(QueryExecutor db, int version) { + switch (version) { + case 2: + return v2.DatabaseAtV2(db); + case 1: + return v1.DatabaseAtV1(db); + default: + throw MissingSchemaException(version, versions); + } + } + + static const versions = const [1, 2]; +} diff --git a/test/drift/app_db/generated/schema_v1.dart b/test/drift/app_db/generated/schema_v1.dart new file mode 100644 index 00000000..9535d685 --- /dev/null +++ b/test/drift/app_db/generated/schema_v1.dart @@ -0,0 +1,3333 @@ +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +//@dart=2.12 +import 'package:drift/drift.dart'; +import 'package:flutter/material.dart' hide Table; +import 'package:spotify/spotify.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/utils/migrations/adapters.dart'; + +class AuthenticationTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AuthenticationTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn cookie = GeneratedColumn( + 'cookie', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn accessToken = GeneratedColumn( + 'access_token', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn expiration = GeneratedColumn( + 'expiration', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + @override + List get $columns => [id, cookie, accessToken, expiration]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'authentication_table'; + @override + Set get $primaryKey => {id}; + @override + AuthenticationTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AuthenticationTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + cookie: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}cookie'])!, + accessToken: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}access_token'])!, + expiration: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}expiration'])!, + ); + } + + @override + AuthenticationTable createAlias(String alias) { + return AuthenticationTable(attachedDatabase, alias); + } +} + +class AuthenticationTableData extends DataClass + implements Insertable { + final int id; + final String cookie; + final String accessToken; + final DateTime expiration; + const AuthenticationTableData( + {required this.id, + required this.cookie, + required this.accessToken, + required this.expiration}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['cookie'] = Variable(cookie); + map['access_token'] = Variable(accessToken); + map['expiration'] = Variable(expiration); + return map; + } + + AuthenticationTableCompanion toCompanion(bool nullToAbsent) { + return AuthenticationTableCompanion( + id: Value(id), + cookie: Value(cookie), + accessToken: Value(accessToken), + expiration: Value(expiration), + ); + } + + factory AuthenticationTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AuthenticationTableData( + id: serializer.fromJson(json['id']), + cookie: serializer.fromJson(json['cookie']), + accessToken: serializer.fromJson(json['accessToken']), + expiration: serializer.fromJson(json['expiration']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'cookie': serializer.toJson(cookie), + 'accessToken': serializer.toJson(accessToken), + 'expiration': serializer.toJson(expiration), + }; + } + + AuthenticationTableData copyWith( + {int? id, + String? cookie, + String? accessToken, + DateTime? expiration}) => + AuthenticationTableData( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + AuthenticationTableData copyWithCompanion(AuthenticationTableCompanion data) { + return AuthenticationTableData( + id: data.id.present ? data.id.value : this.id, + cookie: data.cookie.present ? data.cookie.value : this.cookie, + accessToken: + data.accessToken.present ? data.accessToken.value : this.accessToken, + expiration: + data.expiration.present ? data.expiration.value : this.expiration, + ); + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableData(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, cookie, accessToken, expiration); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AuthenticationTableData && + other.id == this.id && + other.cookie == this.cookie && + other.accessToken == this.accessToken && + other.expiration == this.expiration); +} + +class AuthenticationTableCompanion + extends UpdateCompanion { + final Value id; + final Value cookie; + final Value accessToken; + final Value expiration; + const AuthenticationTableCompanion({ + this.id = const Value.absent(), + this.cookie = const Value.absent(), + this.accessToken = const Value.absent(), + this.expiration = const Value.absent(), + }); + AuthenticationTableCompanion.insert({ + this.id = const Value.absent(), + required String cookie, + required String accessToken, + required DateTime expiration, + }) : cookie = Value(cookie), + accessToken = Value(accessToken), + expiration = Value(expiration); + static Insertable custom({ + Expression? id, + Expression? cookie, + Expression? accessToken, + Expression? expiration, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (cookie != null) 'cookie': cookie, + if (accessToken != null) 'access_token': accessToken, + if (expiration != null) 'expiration': expiration, + }); + } + + AuthenticationTableCompanion copyWith( + {Value? id, + Value? cookie, + Value? accessToken, + Value? expiration}) { + return AuthenticationTableCompanion( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (cookie.present) { + map['cookie'] = Variable(cookie.value); + } + if (accessToken.present) { + map['access_token'] = Variable(accessToken.value); + } + if (expiration.present) { + map['expiration'] = Variable(expiration.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableCompanion(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } +} + +class BlacklistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BlacklistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementType = GeneratedColumn( + 'element_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementId = GeneratedColumn( + 'element_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, name, elementType, elementId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'blacklist_table'; + @override + Set get $primaryKey => {id}; + @override + BlacklistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BlacklistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + elementType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_type'])!, + elementId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_id'])!, + ); + } + + @override + BlacklistTable createAlias(String alias) { + return BlacklistTable(attachedDatabase, alias); + } +} + +class BlacklistTableData extends DataClass + implements Insertable { + final int id; + final String name; + final String elementType; + final String elementId; + const BlacklistTableData( + {required this.id, + required this.name, + required this.elementType, + required this.elementId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['name'] = Variable(name); + map['element_type'] = Variable(elementType); + map['element_id'] = Variable(elementId); + return map; + } + + BlacklistTableCompanion toCompanion(bool nullToAbsent) { + return BlacklistTableCompanion( + id: Value(id), + name: Value(name), + elementType: Value(elementType), + elementId: Value(elementId), + ); + } + + factory BlacklistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BlacklistTableData( + id: serializer.fromJson(json['id']), + name: serializer.fromJson(json['name']), + elementType: serializer.fromJson(json['elementType']), + elementId: serializer.fromJson(json['elementId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'name': serializer.toJson(name), + 'elementType': serializer.toJson(elementType), + 'elementId': serializer.toJson(elementId), + }; + } + + BlacklistTableData copyWith( + {int? id, String? name, String? elementType, String? elementId}) => + BlacklistTableData( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + BlacklistTableData copyWithCompanion(BlacklistTableCompanion data) { + return BlacklistTableData( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + elementType: + data.elementType.present ? data.elementType.value : this.elementType, + elementId: data.elementId.present ? data.elementId.value : this.elementId, + ); + } + + @override + String toString() { + return (StringBuffer('BlacklistTableData(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, name, elementType, elementId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BlacklistTableData && + other.id == this.id && + other.name == this.name && + other.elementType == this.elementType && + other.elementId == this.elementId); +} + +class BlacklistTableCompanion extends UpdateCompanion { + final Value id; + final Value name; + final Value elementType; + final Value elementId; + const BlacklistTableCompanion({ + this.id = const Value.absent(), + this.name = const Value.absent(), + this.elementType = const Value.absent(), + this.elementId = const Value.absent(), + }); + BlacklistTableCompanion.insert({ + this.id = const Value.absent(), + required String name, + required String elementType, + required String elementId, + }) : name = Value(name), + elementType = Value(elementType), + elementId = Value(elementId); + static Insertable custom({ + Expression? id, + Expression? name, + Expression? elementType, + Expression? elementId, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (name != null) 'name': name, + if (elementType != null) 'element_type': elementType, + if (elementId != null) 'element_id': elementId, + }); + } + + BlacklistTableCompanion copyWith( + {Value? id, + Value? name, + Value? elementType, + Value? elementId}) { + return BlacklistTableCompanion( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (elementType.present) { + map['element_type'] = Variable(elementType.value); + } + if (elementId.present) { + map['element_id'] = Variable(elementId.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BlacklistTableCompanion(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } +} + +class PreferencesTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PreferencesTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioQuality = GeneratedColumn( + 'audio_quality', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceQualities.high.name)); + late final GeneratedColumn albumColorSync = GeneratedColumn( + 'album_color_sync', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("album_color_sync" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn amoledDarkTheme = GeneratedColumn( + 'amoled_dark_theme', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("amoled_dark_theme" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn checkUpdate = GeneratedColumn( + 'check_update', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("check_update" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn normalizeAudio = GeneratedColumn( + 'normalize_audio', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("normalize_audio" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn showSystemTrayIcon = GeneratedColumn( + 'show_system_tray_icon', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("show_system_tray_icon" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn systemTitleBar = GeneratedColumn( + 'system_title_bar', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("system_title_bar" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn skipNonMusic = GeneratedColumn( + 'skip_non_music', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("skip_non_music" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn closeBehavior = GeneratedColumn( + 'close_behavior', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(CloseBehavior.close.name)); + late final GeneratedColumn accentColorScheme = + GeneratedColumn('accent_color_scheme', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("Blue:0xFF2196F3")); + late final GeneratedColumn layoutMode = GeneratedColumn( + 'layout_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(LayoutMode.adaptive.name)); + late final GeneratedColumn locale = GeneratedColumn( + 'locale', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: + const Constant('{"languageCode":"system","countryCode":"system"}')); + late final GeneratedColumn market = GeneratedColumn( + 'market', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(Market.US.name)); + late final GeneratedColumn searchMode = GeneratedColumn( + 'search_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SearchMode.youtube.name)); + late final GeneratedColumn downloadLocation = GeneratedColumn( + 'download_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn localLibraryLocation = + GeneratedColumn('local_library_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn pipedInstance = GeneratedColumn( + 'piped_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://pipedapi.kavin.rocks")); + late final GeneratedColumn themeMode = GeneratedColumn( + 'theme_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(ThemeMode.system.name)); + late final GeneratedColumn audioSource = GeneratedColumn( + 'audio_source', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(AudioSource.youtube.name)); + late final GeneratedColumn streamMusicCodec = GeneratedColumn( + 'stream_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.weba.name)); + late final GeneratedColumn downloadMusicCodec = + GeneratedColumn('download_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.m4a.name)); + late final GeneratedColumn discordPresence = GeneratedColumn( + 'discord_presence', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("discord_presence" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn endlessPlayback = GeneratedColumn( + 'endless_playback', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("endless_playback" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn enableConnect = GeneratedColumn( + 'enable_connect', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("enable_connect" IN (0, 1))'), + defaultValue: const Constant(false)); + @override + List get $columns => [ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'preferences_table'; + @override + Set get $primaryKey => {id}; + @override + PreferencesTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PreferencesTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioQuality: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_quality'])!, + albumColorSync: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}album_color_sync'])!, + amoledDarkTheme: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}amoled_dark_theme'])!, + checkUpdate: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}check_update'])!, + normalizeAudio: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}normalize_audio'])!, + showSystemTrayIcon: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}show_system_tray_icon'])!, + systemTitleBar: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}system_title_bar'])!, + skipNonMusic: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}skip_non_music'])!, + closeBehavior: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}close_behavior'])!, + accentColorScheme: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}accent_color_scheme'])!, + layoutMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}layout_mode'])!, + locale: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}locale'])!, + market: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}market'])!, + searchMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}search_mode'])!, + downloadLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_location'])!, + localLibraryLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}local_library_location'])!, + pipedInstance: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}piped_instance'])!, + themeMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}theme_mode'])!, + audioSource: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_source'])!, + streamMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}stream_music_codec'])!, + downloadMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_music_codec'])!, + discordPresence: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}discord_presence'])!, + endlessPlayback: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!, + enableConnect: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!, + ); + } + + @override + PreferencesTable createAlias(String alias) { + return PreferencesTable(attachedDatabase, alias); + } +} + +class PreferencesTableData extends DataClass + implements Insertable { + final int id; + final String audioQuality; + final bool albumColorSync; + final bool amoledDarkTheme; + final bool checkUpdate; + final bool normalizeAudio; + final bool showSystemTrayIcon; + final bool systemTitleBar; + final bool skipNonMusic; + final String closeBehavior; + final String accentColorScheme; + final String layoutMode; + final String locale; + final String market; + final String searchMode; + final String downloadLocation; + final String localLibraryLocation; + final String pipedInstance; + final String themeMode; + final String audioSource; + final String streamMusicCodec; + final String downloadMusicCodec; + final bool discordPresence; + final bool endlessPlayback; + final bool enableConnect; + const PreferencesTableData( + {required this.id, + required this.audioQuality, + required this.albumColorSync, + required this.amoledDarkTheme, + required this.checkUpdate, + required this.normalizeAudio, + required this.showSystemTrayIcon, + required this.systemTitleBar, + required this.skipNonMusic, + required this.closeBehavior, + required this.accentColorScheme, + required this.layoutMode, + required this.locale, + required this.market, + required this.searchMode, + required this.downloadLocation, + required this.localLibraryLocation, + required this.pipedInstance, + required this.themeMode, + required this.audioSource, + required this.streamMusicCodec, + required this.downloadMusicCodec, + required this.discordPresence, + required this.endlessPlayback, + required this.enableConnect}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_quality'] = Variable(audioQuality); + map['album_color_sync'] = Variable(albumColorSync); + map['amoled_dark_theme'] = Variable(amoledDarkTheme); + map['check_update'] = Variable(checkUpdate); + map['normalize_audio'] = Variable(normalizeAudio); + map['show_system_tray_icon'] = Variable(showSystemTrayIcon); + map['system_title_bar'] = Variable(systemTitleBar); + map['skip_non_music'] = Variable(skipNonMusic); + map['close_behavior'] = Variable(closeBehavior); + map['accent_color_scheme'] = Variable(accentColorScheme); + map['layout_mode'] = Variable(layoutMode); + map['locale'] = Variable(locale); + map['market'] = Variable(market); + map['search_mode'] = Variable(searchMode); + map['download_location'] = Variable(downloadLocation); + map['local_library_location'] = Variable(localLibraryLocation); + map['piped_instance'] = Variable(pipedInstance); + map['theme_mode'] = Variable(themeMode); + map['audio_source'] = Variable(audioSource); + map['stream_music_codec'] = Variable(streamMusicCodec); + map['download_music_codec'] = Variable(downloadMusicCodec); + map['discord_presence'] = Variable(discordPresence); + map['endless_playback'] = Variable(endlessPlayback); + map['enable_connect'] = Variable(enableConnect); + return map; + } + + PreferencesTableCompanion toCompanion(bool nullToAbsent) { + return PreferencesTableCompanion( + id: Value(id), + audioQuality: Value(audioQuality), + albumColorSync: Value(albumColorSync), + amoledDarkTheme: Value(amoledDarkTheme), + checkUpdate: Value(checkUpdate), + normalizeAudio: Value(normalizeAudio), + showSystemTrayIcon: Value(showSystemTrayIcon), + systemTitleBar: Value(systemTitleBar), + skipNonMusic: Value(skipNonMusic), + closeBehavior: Value(closeBehavior), + accentColorScheme: Value(accentColorScheme), + layoutMode: Value(layoutMode), + locale: Value(locale), + market: Value(market), + searchMode: Value(searchMode), + downloadLocation: Value(downloadLocation), + localLibraryLocation: Value(localLibraryLocation), + pipedInstance: Value(pipedInstance), + themeMode: Value(themeMode), + audioSource: Value(audioSource), + streamMusicCodec: Value(streamMusicCodec), + downloadMusicCodec: Value(downloadMusicCodec), + discordPresence: Value(discordPresence), + endlessPlayback: Value(endlessPlayback), + enableConnect: Value(enableConnect), + ); + } + + factory PreferencesTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PreferencesTableData( + id: serializer.fromJson(json['id']), + audioQuality: serializer.fromJson(json['audioQuality']), + albumColorSync: serializer.fromJson(json['albumColorSync']), + amoledDarkTheme: serializer.fromJson(json['amoledDarkTheme']), + checkUpdate: serializer.fromJson(json['checkUpdate']), + normalizeAudio: serializer.fromJson(json['normalizeAudio']), + showSystemTrayIcon: serializer.fromJson(json['showSystemTrayIcon']), + systemTitleBar: serializer.fromJson(json['systemTitleBar']), + skipNonMusic: serializer.fromJson(json['skipNonMusic']), + closeBehavior: serializer.fromJson(json['closeBehavior']), + accentColorScheme: serializer.fromJson(json['accentColorScheme']), + layoutMode: serializer.fromJson(json['layoutMode']), + locale: serializer.fromJson(json['locale']), + market: serializer.fromJson(json['market']), + searchMode: serializer.fromJson(json['searchMode']), + downloadLocation: serializer.fromJson(json['downloadLocation']), + localLibraryLocation: + serializer.fromJson(json['localLibraryLocation']), + pipedInstance: serializer.fromJson(json['pipedInstance']), + themeMode: serializer.fromJson(json['themeMode']), + audioSource: serializer.fromJson(json['audioSource']), + streamMusicCodec: serializer.fromJson(json['streamMusicCodec']), + downloadMusicCodec: + serializer.fromJson(json['downloadMusicCodec']), + discordPresence: serializer.fromJson(json['discordPresence']), + endlessPlayback: serializer.fromJson(json['endlessPlayback']), + enableConnect: serializer.fromJson(json['enableConnect']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioQuality': serializer.toJson(audioQuality), + 'albumColorSync': serializer.toJson(albumColorSync), + 'amoledDarkTheme': serializer.toJson(amoledDarkTheme), + 'checkUpdate': serializer.toJson(checkUpdate), + 'normalizeAudio': serializer.toJson(normalizeAudio), + 'showSystemTrayIcon': serializer.toJson(showSystemTrayIcon), + 'systemTitleBar': serializer.toJson(systemTitleBar), + 'skipNonMusic': serializer.toJson(skipNonMusic), + 'closeBehavior': serializer.toJson(closeBehavior), + 'accentColorScheme': serializer.toJson(accentColorScheme), + 'layoutMode': serializer.toJson(layoutMode), + 'locale': serializer.toJson(locale), + 'market': serializer.toJson(market), + 'searchMode': serializer.toJson(searchMode), + 'downloadLocation': serializer.toJson(downloadLocation), + 'localLibraryLocation': serializer.toJson(localLibraryLocation), + 'pipedInstance': serializer.toJson(pipedInstance), + 'themeMode': serializer.toJson(themeMode), + 'audioSource': serializer.toJson(audioSource), + 'streamMusicCodec': serializer.toJson(streamMusicCodec), + 'downloadMusicCodec': serializer.toJson(downloadMusicCodec), + 'discordPresence': serializer.toJson(discordPresence), + 'endlessPlayback': serializer.toJson(endlessPlayback), + 'enableConnect': serializer.toJson(enableConnect), + }; + } + + PreferencesTableData copyWith( + {int? id, + String? audioQuality, + bool? albumColorSync, + bool? amoledDarkTheme, + bool? checkUpdate, + bool? normalizeAudio, + bool? showSystemTrayIcon, + bool? systemTitleBar, + bool? skipNonMusic, + String? closeBehavior, + String? accentColorScheme, + String? layoutMode, + String? locale, + String? market, + String? searchMode, + String? downloadLocation, + String? localLibraryLocation, + String? pipedInstance, + String? themeMode, + String? audioSource, + String? streamMusicCodec, + String? downloadMusicCodec, + bool? discordPresence, + bool? endlessPlayback, + bool? enableConnect}) => + PreferencesTableData( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + ); + PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) { + return PreferencesTableData( + id: data.id.present ? data.id.value : this.id, + audioQuality: data.audioQuality.present + ? data.audioQuality.value + : this.audioQuality, + albumColorSync: data.albumColorSync.present + ? data.albumColorSync.value + : this.albumColorSync, + amoledDarkTheme: data.amoledDarkTheme.present + ? data.amoledDarkTheme.value + : this.amoledDarkTheme, + checkUpdate: + data.checkUpdate.present ? data.checkUpdate.value : this.checkUpdate, + normalizeAudio: data.normalizeAudio.present + ? data.normalizeAudio.value + : this.normalizeAudio, + showSystemTrayIcon: data.showSystemTrayIcon.present + ? data.showSystemTrayIcon.value + : this.showSystemTrayIcon, + systemTitleBar: data.systemTitleBar.present + ? data.systemTitleBar.value + : this.systemTitleBar, + skipNonMusic: data.skipNonMusic.present + ? data.skipNonMusic.value + : this.skipNonMusic, + closeBehavior: data.closeBehavior.present + ? data.closeBehavior.value + : this.closeBehavior, + accentColorScheme: data.accentColorScheme.present + ? data.accentColorScheme.value + : this.accentColorScheme, + layoutMode: + data.layoutMode.present ? data.layoutMode.value : this.layoutMode, + locale: data.locale.present ? data.locale.value : this.locale, + market: data.market.present ? data.market.value : this.market, + searchMode: + data.searchMode.present ? data.searchMode.value : this.searchMode, + downloadLocation: data.downloadLocation.present + ? data.downloadLocation.value + : this.downloadLocation, + localLibraryLocation: data.localLibraryLocation.present + ? data.localLibraryLocation.value + : this.localLibraryLocation, + pipedInstance: data.pipedInstance.present + ? data.pipedInstance.value + : this.pipedInstance, + themeMode: data.themeMode.present ? data.themeMode.value : this.themeMode, + audioSource: + data.audioSource.present ? data.audioSource.value : this.audioSource, + streamMusicCodec: data.streamMusicCodec.present + ? data.streamMusicCodec.value + : this.streamMusicCodec, + downloadMusicCodec: data.downloadMusicCodec.present + ? data.downloadMusicCodec.value + : this.downloadMusicCodec, + discordPresence: data.discordPresence.present + ? data.discordPresence.value + : this.discordPresence, + endlessPlayback: data.endlessPlayback.present + ? data.endlessPlayback.value + : this.endlessPlayback, + enableConnect: data.enableConnect.present + ? data.enableConnect.value + : this.enableConnect, + ); + } + + @override + String toString() { + return (StringBuffer('PreferencesTableData(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PreferencesTableData && + other.id == this.id && + other.audioQuality == this.audioQuality && + other.albumColorSync == this.albumColorSync && + other.amoledDarkTheme == this.amoledDarkTheme && + other.checkUpdate == this.checkUpdate && + other.normalizeAudio == this.normalizeAudio && + other.showSystemTrayIcon == this.showSystemTrayIcon && + other.systemTitleBar == this.systemTitleBar && + other.skipNonMusic == this.skipNonMusic && + other.closeBehavior == this.closeBehavior && + other.accentColorScheme == this.accentColorScheme && + other.layoutMode == this.layoutMode && + other.locale == this.locale && + other.market == this.market && + other.searchMode == this.searchMode && + other.downloadLocation == this.downloadLocation && + other.localLibraryLocation == this.localLibraryLocation && + other.pipedInstance == this.pipedInstance && + other.themeMode == this.themeMode && + other.audioSource == this.audioSource && + other.streamMusicCodec == this.streamMusicCodec && + other.downloadMusicCodec == this.downloadMusicCodec && + other.discordPresence == this.discordPresence && + other.endlessPlayback == this.endlessPlayback && + other.enableConnect == this.enableConnect); +} + +class PreferencesTableCompanion extends UpdateCompanion { + final Value id; + final Value audioQuality; + final Value albumColorSync; + final Value amoledDarkTheme; + final Value checkUpdate; + final Value normalizeAudio; + final Value showSystemTrayIcon; + final Value systemTitleBar; + final Value skipNonMusic; + final Value closeBehavior; + final Value accentColorScheme; + final Value layoutMode; + final Value locale; + final Value market; + final Value searchMode; + final Value downloadLocation; + final Value localLibraryLocation; + final Value pipedInstance; + final Value themeMode; + final Value audioSource; + final Value streamMusicCodec; + final Value downloadMusicCodec; + final Value discordPresence; + final Value endlessPlayback; + final Value enableConnect; + const PreferencesTableCompanion({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + }); + PreferencesTableCompanion.insert({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + }); + static Insertable custom({ + Expression? id, + Expression? audioQuality, + Expression? albumColorSync, + Expression? amoledDarkTheme, + Expression? checkUpdate, + Expression? normalizeAudio, + Expression? showSystemTrayIcon, + Expression? systemTitleBar, + Expression? skipNonMusic, + Expression? closeBehavior, + Expression? accentColorScheme, + Expression? layoutMode, + Expression? locale, + Expression? market, + Expression? searchMode, + Expression? downloadLocation, + Expression? localLibraryLocation, + Expression? pipedInstance, + Expression? themeMode, + Expression? audioSource, + Expression? streamMusicCodec, + Expression? downloadMusicCodec, + Expression? discordPresence, + Expression? endlessPlayback, + Expression? enableConnect, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioQuality != null) 'audio_quality': audioQuality, + if (albumColorSync != null) 'album_color_sync': albumColorSync, + if (amoledDarkTheme != null) 'amoled_dark_theme': amoledDarkTheme, + if (checkUpdate != null) 'check_update': checkUpdate, + if (normalizeAudio != null) 'normalize_audio': normalizeAudio, + if (showSystemTrayIcon != null) + 'show_system_tray_icon': showSystemTrayIcon, + if (systemTitleBar != null) 'system_title_bar': systemTitleBar, + if (skipNonMusic != null) 'skip_non_music': skipNonMusic, + if (closeBehavior != null) 'close_behavior': closeBehavior, + if (accentColorScheme != null) 'accent_color_scheme': accentColorScheme, + if (layoutMode != null) 'layout_mode': layoutMode, + if (locale != null) 'locale': locale, + if (market != null) 'market': market, + if (searchMode != null) 'search_mode': searchMode, + if (downloadLocation != null) 'download_location': downloadLocation, + if (localLibraryLocation != null) + 'local_library_location': localLibraryLocation, + if (pipedInstance != null) 'piped_instance': pipedInstance, + if (themeMode != null) 'theme_mode': themeMode, + if (audioSource != null) 'audio_source': audioSource, + if (streamMusicCodec != null) 'stream_music_codec': streamMusicCodec, + if (downloadMusicCodec != null) + 'download_music_codec': downloadMusicCodec, + if (discordPresence != null) 'discord_presence': discordPresence, + if (endlessPlayback != null) 'endless_playback': endlessPlayback, + if (enableConnect != null) 'enable_connect': enableConnect, + }); + } + + PreferencesTableCompanion copyWith( + {Value? id, + Value? audioQuality, + Value? albumColorSync, + Value? amoledDarkTheme, + Value? checkUpdate, + Value? normalizeAudio, + Value? showSystemTrayIcon, + Value? systemTitleBar, + Value? skipNonMusic, + Value? closeBehavior, + Value? accentColorScheme, + Value? layoutMode, + Value? locale, + Value? market, + Value? searchMode, + Value? downloadLocation, + Value? localLibraryLocation, + Value? pipedInstance, + Value? themeMode, + Value? audioSource, + Value? streamMusicCodec, + Value? downloadMusicCodec, + Value? discordPresence, + Value? endlessPlayback, + Value? enableConnect}) { + return PreferencesTableCompanion( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioQuality.present) { + map['audio_quality'] = Variable(audioQuality.value); + } + if (albumColorSync.present) { + map['album_color_sync'] = Variable(albumColorSync.value); + } + if (amoledDarkTheme.present) { + map['amoled_dark_theme'] = Variable(amoledDarkTheme.value); + } + if (checkUpdate.present) { + map['check_update'] = Variable(checkUpdate.value); + } + if (normalizeAudio.present) { + map['normalize_audio'] = Variable(normalizeAudio.value); + } + if (showSystemTrayIcon.present) { + map['show_system_tray_icon'] = Variable(showSystemTrayIcon.value); + } + if (systemTitleBar.present) { + map['system_title_bar'] = Variable(systemTitleBar.value); + } + if (skipNonMusic.present) { + map['skip_non_music'] = Variable(skipNonMusic.value); + } + if (closeBehavior.present) { + map['close_behavior'] = Variable(closeBehavior.value); + } + if (accentColorScheme.present) { + map['accent_color_scheme'] = Variable(accentColorScheme.value); + } + if (layoutMode.present) { + map['layout_mode'] = Variable(layoutMode.value); + } + if (locale.present) { + map['locale'] = Variable(locale.value); + } + if (market.present) { + map['market'] = Variable(market.value); + } + if (searchMode.present) { + map['search_mode'] = Variable(searchMode.value); + } + if (downloadLocation.present) { + map['download_location'] = Variable(downloadLocation.value); + } + if (localLibraryLocation.present) { + map['local_library_location'] = + Variable(localLibraryLocation.value); + } + if (pipedInstance.present) { + map['piped_instance'] = Variable(pipedInstance.value); + } + if (themeMode.present) { + map['theme_mode'] = Variable(themeMode.value); + } + if (audioSource.present) { + map['audio_source'] = Variable(audioSource.value); + } + if (streamMusicCodec.present) { + map['stream_music_codec'] = Variable(streamMusicCodec.value); + } + if (downloadMusicCodec.present) { + map['download_music_codec'] = Variable(downloadMusicCodec.value); + } + if (discordPresence.present) { + map['discord_presence'] = Variable(discordPresence.value); + } + if (endlessPlayback.present) { + map['endless_playback'] = Variable(endlessPlayback.value); + } + if (enableConnect.present) { + map['enable_connect'] = Variable(enableConnect.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PreferencesTableCompanion(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect') + ..write(')')) + .toString(); + } +} + +class ScrobblerTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ScrobblerTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn username = GeneratedColumn( + 'username', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn passwordHash = GeneratedColumn( + 'password_hash', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, username, passwordHash]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'scrobbler_table'; + @override + Set get $primaryKey => {id}; + @override + ScrobblerTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ScrobblerTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + username: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}username'])!, + passwordHash: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}password_hash'])!, + ); + } + + @override + ScrobblerTable createAlias(String alias) { + return ScrobblerTable(attachedDatabase, alias); + } +} + +class ScrobblerTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String username; + final String passwordHash; + const ScrobblerTableData( + {required this.id, + required this.createdAt, + required this.username, + required this.passwordHash}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['username'] = Variable(username); + map['password_hash'] = Variable(passwordHash); + return map; + } + + ScrobblerTableCompanion toCompanion(bool nullToAbsent) { + return ScrobblerTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + username: Value(username), + passwordHash: Value(passwordHash), + ); + } + + factory ScrobblerTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ScrobblerTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + username: serializer.fromJson(json['username']), + passwordHash: serializer.fromJson(json['passwordHash']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'username': serializer.toJson(username), + 'passwordHash': serializer.toJson(passwordHash), + }; + } + + ScrobblerTableData copyWith( + {int? id, + DateTime? createdAt, + String? username, + String? passwordHash}) => + ScrobblerTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + ScrobblerTableData copyWithCompanion(ScrobblerTableCompanion data) { + return ScrobblerTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + username: data.username.present ? data.username.value : this.username, + passwordHash: data.passwordHash.present + ? data.passwordHash.value + : this.passwordHash, + ); + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, username, passwordHash); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ScrobblerTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.username == this.username && + other.passwordHash == this.passwordHash); +} + +class ScrobblerTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value username; + final Value passwordHash; + const ScrobblerTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.username = const Value.absent(), + this.passwordHash = const Value.absent(), + }); + ScrobblerTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String username, + required String passwordHash, + }) : username = Value(username), + passwordHash = Value(passwordHash); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? username, + Expression? passwordHash, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (username != null) 'username': username, + if (passwordHash != null) 'password_hash': passwordHash, + }); + } + + ScrobblerTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? username, + Value? passwordHash}) { + return ScrobblerTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (username.present) { + map['username'] = Variable(username.value); + } + if (passwordHash.present) { + map['password_hash'] = Variable(passwordHash.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } +} + +class SkipSegmentTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SkipSegmentTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn start = GeneratedColumn( + 'start', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn end = GeneratedColumn( + 'end', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => [id, start, end, trackId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'skip_segment_table'; + @override + Set get $primaryKey => {id}; + @override + SkipSegmentTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SkipSegmentTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + start: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}start'])!, + end: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}end'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SkipSegmentTable createAlias(String alias) { + return SkipSegmentTable(attachedDatabase, alias); + } +} + +class SkipSegmentTableData extends DataClass + implements Insertable { + final int id; + final int start; + final int end; + final String trackId; + final DateTime createdAt; + const SkipSegmentTableData( + {required this.id, + required this.start, + required this.end, + required this.trackId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['start'] = Variable(start); + map['end'] = Variable(end); + map['track_id'] = Variable(trackId); + map['created_at'] = Variable(createdAt); + return map; + } + + SkipSegmentTableCompanion toCompanion(bool nullToAbsent) { + return SkipSegmentTableCompanion( + id: Value(id), + start: Value(start), + end: Value(end), + trackId: Value(trackId), + createdAt: Value(createdAt), + ); + } + + factory SkipSegmentTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SkipSegmentTableData( + id: serializer.fromJson(json['id']), + start: serializer.fromJson(json['start']), + end: serializer.fromJson(json['end']), + trackId: serializer.fromJson(json['trackId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'start': serializer.toJson(start), + 'end': serializer.toJson(end), + 'trackId': serializer.toJson(trackId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SkipSegmentTableData copyWith( + {int? id, + int? start, + int? end, + String? trackId, + DateTime? createdAt}) => + SkipSegmentTableData( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + SkipSegmentTableData copyWithCompanion(SkipSegmentTableCompanion data) { + return SkipSegmentTableData( + id: data.id.present ? data.id.value : this.id, + start: data.start.present ? data.start.value : this.start, + end: data.end.present ? data.end.value : this.end, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableData(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, start, end, trackId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SkipSegmentTableData && + other.id == this.id && + other.start == this.start && + other.end == this.end && + other.trackId == this.trackId && + other.createdAt == this.createdAt); +} + +class SkipSegmentTableCompanion extends UpdateCompanion { + final Value id; + final Value start; + final Value end; + final Value trackId; + final Value createdAt; + const SkipSegmentTableCompanion({ + this.id = const Value.absent(), + this.start = const Value.absent(), + this.end = const Value.absent(), + this.trackId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SkipSegmentTableCompanion.insert({ + this.id = const Value.absent(), + required int start, + required int end, + required String trackId, + this.createdAt = const Value.absent(), + }) : start = Value(start), + end = Value(end), + trackId = Value(trackId); + static Insertable custom({ + Expression? id, + Expression? start, + Expression? end, + Expression? trackId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (start != null) 'start': start, + if (end != null) 'end': end, + if (trackId != null) 'track_id': trackId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SkipSegmentTableCompanion copyWith( + {Value? id, + Value? start, + Value? end, + Value? trackId, + Value? createdAt}) { + return SkipSegmentTableCompanion( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (start.present) { + map['start'] = Variable(start.value); + } + if (end.present) { + map['end'] = Variable(end.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableCompanion(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SourceMatchTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SourceMatchTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceId = GeneratedColumn( + 'source_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceType = GeneratedColumn( + 'source_type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceType.youtube.name)); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => + [id, trackId, sourceId, sourceType, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'source_match_table'; + @override + Set get $primaryKey => {id}; + @override + SourceMatchTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SourceMatchTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + sourceId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_id'])!, + sourceType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SourceMatchTable createAlias(String alias) { + return SourceMatchTable(attachedDatabase, alias); + } +} + +class SourceMatchTableData extends DataClass + implements Insertable { + final int id; + final String trackId; + final String sourceId; + final String sourceType; + final DateTime createdAt; + const SourceMatchTableData( + {required this.id, + required this.trackId, + required this.sourceId, + required this.sourceType, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['source_id'] = Variable(sourceId); + map['source_type'] = Variable(sourceType); + map['created_at'] = Variable(createdAt); + return map; + } + + SourceMatchTableCompanion toCompanion(bool nullToAbsent) { + return SourceMatchTableCompanion( + id: Value(id), + trackId: Value(trackId), + sourceId: Value(sourceId), + sourceType: Value(sourceType), + createdAt: Value(createdAt), + ); + } + + factory SourceMatchTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SourceMatchTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + sourceId: serializer.fromJson(json['sourceId']), + sourceType: serializer.fromJson(json['sourceType']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'sourceId': serializer.toJson(sourceId), + 'sourceType': serializer.toJson(sourceType), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SourceMatchTableData copyWith( + {int? id, + String? trackId, + String? sourceId, + String? sourceType, + DateTime? createdAt}) => + SourceMatchTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + SourceMatchTableData copyWithCompanion(SourceMatchTableCompanion data) { + return SourceMatchTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId, + sourceType: + data.sourceType.present ? data.sourceType.value : this.sourceType, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, sourceId, sourceType, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SourceMatchTableData && + other.id == this.id && + other.trackId == this.trackId && + other.sourceId == this.sourceId && + other.sourceType == this.sourceType && + other.createdAt == this.createdAt); +} + +class SourceMatchTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value sourceId; + final Value sourceType; + final Value createdAt; + const SourceMatchTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.sourceId = const Value.absent(), + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SourceMatchTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String sourceId, + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }) : trackId = Value(trackId), + sourceId = Value(sourceId); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? sourceId, + Expression? sourceType, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (sourceId != null) 'source_id': sourceId, + if (sourceType != null) 'source_type': sourceType, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SourceMatchTableCompanion copyWith( + {Value? id, + Value? trackId, + Value? sourceId, + Value? sourceType, + Value? createdAt}) { + return SourceMatchTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (sourceId.present) { + map['source_id'] = Variable(sourceId.value); + } + if (sourceType.present) { + map['source_type'] = Variable(sourceType.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class AudioPlayerStateTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AudioPlayerStateTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playing = GeneratedColumn( + 'playing', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("playing" IN (0, 1))')); + late final GeneratedColumn loopMode = GeneratedColumn( + 'loop_mode', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn shuffled = GeneratedColumn( + 'shuffled', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("shuffled" IN (0, 1))')); + late final GeneratedColumn collections = GeneratedColumn( + 'collections', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => + [id, playing, loopMode, shuffled, collections]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'audio_player_state_table'; + @override + Set get $primaryKey => {id}; + @override + AudioPlayerStateTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AudioPlayerStateTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playing: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}playing'])!, + loopMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}loop_mode'])!, + shuffled: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}shuffled'])!, + collections: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}collections'])!, + ); + } + + @override + AudioPlayerStateTable createAlias(String alias) { + return AudioPlayerStateTable(attachedDatabase, alias); + } +} + +class AudioPlayerStateTableData extends DataClass + implements Insertable { + final int id; + final bool playing; + final String loopMode; + final bool shuffled; + final String collections; + const AudioPlayerStateTableData( + {required this.id, + required this.playing, + required this.loopMode, + required this.shuffled, + required this.collections}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playing'] = Variable(playing); + map['loop_mode'] = Variable(loopMode); + map['shuffled'] = Variable(shuffled); + map['collections'] = Variable(collections); + return map; + } + + AudioPlayerStateTableCompanion toCompanion(bool nullToAbsent) { + return AudioPlayerStateTableCompanion( + id: Value(id), + playing: Value(playing), + loopMode: Value(loopMode), + shuffled: Value(shuffled), + collections: Value(collections), + ); + } + + factory AudioPlayerStateTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AudioPlayerStateTableData( + id: serializer.fromJson(json['id']), + playing: serializer.fromJson(json['playing']), + loopMode: serializer.fromJson(json['loopMode']), + shuffled: serializer.fromJson(json['shuffled']), + collections: serializer.fromJson(json['collections']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playing': serializer.toJson(playing), + 'loopMode': serializer.toJson(loopMode), + 'shuffled': serializer.toJson(shuffled), + 'collections': serializer.toJson(collections), + }; + } + + AudioPlayerStateTableData copyWith( + {int? id, + bool? playing, + String? loopMode, + bool? shuffled, + String? collections}) => + AudioPlayerStateTableData( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + AudioPlayerStateTableData copyWithCompanion( + AudioPlayerStateTableCompanion data) { + return AudioPlayerStateTableData( + id: data.id.present ? data.id.value : this.id, + playing: data.playing.present ? data.playing.value : this.playing, + loopMode: data.loopMode.present ? data.loopMode.value : this.loopMode, + shuffled: data.shuffled.present ? data.shuffled.value : this.shuffled, + collections: + data.collections.present ? data.collections.value : this.collections, + ); + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableData(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playing, loopMode, shuffled, collections); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AudioPlayerStateTableData && + other.id == this.id && + other.playing == this.playing && + other.loopMode == this.loopMode && + other.shuffled == this.shuffled && + other.collections == this.collections); +} + +class AudioPlayerStateTableCompanion + extends UpdateCompanion { + final Value id; + final Value playing; + final Value loopMode; + final Value shuffled; + final Value collections; + const AudioPlayerStateTableCompanion({ + this.id = const Value.absent(), + this.playing = const Value.absent(), + this.loopMode = const Value.absent(), + this.shuffled = const Value.absent(), + this.collections = const Value.absent(), + }); + AudioPlayerStateTableCompanion.insert({ + this.id = const Value.absent(), + required bool playing, + required String loopMode, + required bool shuffled, + required String collections, + }) : playing = Value(playing), + loopMode = Value(loopMode), + shuffled = Value(shuffled), + collections = Value(collections); + static Insertable custom({ + Expression? id, + Expression? playing, + Expression? loopMode, + Expression? shuffled, + Expression? collections, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playing != null) 'playing': playing, + if (loopMode != null) 'loop_mode': loopMode, + if (shuffled != null) 'shuffled': shuffled, + if (collections != null) 'collections': collections, + }); + } + + AudioPlayerStateTableCompanion copyWith( + {Value? id, + Value? playing, + Value? loopMode, + Value? shuffled, + Value? collections}) { + return AudioPlayerStateTableCompanion( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playing.present) { + map['playing'] = Variable(playing.value); + } + if (loopMode.present) { + map['loop_mode'] = Variable(loopMode.value); + } + if (shuffled.present) { + map['shuffled'] = Variable(shuffled.value); + } + if (collections.present) { + map['collections'] = Variable(collections.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableCompanion(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } +} + +class PlaylistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioPlayerStateId = GeneratedColumn( + 'audio_player_state_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES audio_player_state_table (id)')); + late final GeneratedColumn index = GeneratedColumn( + 'index', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + @override + List get $columns => [id, audioPlayerStateId, index]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioPlayerStateId: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}audio_player_state_id'])!, + index: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}index'])!, + ); + } + + @override + PlaylistTable createAlias(String alias) { + return PlaylistTable(attachedDatabase, alias); + } +} + +class PlaylistTableData extends DataClass + implements Insertable { + final int id; + final int audioPlayerStateId; + final int index; + const PlaylistTableData( + {required this.id, + required this.audioPlayerStateId, + required this.index}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_player_state_id'] = Variable(audioPlayerStateId); + map['index'] = Variable(index); + return map; + } + + PlaylistTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistTableCompanion( + id: Value(id), + audioPlayerStateId: Value(audioPlayerStateId), + index: Value(index), + ); + } + + factory PlaylistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistTableData( + id: serializer.fromJson(json['id']), + audioPlayerStateId: serializer.fromJson(json['audioPlayerStateId']), + index: serializer.fromJson(json['index']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioPlayerStateId': serializer.toJson(audioPlayerStateId), + 'index': serializer.toJson(index), + }; + } + + PlaylistTableData copyWith({int? id, int? audioPlayerStateId, int? index}) => + PlaylistTableData( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + PlaylistTableData copyWithCompanion(PlaylistTableCompanion data) { + return PlaylistTableData( + id: data.id.present ? data.id.value : this.id, + audioPlayerStateId: data.audioPlayerStateId.present + ? data.audioPlayerStateId.value + : this.audioPlayerStateId, + index: data.index.present ? data.index.value : this.index, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistTableData(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, audioPlayerStateId, index); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistTableData && + other.id == this.id && + other.audioPlayerStateId == this.audioPlayerStateId && + other.index == this.index); +} + +class PlaylistTableCompanion extends UpdateCompanion { + final Value id; + final Value audioPlayerStateId; + final Value index; + const PlaylistTableCompanion({ + this.id = const Value.absent(), + this.audioPlayerStateId = const Value.absent(), + this.index = const Value.absent(), + }); + PlaylistTableCompanion.insert({ + this.id = const Value.absent(), + required int audioPlayerStateId, + required int index, + }) : audioPlayerStateId = Value(audioPlayerStateId), + index = Value(index); + static Insertable custom({ + Expression? id, + Expression? audioPlayerStateId, + Expression? index, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioPlayerStateId != null) + 'audio_player_state_id': audioPlayerStateId, + if (index != null) 'index': index, + }); + } + + PlaylistTableCompanion copyWith( + {Value? id, Value? audioPlayerStateId, Value? index}) { + return PlaylistTableCompanion( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioPlayerStateId.present) { + map['audio_player_state_id'] = Variable(audioPlayerStateId.value); + } + if (index.present) { + map['index'] = Variable(index.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistTableCompanion(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } +} + +class PlaylistMediaTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistMediaTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playlistId = GeneratedColumn( + 'playlist_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES playlist_table (id)')); + late final GeneratedColumn uri = GeneratedColumn( + 'uri', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn extras = GeneratedColumn( + 'extras', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn httpHeaders = GeneratedColumn( + 'http_headers', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => + [id, playlistId, uri, extras, httpHeaders]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_media_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistMediaTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistMediaTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playlistId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}playlist_id'])!, + uri: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}uri'])!, + extras: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}extras']), + httpHeaders: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}http_headers']), + ); + } + + @override + PlaylistMediaTable createAlias(String alias) { + return PlaylistMediaTable(attachedDatabase, alias); + } +} + +class PlaylistMediaTableData extends DataClass + implements Insertable { + final int id; + final int playlistId; + final String uri; + final String? extras; + final String? httpHeaders; + const PlaylistMediaTableData( + {required this.id, + required this.playlistId, + required this.uri, + this.extras, + this.httpHeaders}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playlist_id'] = Variable(playlistId); + map['uri'] = Variable(uri); + if (!nullToAbsent || extras != null) { + map['extras'] = Variable(extras); + } + if (!nullToAbsent || httpHeaders != null) { + map['http_headers'] = Variable(httpHeaders); + } + return map; + } + + PlaylistMediaTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistMediaTableCompanion( + id: Value(id), + playlistId: Value(playlistId), + uri: Value(uri), + extras: + extras == null && nullToAbsent ? const Value.absent() : Value(extras), + httpHeaders: httpHeaders == null && nullToAbsent + ? const Value.absent() + : Value(httpHeaders), + ); + } + + factory PlaylistMediaTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistMediaTableData( + id: serializer.fromJson(json['id']), + playlistId: serializer.fromJson(json['playlistId']), + uri: serializer.fromJson(json['uri']), + extras: serializer.fromJson(json['extras']), + httpHeaders: serializer.fromJson(json['httpHeaders']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playlistId': serializer.toJson(playlistId), + 'uri': serializer.toJson(uri), + 'extras': serializer.toJson(extras), + 'httpHeaders': serializer.toJson(httpHeaders), + }; + } + + PlaylistMediaTableData copyWith( + {int? id, + int? playlistId, + String? uri, + Value extras = const Value.absent(), + Value httpHeaders = const Value.absent()}) => + PlaylistMediaTableData( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras.present ? extras.value : this.extras, + httpHeaders: httpHeaders.present ? httpHeaders.value : this.httpHeaders, + ); + PlaylistMediaTableData copyWithCompanion(PlaylistMediaTableCompanion data) { + return PlaylistMediaTableData( + id: data.id.present ? data.id.value : this.id, + playlistId: + data.playlistId.present ? data.playlistId.value : this.playlistId, + uri: data.uri.present ? data.uri.value : this.uri, + extras: data.extras.present ? data.extras.value : this.extras, + httpHeaders: + data.httpHeaders.present ? data.httpHeaders.value : this.httpHeaders, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableData(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playlistId, uri, extras, httpHeaders); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistMediaTableData && + other.id == this.id && + other.playlistId == this.playlistId && + other.uri == this.uri && + other.extras == this.extras && + other.httpHeaders == this.httpHeaders); +} + +class PlaylistMediaTableCompanion + extends UpdateCompanion { + final Value id; + final Value playlistId; + final Value uri; + final Value extras; + final Value httpHeaders; + const PlaylistMediaTableCompanion({ + this.id = const Value.absent(), + this.playlistId = const Value.absent(), + this.uri = const Value.absent(), + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }); + PlaylistMediaTableCompanion.insert({ + this.id = const Value.absent(), + required int playlistId, + required String uri, + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }) : playlistId = Value(playlistId), + uri = Value(uri); + static Insertable custom({ + Expression? id, + Expression? playlistId, + Expression? uri, + Expression? extras, + Expression? httpHeaders, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playlistId != null) 'playlist_id': playlistId, + if (uri != null) 'uri': uri, + if (extras != null) 'extras': extras, + if (httpHeaders != null) 'http_headers': httpHeaders, + }); + } + + PlaylistMediaTableCompanion copyWith( + {Value? id, + Value? playlistId, + Value? uri, + Value? extras, + Value? httpHeaders}) { + return PlaylistMediaTableCompanion( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras ?? this.extras, + httpHeaders: httpHeaders ?? this.httpHeaders, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playlistId.present) { + map['playlist_id'] = Variable(playlistId.value); + } + if (uri.present) { + map['uri'] = Variable(uri.value); + } + if (extras.present) { + map['extras'] = Variable(extras.value); + } + if (httpHeaders.present) { + map['http_headers'] = Variable(httpHeaders.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableCompanion(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } +} + +class HistoryTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + HistoryTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn itemId = GeneratedColumn( + 'item_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, type, itemId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'history_table'; + @override + Set get $primaryKey => {id}; + @override + HistoryTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return HistoryTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + itemId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}item_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + HistoryTable createAlias(String alias) { + return HistoryTable(attachedDatabase, alias); + } +} + +class HistoryTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String type; + final String itemId; + final String data; + const HistoryTableData( + {required this.id, + required this.createdAt, + required this.type, + required this.itemId, + required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['type'] = Variable(type); + map['item_id'] = Variable(itemId); + map['data'] = Variable(data); + return map; + } + + HistoryTableCompanion toCompanion(bool nullToAbsent) { + return HistoryTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + type: Value(type), + itemId: Value(itemId), + data: Value(data), + ); + } + + factory HistoryTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return HistoryTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + type: serializer.fromJson(json['type']), + itemId: serializer.fromJson(json['itemId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'type': serializer.toJson(type), + 'itemId': serializer.toJson(itemId), + 'data': serializer.toJson(data), + }; + } + + HistoryTableData copyWith( + {int? id, + DateTime? createdAt, + String? type, + String? itemId, + String? data}) => + HistoryTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + HistoryTableData copyWithCompanion(HistoryTableCompanion data) { + return HistoryTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + type: data.type.present ? data.type.value : this.type, + itemId: data.itemId.present ? data.itemId.value : this.itemId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('HistoryTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, type, itemId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is HistoryTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.type == this.type && + other.itemId == this.itemId && + other.data == this.data); +} + +class HistoryTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value type; + final Value itemId; + final Value data; + const HistoryTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.type = const Value.absent(), + this.itemId = const Value.absent(), + this.data = const Value.absent(), + }); + HistoryTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String type, + required String itemId, + required String data, + }) : type = Value(type), + itemId = Value(itemId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? type, + Expression? itemId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (type != null) 'type': type, + if (itemId != null) 'item_id': itemId, + if (data != null) 'data': data, + }); + } + + HistoryTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? type, + Value? itemId, + Value? data}) { + return HistoryTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (itemId.present) { + map['item_id'] = Variable(itemId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('HistoryTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class LyricsTable extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + LyricsTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, trackId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'lyrics_table'; + @override + Set get $primaryKey => {id}; + @override + LyricsTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return LyricsTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + LyricsTable createAlias(String alias) { + return LyricsTable(attachedDatabase, alias); + } +} + +class LyricsTableData extends DataClass implements Insertable { + final int id; + final String trackId; + final String data; + const LyricsTableData( + {required this.id, required this.trackId, required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['data'] = Variable(data); + return map; + } + + LyricsTableCompanion toCompanion(bool nullToAbsent) { + return LyricsTableCompanion( + id: Value(id), + trackId: Value(trackId), + data: Value(data), + ); + } + + factory LyricsTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return LyricsTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'data': serializer.toJson(data), + }; + } + + LyricsTableData copyWith({int? id, String? trackId, String? data}) => + LyricsTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + LyricsTableData copyWithCompanion(LyricsTableCompanion data) { + return LyricsTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('LyricsTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is LyricsTableData && + other.id == this.id && + other.trackId == this.trackId && + other.data == this.data); +} + +class LyricsTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value data; + const LyricsTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.data = const Value.absent(), + }); + LyricsTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String data, + }) : trackId = Value(trackId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (data != null) 'data': data, + }); + } + + LyricsTableCompanion copyWith( + {Value? id, Value? trackId, Value? data}) { + return LyricsTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('LyricsTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV1 extends GeneratedDatabase { + DatabaseAtV1(QueryExecutor e) : super(e); + late final AuthenticationTable authenticationTable = + AuthenticationTable(this); + late final BlacklistTable blacklistTable = BlacklistTable(this); + late final PreferencesTable preferencesTable = PreferencesTable(this); + late final ScrobblerTable scrobblerTable = ScrobblerTable(this); + late final SkipSegmentTable skipSegmentTable = SkipSegmentTable(this); + late final SourceMatchTable sourceMatchTable = SourceMatchTable(this); + late final AudioPlayerStateTable audioPlayerStateTable = + AudioPlayerStateTable(this); + late final PlaylistTable playlistTable = PlaylistTable(this); + late final PlaylistMediaTable playlistMediaTable = PlaylistMediaTable(this); + late final HistoryTable historyTable = HistoryTable(this); + late final LyricsTable lyricsTable = LyricsTable(this); + late final Index uniqueBlacklist = Index('unique_blacklist', + 'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)'); + late final Index uniqTrackMatch = Index('uniq_track_match', + 'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)'); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + authenticationTable, + blacklistTable, + preferencesTable, + scrobblerTable, + skipSegmentTable, + sourceMatchTable, + audioPlayerStateTable, + playlistTable, + playlistMediaTable, + historyTable, + lyricsTable, + uniqueBlacklist, + uniqTrackMatch + ]; + @override + int get schemaVersion => 1; +} diff --git a/test/drift/app_db/generated/schema_v2.dart b/test/drift/app_db/generated/schema_v2.dart new file mode 100644 index 00000000..caf34ab9 --- /dev/null +++ b/test/drift/app_db/generated/schema_v2.dart @@ -0,0 +1,3366 @@ +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +//@dart=2.12 +import 'package:drift/drift.dart'; +import 'package:flutter/material.dart' hide Table; +import 'package:spotify/spotify.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/utils/migrations/adapters.dart'; + +class AuthenticationTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AuthenticationTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn cookie = GeneratedColumn( + 'cookie', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn accessToken = GeneratedColumn( + 'access_token', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn expiration = GeneratedColumn( + 'expiration', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + @override + List get $columns => [id, cookie, accessToken, expiration]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'authentication_table'; + @override + Set get $primaryKey => {id}; + @override + AuthenticationTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AuthenticationTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + cookie: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}cookie'])!, + accessToken: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}access_token'])!, + expiration: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}expiration'])!, + ); + } + + @override + AuthenticationTable createAlias(String alias) { + return AuthenticationTable(attachedDatabase, alias); + } +} + +class AuthenticationTableData extends DataClass + implements Insertable { + final int id; + final String cookie; + final String accessToken; + final DateTime expiration; + const AuthenticationTableData( + {required this.id, + required this.cookie, + required this.accessToken, + required this.expiration}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['cookie'] = Variable(cookie); + map['access_token'] = Variable(accessToken); + map['expiration'] = Variable(expiration); + return map; + } + + AuthenticationTableCompanion toCompanion(bool nullToAbsent) { + return AuthenticationTableCompanion( + id: Value(id), + cookie: Value(cookie), + accessToken: Value(accessToken), + expiration: Value(expiration), + ); + } + + factory AuthenticationTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AuthenticationTableData( + id: serializer.fromJson(json['id']), + cookie: serializer.fromJson(json['cookie']), + accessToken: serializer.fromJson(json['accessToken']), + expiration: serializer.fromJson(json['expiration']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'cookie': serializer.toJson(cookie), + 'accessToken': serializer.toJson(accessToken), + 'expiration': serializer.toJson(expiration), + }; + } + + AuthenticationTableData copyWith( + {int? id, + String? cookie, + String? accessToken, + DateTime? expiration}) => + AuthenticationTableData( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + AuthenticationTableData copyWithCompanion(AuthenticationTableCompanion data) { + return AuthenticationTableData( + id: data.id.present ? data.id.value : this.id, + cookie: data.cookie.present ? data.cookie.value : this.cookie, + accessToken: + data.accessToken.present ? data.accessToken.value : this.accessToken, + expiration: + data.expiration.present ? data.expiration.value : this.expiration, + ); + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableData(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, cookie, accessToken, expiration); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AuthenticationTableData && + other.id == this.id && + other.cookie == this.cookie && + other.accessToken == this.accessToken && + other.expiration == this.expiration); +} + +class AuthenticationTableCompanion + extends UpdateCompanion { + final Value id; + final Value cookie; + final Value accessToken; + final Value expiration; + const AuthenticationTableCompanion({ + this.id = const Value.absent(), + this.cookie = const Value.absent(), + this.accessToken = const Value.absent(), + this.expiration = const Value.absent(), + }); + AuthenticationTableCompanion.insert({ + this.id = const Value.absent(), + required String cookie, + required String accessToken, + required DateTime expiration, + }) : cookie = Value(cookie), + accessToken = Value(accessToken), + expiration = Value(expiration); + static Insertable custom({ + Expression? id, + Expression? cookie, + Expression? accessToken, + Expression? expiration, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (cookie != null) 'cookie': cookie, + if (accessToken != null) 'access_token': accessToken, + if (expiration != null) 'expiration': expiration, + }); + } + + AuthenticationTableCompanion copyWith( + {Value? id, + Value? cookie, + Value? accessToken, + Value? expiration}) { + return AuthenticationTableCompanion( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (cookie.present) { + map['cookie'] = Variable(cookie.value); + } + if (accessToken.present) { + map['access_token'] = Variable(accessToken.value); + } + if (expiration.present) { + map['expiration'] = Variable(expiration.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableCompanion(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } +} + +class BlacklistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BlacklistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementType = GeneratedColumn( + 'element_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementId = GeneratedColumn( + 'element_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, name, elementType, elementId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'blacklist_table'; + @override + Set get $primaryKey => {id}; + @override + BlacklistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BlacklistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + elementType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_type'])!, + elementId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_id'])!, + ); + } + + @override + BlacklistTable createAlias(String alias) { + return BlacklistTable(attachedDatabase, alias); + } +} + +class BlacklistTableData extends DataClass + implements Insertable { + final int id; + final String name; + final String elementType; + final String elementId; + const BlacklistTableData( + {required this.id, + required this.name, + required this.elementType, + required this.elementId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['name'] = Variable(name); + map['element_type'] = Variable(elementType); + map['element_id'] = Variable(elementId); + return map; + } + + BlacklistTableCompanion toCompanion(bool nullToAbsent) { + return BlacklistTableCompanion( + id: Value(id), + name: Value(name), + elementType: Value(elementType), + elementId: Value(elementId), + ); + } + + factory BlacklistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BlacklistTableData( + id: serializer.fromJson(json['id']), + name: serializer.fromJson(json['name']), + elementType: serializer.fromJson(json['elementType']), + elementId: serializer.fromJson(json['elementId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'name': serializer.toJson(name), + 'elementType': serializer.toJson(elementType), + 'elementId': serializer.toJson(elementId), + }; + } + + BlacklistTableData copyWith( + {int? id, String? name, String? elementType, String? elementId}) => + BlacklistTableData( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + BlacklistTableData copyWithCompanion(BlacklistTableCompanion data) { + return BlacklistTableData( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + elementType: + data.elementType.present ? data.elementType.value : this.elementType, + elementId: data.elementId.present ? data.elementId.value : this.elementId, + ); + } + + @override + String toString() { + return (StringBuffer('BlacklistTableData(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, name, elementType, elementId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BlacklistTableData && + other.id == this.id && + other.name == this.name && + other.elementType == this.elementType && + other.elementId == this.elementId); +} + +class BlacklistTableCompanion extends UpdateCompanion { + final Value id; + final Value name; + final Value elementType; + final Value elementId; + const BlacklistTableCompanion({ + this.id = const Value.absent(), + this.name = const Value.absent(), + this.elementType = const Value.absent(), + this.elementId = const Value.absent(), + }); + BlacklistTableCompanion.insert({ + this.id = const Value.absent(), + required String name, + required String elementType, + required String elementId, + }) : name = Value(name), + elementType = Value(elementType), + elementId = Value(elementId); + static Insertable custom({ + Expression? id, + Expression? name, + Expression? elementType, + Expression? elementId, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (name != null) 'name': name, + if (elementType != null) 'element_type': elementType, + if (elementId != null) 'element_id': elementId, + }); + } + + BlacklistTableCompanion copyWith( + {Value? id, + Value? name, + Value? elementType, + Value? elementId}) { + return BlacklistTableCompanion( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (elementType.present) { + map['element_type'] = Variable(elementType.value); + } + if (elementId.present) { + map['element_id'] = Variable(elementId.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BlacklistTableCompanion(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } +} + +class PreferencesTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PreferencesTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioQuality = GeneratedColumn( + 'audio_quality', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceQualities.high.name)); + late final GeneratedColumn albumColorSync = GeneratedColumn( + 'album_color_sync', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("album_color_sync" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn amoledDarkTheme = GeneratedColumn( + 'amoled_dark_theme', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("amoled_dark_theme" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn checkUpdate = GeneratedColumn( + 'check_update', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("check_update" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn normalizeAudio = GeneratedColumn( + 'normalize_audio', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("normalize_audio" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn showSystemTrayIcon = GeneratedColumn( + 'show_system_tray_icon', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("show_system_tray_icon" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn systemTitleBar = GeneratedColumn( + 'system_title_bar', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("system_title_bar" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn skipNonMusic = GeneratedColumn( + 'skip_non_music', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("skip_non_music" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn closeBehavior = GeneratedColumn( + 'close_behavior', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(CloseBehavior.close.name)); + late final GeneratedColumn accentColorScheme = + GeneratedColumn('accent_color_scheme', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("Blue:0xFF2196F3")); + late final GeneratedColumn layoutMode = GeneratedColumn( + 'layout_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(LayoutMode.adaptive.name)); + late final GeneratedColumn locale = GeneratedColumn( + 'locale', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: + const Constant('{"languageCode":"system","countryCode":"system"}')); + late final GeneratedColumn market = GeneratedColumn( + 'market', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(Market.US.name)); + late final GeneratedColumn searchMode = GeneratedColumn( + 'search_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SearchMode.youtube.name)); + late final GeneratedColumn downloadLocation = GeneratedColumn( + 'download_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn localLibraryLocation = + GeneratedColumn('local_library_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn pipedInstance = GeneratedColumn( + 'piped_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://pipedapi.kavin.rocks")); + late final GeneratedColumn invidiousInstance = + GeneratedColumn('invidious_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://inv.nadeko.net")); + late final GeneratedColumn themeMode = GeneratedColumn( + 'theme_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(ThemeMode.system.name)); + late final GeneratedColumn audioSource = GeneratedColumn( + 'audio_source', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(AudioSource.youtube.name)); + late final GeneratedColumn streamMusicCodec = GeneratedColumn( + 'stream_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.weba.name)); + late final GeneratedColumn downloadMusicCodec = + GeneratedColumn('download_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.m4a.name)); + late final GeneratedColumn discordPresence = GeneratedColumn( + 'discord_presence', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("discord_presence" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn endlessPlayback = GeneratedColumn( + 'endless_playback', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("endless_playback" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn enableConnect = GeneratedColumn( + 'enable_connect', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("enable_connect" IN (0, 1))'), + defaultValue: const Constant(false)); + @override + List get $columns => [ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + invidiousInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'preferences_table'; + @override + Set get $primaryKey => {id}; + @override + PreferencesTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PreferencesTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioQuality: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_quality'])!, + albumColorSync: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}album_color_sync'])!, + amoledDarkTheme: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}amoled_dark_theme'])!, + checkUpdate: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}check_update'])!, + normalizeAudio: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}normalize_audio'])!, + showSystemTrayIcon: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}show_system_tray_icon'])!, + systemTitleBar: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}system_title_bar'])!, + skipNonMusic: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}skip_non_music'])!, + closeBehavior: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}close_behavior'])!, + accentColorScheme: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}accent_color_scheme'])!, + layoutMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}layout_mode'])!, + locale: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}locale'])!, + market: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}market'])!, + searchMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}search_mode'])!, + downloadLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_location'])!, + localLibraryLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}local_library_location'])!, + pipedInstance: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}piped_instance'])!, + invidiousInstance: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}invidious_instance'])!, + themeMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}theme_mode'])!, + audioSource: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_source'])!, + streamMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}stream_music_codec'])!, + downloadMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_music_codec'])!, + discordPresence: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}discord_presence'])!, + endlessPlayback: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!, + enableConnect: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!, + ); + } + + @override + PreferencesTable createAlias(String alias) { + return PreferencesTable(attachedDatabase, alias); + } +} + +class PreferencesTableData extends DataClass + implements Insertable { + final int id; + final String audioQuality; + final bool albumColorSync; + final bool amoledDarkTheme; + final bool checkUpdate; + final bool normalizeAudio; + final bool showSystemTrayIcon; + final bool systemTitleBar; + final bool skipNonMusic; + final String closeBehavior; + final String accentColorScheme; + final String layoutMode; + final String locale; + final String market; + final String searchMode; + final String downloadLocation; + final String localLibraryLocation; + final String pipedInstance; + final String invidiousInstance; + final String themeMode; + final String audioSource; + final String streamMusicCodec; + final String downloadMusicCodec; + final bool discordPresence; + final bool endlessPlayback; + final bool enableConnect; + const PreferencesTableData( + {required this.id, + required this.audioQuality, + required this.albumColorSync, + required this.amoledDarkTheme, + required this.checkUpdate, + required this.normalizeAudio, + required this.showSystemTrayIcon, + required this.systemTitleBar, + required this.skipNonMusic, + required this.closeBehavior, + required this.accentColorScheme, + required this.layoutMode, + required this.locale, + required this.market, + required this.searchMode, + required this.downloadLocation, + required this.localLibraryLocation, + required this.pipedInstance, + required this.invidiousInstance, + required this.themeMode, + required this.audioSource, + required this.streamMusicCodec, + required this.downloadMusicCodec, + required this.discordPresence, + required this.endlessPlayback, + required this.enableConnect}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_quality'] = Variable(audioQuality); + map['album_color_sync'] = Variable(albumColorSync); + map['amoled_dark_theme'] = Variable(amoledDarkTheme); + map['check_update'] = Variable(checkUpdate); + map['normalize_audio'] = Variable(normalizeAudio); + map['show_system_tray_icon'] = Variable(showSystemTrayIcon); + map['system_title_bar'] = Variable(systemTitleBar); + map['skip_non_music'] = Variable(skipNonMusic); + map['close_behavior'] = Variable(closeBehavior); + map['accent_color_scheme'] = Variable(accentColorScheme); + map['layout_mode'] = Variable(layoutMode); + map['locale'] = Variable(locale); + map['market'] = Variable(market); + map['search_mode'] = Variable(searchMode); + map['download_location'] = Variable(downloadLocation); + map['local_library_location'] = Variable(localLibraryLocation); + map['piped_instance'] = Variable(pipedInstance); + map['invidious_instance'] = Variable(invidiousInstance); + map['theme_mode'] = Variable(themeMode); + map['audio_source'] = Variable(audioSource); + map['stream_music_codec'] = Variable(streamMusicCodec); + map['download_music_codec'] = Variable(downloadMusicCodec); + map['discord_presence'] = Variable(discordPresence); + map['endless_playback'] = Variable(endlessPlayback); + map['enable_connect'] = Variable(enableConnect); + return map; + } + + PreferencesTableCompanion toCompanion(bool nullToAbsent) { + return PreferencesTableCompanion( + id: Value(id), + audioQuality: Value(audioQuality), + albumColorSync: Value(albumColorSync), + amoledDarkTheme: Value(amoledDarkTheme), + checkUpdate: Value(checkUpdate), + normalizeAudio: Value(normalizeAudio), + showSystemTrayIcon: Value(showSystemTrayIcon), + systemTitleBar: Value(systemTitleBar), + skipNonMusic: Value(skipNonMusic), + closeBehavior: Value(closeBehavior), + accentColorScheme: Value(accentColorScheme), + layoutMode: Value(layoutMode), + locale: Value(locale), + market: Value(market), + searchMode: Value(searchMode), + downloadLocation: Value(downloadLocation), + localLibraryLocation: Value(localLibraryLocation), + pipedInstance: Value(pipedInstance), + invidiousInstance: Value(invidiousInstance), + themeMode: Value(themeMode), + audioSource: Value(audioSource), + streamMusicCodec: Value(streamMusicCodec), + downloadMusicCodec: Value(downloadMusicCodec), + discordPresence: Value(discordPresence), + endlessPlayback: Value(endlessPlayback), + enableConnect: Value(enableConnect), + ); + } + + factory PreferencesTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PreferencesTableData( + id: serializer.fromJson(json['id']), + audioQuality: serializer.fromJson(json['audioQuality']), + albumColorSync: serializer.fromJson(json['albumColorSync']), + amoledDarkTheme: serializer.fromJson(json['amoledDarkTheme']), + checkUpdate: serializer.fromJson(json['checkUpdate']), + normalizeAudio: serializer.fromJson(json['normalizeAudio']), + showSystemTrayIcon: serializer.fromJson(json['showSystemTrayIcon']), + systemTitleBar: serializer.fromJson(json['systemTitleBar']), + skipNonMusic: serializer.fromJson(json['skipNonMusic']), + closeBehavior: serializer.fromJson(json['closeBehavior']), + accentColorScheme: serializer.fromJson(json['accentColorScheme']), + layoutMode: serializer.fromJson(json['layoutMode']), + locale: serializer.fromJson(json['locale']), + market: serializer.fromJson(json['market']), + searchMode: serializer.fromJson(json['searchMode']), + downloadLocation: serializer.fromJson(json['downloadLocation']), + localLibraryLocation: + serializer.fromJson(json['localLibraryLocation']), + pipedInstance: serializer.fromJson(json['pipedInstance']), + invidiousInstance: serializer.fromJson(json['invidiousInstance']), + themeMode: serializer.fromJson(json['themeMode']), + audioSource: serializer.fromJson(json['audioSource']), + streamMusicCodec: serializer.fromJson(json['streamMusicCodec']), + downloadMusicCodec: + serializer.fromJson(json['downloadMusicCodec']), + discordPresence: serializer.fromJson(json['discordPresence']), + endlessPlayback: serializer.fromJson(json['endlessPlayback']), + enableConnect: serializer.fromJson(json['enableConnect']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioQuality': serializer.toJson(audioQuality), + 'albumColorSync': serializer.toJson(albumColorSync), + 'amoledDarkTheme': serializer.toJson(amoledDarkTheme), + 'checkUpdate': serializer.toJson(checkUpdate), + 'normalizeAudio': serializer.toJson(normalizeAudio), + 'showSystemTrayIcon': serializer.toJson(showSystemTrayIcon), + 'systemTitleBar': serializer.toJson(systemTitleBar), + 'skipNonMusic': serializer.toJson(skipNonMusic), + 'closeBehavior': serializer.toJson(closeBehavior), + 'accentColorScheme': serializer.toJson(accentColorScheme), + 'layoutMode': serializer.toJson(layoutMode), + 'locale': serializer.toJson(locale), + 'market': serializer.toJson(market), + 'searchMode': serializer.toJson(searchMode), + 'downloadLocation': serializer.toJson(downloadLocation), + 'localLibraryLocation': serializer.toJson(localLibraryLocation), + 'pipedInstance': serializer.toJson(pipedInstance), + 'invidiousInstance': serializer.toJson(invidiousInstance), + 'themeMode': serializer.toJson(themeMode), + 'audioSource': serializer.toJson(audioSource), + 'streamMusicCodec': serializer.toJson(streamMusicCodec), + 'downloadMusicCodec': serializer.toJson(downloadMusicCodec), + 'discordPresence': serializer.toJson(discordPresence), + 'endlessPlayback': serializer.toJson(endlessPlayback), + 'enableConnect': serializer.toJson(enableConnect), + }; + } + + PreferencesTableData copyWith( + {int? id, + String? audioQuality, + bool? albumColorSync, + bool? amoledDarkTheme, + bool? checkUpdate, + bool? normalizeAudio, + bool? showSystemTrayIcon, + bool? systemTitleBar, + bool? skipNonMusic, + String? closeBehavior, + String? accentColorScheme, + String? layoutMode, + String? locale, + String? market, + String? searchMode, + String? downloadLocation, + String? localLibraryLocation, + String? pipedInstance, + String? invidiousInstance, + String? themeMode, + String? audioSource, + String? streamMusicCodec, + String? downloadMusicCodec, + bool? discordPresence, + bool? endlessPlayback, + bool? enableConnect}) => + PreferencesTableData( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + ); + PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) { + return PreferencesTableData( + id: data.id.present ? data.id.value : this.id, + audioQuality: data.audioQuality.present + ? data.audioQuality.value + : this.audioQuality, + albumColorSync: data.albumColorSync.present + ? data.albumColorSync.value + : this.albumColorSync, + amoledDarkTheme: data.amoledDarkTheme.present + ? data.amoledDarkTheme.value + : this.amoledDarkTheme, + checkUpdate: + data.checkUpdate.present ? data.checkUpdate.value : this.checkUpdate, + normalizeAudio: data.normalizeAudio.present + ? data.normalizeAudio.value + : this.normalizeAudio, + showSystemTrayIcon: data.showSystemTrayIcon.present + ? data.showSystemTrayIcon.value + : this.showSystemTrayIcon, + systemTitleBar: data.systemTitleBar.present + ? data.systemTitleBar.value + : this.systemTitleBar, + skipNonMusic: data.skipNonMusic.present + ? data.skipNonMusic.value + : this.skipNonMusic, + closeBehavior: data.closeBehavior.present + ? data.closeBehavior.value + : this.closeBehavior, + accentColorScheme: data.accentColorScheme.present + ? data.accentColorScheme.value + : this.accentColorScheme, + layoutMode: + data.layoutMode.present ? data.layoutMode.value : this.layoutMode, + locale: data.locale.present ? data.locale.value : this.locale, + market: data.market.present ? data.market.value : this.market, + searchMode: + data.searchMode.present ? data.searchMode.value : this.searchMode, + downloadLocation: data.downloadLocation.present + ? data.downloadLocation.value + : this.downloadLocation, + localLibraryLocation: data.localLibraryLocation.present + ? data.localLibraryLocation.value + : this.localLibraryLocation, + pipedInstance: data.pipedInstance.present + ? data.pipedInstance.value + : this.pipedInstance, + invidiousInstance: data.invidiousInstance.present + ? data.invidiousInstance.value + : this.invidiousInstance, + themeMode: data.themeMode.present ? data.themeMode.value : this.themeMode, + audioSource: + data.audioSource.present ? data.audioSource.value : this.audioSource, + streamMusicCodec: data.streamMusicCodec.present + ? data.streamMusicCodec.value + : this.streamMusicCodec, + downloadMusicCodec: data.downloadMusicCodec.present + ? data.downloadMusicCodec.value + : this.downloadMusicCodec, + discordPresence: data.discordPresence.present + ? data.discordPresence.value + : this.discordPresence, + endlessPlayback: data.endlessPlayback.present + ? data.endlessPlayback.value + : this.endlessPlayback, + enableConnect: data.enableConnect.present + ? data.enableConnect.value + : this.enableConnect, + ); + } + + @override + String toString() { + return (StringBuffer('PreferencesTableData(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + invidiousInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PreferencesTableData && + other.id == this.id && + other.audioQuality == this.audioQuality && + other.albumColorSync == this.albumColorSync && + other.amoledDarkTheme == this.amoledDarkTheme && + other.checkUpdate == this.checkUpdate && + other.normalizeAudio == this.normalizeAudio && + other.showSystemTrayIcon == this.showSystemTrayIcon && + other.systemTitleBar == this.systemTitleBar && + other.skipNonMusic == this.skipNonMusic && + other.closeBehavior == this.closeBehavior && + other.accentColorScheme == this.accentColorScheme && + other.layoutMode == this.layoutMode && + other.locale == this.locale && + other.market == this.market && + other.searchMode == this.searchMode && + other.downloadLocation == this.downloadLocation && + other.localLibraryLocation == this.localLibraryLocation && + other.pipedInstance == this.pipedInstance && + other.invidiousInstance == this.invidiousInstance && + other.themeMode == this.themeMode && + other.audioSource == this.audioSource && + other.streamMusicCodec == this.streamMusicCodec && + other.downloadMusicCodec == this.downloadMusicCodec && + other.discordPresence == this.discordPresence && + other.endlessPlayback == this.endlessPlayback && + other.enableConnect == this.enableConnect); +} + +class PreferencesTableCompanion extends UpdateCompanion { + final Value id; + final Value audioQuality; + final Value albumColorSync; + final Value amoledDarkTheme; + final Value checkUpdate; + final Value normalizeAudio; + final Value showSystemTrayIcon; + final Value systemTitleBar; + final Value skipNonMusic; + final Value closeBehavior; + final Value accentColorScheme; + final Value layoutMode; + final Value locale; + final Value market; + final Value searchMode; + final Value downloadLocation; + final Value localLibraryLocation; + final Value pipedInstance; + final Value invidiousInstance; + final Value themeMode; + final Value audioSource; + final Value streamMusicCodec; + final Value downloadMusicCodec; + final Value discordPresence; + final Value endlessPlayback; + final Value enableConnect; + const PreferencesTableCompanion({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + }); + PreferencesTableCompanion.insert({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + }); + static Insertable custom({ + Expression? id, + Expression? audioQuality, + Expression? albumColorSync, + Expression? amoledDarkTheme, + Expression? checkUpdate, + Expression? normalizeAudio, + Expression? showSystemTrayIcon, + Expression? systemTitleBar, + Expression? skipNonMusic, + Expression? closeBehavior, + Expression? accentColorScheme, + Expression? layoutMode, + Expression? locale, + Expression? market, + Expression? searchMode, + Expression? downloadLocation, + Expression? localLibraryLocation, + Expression? pipedInstance, + Expression? invidiousInstance, + Expression? themeMode, + Expression? audioSource, + Expression? streamMusicCodec, + Expression? downloadMusicCodec, + Expression? discordPresence, + Expression? endlessPlayback, + Expression? enableConnect, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioQuality != null) 'audio_quality': audioQuality, + if (albumColorSync != null) 'album_color_sync': albumColorSync, + if (amoledDarkTheme != null) 'amoled_dark_theme': amoledDarkTheme, + if (checkUpdate != null) 'check_update': checkUpdate, + if (normalizeAudio != null) 'normalize_audio': normalizeAudio, + if (showSystemTrayIcon != null) + 'show_system_tray_icon': showSystemTrayIcon, + if (systemTitleBar != null) 'system_title_bar': systemTitleBar, + if (skipNonMusic != null) 'skip_non_music': skipNonMusic, + if (closeBehavior != null) 'close_behavior': closeBehavior, + if (accentColorScheme != null) 'accent_color_scheme': accentColorScheme, + if (layoutMode != null) 'layout_mode': layoutMode, + if (locale != null) 'locale': locale, + if (market != null) 'market': market, + if (searchMode != null) 'search_mode': searchMode, + if (downloadLocation != null) 'download_location': downloadLocation, + if (localLibraryLocation != null) + 'local_library_location': localLibraryLocation, + if (pipedInstance != null) 'piped_instance': pipedInstance, + if (invidiousInstance != null) 'invidious_instance': invidiousInstance, + if (themeMode != null) 'theme_mode': themeMode, + if (audioSource != null) 'audio_source': audioSource, + if (streamMusicCodec != null) 'stream_music_codec': streamMusicCodec, + if (downloadMusicCodec != null) + 'download_music_codec': downloadMusicCodec, + if (discordPresence != null) 'discord_presence': discordPresence, + if (endlessPlayback != null) 'endless_playback': endlessPlayback, + if (enableConnect != null) 'enable_connect': enableConnect, + }); + } + + PreferencesTableCompanion copyWith( + {Value? id, + Value? audioQuality, + Value? albumColorSync, + Value? amoledDarkTheme, + Value? checkUpdate, + Value? normalizeAudio, + Value? showSystemTrayIcon, + Value? systemTitleBar, + Value? skipNonMusic, + Value? closeBehavior, + Value? accentColorScheme, + Value? layoutMode, + Value? locale, + Value? market, + Value? searchMode, + Value? downloadLocation, + Value? localLibraryLocation, + Value? pipedInstance, + Value? invidiousInstance, + Value? themeMode, + Value? audioSource, + Value? streamMusicCodec, + Value? downloadMusicCodec, + Value? discordPresence, + Value? endlessPlayback, + Value? enableConnect}) { + return PreferencesTableCompanion( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioQuality.present) { + map['audio_quality'] = Variable(audioQuality.value); + } + if (albumColorSync.present) { + map['album_color_sync'] = Variable(albumColorSync.value); + } + if (amoledDarkTheme.present) { + map['amoled_dark_theme'] = Variable(amoledDarkTheme.value); + } + if (checkUpdate.present) { + map['check_update'] = Variable(checkUpdate.value); + } + if (normalizeAudio.present) { + map['normalize_audio'] = Variable(normalizeAudio.value); + } + if (showSystemTrayIcon.present) { + map['show_system_tray_icon'] = Variable(showSystemTrayIcon.value); + } + if (systemTitleBar.present) { + map['system_title_bar'] = Variable(systemTitleBar.value); + } + if (skipNonMusic.present) { + map['skip_non_music'] = Variable(skipNonMusic.value); + } + if (closeBehavior.present) { + map['close_behavior'] = Variable(closeBehavior.value); + } + if (accentColorScheme.present) { + map['accent_color_scheme'] = Variable(accentColorScheme.value); + } + if (layoutMode.present) { + map['layout_mode'] = Variable(layoutMode.value); + } + if (locale.present) { + map['locale'] = Variable(locale.value); + } + if (market.present) { + map['market'] = Variable(market.value); + } + if (searchMode.present) { + map['search_mode'] = Variable(searchMode.value); + } + if (downloadLocation.present) { + map['download_location'] = Variable(downloadLocation.value); + } + if (localLibraryLocation.present) { + map['local_library_location'] = + Variable(localLibraryLocation.value); + } + if (pipedInstance.present) { + map['piped_instance'] = Variable(pipedInstance.value); + } + if (invidiousInstance.present) { + map['invidious_instance'] = Variable(invidiousInstance.value); + } + if (themeMode.present) { + map['theme_mode'] = Variable(themeMode.value); + } + if (audioSource.present) { + map['audio_source'] = Variable(audioSource.value); + } + if (streamMusicCodec.present) { + map['stream_music_codec'] = Variable(streamMusicCodec.value); + } + if (downloadMusicCodec.present) { + map['download_music_codec'] = Variable(downloadMusicCodec.value); + } + if (discordPresence.present) { + map['discord_presence'] = Variable(discordPresence.value); + } + if (endlessPlayback.present) { + map['endless_playback'] = Variable(endlessPlayback.value); + } + if (enableConnect.present) { + map['enable_connect'] = Variable(enableConnect.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PreferencesTableCompanion(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect') + ..write(')')) + .toString(); + } +} + +class ScrobblerTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ScrobblerTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn username = GeneratedColumn( + 'username', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn passwordHash = GeneratedColumn( + 'password_hash', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, username, passwordHash]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'scrobbler_table'; + @override + Set get $primaryKey => {id}; + @override + ScrobblerTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ScrobblerTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + username: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}username'])!, + passwordHash: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}password_hash'])!, + ); + } + + @override + ScrobblerTable createAlias(String alias) { + return ScrobblerTable(attachedDatabase, alias); + } +} + +class ScrobblerTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String username; + final String passwordHash; + const ScrobblerTableData( + {required this.id, + required this.createdAt, + required this.username, + required this.passwordHash}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['username'] = Variable(username); + map['password_hash'] = Variable(passwordHash); + return map; + } + + ScrobblerTableCompanion toCompanion(bool nullToAbsent) { + return ScrobblerTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + username: Value(username), + passwordHash: Value(passwordHash), + ); + } + + factory ScrobblerTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ScrobblerTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + username: serializer.fromJson(json['username']), + passwordHash: serializer.fromJson(json['passwordHash']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'username': serializer.toJson(username), + 'passwordHash': serializer.toJson(passwordHash), + }; + } + + ScrobblerTableData copyWith( + {int? id, + DateTime? createdAt, + String? username, + String? passwordHash}) => + ScrobblerTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + ScrobblerTableData copyWithCompanion(ScrobblerTableCompanion data) { + return ScrobblerTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + username: data.username.present ? data.username.value : this.username, + passwordHash: data.passwordHash.present + ? data.passwordHash.value + : this.passwordHash, + ); + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, username, passwordHash); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ScrobblerTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.username == this.username && + other.passwordHash == this.passwordHash); +} + +class ScrobblerTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value username; + final Value passwordHash; + const ScrobblerTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.username = const Value.absent(), + this.passwordHash = const Value.absent(), + }); + ScrobblerTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String username, + required String passwordHash, + }) : username = Value(username), + passwordHash = Value(passwordHash); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? username, + Expression? passwordHash, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (username != null) 'username': username, + if (passwordHash != null) 'password_hash': passwordHash, + }); + } + + ScrobblerTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? username, + Value? passwordHash}) { + return ScrobblerTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (username.present) { + map['username'] = Variable(username.value); + } + if (passwordHash.present) { + map['password_hash'] = Variable(passwordHash.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } +} + +class SkipSegmentTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SkipSegmentTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn start = GeneratedColumn( + 'start', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn end = GeneratedColumn( + 'end', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => [id, start, end, trackId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'skip_segment_table'; + @override + Set get $primaryKey => {id}; + @override + SkipSegmentTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SkipSegmentTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + start: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}start'])!, + end: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}end'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SkipSegmentTable createAlias(String alias) { + return SkipSegmentTable(attachedDatabase, alias); + } +} + +class SkipSegmentTableData extends DataClass + implements Insertable { + final int id; + final int start; + final int end; + final String trackId; + final DateTime createdAt; + const SkipSegmentTableData( + {required this.id, + required this.start, + required this.end, + required this.trackId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['start'] = Variable(start); + map['end'] = Variable(end); + map['track_id'] = Variable(trackId); + map['created_at'] = Variable(createdAt); + return map; + } + + SkipSegmentTableCompanion toCompanion(bool nullToAbsent) { + return SkipSegmentTableCompanion( + id: Value(id), + start: Value(start), + end: Value(end), + trackId: Value(trackId), + createdAt: Value(createdAt), + ); + } + + factory SkipSegmentTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SkipSegmentTableData( + id: serializer.fromJson(json['id']), + start: serializer.fromJson(json['start']), + end: serializer.fromJson(json['end']), + trackId: serializer.fromJson(json['trackId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'start': serializer.toJson(start), + 'end': serializer.toJson(end), + 'trackId': serializer.toJson(trackId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SkipSegmentTableData copyWith( + {int? id, + int? start, + int? end, + String? trackId, + DateTime? createdAt}) => + SkipSegmentTableData( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + SkipSegmentTableData copyWithCompanion(SkipSegmentTableCompanion data) { + return SkipSegmentTableData( + id: data.id.present ? data.id.value : this.id, + start: data.start.present ? data.start.value : this.start, + end: data.end.present ? data.end.value : this.end, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableData(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, start, end, trackId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SkipSegmentTableData && + other.id == this.id && + other.start == this.start && + other.end == this.end && + other.trackId == this.trackId && + other.createdAt == this.createdAt); +} + +class SkipSegmentTableCompanion extends UpdateCompanion { + final Value id; + final Value start; + final Value end; + final Value trackId; + final Value createdAt; + const SkipSegmentTableCompanion({ + this.id = const Value.absent(), + this.start = const Value.absent(), + this.end = const Value.absent(), + this.trackId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SkipSegmentTableCompanion.insert({ + this.id = const Value.absent(), + required int start, + required int end, + required String trackId, + this.createdAt = const Value.absent(), + }) : start = Value(start), + end = Value(end), + trackId = Value(trackId); + static Insertable custom({ + Expression? id, + Expression? start, + Expression? end, + Expression? trackId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (start != null) 'start': start, + if (end != null) 'end': end, + if (trackId != null) 'track_id': trackId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SkipSegmentTableCompanion copyWith( + {Value? id, + Value? start, + Value? end, + Value? trackId, + Value? createdAt}) { + return SkipSegmentTableCompanion( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (start.present) { + map['start'] = Variable(start.value); + } + if (end.present) { + map['end'] = Variable(end.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableCompanion(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SourceMatchTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SourceMatchTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceId = GeneratedColumn( + 'source_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceType = GeneratedColumn( + 'source_type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceType.youtube.name)); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => + [id, trackId, sourceId, sourceType, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'source_match_table'; + @override + Set get $primaryKey => {id}; + @override + SourceMatchTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SourceMatchTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + sourceId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_id'])!, + sourceType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SourceMatchTable createAlias(String alias) { + return SourceMatchTable(attachedDatabase, alias); + } +} + +class SourceMatchTableData extends DataClass + implements Insertable { + final int id; + final String trackId; + final String sourceId; + final String sourceType; + final DateTime createdAt; + const SourceMatchTableData( + {required this.id, + required this.trackId, + required this.sourceId, + required this.sourceType, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['source_id'] = Variable(sourceId); + map['source_type'] = Variable(sourceType); + map['created_at'] = Variable(createdAt); + return map; + } + + SourceMatchTableCompanion toCompanion(bool nullToAbsent) { + return SourceMatchTableCompanion( + id: Value(id), + trackId: Value(trackId), + sourceId: Value(sourceId), + sourceType: Value(sourceType), + createdAt: Value(createdAt), + ); + } + + factory SourceMatchTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SourceMatchTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + sourceId: serializer.fromJson(json['sourceId']), + sourceType: serializer.fromJson(json['sourceType']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'sourceId': serializer.toJson(sourceId), + 'sourceType': serializer.toJson(sourceType), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SourceMatchTableData copyWith( + {int? id, + String? trackId, + String? sourceId, + String? sourceType, + DateTime? createdAt}) => + SourceMatchTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + SourceMatchTableData copyWithCompanion(SourceMatchTableCompanion data) { + return SourceMatchTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId, + sourceType: + data.sourceType.present ? data.sourceType.value : this.sourceType, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, sourceId, sourceType, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SourceMatchTableData && + other.id == this.id && + other.trackId == this.trackId && + other.sourceId == this.sourceId && + other.sourceType == this.sourceType && + other.createdAt == this.createdAt); +} + +class SourceMatchTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value sourceId; + final Value sourceType; + final Value createdAt; + const SourceMatchTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.sourceId = const Value.absent(), + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SourceMatchTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String sourceId, + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }) : trackId = Value(trackId), + sourceId = Value(sourceId); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? sourceId, + Expression? sourceType, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (sourceId != null) 'source_id': sourceId, + if (sourceType != null) 'source_type': sourceType, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SourceMatchTableCompanion copyWith( + {Value? id, + Value? trackId, + Value? sourceId, + Value? sourceType, + Value? createdAt}) { + return SourceMatchTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (sourceId.present) { + map['source_id'] = Variable(sourceId.value); + } + if (sourceType.present) { + map['source_type'] = Variable(sourceType.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class AudioPlayerStateTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AudioPlayerStateTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playing = GeneratedColumn( + 'playing', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("playing" IN (0, 1))')); + late final GeneratedColumn loopMode = GeneratedColumn( + 'loop_mode', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn shuffled = GeneratedColumn( + 'shuffled', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("shuffled" IN (0, 1))')); + late final GeneratedColumn collections = GeneratedColumn( + 'collections', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => + [id, playing, loopMode, shuffled, collections]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'audio_player_state_table'; + @override + Set get $primaryKey => {id}; + @override + AudioPlayerStateTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AudioPlayerStateTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playing: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}playing'])!, + loopMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}loop_mode'])!, + shuffled: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}shuffled'])!, + collections: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}collections'])!, + ); + } + + @override + AudioPlayerStateTable createAlias(String alias) { + return AudioPlayerStateTable(attachedDatabase, alias); + } +} + +class AudioPlayerStateTableData extends DataClass + implements Insertable { + final int id; + final bool playing; + final String loopMode; + final bool shuffled; + final String collections; + const AudioPlayerStateTableData( + {required this.id, + required this.playing, + required this.loopMode, + required this.shuffled, + required this.collections}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playing'] = Variable(playing); + map['loop_mode'] = Variable(loopMode); + map['shuffled'] = Variable(shuffled); + map['collections'] = Variable(collections); + return map; + } + + AudioPlayerStateTableCompanion toCompanion(bool nullToAbsent) { + return AudioPlayerStateTableCompanion( + id: Value(id), + playing: Value(playing), + loopMode: Value(loopMode), + shuffled: Value(shuffled), + collections: Value(collections), + ); + } + + factory AudioPlayerStateTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AudioPlayerStateTableData( + id: serializer.fromJson(json['id']), + playing: serializer.fromJson(json['playing']), + loopMode: serializer.fromJson(json['loopMode']), + shuffled: serializer.fromJson(json['shuffled']), + collections: serializer.fromJson(json['collections']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playing': serializer.toJson(playing), + 'loopMode': serializer.toJson(loopMode), + 'shuffled': serializer.toJson(shuffled), + 'collections': serializer.toJson(collections), + }; + } + + AudioPlayerStateTableData copyWith( + {int? id, + bool? playing, + String? loopMode, + bool? shuffled, + String? collections}) => + AudioPlayerStateTableData( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + AudioPlayerStateTableData copyWithCompanion( + AudioPlayerStateTableCompanion data) { + return AudioPlayerStateTableData( + id: data.id.present ? data.id.value : this.id, + playing: data.playing.present ? data.playing.value : this.playing, + loopMode: data.loopMode.present ? data.loopMode.value : this.loopMode, + shuffled: data.shuffled.present ? data.shuffled.value : this.shuffled, + collections: + data.collections.present ? data.collections.value : this.collections, + ); + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableData(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playing, loopMode, shuffled, collections); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AudioPlayerStateTableData && + other.id == this.id && + other.playing == this.playing && + other.loopMode == this.loopMode && + other.shuffled == this.shuffled && + other.collections == this.collections); +} + +class AudioPlayerStateTableCompanion + extends UpdateCompanion { + final Value id; + final Value playing; + final Value loopMode; + final Value shuffled; + final Value collections; + const AudioPlayerStateTableCompanion({ + this.id = const Value.absent(), + this.playing = const Value.absent(), + this.loopMode = const Value.absent(), + this.shuffled = const Value.absent(), + this.collections = const Value.absent(), + }); + AudioPlayerStateTableCompanion.insert({ + this.id = const Value.absent(), + required bool playing, + required String loopMode, + required bool shuffled, + required String collections, + }) : playing = Value(playing), + loopMode = Value(loopMode), + shuffled = Value(shuffled), + collections = Value(collections); + static Insertable custom({ + Expression? id, + Expression? playing, + Expression? loopMode, + Expression? shuffled, + Expression? collections, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playing != null) 'playing': playing, + if (loopMode != null) 'loop_mode': loopMode, + if (shuffled != null) 'shuffled': shuffled, + if (collections != null) 'collections': collections, + }); + } + + AudioPlayerStateTableCompanion copyWith( + {Value? id, + Value? playing, + Value? loopMode, + Value? shuffled, + Value? collections}) { + return AudioPlayerStateTableCompanion( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playing.present) { + map['playing'] = Variable(playing.value); + } + if (loopMode.present) { + map['loop_mode'] = Variable(loopMode.value); + } + if (shuffled.present) { + map['shuffled'] = Variable(shuffled.value); + } + if (collections.present) { + map['collections'] = Variable(collections.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableCompanion(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } +} + +class PlaylistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioPlayerStateId = GeneratedColumn( + 'audio_player_state_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES audio_player_state_table (id)')); + late final GeneratedColumn index = GeneratedColumn( + 'index', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + @override + List get $columns => [id, audioPlayerStateId, index]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioPlayerStateId: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}audio_player_state_id'])!, + index: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}index'])!, + ); + } + + @override + PlaylistTable createAlias(String alias) { + return PlaylistTable(attachedDatabase, alias); + } +} + +class PlaylistTableData extends DataClass + implements Insertable { + final int id; + final int audioPlayerStateId; + final int index; + const PlaylistTableData( + {required this.id, + required this.audioPlayerStateId, + required this.index}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_player_state_id'] = Variable(audioPlayerStateId); + map['index'] = Variable(index); + return map; + } + + PlaylistTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistTableCompanion( + id: Value(id), + audioPlayerStateId: Value(audioPlayerStateId), + index: Value(index), + ); + } + + factory PlaylistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistTableData( + id: serializer.fromJson(json['id']), + audioPlayerStateId: serializer.fromJson(json['audioPlayerStateId']), + index: serializer.fromJson(json['index']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioPlayerStateId': serializer.toJson(audioPlayerStateId), + 'index': serializer.toJson(index), + }; + } + + PlaylistTableData copyWith({int? id, int? audioPlayerStateId, int? index}) => + PlaylistTableData( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + PlaylistTableData copyWithCompanion(PlaylistTableCompanion data) { + return PlaylistTableData( + id: data.id.present ? data.id.value : this.id, + audioPlayerStateId: data.audioPlayerStateId.present + ? data.audioPlayerStateId.value + : this.audioPlayerStateId, + index: data.index.present ? data.index.value : this.index, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistTableData(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, audioPlayerStateId, index); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistTableData && + other.id == this.id && + other.audioPlayerStateId == this.audioPlayerStateId && + other.index == this.index); +} + +class PlaylistTableCompanion extends UpdateCompanion { + final Value id; + final Value audioPlayerStateId; + final Value index; + const PlaylistTableCompanion({ + this.id = const Value.absent(), + this.audioPlayerStateId = const Value.absent(), + this.index = const Value.absent(), + }); + PlaylistTableCompanion.insert({ + this.id = const Value.absent(), + required int audioPlayerStateId, + required int index, + }) : audioPlayerStateId = Value(audioPlayerStateId), + index = Value(index); + static Insertable custom({ + Expression? id, + Expression? audioPlayerStateId, + Expression? index, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioPlayerStateId != null) + 'audio_player_state_id': audioPlayerStateId, + if (index != null) 'index': index, + }); + } + + PlaylistTableCompanion copyWith( + {Value? id, Value? audioPlayerStateId, Value? index}) { + return PlaylistTableCompanion( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioPlayerStateId.present) { + map['audio_player_state_id'] = Variable(audioPlayerStateId.value); + } + if (index.present) { + map['index'] = Variable(index.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistTableCompanion(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } +} + +class PlaylistMediaTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistMediaTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playlistId = GeneratedColumn( + 'playlist_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES playlist_table (id)')); + late final GeneratedColumn uri = GeneratedColumn( + 'uri', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn extras = GeneratedColumn( + 'extras', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn httpHeaders = GeneratedColumn( + 'http_headers', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => + [id, playlistId, uri, extras, httpHeaders]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_media_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistMediaTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistMediaTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playlistId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}playlist_id'])!, + uri: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}uri'])!, + extras: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}extras']), + httpHeaders: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}http_headers']), + ); + } + + @override + PlaylistMediaTable createAlias(String alias) { + return PlaylistMediaTable(attachedDatabase, alias); + } +} + +class PlaylistMediaTableData extends DataClass + implements Insertable { + final int id; + final int playlistId; + final String uri; + final String? extras; + final String? httpHeaders; + const PlaylistMediaTableData( + {required this.id, + required this.playlistId, + required this.uri, + this.extras, + this.httpHeaders}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playlist_id'] = Variable(playlistId); + map['uri'] = Variable(uri); + if (!nullToAbsent || extras != null) { + map['extras'] = Variable(extras); + } + if (!nullToAbsent || httpHeaders != null) { + map['http_headers'] = Variable(httpHeaders); + } + return map; + } + + PlaylistMediaTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistMediaTableCompanion( + id: Value(id), + playlistId: Value(playlistId), + uri: Value(uri), + extras: + extras == null && nullToAbsent ? const Value.absent() : Value(extras), + httpHeaders: httpHeaders == null && nullToAbsent + ? const Value.absent() + : Value(httpHeaders), + ); + } + + factory PlaylistMediaTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistMediaTableData( + id: serializer.fromJson(json['id']), + playlistId: serializer.fromJson(json['playlistId']), + uri: serializer.fromJson(json['uri']), + extras: serializer.fromJson(json['extras']), + httpHeaders: serializer.fromJson(json['httpHeaders']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playlistId': serializer.toJson(playlistId), + 'uri': serializer.toJson(uri), + 'extras': serializer.toJson(extras), + 'httpHeaders': serializer.toJson(httpHeaders), + }; + } + + PlaylistMediaTableData copyWith( + {int? id, + int? playlistId, + String? uri, + Value extras = const Value.absent(), + Value httpHeaders = const Value.absent()}) => + PlaylistMediaTableData( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras.present ? extras.value : this.extras, + httpHeaders: httpHeaders.present ? httpHeaders.value : this.httpHeaders, + ); + PlaylistMediaTableData copyWithCompanion(PlaylistMediaTableCompanion data) { + return PlaylistMediaTableData( + id: data.id.present ? data.id.value : this.id, + playlistId: + data.playlistId.present ? data.playlistId.value : this.playlistId, + uri: data.uri.present ? data.uri.value : this.uri, + extras: data.extras.present ? data.extras.value : this.extras, + httpHeaders: + data.httpHeaders.present ? data.httpHeaders.value : this.httpHeaders, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableData(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playlistId, uri, extras, httpHeaders); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistMediaTableData && + other.id == this.id && + other.playlistId == this.playlistId && + other.uri == this.uri && + other.extras == this.extras && + other.httpHeaders == this.httpHeaders); +} + +class PlaylistMediaTableCompanion + extends UpdateCompanion { + final Value id; + final Value playlistId; + final Value uri; + final Value extras; + final Value httpHeaders; + const PlaylistMediaTableCompanion({ + this.id = const Value.absent(), + this.playlistId = const Value.absent(), + this.uri = const Value.absent(), + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }); + PlaylistMediaTableCompanion.insert({ + this.id = const Value.absent(), + required int playlistId, + required String uri, + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }) : playlistId = Value(playlistId), + uri = Value(uri); + static Insertable custom({ + Expression? id, + Expression? playlistId, + Expression? uri, + Expression? extras, + Expression? httpHeaders, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playlistId != null) 'playlist_id': playlistId, + if (uri != null) 'uri': uri, + if (extras != null) 'extras': extras, + if (httpHeaders != null) 'http_headers': httpHeaders, + }); + } + + PlaylistMediaTableCompanion copyWith( + {Value? id, + Value? playlistId, + Value? uri, + Value? extras, + Value? httpHeaders}) { + return PlaylistMediaTableCompanion( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras ?? this.extras, + httpHeaders: httpHeaders ?? this.httpHeaders, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playlistId.present) { + map['playlist_id'] = Variable(playlistId.value); + } + if (uri.present) { + map['uri'] = Variable(uri.value); + } + if (extras.present) { + map['extras'] = Variable(extras.value); + } + if (httpHeaders.present) { + map['http_headers'] = Variable(httpHeaders.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableCompanion(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } +} + +class HistoryTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + HistoryTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn itemId = GeneratedColumn( + 'item_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, type, itemId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'history_table'; + @override + Set get $primaryKey => {id}; + @override + HistoryTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return HistoryTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + itemId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}item_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + HistoryTable createAlias(String alias) { + return HistoryTable(attachedDatabase, alias); + } +} + +class HistoryTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String type; + final String itemId; + final String data; + const HistoryTableData( + {required this.id, + required this.createdAt, + required this.type, + required this.itemId, + required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['type'] = Variable(type); + map['item_id'] = Variable(itemId); + map['data'] = Variable(data); + return map; + } + + HistoryTableCompanion toCompanion(bool nullToAbsent) { + return HistoryTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + type: Value(type), + itemId: Value(itemId), + data: Value(data), + ); + } + + factory HistoryTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return HistoryTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + type: serializer.fromJson(json['type']), + itemId: serializer.fromJson(json['itemId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'type': serializer.toJson(type), + 'itemId': serializer.toJson(itemId), + 'data': serializer.toJson(data), + }; + } + + HistoryTableData copyWith( + {int? id, + DateTime? createdAt, + String? type, + String? itemId, + String? data}) => + HistoryTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + HistoryTableData copyWithCompanion(HistoryTableCompanion data) { + return HistoryTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + type: data.type.present ? data.type.value : this.type, + itemId: data.itemId.present ? data.itemId.value : this.itemId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('HistoryTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, type, itemId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is HistoryTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.type == this.type && + other.itemId == this.itemId && + other.data == this.data); +} + +class HistoryTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value type; + final Value itemId; + final Value data; + const HistoryTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.type = const Value.absent(), + this.itemId = const Value.absent(), + this.data = const Value.absent(), + }); + HistoryTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String type, + required String itemId, + required String data, + }) : type = Value(type), + itemId = Value(itemId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? type, + Expression? itemId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (type != null) 'type': type, + if (itemId != null) 'item_id': itemId, + if (data != null) 'data': data, + }); + } + + HistoryTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? type, + Value? itemId, + Value? data}) { + return HistoryTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (itemId.present) { + map['item_id'] = Variable(itemId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('HistoryTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class LyricsTable extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + LyricsTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, trackId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'lyrics_table'; + @override + Set get $primaryKey => {id}; + @override + LyricsTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return LyricsTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + LyricsTable createAlias(String alias) { + return LyricsTable(attachedDatabase, alias); + } +} + +class LyricsTableData extends DataClass implements Insertable { + final int id; + final String trackId; + final String data; + const LyricsTableData( + {required this.id, required this.trackId, required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['data'] = Variable(data); + return map; + } + + LyricsTableCompanion toCompanion(bool nullToAbsent) { + return LyricsTableCompanion( + id: Value(id), + trackId: Value(trackId), + data: Value(data), + ); + } + + factory LyricsTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return LyricsTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'data': serializer.toJson(data), + }; + } + + LyricsTableData copyWith({int? id, String? trackId, String? data}) => + LyricsTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + LyricsTableData copyWithCompanion(LyricsTableCompanion data) { + return LyricsTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('LyricsTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is LyricsTableData && + other.id == this.id && + other.trackId == this.trackId && + other.data == this.data); +} + +class LyricsTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value data; + const LyricsTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.data = const Value.absent(), + }); + LyricsTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String data, + }) : trackId = Value(trackId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (data != null) 'data': data, + }); + } + + LyricsTableCompanion copyWith( + {Value? id, Value? trackId, Value? data}) { + return LyricsTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('LyricsTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV2 extends GeneratedDatabase { + DatabaseAtV2(QueryExecutor e) : super(e); + late final AuthenticationTable authenticationTable = + AuthenticationTable(this); + late final BlacklistTable blacklistTable = BlacklistTable(this); + late final PreferencesTable preferencesTable = PreferencesTable(this); + late final ScrobblerTable scrobblerTable = ScrobblerTable(this); + late final SkipSegmentTable skipSegmentTable = SkipSegmentTable(this); + late final SourceMatchTable sourceMatchTable = SourceMatchTable(this); + late final AudioPlayerStateTable audioPlayerStateTable = + AudioPlayerStateTable(this); + late final PlaylistTable playlistTable = PlaylistTable(this); + late final PlaylistMediaTable playlistMediaTable = PlaylistMediaTable(this); + late final HistoryTable historyTable = HistoryTable(this); + late final LyricsTable lyricsTable = LyricsTable(this); + late final Index uniqueBlacklist = Index('unique_blacklist', + 'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)'); + late final Index uniqTrackMatch = Index('uniq_track_match', + 'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)'); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + authenticationTable, + blacklistTable, + preferencesTable, + scrobblerTable, + skipSegmentTable, + sourceMatchTable, + audioPlayerStateTable, + playlistTable, + playlistMediaTable, + historyTable, + lyricsTable, + uniqueBlacklist, + uniqTrackMatch + ]; + @override + int get schemaVersion => 2; +} diff --git a/test/drift/app_db/migration_test.dart b/test/drift/app_db/migration_test.dart new file mode 100644 index 00000000..cdf646e9 --- /dev/null +++ b/test/drift/app_db/migration_test.dart @@ -0,0 +1,128 @@ +// ignore_for_file: unused_local_variable, unused_import +import 'package:drift/drift.dart'; +import 'package:drift_dev/api/migrations.dart'; +import 'package:spotube/models/database/database.dart'; +import 'package:test/test.dart'; +import 'generated/schema.dart'; + +import 'generated/schema_v1.dart' as v1; +import 'generated/schema_v2.dart' as v2; + +void main() { + driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; + late SchemaVerifier verifier; + + setUpAll(() { + verifier = SchemaVerifier(GeneratedHelper()); + }); + + group('simple database migrations', () { + // These simple tests verify all possible schema updates with a simple (no + // data) migration. This is a quick way to ensure that written database + // migrations properly alter the schema. + final versions = GeneratedHelper.versions; + for (final (i, fromVersion) in versions.indexed) { + group('from $fromVersion', () { + for (final toVersion in versions.skip(i + 1)) { + test('to $toVersion', () async { + final schema = await verifier.schemaAt(fromVersion); + final db = Database(schema.newConnection()); + await verifier.migrateAndValidate(db, toVersion); + await db.close(); + }); + } + }); + } + }); + + // Simple tests ensure the schema is transformed correctly, but some + // migrations benefit from a test verifying that data is transformed correctly + // too. This is particularly true for migrations that change existing columns + // (e.g. altering their type or constraints). Migrations that only add tables + // or columns typically don't need these advanced tests. + // TODO: Check whether you have migrations that could benefit from these tests + // and adapt this example to your database if necessary: + test("migration from v1 to v2 does not corrupt data", () async { + // Add data to insert into the old database, and the expected rows after the + // migration. + final oldAuthenticationTableData = []; + final expectedNewAuthenticationTableData = []; + + final oldBlacklistTableData = []; + final expectedNewBlacklistTableData = []; + + final oldPreferencesTableData = []; + final expectedNewPreferencesTableData = []; + + final oldScrobblerTableData = []; + final expectedNewScrobblerTableData = []; + + final oldSkipSegmentTableData = []; + final expectedNewSkipSegmentTableData = []; + + final oldSourceMatchTableData = []; + final expectedNewSourceMatchTableData = []; + + final oldAudioPlayerStateTableData = []; + final expectedNewAudioPlayerStateTableData = + []; + + final oldPlaylistTableData = []; + final expectedNewPlaylistTableData = []; + + final oldPlaylistMediaTableData = []; + final expectedNewPlaylistMediaTableData = []; + + final oldHistoryTableData = []; + final expectedNewHistoryTableData = []; + + final oldLyricsTableData = []; + final expectedNewLyricsTableData = []; + + await verifier.testWithDataIntegrity( + oldVersion: 1, + newVersion: 2, + createOld: v1.DatabaseAtV1.new, + createNew: v2.DatabaseAtV2.new, + openTestedDatabase: (x) => AppDatabase(), + createItems: (batch, oldDb) { + batch.insertAll(oldDb.authenticationTable, oldAuthenticationTableData); + batch.insertAll(oldDb.blacklistTable, oldBlacklistTableData); + batch.insertAll(oldDb.preferencesTable, oldPreferencesTableData); + batch.insertAll(oldDb.scrobblerTable, oldScrobblerTableData); + batch.insertAll(oldDb.skipSegmentTable, oldSkipSegmentTableData); + batch.insertAll(oldDb.sourceMatchTable, oldSourceMatchTableData); + batch.insertAll( + oldDb.audioPlayerStateTable, oldAudioPlayerStateTableData); + batch.insertAll(oldDb.playlistTable, oldPlaylistTableData); + batch.insertAll(oldDb.playlistMediaTable, oldPlaylistMediaTableData); + batch.insertAll(oldDb.historyTable, oldHistoryTableData); + batch.insertAll(oldDb.lyricsTable, oldLyricsTableData); + }, + validateItems: (newDb) async { + expect(expectedNewAuthenticationTableData, + await newDb.select(newDb.authenticationTable).get()); + expect(expectedNewBlacklistTableData, + await newDb.select(newDb.blacklistTable).get()); + expect(expectedNewPreferencesTableData, + await newDb.select(newDb.preferencesTable).get()); + expect(expectedNewScrobblerTableData, + await newDb.select(newDb.scrobblerTable).get()); + expect(expectedNewSkipSegmentTableData, + await newDb.select(newDb.skipSegmentTable).get()); + expect(expectedNewSourceMatchTableData, + await newDb.select(newDb.sourceMatchTable).get()); + expect(expectedNewAudioPlayerStateTableData, + await newDb.select(newDb.audioPlayerStateTable).get()); + expect(expectedNewPlaylistTableData, + await newDb.select(newDb.playlistTable).get()); + expect(expectedNewPlaylistMediaTableData, + await newDb.select(newDb.playlistMediaTable).get()); + expect(expectedNewHistoryTableData, + await newDb.select(newDb.historyTable).get()); + expect(expectedNewLyricsTableData, + await newDb.select(newDb.lyricsTable).get()); + }, + ); + }); +} diff --git a/untranslated_messages.json b/untranslated_messages.json index 9e26dfee..1bfd16af 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -1 +1,183 @@ -{} \ No newline at end of file +{ + "ar": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "bn": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ca": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "cs": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "de": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "es": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "eu": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "fa": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "fi": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "fr": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "hi": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "id": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "it": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ja": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ka": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ko": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ne": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "nl": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "pl": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "pt": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "ru": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "th": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "tr": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "uk": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "vi": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ], + + "zh": [ + "invidious_instance", + "invidious_description", + "invidious_warning", + "invidious_source_description" + ] +} From e3285bd4da2960957601feba4810c5c59ff3e605 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 10 Nov 2024 11:27:56 +0600 Subject: [PATCH 03/11] fix: selecting an Alternative Track Source removes the current song from the queue #2039 --- lib/provider/audio_player/audio_player.dart | 8 ++++++-- lib/provider/server/active_sourced_track.dart | 2 +- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/provider/audio_player/audio_player.dart b/lib/provider/audio_player/audio_player.dart index 7c1b6897..b4892a0c 100644 --- a/lib/provider/audio_player/audio_player.dart +++ b/lib/provider/audio_player/audio_player.dart @@ -247,7 +247,10 @@ class AudioPlayerNotifier extends Notifier { // Tracks related methods - Future addTracksAtFirst(Iterable tracks) async { + Future addTracksAtFirst( + Iterable tracks, { + bool allowDuplicates = false, + }) async { if (state.tracks.length == 1) { return addTracks(tracks); } @@ -257,7 +260,8 @@ class AudioPlayerNotifier extends Notifier { for (int i = 0; i < tracks.length; i++) { final track = tracks.elementAt(i); - if (state.tracks.any((element) => _compareTracks(element, track))) { + if (!allowDuplicates && + state.tracks.any((element) => _compareTracks(element, track))) { continue; } diff --git a/lib/provider/server/active_sourced_track.dart b/lib/provider/server/active_sourced_track.dart index 685896ec..37d0dec8 100644 --- a/lib/provider/server/active_sourced_track.dart +++ b/lib/provider/server/active_sourced_track.dart @@ -31,7 +31,7 @@ class ActiveSourcedTrackNotifier extends Notifier { final playbackNotifier = ref.read(audioPlayerProvider.notifier); final oldActiveIndex = audioPlayer.currentIndex; - await playbackNotifier.addTracksAtFirst([newTrack]); + await playbackNotifier.addTracksAtFirst([newTrack], allowDuplicates: true); await Future.delayed(const Duration(milliseconds: 50)); await playbackNotifier.jumpToTrack(newTrack); diff --git a/pubspec.lock b/pubspec.lock index 37aa3d54..85ae77da 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2528,10 +2528,10 @@ packages: dependency: "direct main" description: name: youtube_explode_dart - sha256: "523a01ef948607d3e8fdcdcdcef1ce805c7d26480f609e3b209d1c73520a6c3c" + sha256: "6d5f9a0a55d02743e59ca495887432814bddb6b11400b08ee0eeaf69c83d0089" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.5" sdks: dart: ">=3.5.3 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2923cc3b..99f5605b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -88,7 +88,7 @@ dependencies: version: ^3.0.2 visibility_detector: ^0.4.0+2 window_manager: ^0.3.9 - youtube_explode_dart: ^2.3.1 + youtube_explode_dart: ^2.3.5 simple_icons: ^10.1.3 jiosaavn: ^0.1.0 draggable_scrollbar: From 3fd7a18159e6861562ac225e6e459388d81e6001 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 1 Dec 2024 17:49:35 +0600 Subject: [PATCH 04/11] chore: upgrade dependency version --- linux/flutter/generated_plugin_registrant.cc | 8 +- linux/flutter/generated_plugins.cmake | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 6 +- macos/Podfile.lock | 53 +- macos/Runner/Configs/AppInfo.xcconfig | 2 +- pubspec.lock | 671 ++++++++++-------- pubspec.yaml | 105 +-- .../flutter/generated_plugin_registrant.cc | 6 +- windows/flutter/generated_plugins.cmake | 2 +- 9 files changed, 484 insertions(+), 371 deletions(-) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 0f93d754..feeba39f 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -38,9 +38,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); - g_autoptr(FlPluginRegistrar) screen_retriever_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); - screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index ff642696..3f37d5e6 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -9,7 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST gtk local_notifier media_kit_libs_linux - screen_retriever + screen_retriever_linux sqlite3_flutter_libs system_theme tray_manager diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index ea94bf6d..69e363a6 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -18,9 +18,9 @@ import local_notifier import media_kit_libs_macos_audio import package_info_plus import path_provider_foundation -import screen_retriever +import screen_retriever_macos import shared_preferences_foundation -import sqflite +import sqflite_darwin import sqlite3_flutter_libs import system_theme import tray_manager @@ -41,7 +41,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { MediaKitLibsMacosAudioPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index acc50c99..7afbf553 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -36,26 +36,29 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - screen_retriever (0.0.1): + - screen_retriever_macos (0.0.1): - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - sqflite (0.0.3): + - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - "sqlite3 (3.46.0+1)": - - "sqlite3/common (= 3.46.0+1)" - - "sqlite3/common (3.46.0+1)" - - "sqlite3/fts5 (3.46.0+1)": + - sqlite3 (3.47.0): + - sqlite3/common (= 3.47.0) + - sqlite3/common (3.47.0) + - sqlite3/dbstatvtab (3.47.0): - sqlite3/common - - "sqlite3/perf-threadsafe (3.46.0+1)": + - sqlite3/fts5 (3.47.0): - sqlite3/common - - "sqlite3/rtree (3.46.0+1)": + - sqlite3/perf-threadsafe (3.47.0): + - sqlite3/common + - sqlite3/rtree (3.47.0): - sqlite3/common - sqlite3_flutter_libs (0.0.1): - FlutterMacOS - - sqlite3 (~> 3.46.0) + - sqlite3 (~> 3.47.0) + - sqlite3/dbstatvtab - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree @@ -86,9 +89,9 @@ DEPENDENCIES: - metadata_god (from `Flutter/ephemeral/.symlinks/plugins/metadata_god/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) - system_theme (from `Flutter/ephemeral/.symlinks/plugins/system_theme/macos`) - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) @@ -135,12 +138,12 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos path_provider_foundation: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - screen_retriever: - :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos shared_preferences_foundation: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin sqlite3_flutter_libs: :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos system_theme: @@ -158,11 +161,11 @@ SPEC CHECKSUMS: audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 bonsoir_darwin: e3b8526c42ca46a885142df84229131dfabea842 desktop_webview_window: 89bb3d691f4c80314a10be312f4cd35db93a9d5a - device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 - file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 + device_info_plus: 1b14eed9bf95428983aed283a8d51cce3d8c4215 + file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d flutter_discord_rpc: 67a7c10ea24d9d3bf35d01af643f48fbcfa7c24f flutter_inappwebview_macos: bdf207b8f4ebd58e86ae06cd96b147de99a67c9b - flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea + flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 local_notifier: e9506bc66fc70311e8bc7291fb70f743c081e4ff media_kit_libs_macos_audio: 3871782a4f3f84c77f04d7666c87800a781c24da @@ -170,15 +173,15 @@ SPEC CHECKSUMS: metadata_god: 829f61208b44ac1173e7cd32ab740d8776be5435 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c - screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 - sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + screen_retriever_macos: 776e0fa5d42c6163d2bf772d22478df4b302b161 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: 0aa20658a9b238a3b1ff7175eb7bdd863b0ab4fd + sqlite3_flutter_libs: f0b7a85544d8bac7b8bac12eac7d05bcfdd786d0 system_theme: c7b9f6659a5caa26c9bc2284da096781e9a6fcbc tray_manager: 9064e219c56d75c476e46b9a21182087930baf90 - url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 PODFILE CHECKSUM: 0d3963a09fc94f580682bd88480486da345dc3f0 diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index dc7617dc..eac0f8cf 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = spotube +PRODUCT_NAME = Spotube // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = oss.krtirtho.spotube diff --git a/pubspec.lock b/pubspec.lock index 85ae77da..4b0912dd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.7.0" analyzer_plugin: dependency: transitive description: @@ -29,10 +34,10 @@ packages: dependency: transitive description: name: ansicolor - sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" app_links: dependency: "direct main" description: @@ -69,26 +74,26 @@ packages: dependency: transitive description: name: archive - sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "3.6.1" args: dependency: "direct main" description: name: args - sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.0" asn1lib: dependency: transitive description: name: asn1lib - sha256: "58082b3f0dca697204dbab0ef9ff208bfaea7767ea771076af9a343488428dda" + sha256: "4bae5ae63e6d6dd17c4aac8086f3dec26c0236f6a0f03416c6c19d830c367cf5" url: "https://pub.dev" source: hosted - version: "1.5.3" + version: "1.5.8" async: dependency: "direct main" description: @@ -101,18 +106,18 @@ packages: dependency: "direct main" description: name: audio_service - sha256: "4547c312a94f9cb2c48b60823fb190767cbd63454a83c73049384d5d3cba4650" + sha256: "9dd5ba7e77567b290c35908b1950d61485b4dfdd3a0ac398e98cfeec04651b75" url: "https://pub.dev" source: hosted - version: "0.18.13" + version: "0.18.15" audio_service_mpris: dependency: "direct main" description: name: audio_service_mpris - sha256: b16db3584a4b2464c0bfd575c1a21765723d257931222f8adfcb0511f940d352 + sha256: fdab1ae1f659c6db36d5cc396e46e4ee9663caefa6153f8453fcd01d57567c08 url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" audio_service_platform_interface: dependency: transitive description: @@ -125,18 +130,18 @@ packages: dependency: transitive description: name: audio_service_web - sha256: "9d7d5ae5f98a5727f2580fad73062f2484f400eef6cef42919413268e62a363e" + sha256: "4cdc2127cd4562b957fb49227dc58e3303fafb09bde2573bc8241b938cf759d9" url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.1.3" audio_session: dependency: "direct main" description: name: audio_session - sha256: a49af9981eec5d7cd73b37bacb6ee73f8143a6a9f9bd5b6021e6c346b9b6cf4e + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" url: "https://pub.dev" source: hosted - version: "0.1.19" + version: "0.1.21" auto_size_text: dependency: "direct main" description: @@ -253,10 +258,10 @@ packages: dependency: transitive description: name: build_runner_core - sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.2" built_collection: dependency: transitive description: @@ -277,34 +282,34 @@ packages: dependency: "direct main" description: name: buttons_tabbar - sha256: "3f0969c26574ef15c0c9ff1dee42c3c4b0d3563d2c8607804372490fb8b76896" + sha256: "6e541377ab96d4223d8f072bc4f35c9d32dafe042005cad93530e0cd9d02801f" url: "https://pub.dev" source: hosted - version: "1.3.8" + version: "1.3.14" cached_network_image: dependency: "direct main" description: name: cached_network_image - sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.1" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.3.1" change_case: dependency: transitive description: @@ -325,10 +330,10 @@ packages: dependency: transitive description: name: charcode - sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" checked_yaml: dependency: transitive description: @@ -349,10 +354,10 @@ packages: dependency: transitive description: name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.4.2" clock: dependency: transitive description: @@ -365,10 +370,10 @@ packages: dependency: transitive description: name: code_builder - sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" url: "https://pub.dev" source: hosted - version: "4.10.0" + version: "4.10.1" collection: dependency: "direct main" description: @@ -389,74 +394,82 @@ packages: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5 + sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5" url: "https://pub.dev" source: hosted - version: "1.9.2" + version: "1.11.0" cross_file: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: "direct dev" description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" csslib: dependency: transitive description: name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" curved_navigation_bar: dependency: "direct main" description: name: curved_navigation_bar - sha256: ea6412d00c5d83501bbf1cf9d1ac2ff11a20fbaf910c103c95ace7de82910334 + sha256: bb4ab128fcb6f4a9f0f1f72d227db531818b20218984789777f049fcbf919279 url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.6" custom_lint: dependency: "direct dev" description: name: custom_lint - sha256: "7c0aec12df22f9082146c354692056677f1e70bc43471644d1fdb36c6fdda799" + sha256: "3486c470bb93313a9417f926c7dd694a2e349220992d7b9d14534dc49c15bba9" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.7.0" custom_lint_builder: dependency: transitive description: name: custom_lint_builder - sha256: d7dc41e709dde223806660268678be7993559e523eb3164e2a1425fd6f7615a9 + sha256: "42cdc41994eeeddab0d7a722c7093ec52bd0761921eeb2cbdbf33d192a234759" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.7.0" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: a85e8f78f4c52f6c63cdaf8c872eb573db0231dcdf3c3a5906d493c1f8bc20e6 + sha256: "02450c3e45e2a6e8b26c4d16687596ab3c4644dd5792e3313aa9ceba5a49b7f5" url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.7.0" + custom_lint_visitor: + dependency: transitive + description: + name: custom_lint_visitor + sha256: "8aeb3b6ae2bb765e7716b93d1d10e8356d04e0ff6d7592de6ee04e0dd7d6587d" + url: "https://pub.dev" + source: hosted + version: "1.0.0+6.7.0" dart_des: dependency: transitive description: @@ -469,18 +482,18 @@ packages: dependency: transitive description: name: dart_mappable - sha256: "47269caf2060533c29b823ff7fa9706502355ffcb61e7f2a374e3a0fb2f2c3f0" + sha256: f69a961ae8589724ebb542e588f228ae844c5f78028899cbe2cc718977c1b382 url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.0" dart_style: dependency: transitive description: name: dart_style - sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" url: "https://pub.dev" source: hosted - version: "2.3.6" + version: "2.3.7" dartx: dependency: transitive description: @@ -510,18 +523,18 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 + sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95 url: "https://pub.dev" source: hosted - version: "10.1.0" + version: "11.1.1" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" dio: dependency: "direct main" description: @@ -559,26 +572,26 @@ packages: dependency: "direct main" description: name: drift - sha256: df027d168a2985a2e9da900adeba2ab0136f0d84436592cf3cd5135f82c8579c + sha256: c2d073d35ad441730812f4ea05b5dd031fb81c5f9786a4f5fb77ecd6307b6f74 url: "https://pub.dev" source: hosted - version: "2.21.0" + version: "2.22.1" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "27bab15e7869b69259663590381180117873b9b273a1ea9ebb21bb73133d1233" + sha256: "488263d85d027333fc602eb7714125de317e8c7db064aa6c2f208a8f79139e7b" url: "https://pub.dev" source: hosted - version: "2.21.0" + version: "2.22.0" duration: dependency: "direct main" description: name: duration - sha256: "0548a12d235dab185c677ef660995f23fdc06a02a2b984aa23805f6a03d82815" + sha256: "8b9020df63d2894f29fe250b60ca5b7f9e943d4a3cf766c2b161efeb617a0ea3" url: "https://pub.dev" source: hosted - version: "3.0.13" + version: "3.0.15" encrypt: dependency: "direct main" description: @@ -591,26 +604,26 @@ packages: dependency: "direct main" description: name: envied - sha256: bbff9c76120e4dc5e2e36a46690cf0a26feb65e7765633f4e8d916bcd173a450 + sha256: "129a0dbf32b90344fa2e9d6943569fdec8f17904e66161e0a1f09ee3416508ae" url: "https://pub.dev" source: hosted - version: "0.5.4+1" + version: "1.0.0" envied_generator: dependency: "direct dev" description: name: envied_generator - sha256: "517b70de08d13dcd40e97b4e5347e216a0b1c75c99e704f3c85c0474a392d14a" + sha256: "76aec98907872ce8488f021e68d213bd0d9bf224eb393a094be1708cc3180d41" url: "https://pub.dev" source: hosted - version: "0.5.4+1" + version: "1.0.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.7" fake_async: dependency: transitive description: @@ -639,10 +652,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03 + sha256: "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c" url: "https://pub.dev" source: hosted - version: "8.0.0+1" + version: "8.1.4" file_selector: dependency: "direct main" description: @@ -655,34 +668,34 @@ packages: dependency: transitive description: name: file_selector_android - sha256: "1cd66575f063b689e041aec836905ba7be18d76c9f0634d0d75daec825f67095" + sha256: "98ac58e878b05ea2fdb204e7f4fc4978d90406c9881874f901428e01d3b18fbc" url: "https://pub.dev" source: hosted - version: "0.5.0+7" + version: "0.5.1+12" file_selector_ios: dependency: transitive description: name: file_selector_ios - sha256: "0a1196a9c5795858aa315332da2fb5c4bcfdcb312d8a4e27651f765b87904431" + sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420" url: "https://pub.dev" source: hosted - version: "0.5.1+9" + version: "0.5.3+1" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" url: "https://pub.dev" source: hosted - version: "0.9.2+1" + version: "0.9.3+2" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" url: "https://pub.dev" source: hosted - version: "0.9.3+3" + version: "0.9.4+2" file_selector_platform_interface: dependency: transitive description: @@ -695,34 +708,34 @@ packages: dependency: transitive description: name: file_selector_web - sha256: "619e431b224711a3869e30dbd7d516f5f5a4f04b265013a50912f39e1abc88c8" + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 url: "https://pub.dev" source: hosted - version: "0.9.4+1" + version: "0.9.4+2" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" url: "https://pub.dev" source: hosted - version: "0.9.3+1" + version: "0.9.3+3" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" fluentui_system_icons: dependency: "direct main" description: name: fluentui_system_icons - sha256: "1c860f10a0e74c5788ff8a650ae6074d9a544463ae269714f1044b32df52b978" + sha256: d637972e7e0b34e7accf6a34bf757494a35559959b69ffd0f8926804421faa60 url: "https://pub.dev" source: hosted - version: "1.1.234" + version: "1.1.265" flutter: dependency: "direct main" description: flutter @@ -740,10 +753,10 @@ packages: dependency: "direct main" description: name: flutter_cache_manager - sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.1" flutter_discord_rpc: dependency: "direct main" description: @@ -777,18 +790,18 @@ packages: dependency: transitive description: name: flutter_gen_core - sha256: "3a6c3dbc1c0e260088e9c7ed1ba905436844e8c01a44799f6281edada9e45308" + sha256: "46ecf0e317413dd065547887c43f93f55e9653e83eb98dc13dd07d40dd225325" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.8.0" flutter_gen_runner: dependency: "direct dev" description: name: flutter_gen_runner - sha256: "24889d5140b03997f7148066a9c5fab8b606dff36093434c782d7a7fb22c6fb6" + sha256: "77f0a02fc30d9fcf2549fe874eb3fde091435724904bcbb1af60aa40cbfab1f4" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.8.0" flutter_hooks: dependency: "direct main" description: @@ -801,66 +814,66 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - sha256: "274edbb07196944e316722d9f6f641c77d0e71261200869887e10f59614c0458" + sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" url: "https://pub.dev" source: hosted - version: "6.1.3" + version: "6.1.5" flutter_inappwebview_android: dependency: transitive description: name: flutter_inappwebview_android - sha256: f48203a11c5eb0c23dd5a3cb3638ae678056b6ceae22819373e36c6cb4f1d46a + sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.3" flutter_inappwebview_internal_annotations: dependency: transitive description: name: flutter_inappwebview_internal_annotations - sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" + sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" flutter_inappwebview_ios: dependency: transitive description: name: flutter_inappwebview_ios - sha256: f6f88d464b38f2fc1c5f2ae74024498115eb1470715bd8b40f902dd4ac99ccc8 + sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_inappwebview_macos: dependency: transitive description: name: flutter_inappwebview_macos - sha256: "68e0c3785d8d789710cda7d7efe6effa337c91bf300dd28af7efc2d358fa1a98" + sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_inappwebview_platform_interface: dependency: transitive description: name: flutter_inappwebview_platform_interface - sha256: "97b4ab116d949ede20c90c7e3d15d24afaf1b706cc0af96b060770293cd6c49d" + sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0+1" flutter_inappwebview_web: dependency: transitive description: name: flutter_inappwebview_web - sha256: f7f97b6faa39416e4e86da1184edd4de6c27b271d036f0838ea3ff9a250a1de2 + sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_inappwebview_windows: dependency: transitive description: name: flutter_inappwebview_windows - sha256: "86702d2109384311f8ea634855e90ee143b9bfabddd3858696d905a2c28808aa" + sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.6.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -886,26 +899,26 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0 + sha256: "1152ab0067ca5a2ebeb862fe0a762057202cceb22b7e62692dcbabf6483891bb" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.3" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f" + sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" url: "https://pub.dev" source: hosted - version: "2.0.19" + version: "2.0.23" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" + sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.6.1" flutter_rust_bridge: dependency: transitive description: @@ -918,50 +931,50 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.2.2" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.2" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.2" flutter_sharing_intent: dependency: "direct main" description: @@ -1000,10 +1013,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1 + sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.7" freezed_annotation: dependency: "direct main" description: @@ -1029,10 +1042,10 @@ packages: dependency: "direct main" description: name: fuzzywuzzy - sha256: a84b99ebb21c448e02267070c91b218b4fbbef9c668b344aaeada49865985cae + sha256: "3004379ffd6e7f476a0c2091f38f16588dc45f67de7adf7c41aa85dec06b432c" url: "https://pub.dev" source: hosted - version: "1.1.6" + version: "1.2.0" gap: dependency: "direct main" description: @@ -1053,10 +1066,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "2ddb88e9ad56ae15ee144ed10e33886777eb5ca2509a914850a5faa7b52ff459" + sha256: "8660b74171fafae4aa8202100fa2e55349e078281dadc73a241eb8e758534d9d" url: "https://pub.dev" source: hosted - version: "14.2.7" + version: "14.6.1" google_fonts: dependency: "direct main" description: @@ -1069,10 +1082,10 @@ packages: dependency: transitive description: name: graphs - sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" gsettings: dependency: transitive description: @@ -1089,6 +1102,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + hashcodes: + dependency: transitive + description: + name: hashcodes + sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651" + url: "https://pub.dev" + source: hosted + version: "2.0.0" hive: dependency: "direct main" description: @@ -1117,10 +1138,10 @@ packages: dependency: "direct main" description: name: hooks_riverpod - sha256: "45b2030a18bcd6dbd680c2c91bc3b33e3fe7c323e3acb5ecec93a613e2fbaa8a" + sha256: "70bba33cfc5670c84b796e6929c54b8bc5be7d0fe15bb28c2560500b9ad06966" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.6.1" hotreloader: dependency: transitive description: @@ -1133,10 +1154,10 @@ packages: dependency: "direct main" description: name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" url: "https://pub.dev" source: hosted - version: "0.15.4" + version: "0.15.5" html_unescape: dependency: "direct main" description: @@ -1149,10 +1170,10 @@ packages: dependency: "direct main" description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_methods: dependency: transitive description: @@ -1181,42 +1202,42 @@ packages: dependency: transitive description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.3.0" image_picker: dependency: "direct main" description: name: image_picker - sha256: fe9ee64ccb8d599a5dfb0e21cc6652232c610bcf667af4e79b9eb175cc30a7a5 + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "8e75431a62b7feb4fd55cb4a5c6f0ac4564460ec5dc09f9c4a0d50a5ce7c4cb9" + sha256: fa8141602fde3f7e2f81dbf043613eb44dfa325fa0bcf93c0f142c9f7a2c193e url: "https://pub.dev" source: hosted - version: "0.8.10" + version: "0.8.12+18" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "5d6eb13048cd47b60dbf1a5495424dea226c5faf3950e20bf8120a58efb5b5f3" + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.6" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: f4a6f62be96d6fd268f32a6bf8ef444cd8e3fff64d16923c6e6fe55e0c84a761 + sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" url: "https://pub.dev" source: hosted - version: "0.8.10" + version: "0.8.12+1" image_picker_linux: dependency: transitive description: @@ -1249,6 +1270,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1+1" + image_size_getter: + dependency: transitive + description: + name: image_size_getter + sha256: "0511799498340b70993d2dfb34b55a2247b5b801d75a6cdd4543acfcafdb12b0" + url: "https://pub.dev" + source: hosted + version: "2.2.0" integration_test: dependency: "direct dev" description: flutter @@ -1306,10 +1335,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c url: "https://pub.dev" source: hosted - version: "6.8.0" + version: "6.9.0" leak_tracker: dependency: transitive description: @@ -1362,18 +1391,18 @@ packages: dependency: "direct main" description: name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.5.0" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" lrc: dependency: "direct main" description: @@ -1382,6 +1411,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" matcher: dependency: transitive description: @@ -1402,10 +1439,10 @@ packages: dependency: "direct main" description: name: media_kit - sha256: "3289062540e3b8b9746e5c50d95bd78a9289826b7227e253dff806d002b9e67a" + sha256: "1f1deee148533d75129a6f38251ff8388e33ee05fc2d20a6a80e57d6051b7b62" url: "https://pub.dev" source: hosted - version: "1.1.10+1" + version: "1.1.11" media_kit_libs_android_audio: dependency: transitive description: @@ -1418,10 +1455,10 @@ packages: dependency: "direct main" description: name: media_kit_libs_audio - sha256: f3f91df69848005363b3ae0ef7971a90edbd80a9365195684ef26c9a6ac8833f + sha256: be40e17c4cb7bd4e14114dce24a36e645f2ac5989dda543deaba2e7873901ba0 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" media_kit_libs_ios_audio: dependency: transitive description: @@ -1458,10 +1495,10 @@ packages: dependency: transitive description: name: media_kit_native_event_loop - sha256: a605cf185499d14d58935b8784955a92a4bf0ff4e19a23de3d17a9106303930e + sha256: "7d82e3b3e9ded5c35c3146c5ba1da3118d1dd8ac3435bac7f29f458181471b40" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" menu_base: dependency: transitive description: @@ -1471,13 +1508,13 @@ packages: source: hosted version: "0.1.1" meta: - dependency: transitive + dependency: "direct overridden" description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" metadata_god: dependency: "direct main" description: @@ -1490,10 +1527,10 @@ packages: dependency: "direct main" description: name: mime - sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.6" node_preamble: dependency: transitive description: @@ -1506,18 +1543,18 @@ packages: dependency: transitive description: name: oauth2 - sha256: c4013ef62be37744efdc0861878fd9e9285f34db1f9e331cc34100d7674feb42 + sha256: c84470642cbb2bec450ccab2f8520c079cd1ca546a76ffd5c40589e07f4e8bf4 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" octo_image: dependency: transitive description: name: octo_image - sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" package_config: dependency: transitive description: @@ -1546,10 +1583,10 @@ packages: dependency: "direct main" description: name: palette_generator - sha256: eb7082b4b97487ebc65b3ad3f6f0b7489b96e76840381ed0e06a46fe7ffd4068 + sha256: "0b20245c451f14a5ca0818ab7a377765162389f8e8f0db361cceabf0fed9d1ea" url: "https://pub.dev" source: hosted - version: "0.3.3+3" + version: "0.3.3+5" path: dependency: "direct main" description: @@ -1570,34 +1607,34 @@ packages: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.14" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -1618,10 +1655,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" permission_handler: dependency: "direct main" description: @@ -1634,34 +1671,34 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.5" + version: "12.0.13" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 url: "https://pub.dev" source: hosted - version: "9.4.4" + version: "9.4.5" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.2.3" permission_handler_windows: dependency: transitive description: @@ -1722,10 +1759,10 @@ packages: dependency: "direct main" description: name: popover - sha256: ca3bef9d88ebf5c5c3823946a5de3ce8360018fbb6a3e25819586a7d5a203db2 + sha256: "0606f3e10f92fc0459f5c52fd917738c29e7552323b28694d50c2d3312d0e1a2" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.3.1" process: dependency: transitive description: @@ -1746,10 +1783,10 @@ packages: dependency: "direct dev" description: name: pub_api_client - sha256: cc3d2c93df3823553de6a3e7d3ac09a3f43f8c271af4f43c2795266090ac9625 + sha256: "06321793e558b2dfac3a11098a530b816a8f752a5cf9208a382be9a418e3f5fc" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.7.1" pub_semver: dependency: transitive description: @@ -1778,10 +1815,10 @@ packages: dependency: transitive description: name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" recase: dependency: transitive description: @@ -1794,34 +1831,34 @@ packages: dependency: "direct main" description: name: riverpod - sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d + sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.6.1" riverpod_analyzer_utils: dependency: transitive description: name: riverpod_analyzer_utils - sha256: "8b71f03fc47ae27d13769496a1746332df4cec43918aeba9aff1e232783a780f" + sha256: c6b8222b2b483cb87ae77ad147d6408f400c64f060df7a225b127f4afef4f8c8 url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.5.8" riverpod_lint: dependency: "direct dev" description: name: riverpod_lint - sha256: "3c67c14ccd16f0c9d53e35ef70d06cd9d072e2fb14557326886bbde903b230a5" + sha256: "83e4caa337a9840469b7b9bd8c2351ce85abad80f570d84146911b32086fbd99" url: "https://pub.dev" source: hosted - version: "2.3.10" + version: "2.6.3" rxdart: dependency: transitive description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" safe_local_storage: dependency: transitive description: @@ -1834,10 +1871,42 @@ packages: dependency: transitive description: name: screen_retriever - sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" url: "https://pub.dev" source: hosted - version: "0.1.9" + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" scrobblenaut: dependency: "direct main" description: @@ -1859,58 +1928,58 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" + sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.3" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.5.3" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shelf: dependency: "direct main" description: @@ -1947,10 +2016,10 @@ packages: dependency: "direct main" description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" shortid: dependency: transitive description: @@ -1979,10 +2048,10 @@ packages: dependency: "direct main" description: name: skeletonizer - sha256: "9a3ae2f4ee4349bdbed3292d04586a1315a44745d2c454684f82f0c46dbeabf9" + sha256: "3b202e4fa9c49b017d368fb0e570d4952bcd19972b67b2face071bdd68abbfae" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.2" sky_engine: dependency: transitive description: flutter @@ -2064,42 +2133,66 @@ packages: dependency: transitive description: name: sqflite - sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.4+6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" sqlite3: dependency: "direct main" description: name: sqlite3 - sha256: b384f598b813b347c5a7e5ffad82cbaff1bec3d1561af267041e66f6f0899295 + sha256: cb7f4e9dc1b52b1fa350f7b3d41c662e75fc3d399555fa4e5efcf267e9a4fbb5 url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.5.0" sqlite3_flutter_libs: dependency: "direct main" description: name: sqlite3_flutter_libs - sha256: "9f89a7e7dc36eac2035808427eba1c3fbd79e59c3a22093d8dace6d36b1fe89e" + sha256: "7ae52b23366e5295005022e62fa093f64bfe190810223ea0ebf733a4cd140bce" url: "https://pub.dev" source: hosted - version: "0.5.23" + version: "0.5.26" sqlparser: dependency: transitive description: name: sqlparser - sha256: c5f63dff8677407ddcddfa4744c176ea6dc44286c47ba9e69e76d8071398034d + sha256: "4cad4b2c5f63dc9ea1a8dcffb58cf762322bea5dd8836870164a65e913bdae41" url: "https://pub.dev" source: hosted - version: "0.39.1" + version: "0.40.0" stack_trace: dependency: transitive description: @@ -2144,10 +2237,10 @@ packages: dependency: "direct main" description: name: stroke_text - sha256: "0ec0e526c0eae7d21ce628d78eb9ae9be634259f26b0f1735f9ed540890d8cf6" + sha256: "783fee071e3a3c5d3fe24011d7d776ce3cd64792e01b650c6b727ac3f38cb37b" url: "https://pub.dev" source: hosted - version: "0.0.2" + version: "0.0.3" sync_http: dependency: transitive description: @@ -2160,10 +2253,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" url: "https://pub.dev" source: hosted - version: "3.1.0+1" + version: "3.3.0+3" system_theme: dependency: "direct main" description: @@ -2176,10 +2269,10 @@ packages: dependency: transitive description: name: system_theme_web - sha256: "7566f5a928f6d28d7a60c97bea8a851d1c6bc9b86a4df2366230a97458489219" + sha256: "900c92c5c050ce58048f241ef9a17e5cd8629808325a05b473dc62a6e99bae77" url: "https://pub.dev" source: hosted - version: "0.0.2" + version: "0.0.3" term_glyph: dependency: transitive description: @@ -2216,18 +2309,18 @@ packages: dependency: transitive description: name: time - sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221 + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" timezone: dependency: "direct main" description: name: timezone - sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.10.0" timing: dependency: transitive description: @@ -2248,10 +2341,10 @@ packages: dependency: "direct main" description: name: tray_manager - sha256: e0ac9a88b2700f366b8629b97e8663b6ef450a2f169560a685dc167bfe9c9c29 + sha256: "3c03c70a9b14e89b17c15275c05f67fdd30950f3073ae523755ad9beb2ac7e35" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.3.0" type_plus: dependency: transitive description: @@ -2264,10 +2357,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" unicode: dependency: transitive description: @@ -2288,10 +2381,10 @@ packages: dependency: transitive description: name: universal_platform - sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" url: "https://pub.dev" source: hosted - version: "1.0.0+1" + version: "1.1.0" uri: dependency: transitive description: @@ -2312,42 +2405,42 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" url: "https://pub.dev" source: hosted - version: "6.2.6" + version: "6.3.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775" + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.14" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.1" url_launcher_platform_interface: dependency: transitive description: @@ -2360,18 +2453,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.3" uuid: dependency: "direct main" description: @@ -2380,6 +2473,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" + url: "https://pub.dev" + source: hosted + version: "1.1.12" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -2400,10 +2509,10 @@ packages: dependency: "direct main" description: name: very_good_infinite_list - sha256: "6f5ad429edbce6084e1c600e56b26b1de8c6b138e8e8fc2de41b686166029aa5" + sha256: "2f72172c28849b29c65dda0e598d486a59d669cfff1d60db7896719ec8211501" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.9.0" visibility_detector: dependency: "direct main" description: @@ -2480,10 +2589,10 @@ packages: dependency: transitive description: name: win32 - sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" + sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69" url: "https://pub.dev" source: hosted - version: "5.5.4" + version: "5.9.0" win32_registry: dependency: "direct main" description: @@ -2496,18 +2605,18 @@ packages: dependency: "direct main" description: name: window_manager - sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" + sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" url: "https://pub.dev" source: hosted - version: "0.3.9" + version: "0.4.3" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" xml: dependency: "direct dev" description: @@ -2528,10 +2637,10 @@ packages: dependency: "direct main" description: name: youtube_explode_dart - sha256: "6d5f9a0a55d02743e59ca495887432814bddb6b11400b08ee0eeaf69c83d0089" + sha256: "51ca5b2c03bf56060143d4f87df90ec3227592d7ae8a8003532533ae019d4291" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.3.6" sdks: dart: ">=3.5.3 <4.0.0" flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 99f5605b..310d5121 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,32 +13,42 @@ environment: flutter: ">=3.10.0" dependencies: + app_links: ^6.3.2 args: ^2.5.0 - async: ^2.9.0 + async: ^2.11.0 audio_service: ^0.18.13 - audio_service_mpris: ^0.1.5 + audio_service_mpris: ^0.2.0 audio_session: ^0.1.19 auto_size_text: ^3.0.0 + bonsoir: ^5.1.10 buttons_tabbar: ^1.3.8 cached_network_image: ^3.3.1 collection: ^1.18.0 curved_navigation_bar: ^1.0.3 desktop_webview_window: git: - url: https://github.com/KRTirtho/flutter-plugins.git - ref: feat/cookies path: packages/desktop_webview_window - device_info_plus: ^10.1.0 + ref: feat/cookies + url: https://github.com/KRTirtho/flutter-plugins.git + device_info_plus: ^11.1.1 dio: ^5.4.3+1 disable_battery_optimization: ^1.1.1 + draggable_scrollbar: + git: + ref: cfd570035bf393de541d32e9b28808b5d7e602df + url: https://github.com/thielepaul/flutter-draggable-scrollbar.git + drift: ^2.21.0 duration: ^3.0.12 - envied: ^0.5.4+1 + encrypt: ^5.0.3 + envied: ^1.0.0 file_picker: ^8.0.0+1 file_selector: ^1.0.3 fluentui_system_icons: ^1.1.234 flutter: sdk: flutter + flutter_broadcasts: ^0.4.0 flutter_cache_manager: ^3.3.0 + flutter_discord_rpc: ^1.0.0 flutter_displaymode: ^0.6.0 flutter_feather_icons: ^2.0.0+1 flutter_hooks: ^0.20.5 @@ -48,19 +58,28 @@ dependencies: flutter_native_splash: ^2.4.0 flutter_riverpod: ^2.5.1 flutter_secure_storage: ^9.0.0 + flutter_sharing_intent: ^1.1.0 flutter_svg: ^1.1.6 form_validator: ^2.1.1 + freezed_annotation: ^2.4.1 fuzzywuzzy: ^1.1.6 + gap: ^3.0.1 + go_router: ^14.2.7 google_fonts: ^6.2.1 hive: ^2.2.3 hive_flutter: ^1.1.0 hooks_riverpod: ^2.5.1 html: ^0.15.1 + html_unescape: ^2.0.0 + http: ^1.2.1 image_picker: ^1.1.0 intl: any invidious: ^0.1.0 + jiosaavn: ^0.1.0 json_annotation: ^4.8.1 + local_notifier: ^0.1.6 logger: ^2.0.2 + lrc: ^1.0.2 media_kit: ^1.1.10+1 media_kit_libs_audio: ^1.0.4 metadata_god: ^1.0.0 @@ -72,64 +91,45 @@ dependencies: permission_handler: ^11.3.1 piped_client: ^0.1.1 popover: ^0.3.0 + riverpod: ^2.5.1 scrobblenaut: git: - url: https://github.com/KRTirtho/scrobblenaut.git ref: dart-3-support + url: https://github.com/KRTirtho/scrobblenaut.git scroll_to_index: ^3.0.1 - sidebarx: ^0.17.1 shared_preferences: ^2.2.3 - smtc_windows: ^1.0.0 - stroke_text: ^0.0.2 - system_theme: ^2.1.0 - titlebar_buttons: ^1.0.0 - url_launcher: ^6.2.6 - uuid: ^4.4.0 - version: ^3.0.2 - visibility_detector: ^0.4.0+2 - window_manager: ^0.3.9 - youtube_explode_dart: ^2.3.5 - simple_icons: ^10.1.3 - jiosaavn: ^0.1.0 - draggable_scrollbar: - git: - url: https://github.com/thielepaul/flutter-draggable-scrollbar.git - ref: cfd570035bf393de541d32e9b28808b5d7e602df - very_good_infinite_list: ^0.7.1 - gap: ^3.0.1 - sliver_tools: ^0.2.12 - flutter_discord_rpc: ^1.0.0 - html_unescape: ^2.0.0 - wikipedia_api: ^0.1.0 - skeletonizer: ^1.1.1 - app_links: ^6.3.2 - win32_registry: ^1.1.5 - flutter_sharing_intent: ^1.1.0 - flutter_broadcasts: ^0.4.0 - freezed_annotation: ^2.4.1 - spotify: ^0.13.7 - bonsoir: ^5.1.10 shelf: ^1.4.1 shelf_router: ^1.1.4 shelf_web_socket: ^2.0.0 - web_socket_channel: ^3.0.1 - lrc: ^1.0.2 - timezone: ^0.9.2 - local_notifier: ^0.1.6 - tray_manager: ^0.2.2 - http: ^1.2.1 - riverpod: ^2.5.1 - drift: ^2.21.0 - sqlite3_flutter_libs: ^0.5.23 + sidebarx: ^0.17.1 + simple_icons: ^10.1.3 + skeletonizer: ^1.1.1 + sliver_tools: ^0.2.12 + smtc_windows: ^1.0.0 + spotify: ^0.13.7 sqlite3: ^2.4.3 - encrypt: ^5.0.3 - go_router: ^14.2.7 + sqlite3_flutter_libs: ^0.5.23 + stroke_text: ^0.0.2 + system_theme: ^2.1.0 test: ^1.25.7 + timezone: ^0.10.0 + titlebar_buttons: ^1.0.0 + tray_manager: ^0.3.0 + url_launcher: ^6.2.6 + uuid: ^4.4.0 + version: ^3.0.2 + very_good_infinite_list: ^0.9.0 + visibility_detector: ^0.4.0+2 + web_socket_channel: ^3.0.1 + wikipedia_api: ^0.1.0 + win32_registry: ^1.1.5 + window_manager: ^0.4.3 + youtube_explode_dart: ^2.3.5 dev_dependencies: build_runner: ^2.4.13 crypto: ^3.0.3 - envied_generator: ^0.5.4+1 + envied_generator: ^1.0.0 flutter_gen_runner: ^5.4.0 flutter_launcher_icons: ^0.13.1 flutter_lints: ^3.0.1 @@ -140,8 +140,8 @@ dev_dependencies: hive_generator: ^2.0.0 json_serializable: ^6.6.2 freezed: ^2.5.2 - custom_lint: ^0.6.4 - riverpod_lint: ^2.3.10 + custom_lint: ^0.7.0 + riverpod_lint: ^2.6.3 process_run: ^0.14.2 pubspec_parse: ^1.3.0 pub_api_client: ^2.7.0 @@ -151,6 +151,7 @@ dev_dependencies: dependency_overrides: web: ^1.1.0 + meta: 1.16.0 flutter: generate: true diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index c10169b1..42fa2129 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -41,8 +41,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("MediaKitLibsWindowsAudioPluginCApi")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); - ScreenRetrieverPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); Sqlite3FlutterLibsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); SystemThemePluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 7cb17288..cf14ec52 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -12,7 +12,7 @@ list(APPEND FLUTTER_PLUGIN_LIST local_notifier media_kit_libs_windows_audio permission_handler_windows - screen_retriever + screen_retriever_windows sqlite3_flutter_libs system_theme tray_manager From 499ecfba26ac20822a6540c94526066bd31a3832 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 1 Dec 2024 19:01:24 +0600 Subject: [PATCH 05/11] fix(mobile): ensure audio session is activated when playback is resumed after interruption #2092 --- lib/services/audio_services/mobile_audio_service.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/services/audio_services/mobile_audio_service.dart b/lib/services/audio_services/mobile_audio_service.dart index 56fe0fc4..16a3618e 100644 --- a/lib/services/audio_services/mobile_audio_service.dart +++ b/lib/services/audio_services/mobile_audio_service.dart @@ -7,6 +7,7 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/state.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:media_kit/media_kit.dart' hide Track; +import 'package:spotube/services/audio_player/playback_state.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/utils/platform.dart'; @@ -59,6 +60,9 @@ class MobileAudioService extends BaseAudioHandler { }); }); audioPlayer.playerStateStream.listen((state) async { + if (state == AudioPlaybackState.playing) { + await session?.setActive(true); + } playbackState.add(await _transformEvent()); }); From 8ca2115ef0b00b02b92ae01fd14aef584377ede2 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 8 Dec 2024 20:03:01 +0600 Subject: [PATCH 06/11] feat: track caching and cached track export support (#2117) * feat: add caching support with track metadata * feat(settings): add cache music toggle * fix(mobile): cache dir not open-able * feat(local folder): add cache export/clear actions and size of the folder * chore: ios deps upgrades * chore: upgrade lint flutter version * chore: lint secrets causing error * cd: invalid value for env var --- .env.example | 12 +- .github/workflows/pr-lint.yml | 23 +- Makefile | 5 +- analysis_options.yaml | 1 + drift_schemas/app_db/drift_schema_v3.json | 1 + ios/Podfile.lock | 57 +- ios/Runner/AppDelegate.swift | 2 +- lib/collections/assets.gen.dart | 13 +- lib/collections/routes.dart | 9 +- lib/collections/spotube_icons.dart | 3 + lib/extensions/track.dart | 28 + .../utils/use_custom_status_bar_color.dart | 25 +- lib/l10n/app_en.arb | 12 +- lib/models/connect/connect.freezed.dart | 35 +- lib/models/database/database.dart | 24 +- lib/models/database/database.g.dart | 80 +- lib/models/database/database.steps.dart | 292 +- lib/models/database/tables/preferences.dart | 4 +- lib/models/parser/range_headers.dart | 71 + lib/models/spotify/home_feed.freezed.dart | 174 +- .../spotify/recommendation_seeds.freezed.dart | 44 +- .../local_folder/cache_export_dialog.dart | 139 + .../local_folder/local_folder_item.dart | 9 +- lib/modules/library/user_local_tracks.dart | 9 +- lib/pages/home/genres/genre_playlists.dart | 10 + lib/pages/library/local_folder.dart | 138 +- lib/pages/lyrics/lyrics.dart | 95 +- lib/pages/settings/sections/playback.dart | 26 + .../audio_player/audio_player_streams.dart | 1 + lib/provider/download_manager_provider.dart | 51 +- .../local_tracks/local_tracks_provider.dart | 11 +- lib/provider/server/routes/playback.dart | 184 +- .../user_preferences_provider.dart | 35 +- lib/services/song_link/song_link.freezed.dart | 21 +- lib/utils/migrations/adapters.freezed.dart | 69 +- lib/utils/service_utils.dart | 27 + linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + macos/Podfile.lock | 8 +- pubspec.lock | 64 + pubspec.yaml | 1 + test/drift/app_db/generated/schema.dart | 7 +- test/drift/app_db/generated/schema_v1.dart | 6 +- test/drift/app_db/generated/schema_v2.dart | 6 +- test/drift/app_db/generated/schema_v3.dart | 3396 +++++++++++++++++ untranslated_messages.json | 312 +- 47 files changed, 5223 insertions(+), 324 deletions(-) create mode 100644 drift_schemas/app_db/drift_schema_v3.json create mode 100644 lib/models/parser/range_headers.dart create mode 100644 lib/modules/library/local_folder/cache_export_dialog.dart create mode 100644 test/drift/app_db/generated/schema_v3.dart diff --git a/.env.example b/.env.example index 6a88cb99..888cbe6b 100644 --- a/.env.example +++ b/.env.example @@ -1,16 +1,16 @@ # The format: # SPOTIFY_SECRETS=clintId1:clientSecret1,clientId2:clientSecret2 -SPOTIFY_SECRETS= +SPOTIFY_SECRETS=$SPOTIFY_SECRETS # 0 or 1 # 0 = disable # 1 = enable -ENABLE_UPDATE_CHECK= +ENABLE_UPDATE_CHECK=$ENABLE_UPDATE_CHECK -LASTFM_API_KEY= -LASTFM_API_SECRET= +LASTFM_API_KEY=$LASTFM_API_KEY +LASTFM_API_SECRET=$LASTFM_API_SECRET # Release channel. Can be: nightly, stable -RELEASE_CHANNEL= +RELEASE_CHANNEL=$RELEASE_CHANNEL -HIDE_DONATIONS= +HIDE_DONATIONS=$HIDE_DONATIONS diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml index db158029..23e5cc74 100644 --- a/.github/workflows/pr-lint.yml +++ b/.github/workflows/pr-lint.yml @@ -4,7 +4,7 @@ on: pull_request: env: - FLUTTER_VERSION: 3.22.2 + FLUTTER_VERSION: 3.24.5 jobs: lint: @@ -17,18 +17,23 @@ jobs: with: flutter-version: ${{ env.FLUTTER_VERSION }} + - name: Dummy Envs + run: | + envsubst < .env.example > .env + env: + SPOTIFY_SECRETS: xxx:xxx + ENABLE_UPDATE_CHECK: true + LASTFM_API_KEY: xxx + LASTFM_API_SECRET: xxx + RELEASE_CHANNEL: nightly + HIDE_DONATIONS: 0 + + - name: Configure repo run: | flutter pub get - echo '${{ secrets.DOTENV_NIGHTLY }}' > .env dart run build_runner build --delete-conflicting-outputs - name: Lint Dart files run: | - dart analyze --no-fatal-warnings - - - name: Lint translations & config files - run: | - npm install -g @prantlf/jsonlint - jsonlint -q -D --enforce-double-quotes ./lib/l10n/*.arb - jsonlint -q -D --enforce-double-quotes -T .vscode/*.json \ No newline at end of file + dart analyze --no-fatal-warnings \ No newline at end of file diff --git a/Makefile b/Makefile index 1add46b0..25ac3a6d 100644 --- a/Makefile +++ b/Makefile @@ -42,4 +42,7 @@ apk: mv build/app/outputs/apk/release/app-release.apk build/Spotube-android-all-arch.apk gensums: - sh -c scripts/gensums.sh \ No newline at end of file + sh -c scripts/gensums.sh + +migrate: + dart run drift_dev make-migrations \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index d5b904cc..1eda286e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -39,3 +39,4 @@ analyzer: - "**.g.dart" - "**.gr.dart" - "**/generated_plugin_registrant.dart" + - test/**/*.dart diff --git a/drift_schemas/app_db/drift_schema_v3.json b/drift_schemas/app_db/drift_schema_v3.json new file mode 100644 index 00000000..93e0ef1b --- /dev/null +++ b/drift_schemas/app_db/drift_schema_v3.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"authentication_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"cookie","getter_name":"cookie","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"access_token","getter_name":"accessToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"expiration","getter_name":"expiration","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"blacklist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"element_type","getter_name":"elementType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BlacklistedType.values)","dart_type_name":"BlacklistedType"}},{"name":"element_id","getter_name":"elementId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"preferences_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_quality","getter_name":"audioQuality","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceQualities.high.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceQualities.values)","dart_type_name":"SourceQualities"}},{"name":"album_color_sync","getter_name":"albumColorSync","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"album_color_sync\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"album_color_sync\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"amoled_dark_theme","getter_name":"amoledDarkTheme","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"amoled_dark_theme\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"amoled_dark_theme\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"check_update","getter_name":"checkUpdate","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"check_update\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"check_update\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"normalize_audio","getter_name":"normalizeAudio","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"normalize_audio\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"normalize_audio\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"show_system_tray_icon","getter_name":"showSystemTrayIcon","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"show_system_tray_icon\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"show_system_tray_icon\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"system_title_bar","getter_name":"systemTitleBar","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"system_title_bar\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"system_title_bar\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"skip_non_music","getter_name":"skipNonMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"skip_non_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"skip_non_music\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"close_behavior","getter_name":"closeBehavior","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(CloseBehavior.close.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CloseBehavior.values)","dart_type_name":"CloseBehavior"}},{"name":"accent_color_scheme","getter_name":"accentColorScheme","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"Blue:0xFF2196F3\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeColorConverter()","dart_type_name":"SpotubeColor"}},{"name":"layout_mode","getter_name":"layoutMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(LayoutMode.adaptive.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(LayoutMode.values)","dart_type_name":"LayoutMode"}},{"name":"locale","getter_name":"locale","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('{\"languageCode\":\"system\",\"countryCode\":\"system\"}')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const LocaleConverter()","dart_type_name":"Locale"}},{"name":"market","getter_name":"market","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(Market.US.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(Market.values)","dart_type_name":"Market"}},{"name":"search_mode","getter_name":"searchMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SearchMode.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SearchMode.values)","dart_type_name":"SearchMode"}},{"name":"download_location","getter_name":"downloadLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[]},{"name":"local_library_location","getter_name":"localLibraryLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}},{"name":"piped_instance","getter_name":"pipedInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://pipedapi.kavin.rocks\")","default_client_dart":null,"dsl_features":[]},{"name":"invidious_instance","getter_name":"invidiousInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://inv.nadeko.net\")","default_client_dart":null,"dsl_features":[]},{"name":"theme_mode","getter_name":"themeMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(ThemeMode.system.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ThemeMode.values)","dart_type_name":"ThemeMode"}},{"name":"audio_source","getter_name":"audioSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(AudioSource.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(AudioSource.values)","dart_type_name":"AudioSource"}},{"name":"stream_music_codec","getter_name":"streamMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.weba.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"download_music_codec","getter_name":"downloadMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.m4a.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"discord_presence","getter_name":"discordPresence","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"discord_presence\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"discord_presence\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"endless_playback","getter_name":"endlessPlayback","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"endless_playback\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"endless_playback\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"enable_connect","getter_name":"enableConnect","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"enable_connect\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"enable_connect\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"cache_music","getter_name":"cacheMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"cache_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"cache_music\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"scrobbler_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"password_hash","getter_name":"passwordHash","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"skip_segment_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"start","getter_name":"start","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end","getter_name":"end","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"source_match_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_id","getter_name":"sourceId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_type","getter_name":"sourceType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceType.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceType.values)","dart_type_name":"SourceType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[],"type":"table","data":{"name":"audio_player_state_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playing","getter_name":"playing","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"playing\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"playing\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"loop_mode","getter_name":"loopMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(PlaylistMode.values)","dart_type_name":"PlaylistMode"}},{"name":"shuffled","getter_name":"shuffled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"shuffled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"shuffled\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"collections","getter_name":"collections","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"references":[6],"type":"table","data":{"name":"playlist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_player_state_id","getter_name":"audioPlayerStateId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES audio_player_state_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES audio_player_state_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"index","getter_name":"index","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":8,"references":[7],"type":"table","data":{"name":"playlist_media_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playlist_id","getter_name":"playlistId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES playlist_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES playlist_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"uri","getter_name":"uri","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"extras","getter_name":"extras","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}},{"name":"http_headers","getter_name":"httpHeaders","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":9,"references":[],"type":"table","data":{"name":"history_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(HistoryEntryType.values)","dart_type_name":"HistoryEntryType"}},{"name":"item_id","getter_name":"itemId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[],"type":"table","data":{"name":"lyrics_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"SubtitleTypeConverter()","dart_type_name":"SubtitleSimple"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":11,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":12,"references":[5],"type":"index","data":{"on":5,"name":"uniq_track_match","sql":null,"unique":true,"columns":["track_id","source_id","source_type"]}}]} \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2d570cbc..104ff767 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -58,7 +58,7 @@ PODS: - flutter_inappwebview_ios/Core (0.0.1): - Flutter - OrderedSet (~> 6.0.3) - - flutter_native_splash (0.0.1): + - flutter_native_splash (2.4.3): - Flutter - flutter_secure_storage (6.0.0): - Flutter @@ -74,6 +74,8 @@ PODS: - Flutter - metadata_god (0.0.1): - Flutter + - open_file_ios (0.0.1): + - Flutter - OrderedSet (6.0.3) - package_info_plus (0.4.5): - Flutter @@ -88,21 +90,24 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - sqflite (0.0.3): + - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - "sqlite3 (3.46.0+1)": - - "sqlite3/common (= 3.46.0+1)" - - "sqlite3/common (3.46.0+1)" - - "sqlite3/fts5 (3.46.0+1)": + - sqlite3 (3.47.1): + - sqlite3/common (= 3.47.1) + - sqlite3/common (3.47.1) + - sqlite3/dbstatvtab (3.47.1): - sqlite3/common - - "sqlite3/perf-threadsafe (3.46.0+1)": + - sqlite3/fts5 (3.47.1): - sqlite3/common - - "sqlite3/rtree (3.46.0+1)": + - sqlite3/perf-threadsafe (3.47.1): + - sqlite3/common + - sqlite3/rtree (3.47.1): - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - - sqlite3 (~> 3.46.0) + - sqlite3 (~> 3.47.0) + - sqlite3/dbstatvtab - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree @@ -130,11 +135,12 @@ DEPENDENCIES: - media_kit_libs_ios_audio (from `.symlinks/plugins/media_kit_libs_ios_audio/ios`) - media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`) - metadata_god (from `.symlinks/plugins/metadata_god/ios`) + - open_file_ios (from `.symlinks/plugins/open_file_ios/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) @@ -186,6 +192,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/media_kit_native_event_loop/ios" metadata_god: :path: ".symlinks/plugins/metadata_god/ios" + open_file_ios: + :path: ".symlinks/plugins/open_file_ios/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: @@ -194,8 +202,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - sqflite: - :path: ".symlinks/plugins/sqflite/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" sqlite3_flutter_libs: :path: ".symlinks/plugins/sqlite3_flutter_libs/ios" url_launcher_ios: @@ -206,35 +214,36 @@ SPEC CHECKSUMS: audio_service: f509d65da41b9521a61f1c404dd58651f265a567 audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207 bonsoir_darwin: e3b8526c42ca46a885142df84229131dfabea842 - device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d + device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 - file_selector_ios: 78baf21d03f1e37a7df97bb2494f9cd86de8fa5d + file_selector_ios: f0670c1064a8c8450e38145d8043160105d0b97c Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_broadcasts: 3ece15b27d8ccbe2132c3df303e7c3401feab882 flutter_discord_rpc: e1c342f29ceb9dd76cdc01db59a70c93bb4d9ec5 flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4 - flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778 - flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be + flutter_native_splash: e8a1e01082d97a8099d973f919f57904c925008a + flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 flutter_sharing_intent: e35380d0e1501d7111dbb7e46d5ac6339da6da98 - image_picker_ios: b545a5f16c0fa88e3ecbbce3ed4de45567a8ec18 + image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 media_kit_libs_ios_audio: 8f39d96a9c630685dfb844c289bd1d114c486fb3 media_kit_native_event_loop: 99111eded5acbdc9c2738021ea6550dd36ca8837 metadata_god: 4bbd8523cdb5d42c5e59d2fabad01ff8f4bc53f9 + open_file_ios: 461db5853723763573e140de3193656f91990d9e OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 SDWebImage: a81bbb3ba4ea5f810f4069c68727cb118467a04a - shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 - sqlite3_flutter_libs: 0d611efdf6d1c9297d5ab03dab21b75aeebdae31 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: 1e522f0938463e44b7faf50393b40bdc1e1e456d + sqlite3_flutter_libs: b55ef23cfafea5318ae5081e0bf3fbbce8417c94 SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f - url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe PODFILE CHECKSUM: 0659b64ac6e9e96b61d8550decffa8bff51a957e -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..b6363034 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import UIKit import Flutter -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart index f10242e8..6825fbd5 100644 --- a/lib/collections/assets.gen.dart +++ b/lib/collections/assets.gen.dart @@ -43,6 +43,7 @@ class $AssetsTutorialGen { class Assets { Assets._(); + static const String license = 'LICENSE'; static const AssetGenImage albumPlaceholder = AssetGenImage('assets/album-placeholder.png'); static const AssetGenImage bengaliPatternsBg = @@ -92,6 +93,7 @@ class Assets { /// List of all assets static List get values => [ + license, albumPlaceholder, bengaliPatternsBg, branding, @@ -122,10 +124,17 @@ class Assets { } class AssetGenImage { - const AssetGenImage(this._assetName); + const AssetGenImage( + this._assetName, { + this.size, + this.flavors = const {}, + }); final String _assetName; + final Size? size; + final Set flavors; + Image image({ Key? key, AssetBundle? bundle, @@ -144,7 +153,7 @@ class AssetGenImage { ImageRepeat repeat = ImageRepeat.noRepeat, Rect? centerSlice, bool matchTextDirection = false, - bool gaplessPlayback = false, + bool gaplessPlayback = true, bool isAntiAlias = false, String? package, FilterQuality filterQuality = FilterQuality.low, diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart index 3bf1d883..a0380e29 100644 --- a/lib/collections/routes.dart +++ b/lib/collections/routes.dart @@ -128,9 +128,12 @@ final routerProvider = Provider((ref) { pageBuilder: (context, state) { assert(state.extra is String); return SpotubePage( - child: LocalLibraryPage(state.extra as String, - isDownloads: - state.uri.queryParameters["downloads"] != null), + child: LocalLibraryPage( + state.extra as String, + isDownloads: + state.uri.queryParameters["downloads"] != null, + isCache: state.uri.queryParameters["cache"] != null, + ), ); }, ), diff --git a/lib/collections/spotube_icons.dart b/lib/collections/spotube_icons.dart index a45e581e..5c4df85f 100644 --- a/lib/collections/spotube_icons.dart +++ b/lib/collections/spotube_icons.dart @@ -124,4 +124,7 @@ abstract class SpotubeIcons { static const chart = FeatherIcons.barChart2; static const folderAdd = FeatherIcons.folderPlus; static const folderRemove = FeatherIcons.folderMinus; + static const cache = FeatherIcons.hardDrive; + static const export = Icons.file_open_outlined; + static const delete = FeatherIcons.trash2; } diff --git a/lib/extensions/track.dart b/lib/extensions/track.dart index 02c0c492..215a5ab2 100644 --- a/lib/extensions/track.dart +++ b/lib/extensions/track.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:typed_data'; import 'package:metadata_god/metadata_god.dart'; import 'package:path/path.dart'; @@ -37,6 +38,33 @@ extension TrackExtensions on Track { return this; } + + Metadata toMetadata({ + required int fileLength, + Uint8List? imageBytes, + }) { + return Metadata( + title: name, + artist: artists?.map((a) => a.name).join(", "), + album: album?.name, + albumArtist: artists?.map((a) => a.name).join(", "), + year: album?.releaseDate != null + ? int.tryParse(album!.releaseDate!.split("-").first) ?? 1969 + : 1969, + trackNumber: trackNumber, + discNumber: discNumber, + durationMs: durationMs?.toDouble() ?? 0.0, + fileSize: BigInt.from(fileLength), + trackTotal: album?.tracks?.length ?? 0, + picture: imageBytes != null + ? Picture( + data: imageBytes, + // Spotify images are always JPEGs + mimeType: 'image/jpeg', + ) + : null, + ); + } } extension TrackSimpleExtensions on TrackSimple { diff --git a/lib/hooks/utils/use_custom_status_bar_color.dart b/lib/hooks/utils/use_custom_status_bar_color.dart index 7c5c7b27..8afc6a59 100644 --- a/lib/hooks/utils/use_custom_status_bar_color.dart +++ b/lib/hooks/utils/use_custom_status_bar_color.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -void useCustomStatusBarColor( +VoidCallback useCustomStatusBarColor( Color color, bool isCurrentRoute, { bool noSetBGColor = false, @@ -10,14 +10,19 @@ void useCustomStatusBarColor( }) { final context = useContext(); final backgroundColor = Theme.of(context).scaffoldBackgroundColor; - resetStatusbar() => SystemChrome.setSystemUIOverlayStyle( - SystemUiOverlayStyle( - statusBarColor: backgroundColor, // status bar color - statusBarIconBrightness: backgroundColor.computeLuminance() > 0.179 - ? Brightness.dark - : Brightness.light, - ), - ); + // ignore: invalid_use_of_visible_for_testing_member + final previousState = SystemChrome.latestStyle; + + void resetStatusbar() => previousState != null + ? SystemChrome.setSystemUIOverlayStyle(previousState) + : SystemChrome.setSystemUIOverlayStyle( + SystemUiOverlayStyle( + statusBarColor: backgroundColor, // status bar color + statusBarIconBrightness: backgroundColor.computeLuminance() > 0.179 + ? Brightness.dark + : Brightness.light, + ), + ); // ignore: invalid_use_of_visible_for_testing_member final statusBarColor = SystemChrome.latestStyle?.statusBarColor; @@ -54,4 +59,6 @@ void useCustomStatusBarColor( useEffect(() { return resetStatusbar; }, []); + + return resetStatusbar; } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 27a64c87..f949480e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -391,5 +391,15 @@ "total_money": "Total {money}", "webview_not_found": "Webview not found", "webview_not_found_description": "No webview runtime is installed in your device.\nIf it's installed make sure it's in the Environment PATH\n\nAfter installing, restart the app", - "unsupported_platform": "Unsupported platform" + "unsupported_platform": "Unsupported platform", + "cache_music": "Cache music", + "open": "Open", + "cache_folder": "Cache folder", + "export": "Export", + "clear_cache": "Clear cache", + "clear_cache_confirmation": "Do you want to clear the cache?", + "export_cache_files": "Export Cached Files", + "found_n_files": "Found {count} files", + "export_cache_confirmation": "Do you want to export these files to", + "exported_n_out_of_m_files": "Exported {filesExported} out of {files} files" } \ No newline at end of file diff --git a/lib/models/connect/connect.freezed.dart b/lib/models/connect/connect.freezed.dart index 088cfbd1..9103dd2b 100644 --- a/lib/models/connect/connect.freezed.dart +++ b/lib/models/connect/connect.freezed.dart @@ -99,8 +99,13 @@ mixin _$WebSocketLoadEventData { required TResult orElse(), }) => throw _privateConstructorUsedError; + + /// Serializes this WebSocketLoadEventData to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $WebSocketLoadEventDataCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -127,6 +132,8 @@ class _$WebSocketLoadEventDataCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -171,6 +178,8 @@ class __$$WebSocketLoadEventDataPlaylistImplCopyWithImpl<$Res> $Res Function(_$WebSocketLoadEventDataPlaylistImpl) _then) : super(_value, _then); + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -247,12 +256,14 @@ class _$WebSocketLoadEventDataPlaylistImpl other.initialIndex == initialIndex)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, const DeepCollectionEquality().hash(_tracks), collection, initialIndex); - @JsonKey(ignore: true) + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$WebSocketLoadEventDataPlaylistImplCopyWith< @@ -372,8 +383,11 @@ abstract class WebSocketLoadEventDataPlaylist extends WebSocketLoadEventData { PlaylistSimple? get collection; @override int? get initialIndex; + + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$WebSocketLoadEventDataPlaylistImplCopyWith< _$WebSocketLoadEventDataPlaylistImpl> get copyWith => throw _privateConstructorUsedError; @@ -404,6 +418,8 @@ class __$$WebSocketLoadEventDataAlbumImplCopyWithImpl<$Res> $Res Function(_$WebSocketLoadEventDataAlbumImpl) _then) : super(_value, _then); + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -479,12 +495,14 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum { other.initialIndex == initialIndex)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, const DeepCollectionEquality().hash(_tracks), collection, initialIndex); - @JsonKey(ignore: true) + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl> @@ -603,8 +621,11 @@ abstract class WebSocketLoadEventDataAlbum extends WebSocketLoadEventData { AlbumSimple? get collection; @override int? get initialIndex; + + /// Create a copy of WebSocketLoadEventData + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart index 8bb32bd5..0f30df19 100644 --- a/lib/models/database/database.dart +++ b/lib/models/database/database.dart @@ -58,18 +58,26 @@ class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); @override - int get schemaVersion => 2; + int get schemaVersion => 3; @override MigrationStrategy get migration { return MigrationStrategy( - onUpgrade: stepByStep(from1To2: (m, schema) async { - // Add invidiousInstance column to preferences table - await m.addColumn( - schema.preferencesTable, - schema.preferencesTable.invidiousInstance, - ); - }), + onUpgrade: stepByStep( + from1To2: (m, schema) async { + // Add invidiousInstance column to preferences table + await m.addColumn( + schema.preferencesTable, + schema.preferencesTable.invidiousInstance, + ); + }, + from2To3: (m, schema) async { + await m.addColumn( + schema.preferencesTable, + schema.preferencesTable.cacheMusic, + ); + }, + ), ); } } diff --git a/lib/models/database/database.g.dart b/lib/models/database/database.g.dart index def70bd2..951b2ed5 100644 --- a/lib/models/database/database.g.dart +++ b/lib/models/database/database.g.dart @@ -812,6 +812,16 @@ class $PreferencesTableTable extends PreferencesTable defaultConstraints: GeneratedColumn.constraintIsAlways( 'CHECK ("enable_connect" IN (0, 1))'), defaultValue: const Constant(false)); + static const VerificationMeta _cacheMusicMeta = + const VerificationMeta('cacheMusic'); + @override + late final GeneratedColumn cacheMusic = GeneratedColumn( + 'cache_music', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("cache_music" IN (0, 1))'), + defaultValue: const Constant(true)); @override List get $columns => [ id, @@ -839,7 +849,8 @@ class $PreferencesTableTable extends PreferencesTable downloadMusicCodec, discordPresence, endlessPlayback, - enableConnect + enableConnect, + cacheMusic ]; @override String get aliasedName => _alias ?? actualTableName; @@ -946,6 +957,12 @@ class $PreferencesTableTable extends PreferencesTable enableConnect.isAcceptableOrUnknown( data['enable_connect']!, _enableConnectMeta)); } + if (data.containsKey('cache_music')) { + context.handle( + _cacheMusicMeta, + cacheMusic.isAcceptableOrUnknown( + data['cache_music']!, _cacheMusicMeta)); + } return context; } @@ -1020,6 +1037,8 @@ class $PreferencesTableTable extends PreferencesTable .read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!, enableConnect: attachedDatabase.typeMapping .read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!, + cacheMusic: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}cache_music'])!, ); } @@ -1086,6 +1105,7 @@ class PreferencesTableData extends DataClass final bool discordPresence; final bool endlessPlayback; final bool enableConnect; + final bool cacheMusic; const PreferencesTableData( {required this.id, required this.audioQuality, @@ -1112,7 +1132,8 @@ class PreferencesTableData extends DataClass required this.downloadMusicCodec, required this.discordPresence, required this.endlessPlayback, - required this.enableConnect}); + required this.enableConnect, + required this.cacheMusic}); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -1182,6 +1203,7 @@ class PreferencesTableData extends DataClass map['discord_presence'] = Variable(discordPresence); map['endless_playback'] = Variable(endlessPlayback); map['enable_connect'] = Variable(enableConnect); + map['cache_music'] = Variable(cacheMusic); return map; } @@ -1213,6 +1235,7 @@ class PreferencesTableData extends DataClass discordPresence: Value(discordPresence), endlessPlayback: Value(endlessPlayback), enableConnect: Value(enableConnect), + cacheMusic: Value(cacheMusic), ); } @@ -1257,6 +1280,7 @@ class PreferencesTableData extends DataClass discordPresence: serializer.fromJson(json['discordPresence']), endlessPlayback: serializer.fromJson(json['endlessPlayback']), enableConnect: serializer.fromJson(json['enableConnect']), + cacheMusic: serializer.fromJson(json['cacheMusic']), ); } @override @@ -1301,6 +1325,7 @@ class PreferencesTableData extends DataClass 'discordPresence': serializer.toJson(discordPresence), 'endlessPlayback': serializer.toJson(endlessPlayback), 'enableConnect': serializer.toJson(enableConnect), + 'cacheMusic': serializer.toJson(cacheMusic), }; } @@ -1330,7 +1355,8 @@ class PreferencesTableData extends DataClass SourceCodecs? downloadMusicCodec, bool? discordPresence, bool? endlessPlayback, - bool? enableConnect}) => + bool? enableConnect, + bool? cacheMusic}) => PreferencesTableData( id: id ?? this.id, audioQuality: audioQuality ?? this.audioQuality, @@ -1358,6 +1384,7 @@ class PreferencesTableData extends DataClass discordPresence: discordPresence ?? this.discordPresence, endlessPlayback: endlessPlayback ?? this.endlessPlayback, enableConnect: enableConnect ?? this.enableConnect, + cacheMusic: cacheMusic ?? this.cacheMusic, ); PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) { return PreferencesTableData( @@ -1427,6 +1454,8 @@ class PreferencesTableData extends DataClass enableConnect: data.enableConnect.present ? data.enableConnect.value : this.enableConnect, + cacheMusic: + data.cacheMusic.present ? data.cacheMusic.value : this.cacheMusic, ); } @@ -1458,7 +1487,8 @@ class PreferencesTableData extends DataClass ..write('downloadMusicCodec: $downloadMusicCodec, ') ..write('discordPresence: $discordPresence, ') ..write('endlessPlayback: $endlessPlayback, ') - ..write('enableConnect: $enableConnect') + ..write('enableConnect: $enableConnect, ') + ..write('cacheMusic: $cacheMusic') ..write(')')) .toString(); } @@ -1490,7 +1520,8 @@ class PreferencesTableData extends DataClass downloadMusicCodec, discordPresence, endlessPlayback, - enableConnect + enableConnect, + cacheMusic ]); @override bool operator ==(Object other) => @@ -1521,7 +1552,8 @@ class PreferencesTableData extends DataClass other.downloadMusicCodec == this.downloadMusicCodec && other.discordPresence == this.discordPresence && other.endlessPlayback == this.endlessPlayback && - other.enableConnect == this.enableConnect); + other.enableConnect == this.enableConnect && + other.cacheMusic == this.cacheMusic); } class PreferencesTableCompanion extends UpdateCompanion { @@ -1551,6 +1583,7 @@ class PreferencesTableCompanion extends UpdateCompanion { final Value discordPresence; final Value endlessPlayback; final Value enableConnect; + final Value cacheMusic; const PreferencesTableCompanion({ this.id = const Value.absent(), this.audioQuality = const Value.absent(), @@ -1578,6 +1611,7 @@ class PreferencesTableCompanion extends UpdateCompanion { this.discordPresence = const Value.absent(), this.endlessPlayback = const Value.absent(), this.enableConnect = const Value.absent(), + this.cacheMusic = const Value.absent(), }); PreferencesTableCompanion.insert({ this.id = const Value.absent(), @@ -1606,6 +1640,7 @@ class PreferencesTableCompanion extends UpdateCompanion { this.discordPresence = const Value.absent(), this.endlessPlayback = const Value.absent(), this.enableConnect = const Value.absent(), + this.cacheMusic = const Value.absent(), }); static Insertable custom({ Expression? id, @@ -1634,6 +1669,7 @@ class PreferencesTableCompanion extends UpdateCompanion { Expression? discordPresence, Expression? endlessPlayback, Expression? enableConnect, + Expression? cacheMusic, }) { return RawValuesInsertable({ if (id != null) 'id': id, @@ -1665,6 +1701,7 @@ class PreferencesTableCompanion extends UpdateCompanion { if (discordPresence != null) 'discord_presence': discordPresence, if (endlessPlayback != null) 'endless_playback': endlessPlayback, if (enableConnect != null) 'enable_connect': enableConnect, + if (cacheMusic != null) 'cache_music': cacheMusic, }); } @@ -1694,7 +1731,8 @@ class PreferencesTableCompanion extends UpdateCompanion { Value? downloadMusicCodec, Value? discordPresence, Value? endlessPlayback, - Value? enableConnect}) { + Value? enableConnect, + Value? cacheMusic}) { return PreferencesTableCompanion( id: id ?? this.id, audioQuality: audioQuality ?? this.audioQuality, @@ -1722,6 +1760,7 @@ class PreferencesTableCompanion extends UpdateCompanion { discordPresence: discordPresence ?? this.discordPresence, endlessPlayback: endlessPlayback ?? this.endlessPlayback, enableConnect: enableConnect ?? this.enableConnect, + cacheMusic: cacheMusic ?? this.cacheMusic, ); } @@ -1825,6 +1864,9 @@ class PreferencesTableCompanion extends UpdateCompanion { if (enableConnect.present) { map['enable_connect'] = Variable(enableConnect.value); } + if (cacheMusic.present) { + map['cache_music'] = Variable(cacheMusic.value); + } return map; } @@ -1856,7 +1898,8 @@ class PreferencesTableCompanion extends UpdateCompanion { ..write('downloadMusicCodec: $downloadMusicCodec, ') ..write('discordPresence: $discordPresence, ') ..write('endlessPlayback: $endlessPlayback, ') - ..write('enableConnect: $enableConnect') + ..write('enableConnect: $enableConnect, ') + ..write('cacheMusic: $cacheMusic') ..write(')')) .toString(); } @@ -4527,6 +4570,7 @@ typedef $$PreferencesTableTableCreateCompanionBuilder Value discordPresence, Value endlessPlayback, Value enableConnect, + Value cacheMusic, }); typedef $$PreferencesTableTableUpdateCompanionBuilder = PreferencesTableCompanion Function({ @@ -4556,6 +4600,7 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder Value discordPresence, Value endlessPlayback, Value enableConnect, + Value cacheMusic, }); class $$PreferencesTableTableFilterComposer @@ -4677,6 +4722,9 @@ class $$PreferencesTableTableFilterComposer ColumnFilters get enableConnect => $composableBuilder( column: $table.enableConnect, builder: (column) => ColumnFilters(column)); + + ColumnFilters get cacheMusic => $composableBuilder( + column: $table.cacheMusic, builder: (column) => ColumnFilters(column)); } class $$PreferencesTableTableOrderingComposer @@ -4783,6 +4831,9 @@ class $$PreferencesTableTableOrderingComposer ColumnOrderings get enableConnect => $composableBuilder( column: $table.enableConnect, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get cacheMusic => $composableBuilder( + column: $table.cacheMusic, builder: (column) => ColumnOrderings(column)); } class $$PreferencesTableTableAnnotationComposer @@ -4880,6 +4931,9 @@ class $$PreferencesTableTableAnnotationComposer GeneratedColumn get enableConnect => $composableBuilder( column: $table.enableConnect, builder: (column) => column); + + GeneratedColumn get cacheMusic => $composableBuilder( + column: $table.cacheMusic, builder: (column) => column); } class $$PreferencesTableTableTableManager extends RootTableManager< @@ -4936,6 +4990,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< Value discordPresence = const Value.absent(), Value endlessPlayback = const Value.absent(), Value enableConnect = const Value.absent(), + Value cacheMusic = const Value.absent(), }) => PreferencesTableCompanion( id: id, @@ -4964,6 +5019,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< discordPresence: discordPresence, endlessPlayback: endlessPlayback, enableConnect: enableConnect, + cacheMusic: cacheMusic, ), createCompanionCallback: ({ Value id = const Value.absent(), @@ -4992,6 +5048,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< Value discordPresence = const Value.absent(), Value endlessPlayback = const Value.absent(), Value enableConnect = const Value.absent(), + Value cacheMusic = const Value.absent(), }) => PreferencesTableCompanion.insert( id: id, @@ -5020,6 +5077,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager< discordPresence: discordPresence, endlessPlayback: endlessPlayback, enableConnect: enableConnect, + cacheMusic: cacheMusic, ), withReferenceMapper: (p0) => p0 .map((e) => (e.readTable(table), BaseReferences(db, table, e))) @@ -5829,8 +5887,7 @@ final class $$PlaylistTableTableReferences extends BaseReferences<_$AppDatabase, db.audioPlayerStateTable.createAlias($_aliasNameGenerator( db.playlistTable.audioPlayerStateId, db.audioPlayerStateTable.id)); - $$AudioPlayerStateTableTableProcessedTableManager? get audioPlayerStateId { - if ($_item.audioPlayerStateId == null) return null; + $$AudioPlayerStateTableTableProcessedTableManager get audioPlayerStateId { final manager = $$AudioPlayerStateTableTableTableManager( $_db, $_db.audioPlayerStateTable) .filter((f) => f.id($_item.audioPlayerStateId!)); @@ -6156,8 +6213,7 @@ final class $$PlaylistMediaTableTableReferences extends BaseReferences< db.playlistTable.createAlias($_aliasNameGenerator( db.playlistMediaTable.playlistId, db.playlistTable.id)); - $$PlaylistTableTableProcessedTableManager? get playlistId { - if ($_item.playlistId == null) return null; + $$PlaylistTableTableProcessedTableManager get playlistId { final manager = $$PlaylistTableTableTableManager($_db, $_db.playlistTable) .filter((f) => f.id($_item.playlistId!)); final item = $_typedResult.readTableOrNull(_playlistIdTable($_db)); diff --git a/lib/models/database/database.steps.dart b/lib/models/database/database.steps.dart index 4814fa5a..40546bdb 100644 --- a/lib/models/database/database.steps.dart +++ b/lib/models/database/database.steps.dart @@ -1,10 +1,11 @@ +// dart format width=80 import 'package:drift/internal/versioned_schema.dart' as i0; import 'package:drift/drift.dart' as i1; -import 'package:drift/drift.dart'; +import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import import 'package:flutter/material.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/services/sourced_track/enums.dart'; -import 'package:spotube/utils/migrations/adapters.dart'; // ignore_for_file: type=lint,unused_import +import 'package:spotube/utils/migrations/adapters.dart'; // GENERATED BY drift_dev, DO NOT MODIFY. final class Schema2 extends i0.VersionedSchema { @@ -627,8 +628,288 @@ class Shape10 extends i0.VersionedTable { columnsByName['data']! as i1.GeneratedColumn; } +final class Schema3 extends i0.VersionedSchema { + Schema3({required super.database}) : super(version: 3); + @override + late final List entities = [ + authenticationTable, + blacklistTable, + preferencesTable, + scrobblerTable, + skipSegmentTable, + sourceMatchTable, + audioPlayerStateTable, + playlistTable, + playlistMediaTable, + historyTable, + lyricsTable, + uniqueBlacklist, + uniqTrackMatch, + ]; + late final Shape0 authenticationTable = Shape0( + source: i0.VersionedTable( + entityName: 'authentication_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 blacklistTable = Shape1( + source: i0.VersionedTable( + entityName: 'blacklist_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_4, + _column_5, + _column_6, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape11 preferencesTable = Shape11( + source: i0.VersionedTable( + entityName: 'preferences_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_7, + _column_8, + _column_9, + _column_10, + _column_11, + _column_12, + _column_13, + _column_14, + _column_15, + _column_16, + _column_17, + _column_18, + _column_19, + _column_20, + _column_21, + _column_22, + _column_23, + _column_24, + _column_25, + _column_26, + _column_27, + _column_28, + _column_29, + _column_30, + _column_31, + _column_53, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 scrobblerTable = Shape3( + source: i0.VersionedTable( + entityName: 'scrobbler_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_32, + _column_33, + _column_34, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape4 skipSegmentTable = Shape4( + source: i0.VersionedTable( + entityName: 'skip_segment_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_35, + _column_36, + _column_37, + _column_32, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 sourceMatchTable = Shape5( + source: i0.VersionedTable( + entityName: 'source_match_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_37, + _column_38, + _column_39, + _column_32, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 audioPlayerStateTable = Shape6( + source: i0.VersionedTable( + entityName: 'audio_player_state_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_40, + _column_41, + _column_42, + _column_43, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape7 playlistTable = Shape7( + source: i0.VersionedTable( + entityName: 'playlist_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_44, + _column_45, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape8 playlistMediaTable = Shape8( + source: i0.VersionedTable( + entityName: 'playlist_media_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_46, + _column_47, + _column_48, + _column_49, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape9 historyTable = Shape9( + source: i0.VersionedTable( + entityName: 'history_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_32, + _column_50, + _column_51, + _column_52, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape10 lyricsTable = Shape10( + source: i0.VersionedTable( + entityName: 'lyrics_table', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_37, + _column_52, + ], + attachedDatabase: database, + ), + alias: null); + final i1.Index uniqueBlacklist = i1.Index('unique_blacklist', + 'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)'); + final i1.Index uniqTrackMatch = i1.Index('uniq_track_match', + 'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)'); +} + +class Shape11 extends i0.VersionedTable { + Shape11({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioQuality => + columnsByName['audio_quality']! as i1.GeneratedColumn; + i1.GeneratedColumn get albumColorSync => + columnsByName['album_color_sync']! as i1.GeneratedColumn; + i1.GeneratedColumn get amoledDarkTheme => + columnsByName['amoled_dark_theme']! as i1.GeneratedColumn; + i1.GeneratedColumn get checkUpdate => + columnsByName['check_update']! as i1.GeneratedColumn; + i1.GeneratedColumn get normalizeAudio => + columnsByName['normalize_audio']! as i1.GeneratedColumn; + i1.GeneratedColumn get showSystemTrayIcon => + columnsByName['show_system_tray_icon']! as i1.GeneratedColumn; + i1.GeneratedColumn get systemTitleBar => + columnsByName['system_title_bar']! as i1.GeneratedColumn; + i1.GeneratedColumn get skipNonMusic => + columnsByName['skip_non_music']! as i1.GeneratedColumn; + i1.GeneratedColumn get closeBehavior => + columnsByName['close_behavior']! as i1.GeneratedColumn; + i1.GeneratedColumn get accentColorScheme => + columnsByName['accent_color_scheme']! as i1.GeneratedColumn; + i1.GeneratedColumn get layoutMode => + columnsByName['layout_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get locale => + columnsByName['locale']! as i1.GeneratedColumn; + i1.GeneratedColumn get market => + columnsByName['market']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchMode => + columnsByName['search_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadLocation => + columnsByName['download_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get localLibraryLocation => + columnsByName['local_library_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get pipedInstance => + columnsByName['piped_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get invidiousInstance => + columnsByName['invidious_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get themeMode => + columnsByName['theme_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioSource => + columnsByName['audio_source']! as i1.GeneratedColumn; + i1.GeneratedColumn get streamMusicCodec => + columnsByName['stream_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadMusicCodec => + columnsByName['download_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get discordPresence => + columnsByName['discord_presence']! as i1.GeneratedColumn; + i1.GeneratedColumn get endlessPlayback => + columnsByName['endless_playback']! as i1.GeneratedColumn; + i1.GeneratedColumn get enableConnect => + columnsByName['enable_connect']! as i1.GeneratedColumn; + i1.GeneratedColumn get cacheMusic => + columnsByName['cache_music']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_53(String aliasedName) => + i1.GeneratedColumn('cache_music', aliasedName, false, + type: i1.DriftSqlType.bool, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'CHECK ("cache_music" IN (0, 1))'), + defaultValue: const Constant(true)); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, + required Future Function(i1.Migrator m, Schema3 schema) from2To3, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -637,6 +918,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from1To2(migrator, schema); return 2; + case 2: + final schema = Schema3(database: database); + final migrator = i1.Migrator(database, schema); + await from2To3(migrator, schema); + return 3; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -645,8 +931,10 @@ i0.MigrationStepWithVersion migrationSteps({ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, + required Future Function(i1.Migrator m, Schema3 schema) from2To3, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( from1To2: from1To2, + from2To3: from2To3, )); diff --git a/lib/models/database/tables/preferences.dart b/lib/models/database/tables/preferences.dart index 96132de8..c3904c84 100644 --- a/lib/models/database/tables/preferences.dart +++ b/lib/models/database/tables/preferences.dart @@ -94,6 +94,7 @@ class PreferencesTable extends Table { boolean().withDefault(const Constant(true))(); BoolColumn get enableConnect => boolean().withDefault(const Constant(false))(); + BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))(); // Default values as PreferencesTableData static PreferencesTableData defaults() { @@ -119,11 +120,12 @@ class PreferencesTable extends Table { invidiousInstance: "https://inv.nadeko.net", themeMode: ThemeMode.system, audioSource: AudioSource.youtube, - streamMusicCodec: SourceCodecs.weba, + streamMusicCodec: SourceCodecs.m4a, downloadMusicCodec: SourceCodecs.m4a, discordPresence: true, endlessPlayback: true, enableConnect: false, + cacheMusic: true, ); } } diff --git a/lib/models/parser/range_headers.dart b/lib/models/parser/range_headers.dart new file mode 100644 index 00000000..08025cbf --- /dev/null +++ b/lib/models/parser/range_headers.dart @@ -0,0 +1,71 @@ +class ContentRangeHeader { + final int start; + final int end; + final int total; + + ContentRangeHeader(this.start, this.end, this.total); + + factory ContentRangeHeader.parse(String value) { + if (value.isEmpty) { + throw FormatException('Invalid Content-Range header: $value'); + } + + final parts = value.split(' '); + if (parts.length != 2) { + throw FormatException('Invalid Content-Range header: $value'); + } + + final rangeParts = parts[1].split('/'); + if (rangeParts.length != 2) { + throw FormatException('Invalid Content-Range header: $value'); + } + + final range = rangeParts[0].split('-'); + if (range.length != 2) { + throw FormatException('Invalid Content-Range header: $value'); + } + + return ContentRangeHeader( + int.parse(range[0]), + int.parse(range[1]), + int.parse(rangeParts[1]), + ); + } + + @override + String toString() { + return 'bytes $start-$end/$total'; + } +} + +class RangeHeader { + final int start; + final int? end; + + RangeHeader(this.start, this.end); + + factory RangeHeader.parse(String value) { + if (value.isEmpty) { + return RangeHeader(0, null); + } + + final parts = value.split('='); + if (parts.length != 2) { + throw FormatException('Invalid Range header: $value'); + } + + final ranges = parts[1].split('-'); + + return RangeHeader( + int.parse(ranges[0]), + ranges.elementAtOrNull(1) != null && ranges[1].isNotEmpty + ? int.parse(ranges[1]) + : null, + ); + } + + @override + String toString() { + return 'bytes=$start-${end ?? ""}'; + } +} diff --git a/lib/models/spotify/home_feed.freezed.dart b/lib/models/spotify/home_feed.freezed.dart index c2bb2aba..5076da29 100644 --- a/lib/models/spotify/home_feed.freezed.dart +++ b/lib/models/spotify/home_feed.freezed.dart @@ -29,8 +29,12 @@ mixin _$SpotifySectionPlaylist { String get owner => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError; + /// Serializes this SpotifySectionPlaylist to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifySectionPlaylist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifySectionPlaylistCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -61,6 +65,8 @@ class _$SpotifySectionPlaylistCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifySectionPlaylist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -128,6 +134,8 @@ class __$$SpotifySectionPlaylistImplCopyWithImpl<$Res> $Res Function(_$SpotifySectionPlaylistImpl) _then) : super(_value, _then); + /// Create a copy of SpotifySectionPlaylist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -221,12 +229,14 @@ class _$SpotifySectionPlaylistImpl extends _SpotifySectionPlaylist { (identical(other.uri, uri) || other.uri == uri)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, description, format, const DeepCollectionEquality().hash(_images), name, owner, uri); - @JsonKey(ignore: true) + /// Create a copy of SpotifySectionPlaylist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl> @@ -266,8 +276,11 @@ abstract class _SpotifySectionPlaylist extends SpotifySectionPlaylist { String get owner; @override String get uri; + + /// Create a copy of SpotifySectionPlaylist + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl> get copyWith => throw _privateConstructorUsedError; } @@ -283,8 +296,12 @@ mixin _$SpotifySectionArtist { List get images => throw _privateConstructorUsedError; + /// Serializes this SpotifySectionArtist to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifySectionArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifySectionArtistCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -309,6 +326,8 @@ class _$SpotifySectionArtistCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifySectionArtist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -352,6 +371,8 @@ class __$$SpotifySectionArtistImplCopyWithImpl<$Res> $Res Function(_$SpotifySectionArtistImpl) _then) : super(_value, _then); + /// Create a copy of SpotifySectionArtist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -416,12 +437,14 @@ class _$SpotifySectionArtistImpl extends _SpotifySectionArtist { const DeepCollectionEquality().equals(other._images, _images)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash( runtimeType, name, uri, const DeepCollectionEquality().hash(_images)); - @JsonKey(ignore: true) + /// Create a copy of SpotifySectionArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl> @@ -454,8 +477,11 @@ abstract class _SpotifySectionArtist extends SpotifySectionArtist { String get uri; @override List get images; + + /// Create a copy of SpotifySectionArtist + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl> get copyWith => throw _privateConstructorUsedError; } @@ -473,8 +499,12 @@ mixin _$SpotifySectionAlbum { String get name => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError; + /// Serializes this SpotifySectionAlbum to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifySectionAlbum + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifySectionAlbumCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -502,6 +532,8 @@ class _$SpotifySectionAlbumCopyWithImpl<$Res, $Val extends SpotifySectionAlbum> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifySectionAlbum + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -554,6 +586,8 @@ class __$$SpotifySectionAlbumImplCopyWithImpl<$Res> $Res Function(_$SpotifySectionAlbumImpl) _then) : super(_value, _then); + /// Create a copy of SpotifySectionAlbum + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -635,7 +669,7 @@ class _$SpotifySectionAlbumImpl extends _SpotifySectionAlbum { (identical(other.uri, uri) || other.uri == uri)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash( runtimeType, @@ -644,7 +678,9 @@ class _$SpotifySectionAlbumImpl extends _SpotifySectionAlbum { name, uri); - @JsonKey(ignore: true) + /// Create a copy of SpotifySectionAlbum + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith => @@ -678,8 +714,11 @@ abstract class _SpotifySectionAlbum extends SpotifySectionAlbum { String get name; @override String get uri; + + /// Create a copy of SpotifySectionAlbum + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith => throw _privateConstructorUsedError; } @@ -694,8 +733,12 @@ mixin _$SpotifySectionAlbumArtist { String get name => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError; + /// Serializes this SpotifySectionAlbumArtist to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifySectionAlbumArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifySectionAlbumArtistCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -720,6 +763,8 @@ class _$SpotifySectionAlbumArtistCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifySectionAlbumArtist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -761,6 +806,8 @@ class __$$SpotifySectionAlbumArtistImplCopyWithImpl<$Res> $Res Function(_$SpotifySectionAlbumArtistImpl) _then) : super(_value, _then); + /// Create a copy of SpotifySectionAlbumArtist + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -808,11 +855,13 @@ class _$SpotifySectionAlbumArtistImpl extends _SpotifySectionAlbumArtist { (identical(other.uri, uri) || other.uri == uri)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, name, uri); - @JsonKey(ignore: true) + /// Create a copy of SpotifySectionAlbumArtist + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl> @@ -840,8 +889,11 @@ abstract class _SpotifySectionAlbumArtist extends SpotifySectionAlbumArtist { String get name; @override String get uri; + + /// Create a copy of SpotifySectionAlbumArtist + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl> get copyWith => throw _privateConstructorUsedError; } @@ -857,8 +909,12 @@ mixin _$SpotifySectionItemImage { String get url => throw _privateConstructorUsedError; num? get width => throw _privateConstructorUsedError; + /// Serializes this SpotifySectionItemImage to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifySectionItemImage + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifySectionItemImageCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -883,6 +939,8 @@ class _$SpotifySectionItemImageCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifySectionItemImage + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -929,6 +987,8 @@ class __$$SpotifySectionItemImageImplCopyWithImpl<$Res> $Res Function(_$SpotifySectionItemImageImpl) _then) : super(_value, _then); + /// Create a copy of SpotifySectionItemImage + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -985,11 +1045,13 @@ class _$SpotifySectionItemImageImpl extends _SpotifySectionItemImage { (identical(other.width, width) || other.width == width)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, height, url, width); - @JsonKey(ignore: true) + /// Create a copy of SpotifySectionItemImage + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl> @@ -1020,8 +1082,11 @@ abstract class _SpotifySectionItemImage extends SpotifySectionItemImage { String get url; @override num? get width; + + /// Create a copy of SpotifySectionItemImage + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1038,8 +1103,12 @@ mixin _$SpotifyHomeFeedSectionItem { SpotifySectionArtist? get artist => throw _privateConstructorUsedError; SpotifySectionAlbum? get album => throw _privateConstructorUsedError; + /// Serializes this SpotifyHomeFeedSectionItem to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifyHomeFeedSectionItemCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -1073,6 +1142,8 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1101,6 +1172,8 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res, ) as $Val); } + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $SpotifySectionPlaylistCopyWith<$Res>? get playlist { @@ -1113,6 +1186,8 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res, }); } + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $SpotifySectionArtistCopyWith<$Res>? get artist { @@ -1125,6 +1200,8 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res, }); } + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $SpotifySectionAlbumCopyWith<$Res>? get album { @@ -1171,6 +1248,8 @@ class __$$SpotifyHomeFeedSectionItemImplCopyWithImpl<$Res> $Res Function(_$SpotifyHomeFeedSectionItemImpl) _then) : super(_value, _then); + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1237,12 +1316,14 @@ class _$SpotifyHomeFeedSectionItemImpl implements _SpotifyHomeFeedSectionItem { (identical(other.album, album) || other.album == album)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, typename, playlist, artist, album); - @JsonKey(ignore: true) + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl> @@ -1276,8 +1357,11 @@ abstract class _SpotifyHomeFeedSectionItem SpotifySectionArtist? get artist; @override SpotifySectionAlbum? get album; + + /// Create a copy of SpotifyHomeFeedSectionItem + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1295,8 +1379,12 @@ mixin _$SpotifyHomeFeedSection { List get items => throw _privateConstructorUsedError; + /// Serializes this SpotifyHomeFeedSection to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifyHomeFeedSection + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifyHomeFeedSectionCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -1325,6 +1413,8 @@ class _$SpotifyHomeFeedSectionCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifyHomeFeedSection + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1380,6 +1470,8 @@ class __$$SpotifyHomeFeedSectionImplCopyWithImpl<$Res> $Res Function(_$SpotifyHomeFeedSectionImpl) _then) : super(_value, _then); + /// Create a copy of SpotifyHomeFeedSection + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1453,12 +1545,14 @@ class _$SpotifyHomeFeedSectionImpl implements _SpotifyHomeFeedSection { const DeepCollectionEquality().equals(other._items, _items)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, typename, title, uri, const DeepCollectionEquality().hash(_items)); - @JsonKey(ignore: true) + /// Create a copy of SpotifyHomeFeedSection + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl> @@ -1492,8 +1586,11 @@ abstract class _SpotifyHomeFeedSection implements SpotifyHomeFeedSection { String get uri; @override List get items; + + /// Create a copy of SpotifyHomeFeedSection + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1508,8 +1605,12 @@ mixin _$SpotifyHomeFeed { List get sections => throw _privateConstructorUsedError; + /// Serializes this SpotifyHomeFeed to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SpotifyHomeFeed + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SpotifyHomeFeedCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -1533,6 +1634,8 @@ class _$SpotifyHomeFeedCopyWithImpl<$Res, $Val extends SpotifyHomeFeed> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SpotifyHomeFeed + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1571,6 +1674,8 @@ class __$$SpotifyHomeFeedImplCopyWithImpl<$Res> _$SpotifyHomeFeedImpl _value, $Res Function(_$SpotifyHomeFeedImpl) _then) : super(_value, _then); + /// Create a copy of SpotifyHomeFeed + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1626,12 +1731,14 @@ class _$SpotifyHomeFeedImpl implements _SpotifyHomeFeed { const DeepCollectionEquality().equals(other._sections, _sections)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash( runtimeType, greeting, const DeepCollectionEquality().hash(_sections)); - @JsonKey(ignore: true) + /// Create a copy of SpotifyHomeFeed + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith => @@ -1659,8 +1766,11 @@ abstract class _SpotifyHomeFeed implements SpotifyHomeFeed { String get greeting; @override List get sections; + + /// Create a copy of SpotifyHomeFeed + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/models/spotify/recommendation_seeds.freezed.dart b/lib/models/spotify/recommendation_seeds.freezed.dart index adf4aab8..c55a4134 100644 --- a/lib/models/spotify/recommendation_seeds.freezed.dart +++ b/lib/models/spotify/recommendation_seeds.freezed.dart @@ -24,7 +24,9 @@ mixin _$GeneratePlaylistProviderInput { RecommendationSeeds? get min => throw _privateConstructorUsedError; RecommendationSeeds? get target => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $GeneratePlaylistProviderInputCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -62,6 +64,8 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res, // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -105,6 +109,8 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res, ) as $Val); } + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $RecommendationSeedsCopyWith<$Res>? get max { @@ -117,6 +123,8 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res, }); } + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $RecommendationSeedsCopyWith<$Res>? get min { @@ -129,6 +137,8 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res, }); } + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $RecommendationSeedsCopyWith<$Res>? get target { @@ -178,6 +188,8 @@ class __$$GeneratePlaylistProviderInputImplCopyWithImpl<$Res> $Res Function(_$GeneratePlaylistProviderInputImpl) _then) : super(_value, _then); + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -283,7 +295,9 @@ class _$GeneratePlaylistProviderInputImpl min, target); - @JsonKey(ignore: true) + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$GeneratePlaylistProviderInputImplCopyWith< @@ -317,8 +331,11 @@ abstract class _GeneratePlaylistProviderInput RecommendationSeeds? get min; @override RecommendationSeeds? get target; + + /// Create a copy of GeneratePlaylistProviderInput + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$GeneratePlaylistProviderInputImplCopyWith< _$GeneratePlaylistProviderInputImpl> get copyWith => throw _privateConstructorUsedError; @@ -347,8 +364,12 @@ mixin _$RecommendationSeeds { num? get timeSignature => throw _privateConstructorUsedError; num? get valence => throw _privateConstructorUsedError; + /// Serializes this RecommendationSeeds to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of RecommendationSeeds + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $RecommendationSeedsCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -386,6 +407,8 @@ class _$RecommendationSeedsCopyWithImpl<$Res, $Val extends RecommendationSeeds> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of RecommendationSeeds + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -498,6 +521,8 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res> $Res Function(_$RecommendationSeedsImpl) _then) : super(_value, _then); + /// Create a copy of RecommendationSeeds + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -665,7 +690,7 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { (identical(other.valence, valence) || other.valence == valence)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash( runtimeType, @@ -684,7 +709,9 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { timeSignature, valence); - @JsonKey(ignore: true) + /// Create a copy of RecommendationSeeds + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith => @@ -749,8 +776,11 @@ abstract class _RecommendationSeeds implements RecommendationSeeds { num? get timeSignature; @override num? get valence; + + /// Create a copy of RecommendationSeeds + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/modules/library/local_folder/cache_export_dialog.dart b/lib/modules/library/local_folder/cache_export_dialog.dart new file mode 100644 index 00000000..1d1421be --- /dev/null +++ b/lib/modules/library/local_folder/cache_export_dialog.dart @@ -0,0 +1,139 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:gap/gap.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:path/path.dart'; +import 'package:spotube/extensions/context.dart'; +import 'package:spotube/services/logger/logger.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; + +final codecs = SourceCodecs.values.map((s) => s.name); + +class LocalFolderCacheExportDialog extends HookConsumerWidget { + final Directory exportDir; + final Directory cacheDir; + const LocalFolderCacheExportDialog({ + super.key, + required this.exportDir, + required this.cacheDir, + }); + + @override + Widget build(BuildContext context, ref) { + final ThemeData(:textTheme, :colorScheme) = Theme.of(context); + + final files = useState>([]); + final filesExported = useState(0); + + useEffect(() { + final stream = cacheDir.list().where( + (event) => + event is File && + codecs.contains(extension(event.path).replaceAll(".", "")), + ); + + stream.listen( + (event) { + files.value = [...files.value, event as File]; + }, + onError: (e, stack) { + AppLogger.reportError(e, stack); + }, + ); + return null; + }, []); + + useEffect(() { + if (filesExported.value == files.value.length && + filesExported.value > 0) { + Navigator.of(context).pop(); + } + return null; + }, [filesExported.value, files.value]); + + final isExportInProgress = + filesExported.value > 0 && filesExported.value != files.value.length; + + return AlertDialog( + title: Text(context.l10n.export_cache_files), + content: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: filesExported.value == 0 + ? Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.l10n.found_n_files(files.value.length.toString()), + ), + const Gap(10), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: context.l10n.export_cache_confirmation, + ), + TextSpan( + text: "\n${exportDir.path}?", + style: textTheme.labelMedium!.copyWith( + color: colorScheme.secondary, + ), + ), + ], + ), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.l10n.exported_n_out_of_m_files( + files.value.length.toString(), + filesExported.value.toString(), + ), + ), + const Gap(10), + LinearProgressIndicator( + value: filesExported.value / files.value.length, + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: isExportInProgress + ? null + : () { + Navigator.of(context).pop(); + }, + child: Text(context.l10n.cancel), + ), + TextButton( + onPressed: isExportInProgress + ? null + : () async { + for (final file in files.value) { + try { + final destinationFile = File( + join(exportDir.path, basename(file.path)), + ); + + if (await destinationFile.exists()) { + await destinationFile.delete(); + } + await file.copy(destinationFile.path); + filesExported.value++; + } catch (e, stack) { + AppLogger.reportError(e, stack); + continue; + } + } + }, + child: Text(context.l10n.export), + ), + ], + ); + } +} diff --git a/lib/modules/library/local_folder/local_folder_item.dart b/lib/modules/library/local_folder/local_folder_item.dart index 02e47a53..a965a42d 100644 --- a/lib/modules/library/local_folder/local_folder_item.dart +++ b/lib/modules/library/local_folder/local_folder_item.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -10,6 +11,7 @@ import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/extensions/string.dart'; import 'package:spotube/hooks/utils/use_brightness_value.dart'; import 'package:spotube/pages/library/local_folder.dart'; import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; @@ -28,8 +30,10 @@ class LocalFolderItem extends HookConsumerWidget { final downloadFolder = ref.watch(userPreferencesProvider.select((s) => s.downloadLocation)); + final cacheFolder = useFuture(UserPreferencesNotifier.getMusicCacheDir()); final isDownloadFolder = folder == downloadFolder; + final isCacheFolder = folder == cacheFolder.data; final Uri(:pathSegments) = Uri.parse( folder @@ -62,6 +66,7 @@ class LocalFolderItem extends HookConsumerWidget { LocalLibraryPage.name, queryParameters: { if (isDownloadFolder) "downloads": "true", + if (isCacheFolder) "cache": "true", }, extra: folder, ); @@ -123,7 +128,9 @@ class LocalFolderItem extends HookConsumerWidget { child: Text( isDownloadFolder ? context.l10n.downloads - : basename(folder), + : isCacheFolder + ? context.l10n.cache_folder.capitalize() + : basename(folder), style: const TextStyle(fontWeight: FontWeight.bold), textAlign: TextAlign.center, ), diff --git a/lib/modules/library/user_local_tracks.dart b/lib/modules/library/user_local_tracks.dart index 926b4e80..23fb3be0 100644 --- a/lib/modules/library/user_local_tracks.dart +++ b/lib/modules/library/user_local_tracks.dart @@ -30,6 +30,7 @@ class UserLocalTracks extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { + final cacheDir = useFuture(UserPreferencesNotifier.getMusicCacheDir()); final preferencesNotifier = ref.watch(userPreferencesProvider.notifier); final preferences = ref.watch(userPreferencesProvider); @@ -83,12 +84,16 @@ class UserLocalTracks extends HookConsumerWidget { crossAxisSpacing: 10, mainAxisSpacing: 10, ), - itemCount: preferences.localLibraryLocation.length + 1, + itemCount: preferences.localLibraryLocation.length + + 1 + + (cacheDir.hasData ? 1 : 0), itemBuilder: (context, index) { return LocalFolderItem( folder: index == 0 ? preferences.downloadLocation - : preferences.localLibraryLocation[index - 1], + : index == 1 && cacheDir.hasData + ? cacheDir.data! + : preferences.localLibraryLocation[index - 1], ); }, ), diff --git a/lib/pages/home/genres/genre_playlists.dart b/lib/pages/home/genres/genre_playlists.dart index 58436bcf..04658965 100644 --- a/lib/pages/home/genres/genre_playlists.dart +++ b/lib/pages/home/genres/genre_playlists.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; +import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotify/spotify.dart' hide Offset; import 'package:spotube/collections/fake.dart'; +import 'package:spotube/hooks/utils/use_custom_status_bar_color.dart'; import 'package:spotube/modules/playlist/playlist_card.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; @@ -27,6 +29,14 @@ class GenrePlaylistsPage extends HookConsumerWidget { final playlistsNotifier = ref.read(categoryPlaylistsProvider(category.id!).notifier); final scrollController = useScrollController(); + final routeName = GoRouterState.of(context).name; + + useCustomStatusBarColor( + Colors.black, + routeName == GenrePlaylistsPage.name, + noSetBGColor: true, + automaticSystemUiAdjustment: false, + ); return Scaffold( appBar: kIsDesktop diff --git a/lib/pages/library/local_folder.dart b/lib/pages/library/local_folder.dart index ad1d5d82..c2848b24 100644 --- a/lib/pages/library/local_folder.dart +++ b/lib/pages/library/local_folder.dart @@ -1,4 +1,8 @@ +import 'dart:io'; +import 'dart:math'; + import 'package:collection/collection.dart'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; @@ -6,6 +10,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; import 'package:spotube/collections/spotube_icons.dart'; +import 'package:spotube/extensions/string.dart'; +import 'package:spotube/modules/library/local_folder/cache_export_dialog.dart'; import 'package:spotube/modules/library/user_local_tracks.dart'; import 'package:spotube/components/expandable_search/expandable_search.dart'; import 'package:spotube/components/fallbacks/not_found.dart'; @@ -18,6 +24,7 @@ import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/local_track.dart'; import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/service_utils.dart'; class LocalLibraryPage extends HookConsumerWidget { @@ -25,7 +32,13 @@ class LocalLibraryPage extends HookConsumerWidget { final String location; final bool isDownloads; - const LocalLibraryPage(this.location, {super.key, this.isDownloads = false}); + final bool isCache; + const LocalLibraryPage( + this.location, { + super.key, + this.isDownloads = false, + this.isCache = false, + }); Future playLocalTracks( WidgetRef ref, @@ -52,6 +65,8 @@ class LocalLibraryPage extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { + final ThemeData(:textTheme) = Theme.of(context); + final sortBy = useState(SortBy.none); final playlist = ref.watch(audioPlayerProvider); final trackSnapshot = ref.watch(localTracksProvider); @@ -65,14 +80,133 @@ class LocalLibraryPage extends HookConsumerWidget { final controller = useScrollController(); + final directorySize = useMemoized(() async { + final dir = Directory(location); + final files = await dir.list(recursive: true).toList(); + + final filesLength = + await Future.wait(files.whereType().map((e) => e.length())); + + return (filesLength.sum.toInt() / pow(10, 9)).toStringAsFixed(2); + }, [location]); + return SafeArea( bottom: false, child: Scaffold( appBar: PageWindowTitleBar( leading: const BackButton(), centerTitle: true, - title: Text(isDownloads ? context.l10n.downloads : location), + title: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + isDownloads + ? context.l10n.downloads + : isCache + ? context.l10n.cache_folder.capitalize() + : location, + style: textTheme.titleLarge, + ), + FutureBuilder( + future: directorySize, + builder: (context, snapshot) { + return Text( + "${(snapshot.data ?? 0)} GB", + style: textTheme.labelSmall, + ); + }, + ) + ], + ), backgroundColor: Colors.transparent, + actions: [ + if (isCache) ...[ + IconButton( + iconSize: 16, + icon: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(SpotubeIcons.delete), + Text( + context.l10n.clear_cache, + style: textTheme.labelSmall, + ) + ], + ), + onPressed: () async { + final accepted = await showDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text(context.l10n.clear_cache_confirmation), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(false); + }, + child: Text(context.l10n.decline), + ), + TextButton( + onPressed: () async { + Navigator.of(context).pop(true); + }, + child: Text(context.l10n.accept), + ), + ], + ), + ); + + if (accepted ?? false) return; + + final cacheDir = Directory( + await UserPreferencesNotifier.getMusicCacheDir(), + ); + + if (cacheDir.existsSync()) { + await cacheDir.delete(recursive: true); + } + }, + ), + IconButton( + iconSize: 16, + icon: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(SpotubeIcons.export), + Text( + context.l10n.export, + style: textTheme.labelSmall, + ) + ], + ), + onPressed: () async { + final exportPath = + await FilePicker.platform.getDirectoryPath(); + + if (exportPath == null) return; + final exportDirectory = Directory(exportPath); + + if (!exportDirectory.existsSync()) { + await exportDirectory.create(recursive: true); + } + + final cacheDir = Directory( + await UserPreferencesNotifier.getMusicCacheDir()); + + if (!context.mounted) return; + await showDialog( + context: context, + builder: (context) { + return LocalFolderCacheExportDialog( + cacheDir: cacheDir, + exportDir: exportDirectory, + ); + }, + ); + }, + ), + ] + ], ), body: Column( children: [ diff --git a/lib/pages/lyrics/lyrics.dart b/lib/pages/lyrics/lyrics.dart index 423212f3..0f4f9473 100644 --- a/lib/pages/lyrics/lyrics.dart +++ b/lib/pages/lyrics/lyrics.dart @@ -38,10 +38,11 @@ class LyricsPage extends HookConsumerWidget { ); final palette = usePaletteColor(albumArt, ref); final mediaQuery = MediaQuery.of(context); + final route = ModalRoute.of(context); - useCustomStatusBarColor( + final resetStatusBar = useCustomStatusBarColor( palette.color, - true, + route?.isCurrent ?? false, noSetBGColor: true, ); @@ -81,53 +82,57 @@ class LyricsPage extends HookConsumerWidget { ); if (isModal) { - return DefaultTabController( - length: 2, - child: SafeArea( - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15), - child: Container( - clipBehavior: Clip.hardEdge, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface.withOpacity(.4), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(10), - topRight: Radius.circular(10), + return PopScope( + canPop: true, + onPopInvokedWithResult: (_, __) => resetStatusBar(), + child: DefaultTabController( + length: 2, + child: SafeArea( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15), + child: Container( + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface.withOpacity(.4), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + topRight: Radius.circular(10), + ), ), - ), - child: Column( - children: [ - const SizedBox(height: 5), - Container( - height: 7, - width: 150, - decoration: BoxDecoration( - color: palette.titleTextColor, - borderRadius: BorderRadius.circular(10), - ), - ), - AppBar( - leadingWidth: double.infinity, - leading: tabbar, - backgroundColor: Colors.transparent, - automaticallyImplyLeading: false, - actions: [ - IconButton( - icon: const Icon(SpotubeIcons.minimize), - onPressed: () => Navigator.of(context).pop(), + child: Column( + children: [ + const SizedBox(height: 5), + Container( + height: 7, + width: 150, + decoration: BoxDecoration( + color: palette.titleTextColor, + borderRadius: BorderRadius.circular(10), ), - const SizedBox(width: 5), - ], - ), - Expanded( - child: TabBarView( - children: [ - SyncedLyrics(palette: palette, isModal: isModal), - PlainLyrics(palette: palette, isModal: isModal), + ), + AppBar( + leadingWidth: double.infinity, + leading: tabbar, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + actions: [ + IconButton( + icon: const Icon(SpotubeIcons.minimize), + onPressed: () => Navigator.of(context).pop(), + ), + const SizedBox(width: 5), ], ), - ), - ], + Expanded( + child: TabBarView( + children: [ + SyncedLyrics(palette: palette, isModal: isModal), + PlainLyrics(palette: palette, isModal: isModal), + ], + ), + ), + ], + ), ), ), ), diff --git a/lib/pages/settings/sections/playback.dart b/lib/pages/settings/sections/playback.dart index 1101f424..f8868789 100644 --- a/lib/pages/settings/sections/playback.dart +++ b/lib/pages/settings/sections/playback.dart @@ -1,4 +1,5 @@ import 'package:collection/collection.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; @@ -15,6 +16,7 @@ import 'package:spotube/provider/audio_player/sources/piped_instances_provider.d import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/utils/platform.dart'; class SettingsPlaybackSection extends HookConsumerWidget { const SettingsPlaybackSection({super.key}); @@ -239,6 +241,30 @@ class SettingsPlaybackSection extends HookConsumerWidget { ) : const SizedBox.shrink(), ), + SwitchListTile( + title: Text(context.l10n.cache_music), + subtitle: kIsMobile + ? null + : Text.rich( + TextSpan( + children: [ + TextSpan(text: "${context.l10n.open} "), + TextSpan( + text: context.l10n.cache_folder.toLowerCase(), + recognizer: TapGestureRecognizer() + ..onTap = preferencesNotifier.openCacheFolder, + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + ), + ) + ], + ), + ), + secondary: const Icon(SpotubeIcons.cache), + value: preferences.cacheMusic, + onChanged: preferencesNotifier.setCacheMusic, + ), ListTile( leading: const Icon(SpotubeIcons.playlistRemove), title: Text(context.l10n.blacklist), diff --git a/lib/provider/audio_player/audio_player_streams.dart b/lib/provider/audio_player/audio_player_streams.dart index 08550844..e52b6109 100644 --- a/lib/provider/audio_player/audio_player_streams.dart +++ b/lib/provider/audio_player/audio_player_streams.dart @@ -74,6 +74,7 @@ class AudioPlayerStreamListeners { StreamSubscription subscribeToPlaylist() { return audioPlayer.playlistStream.listen((mpvPlaylist) { try { + if (audioPlayerState.activeTrack == null) return; notificationService.addTrack(audioPlayerState.activeTrack!); discord.updatePresence(audioPlayerState.activeTrack!); updatePalette(); diff --git a/lib/provider/download_manager_provider.dart b/lib/provider/download_manager_provider.dart index 8c9ffadf..5e9eda20 100644 --- a/lib/provider/download_manager_provider.dart +++ b/lib/provider/download_manager_provider.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'dart:io'; +import 'package:spotube/extensions/track.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:metadata_god/metadata_god.dart'; import 'package:path/path.dart'; @@ -16,6 +16,7 @@ import 'package:spotube/services/download_manager/download_manager.dart'; import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/utils/primitive_utils.dart'; +import 'package:spotube/utils/service_utils.dart'; class DownloadManagerProvider extends ChangeNotifier { DownloadManagerProvider({required this.ref}) @@ -53,33 +54,16 @@ class DownloadManagerProvider extends ChangeNotifier { await oldFile.delete(); } - final imageBytes = await downloadImage( + final imageBytes = await ServiceUtils.downloadImage( (track.album?.images).asUrlString( placeholder: ImagePlaceholder.albumArt, index: 1, ), ); - final metadata = Metadata( - title: track.name, - artist: track.artists?.map((a) => a.name).join(", "), - album: track.album?.name, - albumArtist: track.artists?.map((a) => a.name).join(", "), - year: track.album?.releaseDate != null - ? int.tryParse(track.album!.releaseDate!.split("-").first) ?? 1969 - : 1969, - trackNumber: track.trackNumber, - discNumber: track.discNumber, - durationMs: track.durationMs?.toDouble() ?? 0.0, - fileSize: BigInt.from(await file.length()), - trackTotal: track.album?.tracks?.length ?? 0, - picture: imageBytes != null - ? Picture( - data: imageBytes, - // Spotify images are always JPEGs - mimeType: 'image/jpeg', - ) - : null, + final metadata = track.toMetadata( + fileLength: await file.length(), + imageBytes: imageBytes, ); await MetadataGod.writeMetadata( @@ -116,29 +100,6 @@ class DownloadManagerProvider extends ChangeNotifier { final Set $backHistory; final DownloadManager dl; - /// Spotify Images are always JPEGs - Future downloadImage( - String imageUrl, - ) async { - try { - final fileStream = DefaultCacheManager().getImageFile(imageUrl); - - final bytes = List.empty(growable: true); - - await for (final data in fileStream) { - if (data is FileInfo) { - bytes.addAll(data.file.readAsBytesSync()); - break; - } - } - - return Uint8List.fromList(bytes); - } catch (e, stackTrace) { - AppLogger.reportError(e, stackTrace); - return null; - } - } - String getTrackFileUrl(Track track) { final name = "${track.name} - ${track.artists?.asString() ?? ""}.${downloadCodec.name}"; diff --git a/lib/provider/local_tracks/local_tracks_provider.dart b/lib/provider/local_tracks/local_tracks_provider.dart index 513fd9b9..3245ff2d 100644 --- a/lib/provider/local_tracks/local_tracks_provider.dart +++ b/lib/provider/local_tracks/local_tracks_provider.dart @@ -44,14 +44,23 @@ final localTracksProvider = userPreferencesProvider.select((s) => s.downloadLocation), ); final downloadDir = Directory(downloadLocation); + final cacheDir = + Directory(await UserPreferencesNotifier.getMusicCacheDir()); if (!await downloadDir.exists()) { await downloadDir.create(recursive: true); } + if (!await cacheDir.exists()) { + await cacheDir.create(recursive: true); + } final localLibraryLocations = ref.watch( userPreferencesProvider.select((s) => s.localLibraryLocation), ); - for (final location in [downloadLocation, ...localLibraryLocations]) { + for (final location in [ + downloadLocation, + cacheDir.path, + ...localLibraryLocations + ]) { if (location.isEmpty) continue; final entities = []; if (await Directory(location).exists()) { diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index 93f5dac2..34317aa1 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -1,14 +1,27 @@ +import 'dart:io'; + import 'package:dio/dio.dart' hide Response; +import 'package:dio/dio.dart' as dio_lib; import 'package:flutter/foundation.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:metadata_god/metadata_god.dart'; +import 'package:path/path.dart'; import 'package:shelf/shelf.dart'; +import 'package:spotube/extensions/artist_simple.dart'; +import 'package:spotube/extensions/image.dart'; +import 'package:spotube/extensions/track.dart'; +import 'package:spotube/models/parser/range_headers.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/state.dart'; + import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/server/sourced_track.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/logger/logger.dart'; +import 'package:spotube/services/sourced_track/enums.dart'; +import 'package:spotube/services/sourced_track/sourced_track.dart'; +import 'package:spotube/utils/service_utils.dart'; class ServerPlaybackRoutes { final Ref ref; @@ -18,19 +31,139 @@ class ServerPlaybackRoutes { ServerPlaybackRoutes(this.ref) : dio = Dio(); - /// @get('/stream/') - Future getStreamTrackId(Request request, String trackId) async { - final options = Options( + Future<({dio_lib.Response response, Uint8List? bytes})> + streamTrack( + SourcedTrack track, + Map headers, + ) async { + final trackCacheFile = File( + join( + await UserPreferencesNotifier.getMusicCacheDir(), + '${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}', + ), + ); + final trackPartialCacheFile = File("${trackCacheFile.path}.part"); + + var options = Options( headers: { - ...request.headers, + ...headers, "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", "Cache-Control": "max-age=0", "Connection": "keep-alive", + "host": Uri.parse(track.url).host, }, - responseType: ResponseType.stream, + responseType: ResponseType.bytes, validateStatus: (status) => status! < 400, ); + + final headersRes = await Future.value( + dio.head( + track.url, + options: options, + ), + ).catchError((_) async => null); + + final contentLength = headersRes?.headers.value("content-length"); + + if (await trackCacheFile.exists() && userPreferences.cacheMusic) { + final bytes = await trackCacheFile.readAsBytes(); + final cachedFileLength = bytes.length; + + return ( + response: dio_lib.Response( + statusCode: 200, + headers: Headers.fromMap({ + "content-type": ["audio/${track.codec.name}"], + "content-length": ["$cachedFileLength"], + "accept-ranges": ["bytes"], + "content-range": ["bytes 0-$cachedFileLength/$cachedFileLength"], + }), + requestOptions: RequestOptions(path: track.url), + ), + bytes: bytes, + ); + } + + /// Forcing partial content range as mpv sometimes greedily wants + /// everything at one go. Slows down overall streaming. + final range = RangeHeader.parse(headers["range"] ?? ""); + final contentPartialLength = int.tryParse(contentLength ?? ""); + if ((range.end == null) && + contentPartialLength != null && + range.start == 0) { + options = options.copyWith( + headers: { + ...?options.headers, + "range": "$range${(contentPartialLength * 0.3).ceil()}", + }, + ); + } + + final res = + await dio.get(track.url, options: options).catchError( + (e, stack) async { + final sourcedTrack = await ref + .read(sourcedTrackProvider(SpotubeMedia(track)).notifier) + .switchToAlternativeSources(); + + ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); + + return await dio.get(sourcedTrack!.url, options: options); + }, + ); + + final bytes = res.data; + + if (bytes == null || !userPreferences.cacheMusic) { + return (response: res, bytes: bytes); + } + + final contentRange = + ContentRangeHeader.parse(res.headers.value("content-range") ?? ""); + + if (!await trackPartialCacheFile.exists()) { + await trackPartialCacheFile.create(recursive: true); + } + + // Write the stream to the file based on the range + final partialCacheFile = + await trackPartialCacheFile.open(mode: FileMode.writeOnlyAppend); + int fileLength = 0; + try { + await partialCacheFile.setPosition(contentRange.start); + await partialCacheFile.writeFrom(bytes); + fileLength = await partialCacheFile.length(); + } finally { + await partialCacheFile.close(); + } + + if (fileLength == contentRange.total) { + await trackPartialCacheFile.rename(trackCacheFile.path); + } + + if (contentRange.total == fileLength && track.codec != SourceCodecs.weba) { + final imageBytes = await ServiceUtils.downloadImage( + (track.album?.images).asUrlString( + placeholder: ImagePlaceholder.albumArt, + index: 1, + ), + ); + + await MetadataGod.writeMetadata( + file: trackCacheFile.path, + metadata: track.toMetadata( + fileLength: fileLength, + imageBytes: imageBytes, + ), + ); + } + + return (bytes: bytes, response: res); + } + + /// @get('/stream/') + Future getStreamTrackId(Request request, String trackId) async { try { final track = playlist.tracks.firstWhere((element) => element.id == trackId); @@ -41,48 +174,13 @@ class ServerPlaybackRoutes { : await ref.read(sourcedTrackProvider(SpotubeMedia(track)).future); ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); - final res = await dio - .get( - sourcedTrack!.url, - options: options.copyWith( - headers: { - ...options.headers!, - "host": Uri.parse(sourcedTrack.url).host, - }, - ), - ) - .catchError((e, stack) async { - final sourcedTrack = await ref - .read(sourcedTrackProvider(SpotubeMedia(track)).notifier) - .switchToAlternativeSources(); - ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); - - return await dio.get( - sourcedTrack!.url, - options: options.copyWith( - headers: { - ...options.headers!, - "host": Uri.parse(sourcedTrack.url).host, - }, - ), - ); - }); - - final audioStream = - (res.data?.stream as Stream?)?.asBroadcastStream(); - - audioStream!.listen( - (event) {}, - cancelOnError: true, - ); + final (bytes: audioBytes, response: res) = + await streamTrack(sourcedTrack!, request.headers); return Response( res.statusCode!, - body: audioStream, - context: { - "shelf.io.buffer_output": false, - }, + body: audioBytes, headers: res.headers.map, ); } catch (e, stack) { diff --git a/lib/provider/user_preferences/user_preferences_provider.dart b/lib/provider/user_preferences/user_preferences_provider.dart index 5fe3cb11..053f0994 100644 --- a/lib/provider/user_preferences/user_preferences_provider.dart +++ b/lib/provider/user_preferences/user_preferences_provider.dart @@ -2,7 +2,7 @@ import 'package:drift/drift.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:path/path.dart'; -import 'package:path_provider/path_provider.dart'; +import 'package:path_provider/path_provider.dart' as paths; import 'package:spotify/spotify.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; @@ -14,6 +14,7 @@ import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; +import 'package:open_file/open_file.dart'; typedef UserPreferences = PreferencesTableData; @@ -71,10 +72,10 @@ class UserPreferencesNotifier extends Notifier { if (kIsAndroid) return "/storage/emulated/0/Download/Spotube"; if (kIsMacOS) { - return join((await getLibraryDirectory()).path, "Caches"); + return join((await paths.getLibraryDirectory()).path, "Caches"); } - return getDownloadsDirectory().then((dir) { + return paths.getDownloadsDirectory().then((dir) { return join(dir!.path, "Spotube"); }); } @@ -95,6 +96,30 @@ class UserPreferencesNotifier extends Notifier { await query.replace(PreferencesTableCompanion.insert()); } + static Future getMusicCacheDir() async { + if (kIsAndroid) { + final dir = + await paths.getExternalCacheDirectories().then((dirs) => dirs!.first); + if (!await dir.exists()) { + await dir.create(recursive: true); + } + return join(dir.path, 'Cached Tracks'); + } + + final dir = await paths.getApplicationCacheDirectory(); + return join(dir.path, 'cached_tracks'); + } + + Future openCacheFolder() async { + try { + final filePath = await getMusicCacheDir(); + + await OpenFile.open(filePath); + } catch (e, stack) { + AppLogger.reportError(e, stack); + } + } + void setStreamMusicCodec(SourceCodecs codec) { setData(PreferencesTableCompanion(streamMusicCodec: Value(codec))); } @@ -211,6 +236,10 @@ class UserPreferencesNotifier extends Notifier { void setEnableConnect(bool enable) { setData(PreferencesTableCompanion(enableConnect: Value(enable))); } + + void setCacheMusic(bool cache) { + setData(PreferencesTableCompanion(cacheMusic: Value(cache))); + } } final userPreferencesProvider = diff --git a/lib/services/song_link/song_link.freezed.dart b/lib/services/song_link/song_link.freezed.dart index 0a1af8a9..c704cde3 100644 --- a/lib/services/song_link/song_link.freezed.dart +++ b/lib/services/song_link/song_link.freezed.dart @@ -30,8 +30,12 @@ mixin _$SongLink { String? get nativeAppUriMobile => throw _privateConstructorUsedError; String? get nativeAppUriDesktop => throw _privateConstructorUsedError; + /// Serializes this SongLink to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of SongLink + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $SongLinkCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -63,6 +67,8 @@ class _$SongLinkCopyWithImpl<$Res, $Val extends SongLink> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of SongLink + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -145,6 +151,8 @@ class __$$SongLinkImplCopyWithImpl<$Res> _$SongLinkImpl _value, $Res Function(_$SongLinkImpl) _then) : super(_value, _then); + /// Create a copy of SongLink + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -261,12 +269,14 @@ class _$SongLinkImpl implements _SongLink { other.nativeAppUriDesktop == nativeAppUriDesktop)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, displayName, linkId, platform, show, uniqueId, country, url, nativeAppUriMobile, nativeAppUriDesktop); - @JsonKey(ignore: true) + /// Create a copy of SongLink + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$SongLinkImplCopyWith<_$SongLinkImpl> get copyWith => @@ -313,8 +323,11 @@ abstract class _SongLink implements SongLink { String? get nativeAppUriMobile; @override String? get nativeAppUriDesktop; + + /// Create a copy of SongLink + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$SongLinkImplCopyWith<_$SongLinkImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/utils/migrations/adapters.freezed.dart b/lib/utils/migrations/adapters.freezed.dart index 339ec0e5..40dfd662 100644 --- a/lib/utils/migrations/adapters.freezed.dart +++ b/lib/utils/migrations/adapters.freezed.dart @@ -53,8 +53,12 @@ mixin _$UserPreferences { bool get endlessPlayback => throw _privateConstructorUsedError; bool get enableConnect => throw _privateConstructorUsedError; + /// Serializes this UserPreferences to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of UserPreferences + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $UserPreferencesCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -110,6 +114,8 @@ class _$UserPreferencesCopyWithImpl<$Res, $Val extends UserPreferences> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of UserPreferences + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -290,6 +296,8 @@ class __$$UserPreferencesImplCopyWithImpl<$Res> _$UserPreferencesImpl _value, $Res Function(_$UserPreferencesImpl) _then) : super(_value, _then); + /// Create a copy of UserPreferences + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -605,7 +613,7 @@ class _$UserPreferencesImpl implements _UserPreferences { other.enableConnect == enableConnect)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hashAll([ runtimeType, @@ -635,7 +643,9 @@ class _$UserPreferencesImpl implements _UserPreferences { enableConnect ]); - @JsonKey(ignore: true) + /// Create a copy of UserPreferences + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$UserPreferencesImplCopyWith<_$UserPreferencesImpl> get copyWith => @@ -744,8 +754,11 @@ abstract class _UserPreferences implements UserPreferences { bool get endlessPlayback; @override bool get enableConnect; + + /// Create a copy of UserPreferences + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$UserPreferencesImplCopyWith<_$UserPreferencesImpl> get copyWith => throw _privateConstructorUsedError; } @@ -812,8 +825,13 @@ mixin _$PlaybackHistoryItem { required TResult orElse(), }) => throw _privateConstructorUsedError; + + /// Serializes this PlaybackHistoryItem to a JSON map. Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) + + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) $PlaybackHistoryItemCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -837,6 +855,8 @@ class _$PlaybackHistoryItemCopyWithImpl<$Res, $Val extends PlaybackHistoryItem> // ignore: unused_field final $Res Function($Val) _then; + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -873,6 +893,8 @@ class __$$PlaybackHistoryPlaylistImplCopyWithImpl<$Res> $Res Function(_$PlaybackHistoryPlaylistImpl) _then) : super(_value, _then); + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -925,11 +947,13 @@ class _$PlaybackHistoryPlaylistImpl implements PlaybackHistoryPlaylist { other.playlist == playlist)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, date, playlist); - @JsonKey(ignore: true) + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$PlaybackHistoryPlaylistImplCopyWith<_$PlaybackHistoryPlaylistImpl> @@ -1023,8 +1047,11 @@ abstract class PlaybackHistoryPlaylist implements PlaybackHistoryItem { @override DateTime get date; PlaylistSimple get playlist; + + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$PlaybackHistoryPlaylistImplCopyWith<_$PlaybackHistoryPlaylistImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1048,6 +1075,8 @@ class __$$PlaybackHistoryAlbumImplCopyWithImpl<$Res> $Res Function(_$PlaybackHistoryAlbumImpl) _then) : super(_value, _then); + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1099,11 +1128,13 @@ class _$PlaybackHistoryAlbumImpl implements PlaybackHistoryAlbum { (identical(other.album, album) || other.album == album)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, date, album); - @JsonKey(ignore: true) + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$PlaybackHistoryAlbumImplCopyWith<_$PlaybackHistoryAlbumImpl> @@ -1198,8 +1229,11 @@ abstract class PlaybackHistoryAlbum implements PlaybackHistoryItem { @override DateTime get date; AlbumSimple get album; + + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$PlaybackHistoryAlbumImplCopyWith<_$PlaybackHistoryAlbumImpl> get copyWith => throw _privateConstructorUsedError; } @@ -1223,6 +1257,8 @@ class __$$PlaybackHistoryTrackImplCopyWithImpl<$Res> $Res Function(_$PlaybackHistoryTrackImpl) _then) : super(_value, _then); + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ @@ -1274,11 +1310,13 @@ class _$PlaybackHistoryTrackImpl implements PlaybackHistoryTrack { (identical(other.track, track) || other.track == track)); } - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, date, track); - @JsonKey(ignore: true) + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) @override @pragma('vm:prefer-inline') _$$PlaybackHistoryTrackImplCopyWith<_$PlaybackHistoryTrackImpl> @@ -1373,8 +1411,11 @@ abstract class PlaybackHistoryTrack implements PlaybackHistoryItem { @override DateTime get date; Track get track; + + /// Create a copy of PlaybackHistoryItem + /// with the given fields replaced by the non-null parameter values. @override - @JsonKey(ignore: true) + @JsonKey(includeFromJson: false, includeToJson: false) _$$PlaybackHistoryTrackImplCopyWith<_$PlaybackHistoryTrackImpl> get copyWith => throw _privateConstructorUsedError; } diff --git a/lib/utils/service_utils.dart b/lib/utils/service_utils.dart index c00f07ab..bdc3877a 100644 --- a/lib/utils/service_utils.dart +++ b/lib/utils/service_utils.dart @@ -1,4 +1,7 @@ +import 'dart:typed_data'; + import 'package:dio/dio.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:go_router/go_router.dart'; import 'package:html/dom.dart' hide Text; import 'package:spotify/spotify.dart'; @@ -8,6 +11,7 @@ import 'package:spotube/modules/root/update_dialog.dart'; import 'package:spotube/models/lyrics.dart'; import 'package:spotube/provider/database/database.dart'; import 'package:spotube/services/dio/dio.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/utils/primitive_utils.dart'; @@ -449,4 +453,27 @@ abstract class ServiceUtils { ); } } + + /// Spotify Images are always JPEGs + static Future downloadImage( + String imageUrl, + ) async { + try { + final fileStream = DefaultCacheManager().getImageFile(imageUrl); + + final bytes = List.empty(growable: true); + + await for (final data in fileStream) { + if (data is FileInfo) { + bytes.addAll(data.file.readAsBytesSync()); + break; + } + } + + return Uint8List.fromList(bytes); + } catch (e, stackTrace) { + AppLogger.reportError(e, stackTrace); + return null; + } + } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index feeba39f..06c33e05 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); + g_autoptr(FlPluginRegistrar) open_file_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); + open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 3f37d5e6..e98b18eb 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -9,6 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST gtk local_notifier media_kit_libs_linux + open_file_linux screen_retriever_linux sqlite3_flutter_libs system_theme diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 69e363a6..608a854e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -16,6 +16,7 @@ import flutter_inappwebview_macos import flutter_secure_storage_macos import local_notifier import media_kit_libs_macos_audio +import open_file_mac import package_info_plus import path_provider_foundation import screen_retriever_macos @@ -39,6 +40,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) LocalNotifierPlugin.register(with: registry.registrar(forPlugin: "LocalNotifierPlugin")) MediaKitLibsMacosAudioPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosAudioPlugin")) + OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 7afbf553..fee42515 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -30,6 +30,8 @@ PODS: - FlutterMacOS - metadata_god (0.0.1): - FlutterMacOS + - open_file_mac (0.0.1): + - FlutterMacOS - OrderedSet (6.0.3) - package_info_plus (0.0.1): - FlutterMacOS @@ -87,6 +89,7 @@ DEPENDENCIES: - media_kit_libs_macos_audio (from `Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_audio/macos`) - media_kit_native_event_loop (from `Flutter/ephemeral/.symlinks/plugins/media_kit_native_event_loop/macos`) - metadata_god (from `Flutter/ephemeral/.symlinks/plugins/metadata_god/macos`) + - open_file_mac (from `Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) @@ -134,6 +137,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/media_kit_native_event_loop/macos metadata_god: :path: Flutter/ephemeral/.symlinks/plugins/metadata_god/macos + open_file_mac: + :path: Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos path_provider_foundation: @@ -171,6 +176,7 @@ SPEC CHECKSUMS: media_kit_libs_macos_audio: 3871782a4f3f84c77f04d7666c87800a781c24da media_kit_native_event_loop: 7321675377cb9ae8596a29bddf3a3d2b5e8792c5 metadata_god: 829f61208b44ac1173e7cd32ab740d8776be5435 + open_file_mac: 0e554648e2a87ce59e9438e3e5ca3e552e90d89a OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 @@ -186,4 +192,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 0d3963a09fc94f580682bd88480486da345dc3f0 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/pubspec.lock b/pubspec.lock index 4b0912dd..fd9c3961 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1555,6 +1555,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + open_file: + dependency: "direct main" + description: + name: open_file + sha256: d17e2bddf5b278cb2ae18393d0496aa4f162142ba97d1a9e0c30d476adf99c0e + url: "https://pub.dev" + source: hosted + version: "3.5.10" + open_file_android: + dependency: transitive + description: + name: open_file_android + sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + open_file_ios: + dependency: transitive + description: + name: open_file_ios + sha256: "02996f01e5f6863832068e97f8f3a5ef9b613516db6897f373b43b79849e4d07" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + open_file_linux: + dependency: transitive + description: + name: open_file_linux + sha256: d189f799eecbb139c97f8bc7d303f9e720954fa4e0fa1b0b7294767e5f2d7550 + url: "https://pub.dev" + source: hosted + version: "0.0.5" + open_file_mac: + dependency: transitive + description: + name: open_file_mac + sha256: "1440b1e37ceb0642208cfeb2c659c6cda27b25187a90635c9d1acb7d0584d324" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + open_file_platform_interface: + dependency: transitive + description: + name: open_file_platform_interface + sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + open_file_web: + dependency: transitive + description: + name: open_file_web + sha256: e3dbc9584856283dcb30aef5720558b90f88036360bd078e494ab80a80130c4f + url: "https://pub.dev" + source: hosted + version: "0.0.4" + open_file_windows: + dependency: transitive + description: + name: open_file_windows + sha256: d26c31ddf935a94a1a3aa43a23f4fff8a5ff4eea395fe7a8cb819cf55431c875 + url: "https://pub.dev" + source: hosted + version: "0.0.3" package_config: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 310d5121..4551f956 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -84,6 +84,7 @@ dependencies: media_kit_libs_audio: ^1.0.4 metadata_god: ^1.0.0 mime: ^1.0.2 + open_file: ^3.5.10 package_info_plus: ^6.0.0 palette_generator: ^0.3.3 path: ^1.9.0 diff --git a/test/drift/app_db/generated/schema.dart b/test/drift/app_db/generated/schema.dart index 1b2142be..9e67e542 100644 --- a/test/drift/app_db/generated/schema.dart +++ b/test/drift/app_db/generated/schema.dart @@ -1,8 +1,9 @@ +// dart format width=80 // GENERATED CODE, DO NOT EDIT BY HAND. // ignore_for_file: type=lint -//@dart=2.12 import 'package:drift/drift.dart'; import 'package:drift/internal/migrations.dart'; +import 'schema_v3.dart' as v3; import 'schema_v2.dart' as v2; import 'schema_v1.dart' as v1; @@ -10,6 +11,8 @@ class GeneratedHelper implements SchemaInstantiationHelper { @override GeneratedDatabase databaseForVersion(QueryExecutor db, int version) { switch (version) { + case 3: + return v3.DatabaseAtV3(db); case 2: return v2.DatabaseAtV2(db); case 1: @@ -19,5 +22,5 @@ class GeneratedHelper implements SchemaInstantiationHelper { } } - static const versions = const [1, 2]; + static const versions = const [1, 2, 3]; } diff --git a/test/drift/app_db/generated/schema_v1.dart b/test/drift/app_db/generated/schema_v1.dart index 9535d685..ca848561 100644 --- a/test/drift/app_db/generated/schema_v1.dart +++ b/test/drift/app_db/generated/schema_v1.dart @@ -1,11 +1,7 @@ +// dart format width=80 // GENERATED CODE, DO NOT EDIT BY HAND. // ignore_for_file: type=lint -//@dart=2.12 import 'package:drift/drift.dart'; -import 'package:flutter/material.dart' hide Table; -import 'package:spotify/spotify.dart'; -import 'package:spotube/services/sourced_track/enums.dart'; -import 'package:spotube/utils/migrations/adapters.dart'; class AuthenticationTable extends Table with TableInfo { diff --git a/test/drift/app_db/generated/schema_v2.dart b/test/drift/app_db/generated/schema_v2.dart index caf34ab9..c9642f86 100644 --- a/test/drift/app_db/generated/schema_v2.dart +++ b/test/drift/app_db/generated/schema_v2.dart @@ -1,11 +1,7 @@ +// dart format width=80 // GENERATED CODE, DO NOT EDIT BY HAND. // ignore_for_file: type=lint -//@dart=2.12 import 'package:drift/drift.dart'; -import 'package:flutter/material.dart' hide Table; -import 'package:spotify/spotify.dart'; -import 'package:spotube/services/sourced_track/enums.dart'; -import 'package:spotube/utils/migrations/adapters.dart'; class AuthenticationTable extends Table with TableInfo { diff --git a/test/drift/app_db/generated/schema_v3.dart b/test/drift/app_db/generated/schema_v3.dart new file mode 100644 index 00000000..f6416823 --- /dev/null +++ b/test/drift/app_db/generated/schema_v3.dart @@ -0,0 +1,3396 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class AuthenticationTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AuthenticationTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn cookie = GeneratedColumn( + 'cookie', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn accessToken = GeneratedColumn( + 'access_token', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn expiration = GeneratedColumn( + 'expiration', aliasedName, false, + type: DriftSqlType.dateTime, requiredDuringInsert: true); + @override + List get $columns => [id, cookie, accessToken, expiration]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'authentication_table'; + @override + Set get $primaryKey => {id}; + @override + AuthenticationTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AuthenticationTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + cookie: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}cookie'])!, + accessToken: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}access_token'])!, + expiration: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}expiration'])!, + ); + } + + @override + AuthenticationTable createAlias(String alias) { + return AuthenticationTable(attachedDatabase, alias); + } +} + +class AuthenticationTableData extends DataClass + implements Insertable { + final int id; + final String cookie; + final String accessToken; + final DateTime expiration; + const AuthenticationTableData( + {required this.id, + required this.cookie, + required this.accessToken, + required this.expiration}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['cookie'] = Variable(cookie); + map['access_token'] = Variable(accessToken); + map['expiration'] = Variable(expiration); + return map; + } + + AuthenticationTableCompanion toCompanion(bool nullToAbsent) { + return AuthenticationTableCompanion( + id: Value(id), + cookie: Value(cookie), + accessToken: Value(accessToken), + expiration: Value(expiration), + ); + } + + factory AuthenticationTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AuthenticationTableData( + id: serializer.fromJson(json['id']), + cookie: serializer.fromJson(json['cookie']), + accessToken: serializer.fromJson(json['accessToken']), + expiration: serializer.fromJson(json['expiration']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'cookie': serializer.toJson(cookie), + 'accessToken': serializer.toJson(accessToken), + 'expiration': serializer.toJson(expiration), + }; + } + + AuthenticationTableData copyWith( + {int? id, + String? cookie, + String? accessToken, + DateTime? expiration}) => + AuthenticationTableData( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + AuthenticationTableData copyWithCompanion(AuthenticationTableCompanion data) { + return AuthenticationTableData( + id: data.id.present ? data.id.value : this.id, + cookie: data.cookie.present ? data.cookie.value : this.cookie, + accessToken: + data.accessToken.present ? data.accessToken.value : this.accessToken, + expiration: + data.expiration.present ? data.expiration.value : this.expiration, + ); + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableData(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, cookie, accessToken, expiration); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AuthenticationTableData && + other.id == this.id && + other.cookie == this.cookie && + other.accessToken == this.accessToken && + other.expiration == this.expiration); +} + +class AuthenticationTableCompanion + extends UpdateCompanion { + final Value id; + final Value cookie; + final Value accessToken; + final Value expiration; + const AuthenticationTableCompanion({ + this.id = const Value.absent(), + this.cookie = const Value.absent(), + this.accessToken = const Value.absent(), + this.expiration = const Value.absent(), + }); + AuthenticationTableCompanion.insert({ + this.id = const Value.absent(), + required String cookie, + required String accessToken, + required DateTime expiration, + }) : cookie = Value(cookie), + accessToken = Value(accessToken), + expiration = Value(expiration); + static Insertable custom({ + Expression? id, + Expression? cookie, + Expression? accessToken, + Expression? expiration, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (cookie != null) 'cookie': cookie, + if (accessToken != null) 'access_token': accessToken, + if (expiration != null) 'expiration': expiration, + }); + } + + AuthenticationTableCompanion copyWith( + {Value? id, + Value? cookie, + Value? accessToken, + Value? expiration}) { + return AuthenticationTableCompanion( + id: id ?? this.id, + cookie: cookie ?? this.cookie, + accessToken: accessToken ?? this.accessToken, + expiration: expiration ?? this.expiration, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (cookie.present) { + map['cookie'] = Variable(cookie.value); + } + if (accessToken.present) { + map['access_token'] = Variable(accessToken.value); + } + if (expiration.present) { + map['expiration'] = Variable(expiration.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AuthenticationTableCompanion(') + ..write('id: $id, ') + ..write('cookie: $cookie, ') + ..write('accessToken: $accessToken, ') + ..write('expiration: $expiration') + ..write(')')) + .toString(); + } +} + +class BlacklistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + BlacklistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementType = GeneratedColumn( + 'element_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn elementId = GeneratedColumn( + 'element_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, name, elementType, elementId]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'blacklist_table'; + @override + Set get $primaryKey => {id}; + @override + BlacklistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return BlacklistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + elementType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_type'])!, + elementId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}element_id'])!, + ); + } + + @override + BlacklistTable createAlias(String alias) { + return BlacklistTable(attachedDatabase, alias); + } +} + +class BlacklistTableData extends DataClass + implements Insertable { + final int id; + final String name; + final String elementType; + final String elementId; + const BlacklistTableData( + {required this.id, + required this.name, + required this.elementType, + required this.elementId}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['name'] = Variable(name); + map['element_type'] = Variable(elementType); + map['element_id'] = Variable(elementId); + return map; + } + + BlacklistTableCompanion toCompanion(bool nullToAbsent) { + return BlacklistTableCompanion( + id: Value(id), + name: Value(name), + elementType: Value(elementType), + elementId: Value(elementId), + ); + } + + factory BlacklistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return BlacklistTableData( + id: serializer.fromJson(json['id']), + name: serializer.fromJson(json['name']), + elementType: serializer.fromJson(json['elementType']), + elementId: serializer.fromJson(json['elementId']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'name': serializer.toJson(name), + 'elementType': serializer.toJson(elementType), + 'elementId': serializer.toJson(elementId), + }; + } + + BlacklistTableData copyWith( + {int? id, String? name, String? elementType, String? elementId}) => + BlacklistTableData( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + BlacklistTableData copyWithCompanion(BlacklistTableCompanion data) { + return BlacklistTableData( + id: data.id.present ? data.id.value : this.id, + name: data.name.present ? data.name.value : this.name, + elementType: + data.elementType.present ? data.elementType.value : this.elementType, + elementId: data.elementId.present ? data.elementId.value : this.elementId, + ); + } + + @override + String toString() { + return (StringBuffer('BlacklistTableData(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, name, elementType, elementId); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is BlacklistTableData && + other.id == this.id && + other.name == this.name && + other.elementType == this.elementType && + other.elementId == this.elementId); +} + +class BlacklistTableCompanion extends UpdateCompanion { + final Value id; + final Value name; + final Value elementType; + final Value elementId; + const BlacklistTableCompanion({ + this.id = const Value.absent(), + this.name = const Value.absent(), + this.elementType = const Value.absent(), + this.elementId = const Value.absent(), + }); + BlacklistTableCompanion.insert({ + this.id = const Value.absent(), + required String name, + required String elementType, + required String elementId, + }) : name = Value(name), + elementType = Value(elementType), + elementId = Value(elementId); + static Insertable custom({ + Expression? id, + Expression? name, + Expression? elementType, + Expression? elementId, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (name != null) 'name': name, + if (elementType != null) 'element_type': elementType, + if (elementId != null) 'element_id': elementId, + }); + } + + BlacklistTableCompanion copyWith( + {Value? id, + Value? name, + Value? elementType, + Value? elementId}) { + return BlacklistTableCompanion( + id: id ?? this.id, + name: name ?? this.name, + elementType: elementType ?? this.elementType, + elementId: elementId ?? this.elementId, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (elementType.present) { + map['element_type'] = Variable(elementType.value); + } + if (elementId.present) { + map['element_id'] = Variable(elementId.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('BlacklistTableCompanion(') + ..write('id: $id, ') + ..write('name: $name, ') + ..write('elementType: $elementType, ') + ..write('elementId: $elementId') + ..write(')')) + .toString(); + } +} + +class PreferencesTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PreferencesTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioQuality = GeneratedColumn( + 'audio_quality', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceQualities.high.name)); + late final GeneratedColumn albumColorSync = GeneratedColumn( + 'album_color_sync', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("album_color_sync" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn amoledDarkTheme = GeneratedColumn( + 'amoled_dark_theme', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("amoled_dark_theme" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn checkUpdate = GeneratedColumn( + 'check_update', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("check_update" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn normalizeAudio = GeneratedColumn( + 'normalize_audio', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("normalize_audio" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn showSystemTrayIcon = GeneratedColumn( + 'show_system_tray_icon', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("show_system_tray_icon" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn systemTitleBar = GeneratedColumn( + 'system_title_bar', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("system_title_bar" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn skipNonMusic = GeneratedColumn( + 'skip_non_music', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("skip_non_music" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn closeBehavior = GeneratedColumn( + 'close_behavior', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(CloseBehavior.close.name)); + late final GeneratedColumn accentColorScheme = + GeneratedColumn('accent_color_scheme', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("Blue:0xFF2196F3")); + late final GeneratedColumn layoutMode = GeneratedColumn( + 'layout_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(LayoutMode.adaptive.name)); + late final GeneratedColumn locale = GeneratedColumn( + 'locale', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: + const Constant('{"languageCode":"system","countryCode":"system"}')); + late final GeneratedColumn market = GeneratedColumn( + 'market', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(Market.US.name)); + late final GeneratedColumn searchMode = GeneratedColumn( + 'search_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SearchMode.youtube.name)); + late final GeneratedColumn downloadLocation = GeneratedColumn( + 'download_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn localLibraryLocation = + GeneratedColumn('local_library_location', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + late final GeneratedColumn pipedInstance = GeneratedColumn( + 'piped_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://pipedapi.kavin.rocks")); + late final GeneratedColumn invidiousInstance = + GeneratedColumn('invidious_instance', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("https://inv.nadeko.net")); + late final GeneratedColumn themeMode = GeneratedColumn( + 'theme_mode', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(ThemeMode.system.name)); + late final GeneratedColumn audioSource = GeneratedColumn( + 'audio_source', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(AudioSource.youtube.name)); + late final GeneratedColumn streamMusicCodec = GeneratedColumn( + 'stream_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.weba.name)); + late final GeneratedColumn downloadMusicCodec = + GeneratedColumn('download_music_codec', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceCodecs.m4a.name)); + late final GeneratedColumn discordPresence = GeneratedColumn( + 'discord_presence', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("discord_presence" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn endlessPlayback = GeneratedColumn( + 'endless_playback', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("endless_playback" IN (0, 1))'), + defaultValue: const Constant(true)); + late final GeneratedColumn enableConnect = GeneratedColumn( + 'enable_connect', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("enable_connect" IN (0, 1))'), + defaultValue: const Constant(false)); + late final GeneratedColumn cacheMusic = GeneratedColumn( + 'cache_music', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("cache_music" IN (0, 1))'), + defaultValue: const Constant(true)); + @override + List get $columns => [ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + invidiousInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect, + cacheMusic + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'preferences_table'; + @override + Set get $primaryKey => {id}; + @override + PreferencesTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PreferencesTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioQuality: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_quality'])!, + albumColorSync: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}album_color_sync'])!, + amoledDarkTheme: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}amoled_dark_theme'])!, + checkUpdate: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}check_update'])!, + normalizeAudio: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}normalize_audio'])!, + showSystemTrayIcon: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}show_system_tray_icon'])!, + systemTitleBar: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}system_title_bar'])!, + skipNonMusic: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}skip_non_music'])!, + closeBehavior: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}close_behavior'])!, + accentColorScheme: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}accent_color_scheme'])!, + layoutMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}layout_mode'])!, + locale: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}locale'])!, + market: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}market'])!, + searchMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}search_mode'])!, + downloadLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_location'])!, + localLibraryLocation: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}local_library_location'])!, + pipedInstance: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}piped_instance'])!, + invidiousInstance: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}invidious_instance'])!, + themeMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}theme_mode'])!, + audioSource: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}audio_source'])!, + streamMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}stream_music_codec'])!, + downloadMusicCodec: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}download_music_codec'])!, + discordPresence: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}discord_presence'])!, + endlessPlayback: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!, + enableConnect: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!, + cacheMusic: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}cache_music'])!, + ); + } + + @override + PreferencesTable createAlias(String alias) { + return PreferencesTable(attachedDatabase, alias); + } +} + +class PreferencesTableData extends DataClass + implements Insertable { + final int id; + final String audioQuality; + final bool albumColorSync; + final bool amoledDarkTheme; + final bool checkUpdate; + final bool normalizeAudio; + final bool showSystemTrayIcon; + final bool systemTitleBar; + final bool skipNonMusic; + final String closeBehavior; + final String accentColorScheme; + final String layoutMode; + final String locale; + final String market; + final String searchMode; + final String downloadLocation; + final String localLibraryLocation; + final String pipedInstance; + final String invidiousInstance; + final String themeMode; + final String audioSource; + final String streamMusicCodec; + final String downloadMusicCodec; + final bool discordPresence; + final bool endlessPlayback; + final bool enableConnect; + final bool cacheMusic; + const PreferencesTableData( + {required this.id, + required this.audioQuality, + required this.albumColorSync, + required this.amoledDarkTheme, + required this.checkUpdate, + required this.normalizeAudio, + required this.showSystemTrayIcon, + required this.systemTitleBar, + required this.skipNonMusic, + required this.closeBehavior, + required this.accentColorScheme, + required this.layoutMode, + required this.locale, + required this.market, + required this.searchMode, + required this.downloadLocation, + required this.localLibraryLocation, + required this.pipedInstance, + required this.invidiousInstance, + required this.themeMode, + required this.audioSource, + required this.streamMusicCodec, + required this.downloadMusicCodec, + required this.discordPresence, + required this.endlessPlayback, + required this.enableConnect, + required this.cacheMusic}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_quality'] = Variable(audioQuality); + map['album_color_sync'] = Variable(albumColorSync); + map['amoled_dark_theme'] = Variable(amoledDarkTheme); + map['check_update'] = Variable(checkUpdate); + map['normalize_audio'] = Variable(normalizeAudio); + map['show_system_tray_icon'] = Variable(showSystemTrayIcon); + map['system_title_bar'] = Variable(systemTitleBar); + map['skip_non_music'] = Variable(skipNonMusic); + map['close_behavior'] = Variable(closeBehavior); + map['accent_color_scheme'] = Variable(accentColorScheme); + map['layout_mode'] = Variable(layoutMode); + map['locale'] = Variable(locale); + map['market'] = Variable(market); + map['search_mode'] = Variable(searchMode); + map['download_location'] = Variable(downloadLocation); + map['local_library_location'] = Variable(localLibraryLocation); + map['piped_instance'] = Variable(pipedInstance); + map['invidious_instance'] = Variable(invidiousInstance); + map['theme_mode'] = Variable(themeMode); + map['audio_source'] = Variable(audioSource); + map['stream_music_codec'] = Variable(streamMusicCodec); + map['download_music_codec'] = Variable(downloadMusicCodec); + map['discord_presence'] = Variable(discordPresence); + map['endless_playback'] = Variable(endlessPlayback); + map['enable_connect'] = Variable(enableConnect); + map['cache_music'] = Variable(cacheMusic); + return map; + } + + PreferencesTableCompanion toCompanion(bool nullToAbsent) { + return PreferencesTableCompanion( + id: Value(id), + audioQuality: Value(audioQuality), + albumColorSync: Value(albumColorSync), + amoledDarkTheme: Value(amoledDarkTheme), + checkUpdate: Value(checkUpdate), + normalizeAudio: Value(normalizeAudio), + showSystemTrayIcon: Value(showSystemTrayIcon), + systemTitleBar: Value(systemTitleBar), + skipNonMusic: Value(skipNonMusic), + closeBehavior: Value(closeBehavior), + accentColorScheme: Value(accentColorScheme), + layoutMode: Value(layoutMode), + locale: Value(locale), + market: Value(market), + searchMode: Value(searchMode), + downloadLocation: Value(downloadLocation), + localLibraryLocation: Value(localLibraryLocation), + pipedInstance: Value(pipedInstance), + invidiousInstance: Value(invidiousInstance), + themeMode: Value(themeMode), + audioSource: Value(audioSource), + streamMusicCodec: Value(streamMusicCodec), + downloadMusicCodec: Value(downloadMusicCodec), + discordPresence: Value(discordPresence), + endlessPlayback: Value(endlessPlayback), + enableConnect: Value(enableConnect), + cacheMusic: Value(cacheMusic), + ); + } + + factory PreferencesTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PreferencesTableData( + id: serializer.fromJson(json['id']), + audioQuality: serializer.fromJson(json['audioQuality']), + albumColorSync: serializer.fromJson(json['albumColorSync']), + amoledDarkTheme: serializer.fromJson(json['amoledDarkTheme']), + checkUpdate: serializer.fromJson(json['checkUpdate']), + normalizeAudio: serializer.fromJson(json['normalizeAudio']), + showSystemTrayIcon: serializer.fromJson(json['showSystemTrayIcon']), + systemTitleBar: serializer.fromJson(json['systemTitleBar']), + skipNonMusic: serializer.fromJson(json['skipNonMusic']), + closeBehavior: serializer.fromJson(json['closeBehavior']), + accentColorScheme: serializer.fromJson(json['accentColorScheme']), + layoutMode: serializer.fromJson(json['layoutMode']), + locale: serializer.fromJson(json['locale']), + market: serializer.fromJson(json['market']), + searchMode: serializer.fromJson(json['searchMode']), + downloadLocation: serializer.fromJson(json['downloadLocation']), + localLibraryLocation: + serializer.fromJson(json['localLibraryLocation']), + pipedInstance: serializer.fromJson(json['pipedInstance']), + invidiousInstance: serializer.fromJson(json['invidiousInstance']), + themeMode: serializer.fromJson(json['themeMode']), + audioSource: serializer.fromJson(json['audioSource']), + streamMusicCodec: serializer.fromJson(json['streamMusicCodec']), + downloadMusicCodec: + serializer.fromJson(json['downloadMusicCodec']), + discordPresence: serializer.fromJson(json['discordPresence']), + endlessPlayback: serializer.fromJson(json['endlessPlayback']), + enableConnect: serializer.fromJson(json['enableConnect']), + cacheMusic: serializer.fromJson(json['cacheMusic']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioQuality': serializer.toJson(audioQuality), + 'albumColorSync': serializer.toJson(albumColorSync), + 'amoledDarkTheme': serializer.toJson(amoledDarkTheme), + 'checkUpdate': serializer.toJson(checkUpdate), + 'normalizeAudio': serializer.toJson(normalizeAudio), + 'showSystemTrayIcon': serializer.toJson(showSystemTrayIcon), + 'systemTitleBar': serializer.toJson(systemTitleBar), + 'skipNonMusic': serializer.toJson(skipNonMusic), + 'closeBehavior': serializer.toJson(closeBehavior), + 'accentColorScheme': serializer.toJson(accentColorScheme), + 'layoutMode': serializer.toJson(layoutMode), + 'locale': serializer.toJson(locale), + 'market': serializer.toJson(market), + 'searchMode': serializer.toJson(searchMode), + 'downloadLocation': serializer.toJson(downloadLocation), + 'localLibraryLocation': serializer.toJson(localLibraryLocation), + 'pipedInstance': serializer.toJson(pipedInstance), + 'invidiousInstance': serializer.toJson(invidiousInstance), + 'themeMode': serializer.toJson(themeMode), + 'audioSource': serializer.toJson(audioSource), + 'streamMusicCodec': serializer.toJson(streamMusicCodec), + 'downloadMusicCodec': serializer.toJson(downloadMusicCodec), + 'discordPresence': serializer.toJson(discordPresence), + 'endlessPlayback': serializer.toJson(endlessPlayback), + 'enableConnect': serializer.toJson(enableConnect), + 'cacheMusic': serializer.toJson(cacheMusic), + }; + } + + PreferencesTableData copyWith( + {int? id, + String? audioQuality, + bool? albumColorSync, + bool? amoledDarkTheme, + bool? checkUpdate, + bool? normalizeAudio, + bool? showSystemTrayIcon, + bool? systemTitleBar, + bool? skipNonMusic, + String? closeBehavior, + String? accentColorScheme, + String? layoutMode, + String? locale, + String? market, + String? searchMode, + String? downloadLocation, + String? localLibraryLocation, + String? pipedInstance, + String? invidiousInstance, + String? themeMode, + String? audioSource, + String? streamMusicCodec, + String? downloadMusicCodec, + bool? discordPresence, + bool? endlessPlayback, + bool? enableConnect, + bool? cacheMusic}) => + PreferencesTableData( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + cacheMusic: cacheMusic ?? this.cacheMusic, + ); + PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) { + return PreferencesTableData( + id: data.id.present ? data.id.value : this.id, + audioQuality: data.audioQuality.present + ? data.audioQuality.value + : this.audioQuality, + albumColorSync: data.albumColorSync.present + ? data.albumColorSync.value + : this.albumColorSync, + amoledDarkTheme: data.amoledDarkTheme.present + ? data.amoledDarkTheme.value + : this.amoledDarkTheme, + checkUpdate: + data.checkUpdate.present ? data.checkUpdate.value : this.checkUpdate, + normalizeAudio: data.normalizeAudio.present + ? data.normalizeAudio.value + : this.normalizeAudio, + showSystemTrayIcon: data.showSystemTrayIcon.present + ? data.showSystemTrayIcon.value + : this.showSystemTrayIcon, + systemTitleBar: data.systemTitleBar.present + ? data.systemTitleBar.value + : this.systemTitleBar, + skipNonMusic: data.skipNonMusic.present + ? data.skipNonMusic.value + : this.skipNonMusic, + closeBehavior: data.closeBehavior.present + ? data.closeBehavior.value + : this.closeBehavior, + accentColorScheme: data.accentColorScheme.present + ? data.accentColorScheme.value + : this.accentColorScheme, + layoutMode: + data.layoutMode.present ? data.layoutMode.value : this.layoutMode, + locale: data.locale.present ? data.locale.value : this.locale, + market: data.market.present ? data.market.value : this.market, + searchMode: + data.searchMode.present ? data.searchMode.value : this.searchMode, + downloadLocation: data.downloadLocation.present + ? data.downloadLocation.value + : this.downloadLocation, + localLibraryLocation: data.localLibraryLocation.present + ? data.localLibraryLocation.value + : this.localLibraryLocation, + pipedInstance: data.pipedInstance.present + ? data.pipedInstance.value + : this.pipedInstance, + invidiousInstance: data.invidiousInstance.present + ? data.invidiousInstance.value + : this.invidiousInstance, + themeMode: data.themeMode.present ? data.themeMode.value : this.themeMode, + audioSource: + data.audioSource.present ? data.audioSource.value : this.audioSource, + streamMusicCodec: data.streamMusicCodec.present + ? data.streamMusicCodec.value + : this.streamMusicCodec, + downloadMusicCodec: data.downloadMusicCodec.present + ? data.downloadMusicCodec.value + : this.downloadMusicCodec, + discordPresence: data.discordPresence.present + ? data.discordPresence.value + : this.discordPresence, + endlessPlayback: data.endlessPlayback.present + ? data.endlessPlayback.value + : this.endlessPlayback, + enableConnect: data.enableConnect.present + ? data.enableConnect.value + : this.enableConnect, + cacheMusic: + data.cacheMusic.present ? data.cacheMusic.value : this.cacheMusic, + ); + } + + @override + String toString() { + return (StringBuffer('PreferencesTableData(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect, ') + ..write('cacheMusic: $cacheMusic') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + audioQuality, + albumColorSync, + amoledDarkTheme, + checkUpdate, + normalizeAudio, + showSystemTrayIcon, + systemTitleBar, + skipNonMusic, + closeBehavior, + accentColorScheme, + layoutMode, + locale, + market, + searchMode, + downloadLocation, + localLibraryLocation, + pipedInstance, + invidiousInstance, + themeMode, + audioSource, + streamMusicCodec, + downloadMusicCodec, + discordPresence, + endlessPlayback, + enableConnect, + cacheMusic + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PreferencesTableData && + other.id == this.id && + other.audioQuality == this.audioQuality && + other.albumColorSync == this.albumColorSync && + other.amoledDarkTheme == this.amoledDarkTheme && + other.checkUpdate == this.checkUpdate && + other.normalizeAudio == this.normalizeAudio && + other.showSystemTrayIcon == this.showSystemTrayIcon && + other.systemTitleBar == this.systemTitleBar && + other.skipNonMusic == this.skipNonMusic && + other.closeBehavior == this.closeBehavior && + other.accentColorScheme == this.accentColorScheme && + other.layoutMode == this.layoutMode && + other.locale == this.locale && + other.market == this.market && + other.searchMode == this.searchMode && + other.downloadLocation == this.downloadLocation && + other.localLibraryLocation == this.localLibraryLocation && + other.pipedInstance == this.pipedInstance && + other.invidiousInstance == this.invidiousInstance && + other.themeMode == this.themeMode && + other.audioSource == this.audioSource && + other.streamMusicCodec == this.streamMusicCodec && + other.downloadMusicCodec == this.downloadMusicCodec && + other.discordPresence == this.discordPresence && + other.endlessPlayback == this.endlessPlayback && + other.enableConnect == this.enableConnect && + other.cacheMusic == this.cacheMusic); +} + +class PreferencesTableCompanion extends UpdateCompanion { + final Value id; + final Value audioQuality; + final Value albumColorSync; + final Value amoledDarkTheme; + final Value checkUpdate; + final Value normalizeAudio; + final Value showSystemTrayIcon; + final Value systemTitleBar; + final Value skipNonMusic; + final Value closeBehavior; + final Value accentColorScheme; + final Value layoutMode; + final Value locale; + final Value market; + final Value searchMode; + final Value downloadLocation; + final Value localLibraryLocation; + final Value pipedInstance; + final Value invidiousInstance; + final Value themeMode; + final Value audioSource; + final Value streamMusicCodec; + final Value downloadMusicCodec; + final Value discordPresence; + final Value endlessPlayback; + final Value enableConnect; + final Value cacheMusic; + const PreferencesTableCompanion({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + this.cacheMusic = const Value.absent(), + }); + PreferencesTableCompanion.insert({ + this.id = const Value.absent(), + this.audioQuality = const Value.absent(), + this.albumColorSync = const Value.absent(), + this.amoledDarkTheme = const Value.absent(), + this.checkUpdate = const Value.absent(), + this.normalizeAudio = const Value.absent(), + this.showSystemTrayIcon = const Value.absent(), + this.systemTitleBar = const Value.absent(), + this.skipNonMusic = const Value.absent(), + this.closeBehavior = const Value.absent(), + this.accentColorScheme = const Value.absent(), + this.layoutMode = const Value.absent(), + this.locale = const Value.absent(), + this.market = const Value.absent(), + this.searchMode = const Value.absent(), + this.downloadLocation = const Value.absent(), + this.localLibraryLocation = const Value.absent(), + this.pipedInstance = const Value.absent(), + this.invidiousInstance = const Value.absent(), + this.themeMode = const Value.absent(), + this.audioSource = const Value.absent(), + this.streamMusicCodec = const Value.absent(), + this.downloadMusicCodec = const Value.absent(), + this.discordPresence = const Value.absent(), + this.endlessPlayback = const Value.absent(), + this.enableConnect = const Value.absent(), + this.cacheMusic = const Value.absent(), + }); + static Insertable custom({ + Expression? id, + Expression? audioQuality, + Expression? albumColorSync, + Expression? amoledDarkTheme, + Expression? checkUpdate, + Expression? normalizeAudio, + Expression? showSystemTrayIcon, + Expression? systemTitleBar, + Expression? skipNonMusic, + Expression? closeBehavior, + Expression? accentColorScheme, + Expression? layoutMode, + Expression? locale, + Expression? market, + Expression? searchMode, + Expression? downloadLocation, + Expression? localLibraryLocation, + Expression? pipedInstance, + Expression? invidiousInstance, + Expression? themeMode, + Expression? audioSource, + Expression? streamMusicCodec, + Expression? downloadMusicCodec, + Expression? discordPresence, + Expression? endlessPlayback, + Expression? enableConnect, + Expression? cacheMusic, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioQuality != null) 'audio_quality': audioQuality, + if (albumColorSync != null) 'album_color_sync': albumColorSync, + if (amoledDarkTheme != null) 'amoled_dark_theme': amoledDarkTheme, + if (checkUpdate != null) 'check_update': checkUpdate, + if (normalizeAudio != null) 'normalize_audio': normalizeAudio, + if (showSystemTrayIcon != null) + 'show_system_tray_icon': showSystemTrayIcon, + if (systemTitleBar != null) 'system_title_bar': systemTitleBar, + if (skipNonMusic != null) 'skip_non_music': skipNonMusic, + if (closeBehavior != null) 'close_behavior': closeBehavior, + if (accentColorScheme != null) 'accent_color_scheme': accentColorScheme, + if (layoutMode != null) 'layout_mode': layoutMode, + if (locale != null) 'locale': locale, + if (market != null) 'market': market, + if (searchMode != null) 'search_mode': searchMode, + if (downloadLocation != null) 'download_location': downloadLocation, + if (localLibraryLocation != null) + 'local_library_location': localLibraryLocation, + if (pipedInstance != null) 'piped_instance': pipedInstance, + if (invidiousInstance != null) 'invidious_instance': invidiousInstance, + if (themeMode != null) 'theme_mode': themeMode, + if (audioSource != null) 'audio_source': audioSource, + if (streamMusicCodec != null) 'stream_music_codec': streamMusicCodec, + if (downloadMusicCodec != null) + 'download_music_codec': downloadMusicCodec, + if (discordPresence != null) 'discord_presence': discordPresence, + if (endlessPlayback != null) 'endless_playback': endlessPlayback, + if (enableConnect != null) 'enable_connect': enableConnect, + if (cacheMusic != null) 'cache_music': cacheMusic, + }); + } + + PreferencesTableCompanion copyWith( + {Value? id, + Value? audioQuality, + Value? albumColorSync, + Value? amoledDarkTheme, + Value? checkUpdate, + Value? normalizeAudio, + Value? showSystemTrayIcon, + Value? systemTitleBar, + Value? skipNonMusic, + Value? closeBehavior, + Value? accentColorScheme, + Value? layoutMode, + Value? locale, + Value? market, + Value? searchMode, + Value? downloadLocation, + Value? localLibraryLocation, + Value? pipedInstance, + Value? invidiousInstance, + Value? themeMode, + Value? audioSource, + Value? streamMusicCodec, + Value? downloadMusicCodec, + Value? discordPresence, + Value? endlessPlayback, + Value? enableConnect, + Value? cacheMusic}) { + return PreferencesTableCompanion( + id: id ?? this.id, + audioQuality: audioQuality ?? this.audioQuality, + albumColorSync: albumColorSync ?? this.albumColorSync, + amoledDarkTheme: amoledDarkTheme ?? this.amoledDarkTheme, + checkUpdate: checkUpdate ?? this.checkUpdate, + normalizeAudio: normalizeAudio ?? this.normalizeAudio, + showSystemTrayIcon: showSystemTrayIcon ?? this.showSystemTrayIcon, + systemTitleBar: systemTitleBar ?? this.systemTitleBar, + skipNonMusic: skipNonMusic ?? this.skipNonMusic, + closeBehavior: closeBehavior ?? this.closeBehavior, + accentColorScheme: accentColorScheme ?? this.accentColorScheme, + layoutMode: layoutMode ?? this.layoutMode, + locale: locale ?? this.locale, + market: market ?? this.market, + searchMode: searchMode ?? this.searchMode, + downloadLocation: downloadLocation ?? this.downloadLocation, + localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation, + pipedInstance: pipedInstance ?? this.pipedInstance, + invidiousInstance: invidiousInstance ?? this.invidiousInstance, + themeMode: themeMode ?? this.themeMode, + audioSource: audioSource ?? this.audioSource, + streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec, + downloadMusicCodec: downloadMusicCodec ?? this.downloadMusicCodec, + discordPresence: discordPresence ?? this.discordPresence, + endlessPlayback: endlessPlayback ?? this.endlessPlayback, + enableConnect: enableConnect ?? this.enableConnect, + cacheMusic: cacheMusic ?? this.cacheMusic, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioQuality.present) { + map['audio_quality'] = Variable(audioQuality.value); + } + if (albumColorSync.present) { + map['album_color_sync'] = Variable(albumColorSync.value); + } + if (amoledDarkTheme.present) { + map['amoled_dark_theme'] = Variable(amoledDarkTheme.value); + } + if (checkUpdate.present) { + map['check_update'] = Variable(checkUpdate.value); + } + if (normalizeAudio.present) { + map['normalize_audio'] = Variable(normalizeAudio.value); + } + if (showSystemTrayIcon.present) { + map['show_system_tray_icon'] = Variable(showSystemTrayIcon.value); + } + if (systemTitleBar.present) { + map['system_title_bar'] = Variable(systemTitleBar.value); + } + if (skipNonMusic.present) { + map['skip_non_music'] = Variable(skipNonMusic.value); + } + if (closeBehavior.present) { + map['close_behavior'] = Variable(closeBehavior.value); + } + if (accentColorScheme.present) { + map['accent_color_scheme'] = Variable(accentColorScheme.value); + } + if (layoutMode.present) { + map['layout_mode'] = Variable(layoutMode.value); + } + if (locale.present) { + map['locale'] = Variable(locale.value); + } + if (market.present) { + map['market'] = Variable(market.value); + } + if (searchMode.present) { + map['search_mode'] = Variable(searchMode.value); + } + if (downloadLocation.present) { + map['download_location'] = Variable(downloadLocation.value); + } + if (localLibraryLocation.present) { + map['local_library_location'] = + Variable(localLibraryLocation.value); + } + if (pipedInstance.present) { + map['piped_instance'] = Variable(pipedInstance.value); + } + if (invidiousInstance.present) { + map['invidious_instance'] = Variable(invidiousInstance.value); + } + if (themeMode.present) { + map['theme_mode'] = Variable(themeMode.value); + } + if (audioSource.present) { + map['audio_source'] = Variable(audioSource.value); + } + if (streamMusicCodec.present) { + map['stream_music_codec'] = Variable(streamMusicCodec.value); + } + if (downloadMusicCodec.present) { + map['download_music_codec'] = Variable(downloadMusicCodec.value); + } + if (discordPresence.present) { + map['discord_presence'] = Variable(discordPresence.value); + } + if (endlessPlayback.present) { + map['endless_playback'] = Variable(endlessPlayback.value); + } + if (enableConnect.present) { + map['enable_connect'] = Variable(enableConnect.value); + } + if (cacheMusic.present) { + map['cache_music'] = Variable(cacheMusic.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PreferencesTableCompanion(') + ..write('id: $id, ') + ..write('audioQuality: $audioQuality, ') + ..write('albumColorSync: $albumColorSync, ') + ..write('amoledDarkTheme: $amoledDarkTheme, ') + ..write('checkUpdate: $checkUpdate, ') + ..write('normalizeAudio: $normalizeAudio, ') + ..write('showSystemTrayIcon: $showSystemTrayIcon, ') + ..write('systemTitleBar: $systemTitleBar, ') + ..write('skipNonMusic: $skipNonMusic, ') + ..write('closeBehavior: $closeBehavior, ') + ..write('accentColorScheme: $accentColorScheme, ') + ..write('layoutMode: $layoutMode, ') + ..write('locale: $locale, ') + ..write('market: $market, ') + ..write('searchMode: $searchMode, ') + ..write('downloadLocation: $downloadLocation, ') + ..write('localLibraryLocation: $localLibraryLocation, ') + ..write('pipedInstance: $pipedInstance, ') + ..write('invidiousInstance: $invidiousInstance, ') + ..write('themeMode: $themeMode, ') + ..write('audioSource: $audioSource, ') + ..write('streamMusicCodec: $streamMusicCodec, ') + ..write('downloadMusicCodec: $downloadMusicCodec, ') + ..write('discordPresence: $discordPresence, ') + ..write('endlessPlayback: $endlessPlayback, ') + ..write('enableConnect: $enableConnect, ') + ..write('cacheMusic: $cacheMusic') + ..write(')')) + .toString(); + } +} + +class ScrobblerTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ScrobblerTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn username = GeneratedColumn( + 'username', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn passwordHash = GeneratedColumn( + 'password_hash', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, username, passwordHash]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'scrobbler_table'; + @override + Set get $primaryKey => {id}; + @override + ScrobblerTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ScrobblerTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + username: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}username'])!, + passwordHash: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}password_hash'])!, + ); + } + + @override + ScrobblerTable createAlias(String alias) { + return ScrobblerTable(attachedDatabase, alias); + } +} + +class ScrobblerTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String username; + final String passwordHash; + const ScrobblerTableData( + {required this.id, + required this.createdAt, + required this.username, + required this.passwordHash}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['username'] = Variable(username); + map['password_hash'] = Variable(passwordHash); + return map; + } + + ScrobblerTableCompanion toCompanion(bool nullToAbsent) { + return ScrobblerTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + username: Value(username), + passwordHash: Value(passwordHash), + ); + } + + factory ScrobblerTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ScrobblerTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + username: serializer.fromJson(json['username']), + passwordHash: serializer.fromJson(json['passwordHash']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'username': serializer.toJson(username), + 'passwordHash': serializer.toJson(passwordHash), + }; + } + + ScrobblerTableData copyWith( + {int? id, + DateTime? createdAt, + String? username, + String? passwordHash}) => + ScrobblerTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + ScrobblerTableData copyWithCompanion(ScrobblerTableCompanion data) { + return ScrobblerTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + username: data.username.present ? data.username.value : this.username, + passwordHash: data.passwordHash.present + ? data.passwordHash.value + : this.passwordHash, + ); + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, username, passwordHash); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ScrobblerTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.username == this.username && + other.passwordHash == this.passwordHash); +} + +class ScrobblerTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value username; + final Value passwordHash; + const ScrobblerTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.username = const Value.absent(), + this.passwordHash = const Value.absent(), + }); + ScrobblerTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String username, + required String passwordHash, + }) : username = Value(username), + passwordHash = Value(passwordHash); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? username, + Expression? passwordHash, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (username != null) 'username': username, + if (passwordHash != null) 'password_hash': passwordHash, + }); + } + + ScrobblerTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? username, + Value? passwordHash}) { + return ScrobblerTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + username: username ?? this.username, + passwordHash: passwordHash ?? this.passwordHash, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (username.present) { + map['username'] = Variable(username.value); + } + if (passwordHash.present) { + map['password_hash'] = Variable(passwordHash.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ScrobblerTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('username: $username, ') + ..write('passwordHash: $passwordHash') + ..write(')')) + .toString(); + } +} + +class SkipSegmentTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SkipSegmentTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn start = GeneratedColumn( + 'start', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn end = GeneratedColumn( + 'end', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => [id, start, end, trackId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'skip_segment_table'; + @override + Set get $primaryKey => {id}; + @override + SkipSegmentTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SkipSegmentTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + start: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}start'])!, + end: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}end'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SkipSegmentTable createAlias(String alias) { + return SkipSegmentTable(attachedDatabase, alias); + } +} + +class SkipSegmentTableData extends DataClass + implements Insertable { + final int id; + final int start; + final int end; + final String trackId; + final DateTime createdAt; + const SkipSegmentTableData( + {required this.id, + required this.start, + required this.end, + required this.trackId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['start'] = Variable(start); + map['end'] = Variable(end); + map['track_id'] = Variable(trackId); + map['created_at'] = Variable(createdAt); + return map; + } + + SkipSegmentTableCompanion toCompanion(bool nullToAbsent) { + return SkipSegmentTableCompanion( + id: Value(id), + start: Value(start), + end: Value(end), + trackId: Value(trackId), + createdAt: Value(createdAt), + ); + } + + factory SkipSegmentTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SkipSegmentTableData( + id: serializer.fromJson(json['id']), + start: serializer.fromJson(json['start']), + end: serializer.fromJson(json['end']), + trackId: serializer.fromJson(json['trackId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'start': serializer.toJson(start), + 'end': serializer.toJson(end), + 'trackId': serializer.toJson(trackId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SkipSegmentTableData copyWith( + {int? id, + int? start, + int? end, + String? trackId, + DateTime? createdAt}) => + SkipSegmentTableData( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + SkipSegmentTableData copyWithCompanion(SkipSegmentTableCompanion data) { + return SkipSegmentTableData( + id: data.id.present ? data.id.value : this.id, + start: data.start.present ? data.start.value : this.start, + end: data.end.present ? data.end.value : this.end, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableData(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, start, end, trackId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SkipSegmentTableData && + other.id == this.id && + other.start == this.start && + other.end == this.end && + other.trackId == this.trackId && + other.createdAt == this.createdAt); +} + +class SkipSegmentTableCompanion extends UpdateCompanion { + final Value id; + final Value start; + final Value end; + final Value trackId; + final Value createdAt; + const SkipSegmentTableCompanion({ + this.id = const Value.absent(), + this.start = const Value.absent(), + this.end = const Value.absent(), + this.trackId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SkipSegmentTableCompanion.insert({ + this.id = const Value.absent(), + required int start, + required int end, + required String trackId, + this.createdAt = const Value.absent(), + }) : start = Value(start), + end = Value(end), + trackId = Value(trackId); + static Insertable custom({ + Expression? id, + Expression? start, + Expression? end, + Expression? trackId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (start != null) 'start': start, + if (end != null) 'end': end, + if (trackId != null) 'track_id': trackId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SkipSegmentTableCompanion copyWith( + {Value? id, + Value? start, + Value? end, + Value? trackId, + Value? createdAt}) { + return SkipSegmentTableCompanion( + id: id ?? this.id, + start: start ?? this.start, + end: end ?? this.end, + trackId: trackId ?? this.trackId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (start.present) { + map['start'] = Variable(start.value); + } + if (end.present) { + map['end'] = Variable(end.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SkipSegmentTableCompanion(') + ..write('id: $id, ') + ..write('start: $start, ') + ..write('end: $end, ') + ..write('trackId: $trackId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SourceMatchTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SourceMatchTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceId = GeneratedColumn( + 'source_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sourceType = GeneratedColumn( + 'source_type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: Constant(SourceType.youtube.name)); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + @override + List get $columns => + [id, trackId, sourceId, sourceType, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'source_match_table'; + @override + Set get $primaryKey => {id}; + @override + SourceMatchTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SourceMatchTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + sourceId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_id'])!, + sourceType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}source_type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SourceMatchTable createAlias(String alias) { + return SourceMatchTable(attachedDatabase, alias); + } +} + +class SourceMatchTableData extends DataClass + implements Insertable { + final int id; + final String trackId; + final String sourceId; + final String sourceType; + final DateTime createdAt; + const SourceMatchTableData( + {required this.id, + required this.trackId, + required this.sourceId, + required this.sourceType, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['source_id'] = Variable(sourceId); + map['source_type'] = Variable(sourceType); + map['created_at'] = Variable(createdAt); + return map; + } + + SourceMatchTableCompanion toCompanion(bool nullToAbsent) { + return SourceMatchTableCompanion( + id: Value(id), + trackId: Value(trackId), + sourceId: Value(sourceId), + sourceType: Value(sourceType), + createdAt: Value(createdAt), + ); + } + + factory SourceMatchTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SourceMatchTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + sourceId: serializer.fromJson(json['sourceId']), + sourceType: serializer.fromJson(json['sourceType']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'sourceId': serializer.toJson(sourceId), + 'sourceType': serializer.toJson(sourceType), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SourceMatchTableData copyWith( + {int? id, + String? trackId, + String? sourceId, + String? sourceType, + DateTime? createdAt}) => + SourceMatchTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + SourceMatchTableData copyWithCompanion(SourceMatchTableCompanion data) { + return SourceMatchTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId, + sourceType: + data.sourceType.present ? data.sourceType.value : this.sourceType, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, sourceId, sourceType, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SourceMatchTableData && + other.id == this.id && + other.trackId == this.trackId && + other.sourceId == this.sourceId && + other.sourceType == this.sourceType && + other.createdAt == this.createdAt); +} + +class SourceMatchTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value sourceId; + final Value sourceType; + final Value createdAt; + const SourceMatchTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.sourceId = const Value.absent(), + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SourceMatchTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String sourceId, + this.sourceType = const Value.absent(), + this.createdAt = const Value.absent(), + }) : trackId = Value(trackId), + sourceId = Value(sourceId); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? sourceId, + Expression? sourceType, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (sourceId != null) 'source_id': sourceId, + if (sourceType != null) 'source_type': sourceType, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SourceMatchTableCompanion copyWith( + {Value? id, + Value? trackId, + Value? sourceId, + Value? sourceType, + Value? createdAt}) { + return SourceMatchTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + sourceId: sourceId ?? this.sourceId, + sourceType: sourceType ?? this.sourceType, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (sourceId.present) { + map['source_id'] = Variable(sourceId.value); + } + if (sourceType.present) { + map['source_type'] = Variable(sourceType.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SourceMatchTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('sourceId: $sourceId, ') + ..write('sourceType: $sourceType, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class AudioPlayerStateTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + AudioPlayerStateTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playing = GeneratedColumn( + 'playing', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("playing" IN (0, 1))')); + late final GeneratedColumn loopMode = GeneratedColumn( + 'loop_mode', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn shuffled = GeneratedColumn( + 'shuffled', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("shuffled" IN (0, 1))')); + late final GeneratedColumn collections = GeneratedColumn( + 'collections', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => + [id, playing, loopMode, shuffled, collections]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'audio_player_state_table'; + @override + Set get $primaryKey => {id}; + @override + AudioPlayerStateTableData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return AudioPlayerStateTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playing: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}playing'])!, + loopMode: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}loop_mode'])!, + shuffled: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}shuffled'])!, + collections: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}collections'])!, + ); + } + + @override + AudioPlayerStateTable createAlias(String alias) { + return AudioPlayerStateTable(attachedDatabase, alias); + } +} + +class AudioPlayerStateTableData extends DataClass + implements Insertable { + final int id; + final bool playing; + final String loopMode; + final bool shuffled; + final String collections; + const AudioPlayerStateTableData( + {required this.id, + required this.playing, + required this.loopMode, + required this.shuffled, + required this.collections}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playing'] = Variable(playing); + map['loop_mode'] = Variable(loopMode); + map['shuffled'] = Variable(shuffled); + map['collections'] = Variable(collections); + return map; + } + + AudioPlayerStateTableCompanion toCompanion(bool nullToAbsent) { + return AudioPlayerStateTableCompanion( + id: Value(id), + playing: Value(playing), + loopMode: Value(loopMode), + shuffled: Value(shuffled), + collections: Value(collections), + ); + } + + factory AudioPlayerStateTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return AudioPlayerStateTableData( + id: serializer.fromJson(json['id']), + playing: serializer.fromJson(json['playing']), + loopMode: serializer.fromJson(json['loopMode']), + shuffled: serializer.fromJson(json['shuffled']), + collections: serializer.fromJson(json['collections']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playing': serializer.toJson(playing), + 'loopMode': serializer.toJson(loopMode), + 'shuffled': serializer.toJson(shuffled), + 'collections': serializer.toJson(collections), + }; + } + + AudioPlayerStateTableData copyWith( + {int? id, + bool? playing, + String? loopMode, + bool? shuffled, + String? collections}) => + AudioPlayerStateTableData( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + AudioPlayerStateTableData copyWithCompanion( + AudioPlayerStateTableCompanion data) { + return AudioPlayerStateTableData( + id: data.id.present ? data.id.value : this.id, + playing: data.playing.present ? data.playing.value : this.playing, + loopMode: data.loopMode.present ? data.loopMode.value : this.loopMode, + shuffled: data.shuffled.present ? data.shuffled.value : this.shuffled, + collections: + data.collections.present ? data.collections.value : this.collections, + ); + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableData(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playing, loopMode, shuffled, collections); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is AudioPlayerStateTableData && + other.id == this.id && + other.playing == this.playing && + other.loopMode == this.loopMode && + other.shuffled == this.shuffled && + other.collections == this.collections); +} + +class AudioPlayerStateTableCompanion + extends UpdateCompanion { + final Value id; + final Value playing; + final Value loopMode; + final Value shuffled; + final Value collections; + const AudioPlayerStateTableCompanion({ + this.id = const Value.absent(), + this.playing = const Value.absent(), + this.loopMode = const Value.absent(), + this.shuffled = const Value.absent(), + this.collections = const Value.absent(), + }); + AudioPlayerStateTableCompanion.insert({ + this.id = const Value.absent(), + required bool playing, + required String loopMode, + required bool shuffled, + required String collections, + }) : playing = Value(playing), + loopMode = Value(loopMode), + shuffled = Value(shuffled), + collections = Value(collections); + static Insertable custom({ + Expression? id, + Expression? playing, + Expression? loopMode, + Expression? shuffled, + Expression? collections, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playing != null) 'playing': playing, + if (loopMode != null) 'loop_mode': loopMode, + if (shuffled != null) 'shuffled': shuffled, + if (collections != null) 'collections': collections, + }); + } + + AudioPlayerStateTableCompanion copyWith( + {Value? id, + Value? playing, + Value? loopMode, + Value? shuffled, + Value? collections}) { + return AudioPlayerStateTableCompanion( + id: id ?? this.id, + playing: playing ?? this.playing, + loopMode: loopMode ?? this.loopMode, + shuffled: shuffled ?? this.shuffled, + collections: collections ?? this.collections, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playing.present) { + map['playing'] = Variable(playing.value); + } + if (loopMode.present) { + map['loop_mode'] = Variable(loopMode.value); + } + if (shuffled.present) { + map['shuffled'] = Variable(shuffled.value); + } + if (collections.present) { + map['collections'] = Variable(collections.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('AudioPlayerStateTableCompanion(') + ..write('id: $id, ') + ..write('playing: $playing, ') + ..write('loopMode: $loopMode, ') + ..write('shuffled: $shuffled, ') + ..write('collections: $collections') + ..write(')')) + .toString(); + } +} + +class PlaylistTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn audioPlayerStateId = GeneratedColumn( + 'audio_player_state_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES audio_player_state_table (id)')); + late final GeneratedColumn index = GeneratedColumn( + 'index', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + @override + List get $columns => [id, audioPlayerStateId, index]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + audioPlayerStateId: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}audio_player_state_id'])!, + index: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}index'])!, + ); + } + + @override + PlaylistTable createAlias(String alias) { + return PlaylistTable(attachedDatabase, alias); + } +} + +class PlaylistTableData extends DataClass + implements Insertable { + final int id; + final int audioPlayerStateId; + final int index; + const PlaylistTableData( + {required this.id, + required this.audioPlayerStateId, + required this.index}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['audio_player_state_id'] = Variable(audioPlayerStateId); + map['index'] = Variable(index); + return map; + } + + PlaylistTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistTableCompanion( + id: Value(id), + audioPlayerStateId: Value(audioPlayerStateId), + index: Value(index), + ); + } + + factory PlaylistTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistTableData( + id: serializer.fromJson(json['id']), + audioPlayerStateId: serializer.fromJson(json['audioPlayerStateId']), + index: serializer.fromJson(json['index']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'audioPlayerStateId': serializer.toJson(audioPlayerStateId), + 'index': serializer.toJson(index), + }; + } + + PlaylistTableData copyWith({int? id, int? audioPlayerStateId, int? index}) => + PlaylistTableData( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + PlaylistTableData copyWithCompanion(PlaylistTableCompanion data) { + return PlaylistTableData( + id: data.id.present ? data.id.value : this.id, + audioPlayerStateId: data.audioPlayerStateId.present + ? data.audioPlayerStateId.value + : this.audioPlayerStateId, + index: data.index.present ? data.index.value : this.index, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistTableData(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, audioPlayerStateId, index); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistTableData && + other.id == this.id && + other.audioPlayerStateId == this.audioPlayerStateId && + other.index == this.index); +} + +class PlaylistTableCompanion extends UpdateCompanion { + final Value id; + final Value audioPlayerStateId; + final Value index; + const PlaylistTableCompanion({ + this.id = const Value.absent(), + this.audioPlayerStateId = const Value.absent(), + this.index = const Value.absent(), + }); + PlaylistTableCompanion.insert({ + this.id = const Value.absent(), + required int audioPlayerStateId, + required int index, + }) : audioPlayerStateId = Value(audioPlayerStateId), + index = Value(index); + static Insertable custom({ + Expression? id, + Expression? audioPlayerStateId, + Expression? index, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (audioPlayerStateId != null) + 'audio_player_state_id': audioPlayerStateId, + if (index != null) 'index': index, + }); + } + + PlaylistTableCompanion copyWith( + {Value? id, Value? audioPlayerStateId, Value? index}) { + return PlaylistTableCompanion( + id: id ?? this.id, + audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId, + index: index ?? this.index, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (audioPlayerStateId.present) { + map['audio_player_state_id'] = Variable(audioPlayerStateId.value); + } + if (index.present) { + map['index'] = Variable(index.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistTableCompanion(') + ..write('id: $id, ') + ..write('audioPlayerStateId: $audioPlayerStateId, ') + ..write('index: $index') + ..write(')')) + .toString(); + } +} + +class PlaylistMediaTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + PlaylistMediaTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn playlistId = GeneratedColumn( + 'playlist_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES playlist_table (id)')); + late final GeneratedColumn uri = GeneratedColumn( + 'uri', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn extras = GeneratedColumn( + 'extras', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn httpHeaders = GeneratedColumn( + 'http_headers', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + @override + List get $columns => + [id, playlistId, uri, extras, httpHeaders]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'playlist_media_table'; + @override + Set get $primaryKey => {id}; + @override + PlaylistMediaTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return PlaylistMediaTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + playlistId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}playlist_id'])!, + uri: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}uri'])!, + extras: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}extras']), + httpHeaders: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}http_headers']), + ); + } + + @override + PlaylistMediaTable createAlias(String alias) { + return PlaylistMediaTable(attachedDatabase, alias); + } +} + +class PlaylistMediaTableData extends DataClass + implements Insertable { + final int id; + final int playlistId; + final String uri; + final String? extras; + final String? httpHeaders; + const PlaylistMediaTableData( + {required this.id, + required this.playlistId, + required this.uri, + this.extras, + this.httpHeaders}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['playlist_id'] = Variable(playlistId); + map['uri'] = Variable(uri); + if (!nullToAbsent || extras != null) { + map['extras'] = Variable(extras); + } + if (!nullToAbsent || httpHeaders != null) { + map['http_headers'] = Variable(httpHeaders); + } + return map; + } + + PlaylistMediaTableCompanion toCompanion(bool nullToAbsent) { + return PlaylistMediaTableCompanion( + id: Value(id), + playlistId: Value(playlistId), + uri: Value(uri), + extras: + extras == null && nullToAbsent ? const Value.absent() : Value(extras), + httpHeaders: httpHeaders == null && nullToAbsent + ? const Value.absent() + : Value(httpHeaders), + ); + } + + factory PlaylistMediaTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return PlaylistMediaTableData( + id: serializer.fromJson(json['id']), + playlistId: serializer.fromJson(json['playlistId']), + uri: serializer.fromJson(json['uri']), + extras: serializer.fromJson(json['extras']), + httpHeaders: serializer.fromJson(json['httpHeaders']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'playlistId': serializer.toJson(playlistId), + 'uri': serializer.toJson(uri), + 'extras': serializer.toJson(extras), + 'httpHeaders': serializer.toJson(httpHeaders), + }; + } + + PlaylistMediaTableData copyWith( + {int? id, + int? playlistId, + String? uri, + Value extras = const Value.absent(), + Value httpHeaders = const Value.absent()}) => + PlaylistMediaTableData( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras.present ? extras.value : this.extras, + httpHeaders: httpHeaders.present ? httpHeaders.value : this.httpHeaders, + ); + PlaylistMediaTableData copyWithCompanion(PlaylistMediaTableCompanion data) { + return PlaylistMediaTableData( + id: data.id.present ? data.id.value : this.id, + playlistId: + data.playlistId.present ? data.playlistId.value : this.playlistId, + uri: data.uri.present ? data.uri.value : this.uri, + extras: data.extras.present ? data.extras.value : this.extras, + httpHeaders: + data.httpHeaders.present ? data.httpHeaders.value : this.httpHeaders, + ); + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableData(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, playlistId, uri, extras, httpHeaders); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is PlaylistMediaTableData && + other.id == this.id && + other.playlistId == this.playlistId && + other.uri == this.uri && + other.extras == this.extras && + other.httpHeaders == this.httpHeaders); +} + +class PlaylistMediaTableCompanion + extends UpdateCompanion { + final Value id; + final Value playlistId; + final Value uri; + final Value extras; + final Value httpHeaders; + const PlaylistMediaTableCompanion({ + this.id = const Value.absent(), + this.playlistId = const Value.absent(), + this.uri = const Value.absent(), + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }); + PlaylistMediaTableCompanion.insert({ + this.id = const Value.absent(), + required int playlistId, + required String uri, + this.extras = const Value.absent(), + this.httpHeaders = const Value.absent(), + }) : playlistId = Value(playlistId), + uri = Value(uri); + static Insertable custom({ + Expression? id, + Expression? playlistId, + Expression? uri, + Expression? extras, + Expression? httpHeaders, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (playlistId != null) 'playlist_id': playlistId, + if (uri != null) 'uri': uri, + if (extras != null) 'extras': extras, + if (httpHeaders != null) 'http_headers': httpHeaders, + }); + } + + PlaylistMediaTableCompanion copyWith( + {Value? id, + Value? playlistId, + Value? uri, + Value? extras, + Value? httpHeaders}) { + return PlaylistMediaTableCompanion( + id: id ?? this.id, + playlistId: playlistId ?? this.playlistId, + uri: uri ?? this.uri, + extras: extras ?? this.extras, + httpHeaders: httpHeaders ?? this.httpHeaders, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (playlistId.present) { + map['playlist_id'] = Variable(playlistId.value); + } + if (uri.present) { + map['uri'] = Variable(uri.value); + } + if (extras.present) { + map['extras'] = Variable(extras.value); + } + if (httpHeaders.present) { + map['http_headers'] = Variable(httpHeaders.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PlaylistMediaTableCompanion(') + ..write('id: $id, ') + ..write('playlistId: $playlistId, ') + ..write('uri: $uri, ') + ..write('extras: $extras, ') + ..write('httpHeaders: $httpHeaders') + ..write(')')) + .toString(); + } +} + +class HistoryTable extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + HistoryTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn itemId = GeneratedColumn( + 'item_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, createdAt, type, itemId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'history_table'; + @override + Set get $primaryKey => {id}; + @override + HistoryTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return HistoryTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + itemId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}item_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + HistoryTable createAlias(String alias) { + return HistoryTable(attachedDatabase, alias); + } +} + +class HistoryTableData extends DataClass + implements Insertable { + final int id; + final DateTime createdAt; + final String type; + final String itemId; + final String data; + const HistoryTableData( + {required this.id, + required this.createdAt, + required this.type, + required this.itemId, + required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['type'] = Variable(type); + map['item_id'] = Variable(itemId); + map['data'] = Variable(data); + return map; + } + + HistoryTableCompanion toCompanion(bool nullToAbsent) { + return HistoryTableCompanion( + id: Value(id), + createdAt: Value(createdAt), + type: Value(type), + itemId: Value(itemId), + data: Value(data), + ); + } + + factory HistoryTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return HistoryTableData( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + type: serializer.fromJson(json['type']), + itemId: serializer.fromJson(json['itemId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'type': serializer.toJson(type), + 'itemId': serializer.toJson(itemId), + 'data': serializer.toJson(data), + }; + } + + HistoryTableData copyWith( + {int? id, + DateTime? createdAt, + String? type, + String? itemId, + String? data}) => + HistoryTableData( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + HistoryTableData copyWithCompanion(HistoryTableCompanion data) { + return HistoryTableData( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + type: data.type.present ? data.type.value : this.type, + itemId: data.itemId.present ? data.itemId.value : this.itemId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('HistoryTableData(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, createdAt, type, itemId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is HistoryTableData && + other.id == this.id && + other.createdAt == this.createdAt && + other.type == this.type && + other.itemId == this.itemId && + other.data == this.data); +} + +class HistoryTableCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value type; + final Value itemId; + final Value data; + const HistoryTableCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.type = const Value.absent(), + this.itemId = const Value.absent(), + this.data = const Value.absent(), + }); + HistoryTableCompanion.insert({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + required String type, + required String itemId, + required String data, + }) : type = Value(type), + itemId = Value(itemId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? type, + Expression? itemId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (type != null) 'type': type, + if (itemId != null) 'item_id': itemId, + if (data != null) 'data': data, + }); + } + + HistoryTableCompanion copyWith( + {Value? id, + Value? createdAt, + Value? type, + Value? itemId, + Value? data}) { + return HistoryTableCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + type: type ?? this.type, + itemId: itemId ?? this.itemId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (itemId.present) { + map['item_id'] = Variable(itemId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('HistoryTableCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('type: $type, ') + ..write('itemId: $itemId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class LyricsTable extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + LyricsTable(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn trackId = GeneratedColumn( + 'track_id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn data = GeneratedColumn( + 'data', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, trackId, data]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'lyrics_table'; + @override + Set get $primaryKey => {id}; + @override + LyricsTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return LyricsTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + trackId: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}track_id'])!, + data: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}data'])!, + ); + } + + @override + LyricsTable createAlias(String alias) { + return LyricsTable(attachedDatabase, alias); + } +} + +class LyricsTableData extends DataClass implements Insertable { + final int id; + final String trackId; + final String data; + const LyricsTableData( + {required this.id, required this.trackId, required this.data}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['track_id'] = Variable(trackId); + map['data'] = Variable(data); + return map; + } + + LyricsTableCompanion toCompanion(bool nullToAbsent) { + return LyricsTableCompanion( + id: Value(id), + trackId: Value(trackId), + data: Value(data), + ); + } + + factory LyricsTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return LyricsTableData( + id: serializer.fromJson(json['id']), + trackId: serializer.fromJson(json['trackId']), + data: serializer.fromJson(json['data']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'trackId': serializer.toJson(trackId), + 'data': serializer.toJson(data), + }; + } + + LyricsTableData copyWith({int? id, String? trackId, String? data}) => + LyricsTableData( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + LyricsTableData copyWithCompanion(LyricsTableCompanion data) { + return LyricsTableData( + id: data.id.present ? data.id.value : this.id, + trackId: data.trackId.present ? data.trackId.value : this.trackId, + data: data.data.present ? data.data.value : this.data, + ); + } + + @override + String toString() { + return (StringBuffer('LyricsTableData(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, trackId, data); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is LyricsTableData && + other.id == this.id && + other.trackId == this.trackId && + other.data == this.data); +} + +class LyricsTableCompanion extends UpdateCompanion { + final Value id; + final Value trackId; + final Value data; + const LyricsTableCompanion({ + this.id = const Value.absent(), + this.trackId = const Value.absent(), + this.data = const Value.absent(), + }); + LyricsTableCompanion.insert({ + this.id = const Value.absent(), + required String trackId, + required String data, + }) : trackId = Value(trackId), + data = Value(data); + static Insertable custom({ + Expression? id, + Expression? trackId, + Expression? data, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (trackId != null) 'track_id': trackId, + if (data != null) 'data': data, + }); + } + + LyricsTableCompanion copyWith( + {Value? id, Value? trackId, Value? data}) { + return LyricsTableCompanion( + id: id ?? this.id, + trackId: trackId ?? this.trackId, + data: data ?? this.data, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (trackId.present) { + map['track_id'] = Variable(trackId.value); + } + if (data.present) { + map['data'] = Variable(data.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('LyricsTableCompanion(') + ..write('id: $id, ') + ..write('trackId: $trackId, ') + ..write('data: $data') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV3 extends GeneratedDatabase { + DatabaseAtV3(QueryExecutor e) : super(e); + late final AuthenticationTable authenticationTable = + AuthenticationTable(this); + late final BlacklistTable blacklistTable = BlacklistTable(this); + late final PreferencesTable preferencesTable = PreferencesTable(this); + late final ScrobblerTable scrobblerTable = ScrobblerTable(this); + late final SkipSegmentTable skipSegmentTable = SkipSegmentTable(this); + late final SourceMatchTable sourceMatchTable = SourceMatchTable(this); + late final AudioPlayerStateTable audioPlayerStateTable = + AudioPlayerStateTable(this); + late final PlaylistTable playlistTable = PlaylistTable(this); + late final PlaylistMediaTable playlistMediaTable = PlaylistMediaTable(this); + late final HistoryTable historyTable = HistoryTable(this); + late final LyricsTable lyricsTable = LyricsTable(this); + late final Index uniqueBlacklist = Index('unique_blacklist', + 'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)'); + late final Index uniqTrackMatch = Index('uniq_track_match', + 'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)'); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + authenticationTable, + blacklistTable, + preferencesTable, + scrobblerTable, + skipSegmentTable, + sourceMatchTable, + audioPlayerStateTable, + playlistTable, + playlistMediaTable, + historyTable, + lyricsTable, + uniqueBlacklist, + uniqTrackMatch + ]; + @override + int get schemaVersion => 3; +} diff --git a/untranslated_messages.json b/untranslated_messages.json index 1bfd16af..9cbff978 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -3,181 +3,441 @@ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "bn": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ca": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "cs": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "de": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "es": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "eu": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "fa": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "fi": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "fr": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "hi": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "id": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "it": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ja": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ka": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ko": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ne": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "nl": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "pl": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "pt": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "ru": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "th": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "tr": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "uk": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "vi": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ], "zh": [ "invidious_instance", "invidious_description", "invidious_warning", - "invidious_source_description" + "invidious_source_description", + "cache_music", + "open", + "cache_folder", + "export", + "clear_cache", + "clear_cache_confirmation", + "export_cache_files", + "found_n_files", + "export_cache_confirmation", + "exported_n_out_of_m_files" ] } From 083b366308259ed480698077da656a0c927f7a2b Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 8 Dec 2024 20:13:36 +0600 Subject: [PATCH 07/11] chore: upgrade to fluter 3.24.5 --- .fvm/fvm_config.json | 2 +- .fvmrc | 2 +- .github/workflows/spotube-release-binary.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json index 305f34df..7f89fed4 100644 --- a/.fvm/fvm_config.json +++ b/.fvm/fvm_config.json @@ -1,3 +1,3 @@ { - "flutterSdkVersion": "3.24.3" + "flutterSdkVersion": "3.24.5" } \ No newline at end of file diff --git a/.fvmrc b/.fvmrc index c62692b4..679f8e11 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,4 +1,4 @@ { - "flutter": "3.24.3", + "flutter": "3.24.5", "flavors": {} } \ No newline at end of file diff --git a/.github/workflows/spotube-release-binary.yml b/.github/workflows/spotube-release-binary.yml index d059a067..89c2fedd 100644 --- a/.github/workflows/spotube-release-binary.yml +++ b/.github/workflows/spotube-release-binary.yml @@ -20,7 +20,7 @@ on: description: Dry run without uploading to release env: - FLUTTER_VERSION: 3.24.3 + FLUTTER_VERSION: 3.24.5 permissions: contents: write From 2d972c8f57d0a64d1ea2006e0da48c82b9e2e3d4 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 8 Dec 2024 22:47:13 +0600 Subject: [PATCH 08/11] chore: update macos logo --- appdmg.json | 16 +++++++++++++--- assets/spotube-logo-macos.png | Bin 0 -> 87666 bytes flutter_launcher_icons-stable.yaml | 13 +++++++++++++ .../AppIcon.appiconset/app_icon_1024.png | Bin 268308 -> 60592 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 15382 -> 6235 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 735 -> 499 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 39099 -> 13160 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 2042 -> 1127 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 104174 -> 27418 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 5504 -> 2870 bytes 10 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 assets/spotube-logo-macos.png create mode 100644 flutter_launcher_icons-stable.yaml diff --git a/appdmg.json b/appdmg.json index 350690e7..eb9b5236 100644 --- a/appdmg.json +++ b/appdmg.json @@ -1,8 +1,18 @@ { "title": "Spotube", - "icon": "assets/spotube-logo.png", + "icon": "assets/spotube-logo-macos.png", "contents": [ - { "x": 448, "y": 344, "type": "link", "path": "/Applications" }, - { "x": 192, "y": 344, "type": "file", "path": "build/macos/Build/Products/Release/spotube.app" } + { + "x": 448, + "y": 344, + "type": "link", + "path": "/Applications" + }, + { + "x": 192, + "y": 344, + "type": "file", + "path": "build/macos/Build/Products/Release/Spotube.app" + } ] } \ No newline at end of file diff --git a/assets/spotube-logo-macos.png b/assets/spotube-logo-macos.png new file mode 100644 index 0000000000000000000000000000000000000000..b14a769172d5ceda9c75403bd7981a93177ad300 GIT binary patch literal 87666 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

yREb^qD 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%0AUnSO^3m~XBtNS;{&BlgL! z-hRU>yNmIc5reZXP3xGq=+^w!S2CJYj~iL-sz;^xw3eb9_#hU5)dF*{09!gQHDsm- zKxh%Z{@9c8u~H(~C__Hh`#2%8k6^((|L5WM7 zKt7q~w-84l)@1{Yj;LMPcfr6;mdR1AmSm9*^FDkDu^bsIy+Yco#A4rpBRZ&kC{gyDR`+_&JzDV1Zg5VL&7PibPD<=iR4FT~47y z7T7ZUGz1Bb>D!5&pB#0jUq)l@uUMo1J_6SOSoqSVB2WfOq8f;hc)S?mz5cXQQsRsm z)=kZNeQA{w5I@%_cc?1Bh#gn9Ok$IHFHvf;+ZJ6H2uT=7y8lmPk3ugwToelL%#1!z zthzK}mMIqR^xPjdYbp5q_$b*N(`a+=5MRQ%p-1&eW|T2{;_lWr`T}8B=LCKO5EgmB z$TV8(U59?Lk$6(+jd^64j`~t#d!}&8f>+LRg!9Ew>illG<>D1y1iOb#5WEgi&`XD&)+>I~}AXu)bEwiTmV7zMJcc z;VLg*V&-wmqU?NSuC4oC5N5dxzKq-+^K7KU2 z?a6xW5z*=|Lm2|3dj%L03Fw^@;6+d{2XlYrYi|Bj2t_IIiw#aUD-kl#(Kixx^tzvX z(;_t%dkF{1^;t(*_XkQ1G0?lfd44#|DHc|TQwbUYfsH{!F|zA=lTGd56Edf^pX^=s z8K%3jxYN1bbKwC?)GH1?_ir3v{>yU747_a(5K#b!CxDL3aO=u+p$PY8mfICSrQ<-I zd-Z+prYr5ti)AY>|DqtJKvWq1=ofkBARy_~c}!(44bT-qfH@F7!9MYt8q>Wa!g^1G zEw114`}=n!)^RtpZ7L@2&pa+k--+(@w=h3P)d$i7W|j&+zd(TozFEqylw@ySzfLMS zWVIZ(c8w7iwMfv9AwU5 z&2r};h)FFYsuW$gG-=4NZCOZUb$LDQx$n6r3$i64fvey&uSZTsL8H*{yr8Xo0DLs5DUF_5wqAt-nYQ!c_veJA8x3xBUGGXrl9|BILF4K)LO zHgj1o8&8w)bn~&q{Q>Nsf1)#ihz=14f)4KJVXW6GM$gB*$rxH#$Mn%zuh~k^WbrUI z`Y43|b1%U19c2Oc^rQ##_FwE~t^PigUwtLBn{OgYNc3iIty5*9GG6u5sD5=wXN%#P|`ABQnB zp&E$hnv5wZ){7)%cY0HNe!T1nKAr06p(*&aHCym~2gw?@(zMOUHT(O?GY(cFhWG*? zVyJ)yv>z-8Nnl>lYZ15b8Kqw=w|SEFo%J@(7K1t#HtF@c+~fF}@7x^`g2nWzDt?@< zH^`x9ApuB^_MZZNfY|wPq`uITW9p0U%j<9#-D@VVIFaAI!u{za@Z%i}@+%>QlUX>_ zVxU;=9xK>fm3+X_kx;qOvWy3G$5VC+sU0fx95d4Ud{d6$f5G zry`)1bQRXi@z)PBzMT^U<%WQIBGKXNzQp(U6Op%3ua>(v_8f`RXTP!w#>)iC5s*(TjU%aZ=-Z=k3 zwx6kD7Oc5N5Wv$59x;&a}NTkh1PB{VDCzLaX^d?|_Vq}yl3wEG?+S6#KG zNbs*b)ky{{Sv?Z|6EMQ0kErPD>qy$GiYH88{c;9JCa0%;zdjGgJpP(nY84GtA}l-h zektuLz6z!)=R+ERh{a#5r6^-bU^T%SJBe=P(ByC#UJYpn9=OiI6gLH5q4`B7x zme%Y)Ks?Gl35eZ9Yy^;iR+8<%>^j{XeL9<=YMEtfDoaUGZ!W3ISIc`P_StFOL2Lds zc1Gb{7SOI;V*tg7IK@75ZGVsP6hHkT8PsNYb}fDlPIC`*yr(GO)+xX2Keog0v#~Az zpv|O+2smsL1o|p107Hffz(z08cEb$!jYv~Sw)s{7Zgv{Xu!&uC~j z*mK)dKBAq`@1O++Y+4biC)E82LlCd(x)UIP8s0d->y&e_H!sFesU7t*_5N4?r{%E} z^?I8)Bi%Xt&2KRfv=!t40+=&~gdYH%{czLzx9=Q(g|f$V6%{$L3iwUp;A_@8KZnfy zFs{q!h*)@=;d6!}QzSb9m{_1l_vokOET+bJz20-Z&J6i)B0x)X_0KkUyhq>X1*pI;Az#60$gskR|3@lWI5ypz5*lt#Q_&mM%^ZxR7*0U_(@?owct0$hD zqE-i+OnP#Z|8784_D}N)7B>)Q*CcX(*az$oKO^`?=!zA%>*8NuEt|^fr>h_J+!Ny* zcIgbb;OmLk(*CFO4-){WOz6kwemD>b2`zC)3`6jJOJaSy^Gcd;?S_)u7(@Rn7m zv4BX6RAP%`*$fWE21_X8_;2ADh@T@YYpMnh_1&5#g4*lIx-@9n))(()$uxG%%2%I; z8p66;fUh7~!v!GFy|miRwZ(U~ChNkK#!6G}>e{)dCpZS)m$?o4bWvP@ znvTSH?asJA+dEB!Fc>K_>%- zrzC|@3+Pn?eXaf3-22M#>j?dMgTr5v)k;nEz#1p1jJDU?nHmEW^M~C z&>m5JTwkGAvi0cr=~eYn+9NiWujhjb-)3cxb)FD2@ai!%pnv2<`K<@|@EO#wM!Q1E zIkl7-V&zf?EgepkKlVvPOQb{cRCukLwH}5P@xcT9QhnPFMVq037eM=={vON97mLRq zLiiG&q4h_ca8#DKP{%i&qWtbbn?`5#BvvXM7^wtO;4g69(BDcSo@WJu@7JG}^$kZ1 z-DLgof|U&%<^JVH?eqe#u=kzLfX0;;5qBh_Vg3L>1KZVZgDD5xM!!S+OE< zQ?k&t^%xS)GaTe`S>U(_Rdcr8zH8g2{V`#`}$ z!|{DMgXFo(PL_%|VxT-A2oNxYl_r>u|Ltu63EGbm`J{%eJ#QLJWmXoC?lfl4cY5M# z)IAA*l5ezpA96~VIIN>EAX_{m3Rs?JN#cC~X8D_bI0xOX7$Kf*^-=wHeNWFtVJv0I z`i~sb1cWIJ1RDZEfXNapw0R@8$N~5MN&16=o_B&ZkKHff2@MRFp>elJ;#9hT->D_j z=XQ98L6Cj5%aPoV?9$A(sqnrD(LgEmS}S7Zt5L9q9kQ5XVMIS4l_kO)`_{4e_-W3t z0_b5-Xbs8_9~=K8Tx*P=F#q#ZK4v@sMP*!rGEio0UQfcBHy8P;q{ zhy(IrCFuaXuod)%Lwp%NtWVo}Pd+7YrcNcaL{So7h^j!J+w-P&%W-?Qpor>KiF{Ir zsRs@W1gg7lf)0jB39wz=FTQhp_B?}S&Xij0EE17URGOb7Sf0a-dgS*o0DIGi1cLv3 z0+7rsc7TPE2 zrwMOrVvA*8>sySo^>=%f9Oh4ZI1pa23<=WO#-!N58aM&1(Vv~u^&kFjO;Q&DWT^Sq z#vif=6BL-6km$`;y$;hpD;x*b1vByeTdgE6OKXaPHOl z>E6kQXNVd43m&X>sW=SEUKtj-w>^kqM&;=+v0%W8CdKKNmMz90a9k@FeobtA8ApSJ z{yh>vT*yOvZy%9L4fjvS?4rBxLT21{5V8f82dshBZqG^L4jZ?E=dmo6+n7}Y`~m$ zY@m<;1!1E75S1F6f6&I1QlT?7_3qLNz>-eXSCwNppi_-k4($@|3r0vLirIv~Qm!TF z{=7Gd&&O|Ocb_+}{PaWZFEu3$8`EW-z&k784jrdfO+yUHaVp5SGz)i+=&mH^2?AYL z!EyLs?91YqF||v>o$XA*3s+HSm-V+Nd5WCcd}^&@VQRkzS;bnA24cXHkGV@eNe*qW;tCZBLr zY$%iyS1*mW7a++Aa7P715dueHO8$at@ImO68*~e{t_1JzF&Rd(nDSGf67ZtgaQE91 zTF)xC|fS(lAphfDG82bBD^3l$Wv2!^E85e}h z2zH}D9PS$y^E<$sA|jRA6Ba)PvtN)oeO!H_dD%=Af~tzhM7^w{ekf znjM(#qzr_q>Au1x%*k$vA)?=;~-dwQ$j({0B=^3!@K~#p&sK0nZvn@Eam=YgPShpiX3CC)h;Q| z5&8t7bfK4&faYGbC#p9VJ^bLDbm6vdH|%6qnx;^tMN!B9D?KDQNPGkT29>ahcGh4Swdi>SwgV@z@({MVbA5aT|0xiNBBm1Nu z8O3b#vFNQzUCX^$)Oh;wG4#XtnA)%Cmc)gMBB9Vk5c7b7nFc75IH8OruojbGZc6Go~OsnF1Aj0B@G zat(BaN+Ce@d<17KYGhxWX5w*beX=N?XRpIkH*)c7h+Rv3Os!PL_{~MPc@83^ek@1> zygg|n2tv`oFv3V+a*>1rwErlwB&2(Yo%|k! zBlS&u`#`2S@bvt7SViLCj)^1Qe^?X|AnJBA7IPpcMb9iq18lw;4emCgFleNVWy`oIXFAF?Ne-+%_&$7zi-qU{-%;LMN&H{a zwi@+!xDM0NNzuj%(T8xeLv7fGud)m}x%slWqeu7X`z(oR8g0GVSP@bD4;UknP_-?`1rc!=mCS{feme)t6md`E>ymM$TW_Poj8l88D zNXilzjtN~3jQS4@K?)k!mG8hpBzrJDWUn$!%Z|NP;nqFS7%{W@541y(Vl)rin&%Xd z><0>lS3DQA7crkXI4Qdk=$pg?A7D`e6zra22?uFo2Tx zC{a&VgfS!bPHr-u7xIS`EZ5sz!5Q4u7#`4f48q&$TN_E~LBAHG{gELIM=Y1AHuh+n z#`Wuav5o0*_Cnoia=<&xVj%zeBm*9xxZ=hGvmX+WvT~0!;{DeF@pxe3F2Jz_3^OvSV2rmZOw3V|3jnnm7^8UlnKwZJ~xlKTsGd zklW;@0USH1^-)#7UYPJK47}BlB1cCn;&MoHC-W!5Ul0NRSKi~?*RzD4UzRg z1KZDntMESGn3+VtuBXEc=TO#l>bmhAb}=8z{^;e|ylnU{HlP|PUhRg1wXVO)ddSg0(Rh?fi`|oL@>M(B)^!T?S=qg4#{3r# zJ#48hD}QGFkFsEZ*YO%sQUi>N1U`uS9q@A{sOfN8u6VJ;!sWq#YK2u-DK(g^`Yy-f z5@&`3aX}?-fIOH5G}_ZVuU6VMq{|gWC-2_DKy?9L=*wD>AHJfz?ADOet#A(f48cwy zTDE`I>{0voXCzSGXr9a$zdM7^XwS-XlL~6&{k8=PhIbD9A;8t0z~i}Lg6l^Zn8%BS zk{Ni+6A$bWlv*^5{GdI{n6E0H4p9e7q0TOvN&mY=>m`@2bILiCvT*DhTfZgZJ;&g2xPg6Y`Y>CR=@qfb zPX0XhYoz_9%x@bJ=U}>vuslotKNiu92MmDpECc#Fdj}o=*k^f+y<~f*I!|MoDt31p zsOB5*j?st5t?3X4)$B_;Yf0b?V9}a3sIM+Iai;H3Okkq1Q#EF>24S(;EQRv-hiA>a zAC3IOuG2L_1Y{WJ7n;OLGq|t-xWJ?U^kh!KPx)cWvT54PdJ8Bzdm|~5Jc>v7(K>2%7~Bv&r*S`n@Dlp zDGRx5MU0x+Qm3ARKLN{m!xW6 z=)Di_tQF1`AOIi>yU;Upxs(pnn`_nMd59_r`gP2uI)uhitH6WsA7VFyE(jyr@XH=3 zU;CqhYGJO2UTld320khCvy~@{Rdj-dCphunQD}$N7TyGlXmRDTK)i-Ys5@oCS2kNH z^*W5rRgqe`7)!#{BZ3h2KK|W5SpVOqHITuC`JAMTK=+nxCrtI+Do&Rv=??qPzR>Ph zsN#}mR{VEaI-7EBBsw86>nle{YYKlQ_aMwwpSPA(&NjDpX~J)M*~Y9%h%p2R0@0f? z&U7GGs9PJR;s)AL6r@K~!$`ME=v2h$@2TCc`Zi+jR^97LvjcS;ACM*-&d0U5_FacI zluY|kvs6k=hg?w>&1;5!(|3>(2?T_@p;c&T2mnfB5ar*;)S~C=q0AH8n&NxxlX5uD zAA2mZjkA6Vi5DXNn<+B;S#y77y@RMZ`je?~{<-}cgm|vp1h@iP3hb7C!Pb+z-C!XA zDrkgt)m|-_TvKKqxbGGrhTtCwb2QOQhN#rveP(gKqnAKY>cWmeOga>ef}G|UbO!Mp z0=T^nZ6_RNXNbWQLASge+-O*vIrfhSG6bCYuNz{bPDBK!a(WP^u|@|X+fC;42~lSw zrxQK@Zab-&&e+7-cakn@RO$aOBrih-*xG_~i2-3~GVoPUV@@I%V>@cOd`2_Uv-L+V zBTg0xg23t-DRj(jr+c~Ht_VM$gnUi+P^%hCbpwcwQ}G?ppFjezZ9WYY0enV!xOAM8_oHN+W3)+?S7W@oRHewkfmh$RtiAr<1I z_-tQ*AOehe4BQGKcMPY0in2_=tjj{sbHDR5<)f{xDF#Nu&#TV+LeurhvOXYvo>!uCp>xl9XT$FIYtDGA_4p*X4MTRaZCWI z8PRLX%&i?MPSQ2Bjr~h=-q|KvK7@0puW05OaS^XkJe;2q>(kzHyhk~Okr`tu zH?!5bmZ`xc(;(%VDtiHVk4vYh%-GP3D=fR7^})m&TVGRSzp~I5iTSnEs`+_pAU{+a z2C1^XIHY%O%=V)n{4N;cVc9bE2^%WaKyDm99dM21>w@kv&t57G{(a0NUI`AIl6 zk3!9Q;fo-ba-Wl1 zmCtV`z#|!>PG`|?J%O>1?5&Ls?M+`glK(ZcP@rri*$7+O;g)N_vtLm9sHBtT_@@1HxKj<6q`BpS z`3x)S9$xJCKmEQ&Jn}SgiIiXkye^QP-KjqH><@_CzdPLt} zxP!n;x)QgF?mb6a_CASv2A*-ck3bIKPtiR4;O{!KQAAc4rwFxtJ+{?_# zPSi(mQnf-Eq7IrLFgPBsiGN{)qmg;gnwcc_WSf%8Qj?&+s4`u~j(oskt95;EA~ACJ zZidZUAuzvirtiAW8V*ZFVkHE_?{{gBh>D~s z0yzhL)o{`-O1+LWf~f7BIW2s^W{#v>AoORGid>9(Um5wr=fTg~2sReQxwY`Bjnkb6 zBFaU$Kn30hQ==9`>i{aJ?FPDob)&byZPpj1T%BTf`nB1iH$Z1xf(f`&*E?g^u6!;o z4vg+YTk#lxKS3beJmp`|U0MkdAuQ!Xpm1N7&LhsVp|_us62wEk|1-b%HKFOVv?$|? z)PP4|L@k7vspza{m0Qvt#D5raWaYg9Fo~&^&7)StT`=GkumbOvRK|$mPt*`9VS?uJ z6kgnQtuX@){(02o%12+7L*fJLUXIg1CS^(ip@Qkzp%X8pB;x*tTZT?TNL3^*Ph^Dx z3+IQ+^Ko&2Z2IhBU!JVqwuu4DtbB&nynEM^yww3q)8v??qqZ#5Q5lii!}i|(_ZtWq zGl9s7ijvBDbNMTOtH1Y0%sss2=y;#xJ5_HA(xV8{0fk_4#V>$BRVJX_*?5YBh5wpf zP(wIlj_@u7#Sk{wF^^shckLy5URHlL`c&rQYiw$bFSlY?E}jHn-GLMUQAeGTLbAjM zTv@D3o|Qi}hF%=cnKTyD)HCzUFknG(_8he4>Fx$oI}h-(X=1KN@+)M2m&uP; z2iRJ2=7(;E%Ki`_Ft@u$pp`uiCEj7z<|76rMm9npMJkXdO{dilh4A8RohS4@(2ZKi zo|PSE0>S40h!Fyd1{NyLztQ3@7dP8X+nZ-g39@AT%kHa!0bMwlSZu^)8dm)kR%l)f zqyHfHTpfV#QkL`ulAxCe+;AEZ#)d&WrvwgP&}irsG0}BMQkLH(80mB<*48;O)Es8f z3pU~YR~0iTk%<8b+6Bh!SP5VHtD6V8vOV&-{(dTBhDF7*7hwU3!NV5xy!TEF+VBHK z7-2JMDlhZQg&7wIcrJ&vXP;w3-1(o|gv3No`usD+d&LEmH3`&|x090BG%7+WYX+$K zck|M^gm9QT!mZc&C+X7-vZ*>Ln98jJ29+NbpGcqaD||vlOVQv3I!vzywnO<_n(>wT zl&EEz^Lj?g9+|u!5sGjDJPM8%qlE*($wC_kdVHQ%&_K`iF3V9_E<3L&rkdkqxBo3Ev0!Dscx)_4k!B;r)W{Q? z(TU@>M$k(xX-r9+NYL$;4sUt-_NFQ%Ut^h8oW@U{Da{y(+<*k)yA)6&XP--{iLw3T zk=||O)`y{<7Y%lGZJ$Y}NZ$_uvo$gllZA)EXHbP)Oi=0Mm(Nj2WfIBR-hCc{4wlZ? z747jmv)6p4cAQ*SPe-4<5*+N;)`bJI_yZt;Q!pZAOZ;6PkzUi{?$1u)9>lB1#^b%x z;cfn=>~j0t(8_ZXvcgC5xREc&lf=N`k!mJIxx)SDap&wjlxt!zmBj#yx-l3$oj7II z%*4X$nGVhpEn0Lz7JuxwMeC2@^Xr=yftEQ>fy=V0;-DUDn9TM!LrEP; z8wXCt@~Uz7_^h{SE4>GQhRhFb9y4KcaWJu(O9ojh=Z7?uueW}E5Ubj(o+Dk~qbBbB zUZ+5cOPgnv%E@i(aSrWefk%X_e3C(}QhK9Zo@U&1zI+fo;Y@Y8OsZs3M(LzeR(-jm zM}9fv)PHEs(KWTi4u~2%yzBRk(gy>?Frc6#5SFYIR>$&9cXk9PuFa&TpJVj%JQ`e? z<`ZCBrbwzuD(I|qKVX=e=rN}0>$pJQVhl9?nPn!a_+z72os6nS-uIdHG?D$&C??{{ zCkVS?U)nEcZV&g{b5~DfDfmer71#fn%?Lf;;nPYA$?cEoMYMlP$2}afe_2CLWn>qv zF7JG;s#m4ImV_6n!5FbRQ##=HH=L{6a1S2}+W^%F9d^2?U_<6)4O?7>uIk`|C>9?1 zXpPYR@>G&4E7OF$$t8h7Fw>*U`*&~V%%ea#cG|VqUZ*)%3cb!B1;#J<|EhK2|Dm&_ zKey#h#sq}}&k$YPh2J=~brE4ohnK`Plff*34gf zwekK`t*&Z~n53M3<<0DFH>ovc5zW+~tuNR*KUNZIK{VZNy0Fz6OF@EMlnMa@aqKWgZca}d((*=;ZzE^i1I(;+y$*rCg-*4u8&_NXI zlvVv&5n5<+S}@Ge1*?;`mH~70cgZ^I%8cvP-0zr5WXK2*scHJSO``T0+erzGvL%5p15E3+dNGDY|5_w#D{;`Gk3CMgpo_aR$JyWn#K5& z9k{c;{s&7hz37qY3i)rttcmjk?~yMnih9dQjI5oGWXk)O37Sf)X2u{!%k&?qift-= zRW3zu{~jMd2&x>?lb|-E%DQb9V=ju5J31Vxxfk#?u~+$sS2}BEsx|&(@tnwe{h)Ac zwNiC+U{^z&N_XsCGu+n4a;4)kd*VvnC6d`^{_!wlMk_`V{a=?RWl?rJEu*0yzDt>- zq*|}tMh)ewZJrF^s-2gM#RdNm7(6n8UEoGVD*`KtPd3&mKXqU;4!99{3C}Ah9P0jI zT*Z|qaGQGJj$ER-hq^WY^G32*?ZrZAieF>Re@0ri*~8upoqL+@dWbW>02jB5?O)la zK7%_Qcj}`g$`@M?WuK|Dc#_^+T$ki602F&XpcMmwiC)N=ANt;I`&w+8+esq zFYps=t+pe5U6AoZmk2Zl4Lu+=kA0 zre$ycxAyVQ<+_$f`}9t=inxH4#;4&ssbTMq(FA>1rBvzXAM@lpD^H< z8@=}UwNsLH;2rv^_KQgrtIdPyVghqHlg5s6BG>(P1M&Nzcg5qWjaqIKU|k1AA#2@Q zuGg1N6NH7vU-ppWkj2x*n5CGfWQ*o!q`3BH9L?BLwwFJ1p=l*4z4NaM$N&&$;|%)#%&k&C{o>>I;t3*ia$Af2~YBg?FB zpP0Ib3P(iD`tE|;MZ`v4%OS$l$N1yg*EcZIQ=m843eDv!GRKbUT{r1Lm{^ zw{P6})ZbizR#&=Ke1R`Ti|rqSV4LS-vHpX6V8tpRW||qgO~5$4b=86|S=Hdc`gJtb z*7IBZWZCU}R=viV^Ouz=B8GE^;;7`wdIb=6(IfzzHN%w7M>-8P^UCP(*t-RP{F{}kM&Ftrey4TX}*O+LoS6;We4eJDk znny3WJ~@;w?2D@V`K3Mi9rZ{@rf8C*4{6 zs)dqtuHb8-`6h(+jRE5yW=IH86MN($mFKd0b9cTay7|3V=t&43)WL5aV^>uN_AZGw zN9@vVVA+G=(U+Bc{rMhYv>V=9FdtB{>;BF>M9q2gqR>w!D?MYfkh3PQQB%oaT}3A) zO(Vl#gepv6R>4!Nl=bZpRi7a6cEU-aQv(v9^msT@dY9dJcKoZvdlp|ahh2qi&0&4e z-Hki1l+>O0@zG>@b7-JZp~da^QpBgcH+Rp+9YLNDy0h5`gJI-;WBtZ@-Oi^eQcI;L z=(h3d{@Eg4d++b9NP}T+N-m$X`%$BUemktQO6Onw?s-Hm69YLXHevog%E?~~4uXsF z5RYwm?e{~mBy44G7ium4%w4EsO!j3wBuh0%qOwlzD}$*~#Eld@ zl{>z_jH5tD5;YkN_g|tFKDkQ*{Toe+EX|*`&z%NdoF6u)=ZX)I~w({tu`a7AViX%XT!}^+)dfWP1~D#5}L?#iwU?M@+x2`N6#~c$d7EzAp?jw#=|9 z8BQLps14bdSL&LO%4;h>JAD!R;?U@!>o=9+mz`ziK{LIvD%zoOJ1o8YcrMEE$K7g( z&uXT1!@HT4^}FC*N^LVd=$a*b{LMyAv@BCnDG%sI2I(YaB^9(i2uT zkcE73nH6B2s`FJ*Tc{z=ZVhHE#*A6_fvkIK;&GbGyG+8YXJmyh<_4qH1&}qOrlMtK zb^?PBN)!1PEXUdTtRxpY_e+1qpLVb?D##Z}!ZItxPolQ8t5%$TI?>Bq2IRCIXbqKr zG?p{y>Jt-tR21A53^sdIYv!YfMAuARHwhOiu-Dg8n{G#qb9E{hb1eC{Sp~>ktbn6}^0XXYF-28?mW%T>NBu@Xj_% zcoA2pYg>D>d3Wol+a0>zr=7;Wfmc_?&Py2kWrO4Hmec1fADtIK9%Nu1q4b6I=BH7SAtt zPkiP*-tvcM0u$pEa$7@2#hFRD%D?shhEe!_C?c*-M?`B3Iy(a2K=JMKR4pCDvi-L^ zp^|5tqk0@6jn&6I5++t&{JTNC5-t69Z8E$r^igjoccw_$8P9pv1PV^BB^By3ZZ`xH zN%;K6#Ze#!mTU<+48Id^E6r4tg4E>On7YH8KA@AHZ}nozV5#_*@DkNR67Cf_evHbv ze-JlO#Fp>g`=#;7$->T-g9fXP#d>eozwW6eZM2#8k)SAW*JwJK+!3CEaM`FEioR7c zkR)@RJ1rs8FvgNEZ5-pRQQ?e|Xb3He>wfuC+IB;gjvA!^Oa*Pj` zvTJfw@%j$hY!GC)V?(17;6sm9F zRq&|lQ@u8K`N%)inJxa;M>6c9*(Foz&hPA)qVp2b;ecW!Q#UqGG*-AeHt4BhxYVK+ zTRW_f%JSy-;WZU6WqH`;;EJsk=4w%!Qn z9Tf}cxvj>iUg%kL+NhcchXZHTCG&9^+H;T7opCub&=P^_dn}$cRr~#$2Gu27LcI3~ z-@@b(Mwt2w^pZZCL=ls0bxN+DKgsjuemk=_-NJijzsEYRQg)lU78kbiJXg*yJ(Vad zGL`5GYfYPxsaYz zdfv5x=lM6(v~lIr(%(mVtx`dne+o)HG&q%KVm((^9F-RZVy%SU(Gu~UxE5W_`nY^m^sXqIT<; zExLP>HuQQAFW$`eS^ub=Iua~PV`b|ts&Q&s^|1`;O$m^X6dynfug0nD-ivYQXRI`f z_T>EHTi~E{tGtJRbTaALc9y5uLLVZ3P6%-336V60aCSWAjLeyz^07ha zuP5Cx`1MO(NPNFe9{;;S785ZwP*vpA26jbEx-{X7-;7gtmz9$>53(dYUVG_{mf3R+nmXKERnAdLPmMs3pmP=!?Tj?sW7BG&{&-7w?`$%iQI_wh<4d5_U3V9jB1uL?qt&p- zHEXvg)s>@5xRmS2xgzcVtIB+OAZ$5(>)Sewou3 z(cHPn9l#CPf5jfOz0KvjdB4f?;Smc>3w8%Mp3qh53-Y_Ij1djaf5NHA2KIWM?)Yn7 zVV213P*7KkhdlGdVm$hl)x;ZZifi}!>`UJx%eT)s%7p86Jp_vFtOksnpT|%Gu$;|8 zoFu}NJ9^#~G;1l;TdS!vC`s?L(UEql{(3)adW0gwuVyRI$hXDLz=~~DAc@F8vsUk| z<@J!#Hu38FAL$F%x8wFZjqidBjsbAOfPfS7SrH4i6Eks=u3N)L1^W+FP5M*ui*~!= zs~u)Ln{Tug?l1o`*z{<6^vd3)LFwUeY8$Q(epj+9 z)`ki{FT4HC-sl&(?nPf(b7k(`=juGAAP-v)eTL`osBF$98wMSrA(_!vk@ua*E8#E> z?A6w<3cexDvGp!nlY@@j$DjZpYzr+rLw+u9?&n_7}wN*4!`dRU`J0i)(_p&(#W(Wl0`a;pRdy5q0XY&z~?0%OgTf4J+@}zo<1a-0ygM3UQ`2H!9 z3j2Y3mqz8_-_HCrExq+|_tZ4C0CblT$$FC~X)=q`_VzB}L$ZcLfyFe_%J{V=b6S=z z1y96f`3DyJ!n16x#Wc;IdAo>sY`S)-qKdkc3WX++<)X)L=FuE7PuVvUb0 zJbxE(>Lw=f*byx<2$WuCA?Mq7GR^HGd(|xil&L!;dKX{C=H?i)E)*1&FaE)*miRE% zNNN9?m8OCDY?BiH1-j-Vk-G>RJDbTy&+X$Q4$1oJ(W}M~!!B|CX$f&uMm{jV2qtQH z996VhJw@B=3{hjW-X@Pb_`fjF6T#uI8mp@}Cdkhszlf?Fo9CWdxy-2bUlyUzzTq<3 za*@a7k{iI|C19aN)+2oIfi_5O_Lb>P$IE==Py)M~H5JcVO}ft-y}U*49Ir|}MQuMN zZo`7B(KDA{w`MIocPZNaGwYI2m1oecWo^S$6Y@yW@Ez^;>lpXu4M(o9?<76A9p%r> z8?frRyL{hdz7?uTe>Fc~IAqN2vTKBl=p!MX&2N&ZJfQ9Osd&KA;Yz|TSxw0@i*IDd z8)+tG7;nTO(D}m%F>k2G5ooXRqV z@Yy1^#UIj!EuGi>73y*s&#>GQDLk)r`go5`UlquEYo3LPS<@Dq2oJn^YN6=yXl~n$ zjnqXDgyX>x0?0W*d9G+{mtv`wA78uL9j-EaQa&~3MjDhcytX!Kd(_@>vMcXH^KdZ% z(MOM-VeYW_t-8{vN6JssQ2zFvtcD%adWN_PLOl~nNoui*daK$uQCyONQN_NxI6y!i z!9039w5X5dk=)^nrj2Y6}f-<>0#&)fRdkLhs0nw#Up0HdHA7xpygm1Z%lnsJV|(IT^luMGK6B|}!$n9C z@C1&r%^PrWlJB$^TMs4;#ha4Jc!WE+YSe92u5$u2?2LYUHP?3VFbE7kHki%94^M+B zBhG_;;|tziD*pVlRgTxsek3uOW4gmR{2cIe@_I1i#* z8!bX9b!0RQ2aLsW!x;O2{zgRKlDyCrwd*RasTNX9lEd*Iq*#vJ{;VN=Em2}jlVM`; zrGm)7=_CJ6R36>Db}WWxE;&F$h!g_&-oB?`Y53`3Ilo5jwh&Du!vjRk{anYy5O zeG7r}@U0jAdEsJmhRjR7#Vs6)N|e0K2pVD!=myPtRuwF!zIa6AE5-D}`i-*mv2y?Q zn6pBdRCiGd2aLzsY*AbKC%dKSbE2>Q>3v@2%jBC4M;#_w4A9=_BMDh7ICQyUMEmt{ z-IsoN-kpwpO-5ko`l#aIO4EmP#R+)%I%FV6d2;>f5tFV=c<|DV(1m3B=pC<$YQ}`* zQS6BFn(I00e(KSeUKW7?6)vSj%vztkcS02Lg$Fm_2dqu!#o{T^6sR5fKRap=d#LfL z<8q={-#DV+(oZ|+{sW$krcUGhF8!(NAD9b>yC2}Uxji{PlH*x+il6J@LnZ>W2Sg|1 z3$klrLhyq7$+L#0!&^u5>-XS=jFv;_?}k)p*W-thQ+e#`#AX*W_m9sLmxWlEHkzu> zYt=tbA5^9{=+7MgTBE{v=hRALtgP}TBIqJ<`*9hJUM{W?2Db<8ydlI=tS7`q3^D>a z>C1yp(Q1r?JY7A@&q6Y8OU18dS;=Ze-{QHuQ{I!+`=+KTDYv6~g2eMm1F;rt6hP3M zau#Q<_;vb){!B)Pr&q6dy+lq|fYtyu^AyFt@r6>-jB#lFixmqxkqZxvw);kx7eIQ;QBa&VxbThHTB0 zK|XJEgJtm?4_ry@VNSknq)Po@96!T;?HgdUmNBdEOM0{I8A;6T7eQWDA*C?%1i_QLSl2CVegy6z{yowh*ZdmGH)p& zk~WJsvxc^{%W8Q)jwDx@v-&K|?+s?T5V{%Sf|y3Z8!%035KD|I)+-{#Zc{Geq8F^S z+BHyn5&XGsInb!yg8oJ|ZtBq^nOg!4_uS-dPkFx24c~~HRbZ+#PqA3I_&ALD<0$`S zCXM5tJc~@OZq0Nj!G>XWf;j$1uHNBLuEHK9QX%~yX847eYk*!bA*Z>kPnE9HHV&=9 zIP-}7K;NK%Bnd=>GiD1GW+T!#+>IOcUq@7iS!@`JoqqdH%atxfYu| zciun5U8ln2aJdw}f(j1S&WE>M-orC|GIYLPUZ1xv?7gh^kNX-_H0pv+>!nZGj`I`? zrqpX?#OKuNM^Ja{gF?LQ?_X$H38c~Ecfbw7xHRH6Mt5RNXgerbtlyE36~&hnC)29@ zSuuDJdNZS=I=$=xl9-eY=6S0oXSBX&jAyF(f%WTpDMR_A{ntHqiaHUo#@xt3`eAA{Xp#y>1YNAq4mw`zbY%j|VfLa4kG zyzpg*K}oSp*bst#k|Cr*oC4>Ia{o=3`6fG$7jEcgt;@X~dBWZOlIQD_2p6DE{neolh}*7vHg>P=_(MWfo`-$L+>R?QNBMN9BIv5 zqCXRFS~ETE-um9ZOUY(!$iSz&GPPM!-Y2jlEcsx99$Ej7E`eZ&OS0|+VxYf+FIqCu z-OL;9Aj+%*3-HLWa2}58s4Cabl&oXo=7JlwGF8#k@kkhhXbG@M1q}^DwUQ5aVBE&} zdI$`N$SS~a+rg#&RmTzgAI8U1Wq-#U#xr`7ltBtiv!zc+9C|x{ufBsgAsoWqp!)@= zaMRq~fjk80q>lv{+B)FbEFT#5)bl7{2{Gvkqh~-4hc=-uH0r~sWHKmy4Be5 zTi2VIfA4t6iOg|))%@=He=*5FR{5XbplV8~&oBZ93p#}aWs+(Ld-@n4O^I`l&fPqt zT%kn6R;K&1(A1&XTLB!uxt54(cz^~sVlDDsNQu8iYAU2sRv*VRW}_dD(1Nd87>O3% z8*HCPKtR5R;~+=-?X@zQlQ)Wl8IUUWG!jRZrXl*+VYfOo(;wE}wngx)XFTSO#J=x} z4Jr1|_8EaI9d^Rkz`+4y!=a4Fa1p5+3?{HM+I5CWtWQQfY2zK|EN!V`#`Z)&?KuW2 z8r*~%IW&WV17Mm5+W4(wmDNc+)!F1@7T`9VuW=M*K{nI>6!HTq*c2d#KD-1Ae)ibB zC%^^qw1`;ur=Z7Whc1LZi#|~#fO2WD83-H@AWXN3Kpkc1sxl!3upaijY50Nw_{{9y zZzJr;<{K{%MI10UD*;h%?~F9Vtt$P@At43S6(30CUnu+)MrRkn)R%=oV;~4lyst0p zv%s|I_omiWL4SHmO}~s}6&~9+WML$Xch8EdW)1-{!xItfU}2+LnP5A0d^o%dI=&My zBly?SVF|m^f*ANqw2mn3ypY%DzsN~E#jm=TWAEy**66xAs4#s}>rWW0P?Yl{M0g3Kd~1mt?#hGhYOtn%?9&CMh`TQk%|AtCzz>>? z*#)0Qdo^WT0$V8$K~ppzIx!;AG}z7M*0K=avMRFX8v!6WhD%ZR_9(PU-A)@ZL-SDy`MvPnWX-{S2!F;r>nj)_^> z{`_V}&MS=&bZ!Bdxet(#>;MP3jFo^!ng2~loYVaA#0M$Lh;qQ%@@&Y-EeWzoEkRx%U^D*+ zz-Bjv$fw|tx>+LCHH}qP@Vp!@UpNYJal%hv_zyeVD7;01i)o*i_XzDP#3bJ_fv$X$ z4k!+OKt4I|QpvqpTOq=mxbPh0(DvTnCch1xRJPghC7JE|t?Ipk0u147^czoIut`DT z?tA&TFKe$#+eq6x%^n+@{g@xpG@Fzwl2ek4Gb7voK+1$e%7(Cbk8F#A-|({eTu@L` zvA@@m+(mRAUvGSn6k9v=PG*vICD*~;$3CzvY_WuArR>tH(7sISgWu7%zMo{`UC?@% zIJ+7RJ-h12%LCOUE%=e*uHUfhiM;KVjzQlBY3Z2Vb9U89dTx3;sQYhU7U-L8otpj> zG=pXm>_CoI9mx(4J$yEL6p|_0A=|*$jBF6vtjP-vA?difos2%8g!-ZoXu?HSvW@`F zO8bzovd-~?&X*rIq}G1k9A0qEN54z2!&`+Mr4eKvmHK(Ja4p*6*1d^hrDkw4i4MO( z&V(k+M6ROQ*oIwHh5U^z{`g&|yA|QBM(m zg_G{)5GmI&nEAk6)OM>zZK^CaZGpF{Vzy(w^lO?7y7+u4c!OiZhVl(0w173E>5Y2* zG+GRMna^y08ZxFceOZxx0J7UqGl7|-!3?MlXrc~GjW+#O6lZ<57&I_nP##G93C{cw zK=u1&u_x+FcAyzC4MuVn3wQwgjO5_?67#AXUyoPc*?0*#T!oCwoiKZB`NjCfQ)6c6 zE9BOoLEGVFHYN1HA>LUY;a+nspG4u>B_Hn}tMaHuoHL8tWPyB_d`pg|jla2nqx#&( zn1QFJzACN}AMp2ehW04G%b+r_j;xE{H)RiXoa}lPeVxfTBer-}y2^r`?sG%4t*7&P zHsS6~_-2LlFH#?+q8PBQxGyzOk1pbY=g3iw`+$@}7tkmY+n&{Q;mFa$jb^^jo!B?9 z?m?6##%4jFabWXCqE?2_o|46mE}P|wkNG~01ZuP<9W5KJn8k?9VnOX2u`1|%c3%^s z8@8rp-+ohp$H=q5^|Jb9a;|nRSZEegq`_gxx5tFh+q|eI*u>&iNHly_IK*c*TQJ!y zfipf{yne@X+2Nc(PW|vjoK@$mwW|7Y{0Q8KqjtWW&&HiJ_!}2^ zN&`H_SCf78h4*~fp6`-&v}fq&EW7ORsj1OmH1P{U4KQ z0d^S=Og~}rNI}^KL1iOG;IKALiEPpC;^!T%*>0Gf+*irEo?Lx#0-Q8ca zWRtwkq?#R(UNFgiRCRYL4xZapLR(G=sJZN4cSAirO2Dt+HvA8Xtaq@EE(84+Q?qJ71Ae zfqZ0wz4ebdV~K0YH;(7Ue^d^_#N;Y;D}@BB5w5>!UNLlmey-X;{dlpE==_ra{_jFp zq%GAwOG}?MI-kDKKbwLd-TouKUoNI3E(q2D`YM4%6oBTkV6&*LnFL-d|9EYve$Y$c zV_gr)B(P|8Fx?^G?hdHjrKe8}!^Y?D6FDdz#Jz+S z+P!f!b@nLK5G&nD@!{XGDZc*=sMn1#I|=XeZ@S!Ef$07Ezbut7Nw}K8NGzwf9ziPI zljXZ#fc!vP)Y6*%BG&2yBxOqu&<(#~{bbh#e(z=RB#WFW!IV-kAZgiTtByf~v6FEv zTegp`VKScwyGIWv+6;c)9mv@}?!uGF44DyKU5Xj#$lgL}9wiQ-vziEtB>^!JKjEqN z#5dg=f-^IwX{?4%zwAvA(9=q{{tq9}t~Cc2+9!U+AxCkfE(aLXe(TYE9Gd&(nj?OC zWy6tJ&3ngzQl+nXg$zBHmMBYf7wQ5_mL74r~uL@`O0CJ>S@IO@#hVrqcu9w z7HX6lqzBLc*gP~tQC$ue5UX&uDB7P)UxqTihx8ZpC#F54O)9e+87OXH2i$7#R=Z-* zo&vjZtfV$G&FOWoDdmq@v0%&Kn_z=XeT#<~dwaRi!{5MU z=X_7@A@mnHqHn)8HD&+(rOpjA4h?w5;A*GPzui!>~syi7QCJ zhge{`0h{bwfDg+^xqkQ*kLJRGksy$UEOw0{Cr;vTj+88+&E^8x;iDN6a+LPd#RX55 zZ934#qQTlpx$eU`1nwyHWNEBDw9ub>3k;j|bM0FKT-tx?(hw+YT`Sywrb@MM zBNYuGH{L=%p#%TR_2$~}q5x7@5^|PZ72UqO&<}lEeH_IA*z~Mm50?M!fe(5zbK-Xi zq9eoEDnCAo7_+_&{OmEZQ(#l{{BSc+h>EKP2&00ZK%ydAcrb4Iz7eay!rLYSAK6i^ zhxz;-K^XpWVeY{hY4;44HY^7^ZqJ}>EwMPTp7=jNhf-jxJ76bu#|0l>kA`Gs1PE_7 z*H30_Y_e0Oczu{XUjbOqas`sAj9~2XU=%ko1DlPH(?5xV2@2R}0aSl{M}SPa)r>0B z6>rnNDCBB3fysUp-mq-!2VoP)@L>bi;)vj}XCbaZ!;!Pweg1lex4h>_{0D0dM({V7 zHcKhVk(jU?MtTmVeBVYp)kPP!Wlz?hU-^7rG|ITx44BIQHhPl)c2Ng(t?J0_hd_)F z?iX|32C8@A?$g0Dq8=W+{ol&9NpSqXVshWzupBe>B>63H?;qTP+DUs`DnvrkaD)Tz z@j1S+<<*aTt*%E5W5orwuNc@qzyK~vfmTrvTkGnB9cSP5&jHpQ`#szD5cPZVKugON>ovKRSr zEezPp+NcY@UXgH|KRsu1j$9;wHq<%*$@qtM(L%e?_Y_g!Ms{RqOk}A@0$>G@9+)4u z7HY3!EWj#O8I*oQtGJE*OPb@uFH@s=tDzH9**AH&6ZZTU{H4%-IFbXjQkV%rVhZihmVpz z3D5vIy`<2Y9frNCR`lQwmh4hwmK)*qp6}+-v4~-nOAqGN=glMGwDQ7A6aYEDi9U4` zT8YgBWXt(KAEG$!8w>FXXqnbFnn&~Jp|Tow0tbXRrK3Y;yhOOIA|a9^k&J-mp-`Le zGt6LZ(d6D&=MDEYn{7Dss0yX>B6dQmDn>gl_;??5a(8CKdOmuomPzOFUKJ8Zz^*c7 zV*k3ln-Xumz&G$Kh)08gJNA(@aq*n2kST~DJ~-cNA8l%y--38Ka+7L^uN67^oW1yC z6GW$bJ0uF*sCfoM{eJn?15kUYh`0JPiVGO;4px8pDu@!*oz8qHy1*eFwh6C>-kxsN zw{ZjmO2kKV^GHLE8ZA2;5LmT%6c5Exw)r2zQSXjp0$3BfTa}KO+5~yJhgF_)L1wpA zbKr9r08~&}boeL@hQ9AWhjs|ILHH&n%J|NquxoQ#NSumXu&31dxUE003q5q?eedQT{@E3FTb-T4k=SzH$dREy)ZLK zS8G}`xl2W#E!MqtG@aa6dzf+uy>P>7vvCKa(1*nhduPW_A&9RKuK^dBItmUR(Lu() z`#E>lclD~PGbHFUvLU)RHF!G4bBHaakVY`i&z?5x&BD;DyB@ZLfH2n(xR)g6N<*V! zkofs1$o!^(wN}wBSqu`{VRa(v+tRD6)A?npQ)vHH&!nq}hojF8e?K`tJ|Pt&r@hk^8o^(AQVx znRM{*f#R0_CF7G+ump8i$4SUcG<&qP z3?unQK@5Tkz3_*`Y5?a5k!25&t@+2wKfaev2J*v2g}C#LB6vVzfqq%KJ4FnJ=ITKd zq}l>U;RB;Yiw8Y=>OoQo)nAu$a|)DWPt27MEn{{~1O<}*_cHjwGA35&iT-m1s8yP^A%YHMZ-65**w4T&5sW_KSI;?4>^gjAa>FwKA;(cNfjZxPrm;( zLs-YDpoRZ{n>=}c_P<9*trmtSh`}K!_yN*h@9@$eJEV+?0W|hCNH#5#Q0}%rCM*>5 zNTeX7U>2a11=jR`Hp>;=p^v;X%$ec;FsBkwJseN8LESTI@&EBl*A+dJi30Ud5~83y zXYz6Xdl6+>56h#>wh6~0l|uW+^Gt%Z$WbqWUnVHDx+l2tcju*|N8l*YRoJ7=s1HVk z#dLjmfS(XRNHG)+MNpEI0+SVx1(ch1K(X}tP}-wvA`pJ z6kKZ~@&%q0t5x-RX4v$cx-*t3;?WWUs9h~*?ISJy+2&>VAA*befSBtUfN`WgVp_`o zOB^8L`~(51=Sfm`!6zh@>7I22At>ApRyIlcecsOOh@J`^UW+DSLwy4~UAbs7v7t=( zJ@UtPy7TmaqxKD8SY(3NKczG&&iI&x3_d<)g$yrnz_$kjvI-ArD$AQmtb)8H!)Y}d zft#NT=J6#k;)01-wP?Z(izgt#cEjPLzmNcbI&ySS7k~x@6cgZzGC6%xf(P$CArIt> zz7@vuot_OheD17XhNlj@Vf@7=A5S>q5C{c%gN`!^>^UqW>3YKo=bUg2`v7ipQSt#L z8xi;WHJ~-dVh=2-|FP1J2&{cN@apb^Ys33DKABh!#gh!AAtJmEj^5w3BpFCXB<$B4 zvIJA{$jPXKXaPhjaTTPg;+(sxvi~m08lS!Pt^bH~5f}DpzM{1*TYnxwWnH1m`j6_k ze8kJI?xxQ=Vcvv^5QID9dYlStg(M~R!7+L2GM^=XySjoW2fi&fGG3{|6Mg;yxew1R z&Ly4G?-?5@yMp0C%A}AA#4P-t{#$?Gw7jEulYoa#0DCL6ZJ|StoB^dvg0_fX>J+ln@ z^wo^9o4<<`c=JHXa`;)QM3PWj+U(8Lja$=y&!8B*YgYj~R>e8cz6}bEP*nU2Yr5hp zxA1R`gxg&C3A3{hHv~tcDv-uH+s71%vok+pA8I5_fxDR zvo3Zx*WbYbIQvS|{zVzd~^he_H zrS!BmYF7Y1>Ss@t&+*prcXZ+#J!&-W3JCG2_~3 zGA(3nCW&J<-S4z}g-WAoH{=X`b=*BA`JG&sXpwdZ=IMzeh*55Ft>r=@cx+ssqh3Oj zue4V2jm|Q^5=4_wTd`_gboAz|UWg}A#Z#*vxR^uiKq^qrsHOroJ5=!|%{c9z%+4s= z+)|F@U`lztnj^a{g>FR{j<7~Aw3GPdidX1kubQsWXJyVdOZ`lS(z;g__HE!IVv9)- z2aqvMcbytriR0zj!w3T_M+f|78x}e)Lo5_)hUek2%~GDwvbKJN4JX@flWsljQ-Tkm z3zIkyK0#Q(;v0G#G&lWt?>c#|ao!Z_-mn%bH)C9$#tc%6xF$0aulG6s_*zuQhhV`a z-3lJwm9UXF)$ASC$ts8S;3U4gHRdpfvz_t>@X*W1Vg%?dI&Kxc!Pd00*<0rq_R`J2 z3fGZbxvH%SzEb3riC;o_9}rnMaoJ|cPv%)#qb;5ezM>`qD5(&r+N0kR{3?BJu(5ct z<51<+*x<{MU!?zSy#+h^7WPF4MU^9xADprV@uP?d!Jyy}?RXMZcxFMEkXh`|XxNwR zxwCJLIn>k!UpQ4p{y7`CTs95NJcSoOo#-f!MNL|q4DrLC08_%PdUpaJ9z|gi{4+Rx zK~F=9r@~lkEsal^wpGXLIv8@a2yM=5UFxM0hc->eD&=Tx6#llAP{)KaZ z>~^JnWHs*^i$^MQ|1fysu>U-yU`tY4Dqyz_mT@ZWEp_NtO4NRm>LLgUj5Z`NJAP(~ z2$q*uzmi{MR$jfmn;_9i>BCS(|KD=Y;^8pDHcLn%msuFfu`;hG3iLm~kQ^<7YpleL zeQ&qjv*+@^`n&vp?7jCt)%_no&Phg6R`$wl$RR76tE{X_kxf?Ck#+2YD3!hELADUt z92}+0gOKgeu#RzTvOiB<*ZaEC=kpJIZ@2Fc>D*J_@p9dLE%0#>vXt&N)B+>?ZWu#TnkwKX1OO`<|kW&52KL&VNu97AW`f#tsP#B>gC* zTtZq`K^VY7iZMdl%#;|47L%~QsH=)|ukT7U+0V!ME)+!9d(-Y(Sta7re*Rdux=VR!N1rwskMkuDF(2{6{f| zC;(qCNd-??abj4A0%}fc`tEr<>8_N*uV z@p2|+IhR?Fufs73aq1yu>>M;cbsw=~p1X!8X}w}~51NJ@zpmDU7Aa_UVgVu5Lw~8n z7gE7*E(!_-z=n!uEa*ZL?@xH53-&{_7|U=H$7)vhQ zE=J5cnJ-q-0R@!@6qz}|7}NpN?6MA4=ib!z=GPyv39lO*VHieM{gt~09 zxZRhV1)JwQH$o@7kh~7N>aw}i{X!VMX`}7A(l~yptuoHg9N14nqFcwj+pmiPZPD~y zPG8G$+WoRbE+obEoa7&&rq#_@`|R6(pk;pSxd`Qhmn z^iL}D#n2&XS)InCn_NRW(#P)Zf+-obIUyktScLE5m=y>(LY`G#5MEC~M=plS!x)Ig z{@w+N3pY@7tf58Hw&etk;!yKn8PUVB&2%-kj+aTYJ3#Xm6PUf?rzkh?Y!yePN+#N3wJ0lXcqHuw86FIxk^ z1;cq#jupCqxMew;bFw=^{RjgDoY6y#Ytb#mu&G^nxg}SKULa{=K{wQ9ioaEZtYua` z>sw_UHb=2!y7t*-e0+Vp(dsz7BrdD;13C8($B~{y{4?ogx`VX-#-kZpL`D!S!~W_) z+gOz@Wu7F@Q4h=;QaRZfL^9iM6$ttt^{l zMq1*9Ui(Rs%i-ap^z|?wLPkGU7pwiJ_GDN^=C&w3K_fX~+wt3Oz9g~|%k>*OZO<^n zXGynHMdL{9OFt1CUU5XXCXS3mg@mj=bEdFdtfW2G9}XZ7&xOFAB^`TRSiJEK$9cJ( z$4)_uiYC(vQiZJuZkiM+R&)54hGU6sDB_E~U z)+v)Yj|u6AZoNfLF}*rg$4G!(o;!gh_?{kY+z{3F+wk4`tGy@8$@PnKlm|YvU^rr< zc}Pap)gk=dUt%Pf@s{Tep5*~F=Of-C3HyD%5|%%ieiPh>Fuc_hp3u^K-us#h4BP$j zdq7hx(TpSZdYC)9bF7zn+1EXiK>eU$c~wXG^5a7tLU;%Bt&cO>NjvEXn@H<5783|u zr`S;HmkHS=quqG>>Kq_0*dZ>=DOO8D?O#h&@9h{Gle2TZ@ndumcl2bn-b>%D**>Ey zw{^GQAaeWKekw^h3iX^vWdijQ5=^;*m^c{kNt~#k+}_gPMlT7fOwHEEtZ&0nH>LLn zdWR+%JCf|v+eBmjxhEjebHDGfT|A8ud#>Ro$hc9F6Ch&+AG+S;XKaet;{$AH(;PRFJSGrm=Y zmb^y|35JlerXsBU(;EJ7O?#+P*WF|)Pr(#8GUir82x*n*nW-`&$6GR%o7o% zJIjZaHt8t4MQ3k#aCq3!iX8JKna9lv&&8H|@&!aQB}U?n?%zibX3>vr*;gW^Foz{0 zhhZk=ore>+N-es{8V2sWPwuH6%Eb?6^w}ntrypFUUiOkPxO_I?5y;?PwnFz^A*w%v zfx(i5O@5XQUB7&mP}lU^`~zX_brjbfcgs)q`*^fCvOkMY6hA@~oq}F>R9{y>DZZI) z{eHE?Qy}U)C4*+hqxA>;jj&VHvg~4{?=~I%#zfc{&54t*nJ@PrAtio(Z1oxBzijt% zy&HA;G?U9r3EF;2|K+jhJ&6YT9TW6Z213dW>C}=nk5BU@q#*i0I$Uf=Z&FT3*0an} zz1-M2zT0zTlTC!i##xphrXT8R`=K=m=4*}1y}iY#9_LHbn$^9y7jik0h+8_svHeu} zD*I7Gf$z$x=ByD*Fn_+iAa4yo*%9%!~N%nKEy&jl1966O*xC4Vzng4MXp*J(<4D?Efu59*nVd z_r>j>*4|S+?`d#-)MaHgU8wT>(S7I8Pvj*$gp_))hc?wqZy%AX!g6wDCN0PpcK0S6 ztQ*=Y5(FdS@+6i&w8fX-Co@btz?d*e1bZBZ1%W`)81KKD1-WL<(kH9Y66+(-#HFKY z6RxNJx`ge@7sXZf&?{sm({;~yP!&G&v(XVYGIRn)LM{u;{gTqHir}?jSG5i=JtR;% zH)y0UGLU{~x+YYtoHHQS+0$^NxY=bKawc_WoE`&^FkPvo2w*AxIwsAs1uVJl+zGHm z-M3h}I(g~w!s9`a(>m-&0Y>L~kyaO;vU_hz9Wm@Pun+{85yjgZ$L^#oG}m*x_sDEE z=QZ%{cC$h*Z1I+E4YXp``pfL&k0n;{xVq(Ay$A5mEN6-k>nN*f60L6mU?F;Ru~W)q zkv_uDuUpP^uBp-2C*Ng&n3E4%dK69`8k_Y<^)Dn3EFbm{tJC`XlNL#@R_OUIN|_#S z5!Z1d=Vcf@*rMpz?UF_dIuk2pGNnM1fB{F}p6;hMV}Bj+O(Ee)d1xEx=u(%!d7?)& z58p}EjvF)S*01AZv9GP**5YE$^D#FAKIt0s;b7RN}%;zNaxqAbO>z%->;Ryng%MCd-FpM!TLL49TRop^nM7*iha zZ49ABzhybsaGt@Kpv>^QF+GghE0$%7i&CRO^6CI9JesGNe=2|O^p&vZ65B_IPSL3e zB#=g;!NYIfR&d8jU8jC%Yqyug-lvjx4{#gaPnlS_N-f+k>t7kBuI)EDf|sF~&J(pz zJ@i;Fli2q5vvBXW3)Mbba!eGSC1fBbgph__<1l!Ywg>gIrRzaohwB}0;r(O{m#vbc zw}K3Ile@}X%V}%!9Pog0zrD&2+=X%C#F|ls{9704eGe=OHfxX8_?}5XGfDEElF}aM z7~e}J&Ri6{9B{kP62F_(!!&XcSR`4Z_-?eV4!hq6<-6L~%)j+LDBl{c&eJD37v7Ws ziM~2r)U_P9t-RLKG<(>B4=`FZ8d#gqdN<^^lQi39Y9 zZEMcl5Q|@b=Xl`5df}`%!y(N^Mv1c%_NeGpqxRSU1dJ_AUNCLx8Z!&T~D)Hy?qE z-H6q~XPuTYo#AaxInzu^Z!L!_1zM3R15_`Lv-{bsH!CUID*b)8oi>-zmfZ)3))@85 z_=Vg%o+%MIy{T6MF`TtynuO_CY>KVSbBP+F@a_?JO?m+n<{3+A`T!52IvJOt^rJ96 zpQT6AZcG`xb`icqsk?c6Bp$g(c^LH_$DAX&xRP77RzPkJhNhT!N1~9&diGV%pCHuw z&MOduv6HLZoA5qdo-_~6PCfsM0nQa&T(ErLci4uRG>kCTcGenSCrKAlgQDqtjS4s* ztz`H09bC5A$Ht9&8X4qb8}#CdKIEZ=8hq4*CC*T{PQH#Q`SyW1A=-{kwXXBn`jY|# z#2d>$%?T_N2N~;fm4W!%QHN)qQ`)Ay(MuVY#26Vk->aM#(C}G%|G5bZgRRb;MSI&Y z`P&>xU6$(%#lHQA6cMgUP3jFW{2|6&sr@)>s^V%0-7C~ouBN^#5}`hZ7&ipFEwHCW;ld%RQ*t+rOZ$ssOOzJ_XH~6pCE;Ef3jWWA5p~NEi3h4o9lbda$D^ zR-{Fv^)wf%>SbPrOwK+ug?YCY4Wqv`JoD`LS|Rklz?C4>@2MiVg-JM?NImEq>QZkI zLf*~}zanA!CVjW|()?dMnsg5jqp**5BV_GnN{r=p+NDngu#hh<*-JYVLdQJY5%X&T zQQX@xCD`-Z04{nqBH~L>TU>pfkvsD&5W)ThDELu6+onw$N&bZ=MN2;ZaRnRV#fYHx zVu->y8C0dYrr-23iRb*sbgpGX0JZ0y*@>$!1nlw2#!nI7u{u4zxdTnE4clMp6Ing? z!~Yp&e#Mw7B5Rr+I!rKUBu3x`&s=&l%ovx4_*qfAhd#{FtB{a-RL7cFprdiX#h(0g zGV>)|p75Mlb)!u;Vg?$M)61bQagnvVr;{Q}|I+k@P{TUfoJEKmlS)-pl81bBxt>@|U}$AJ{Q__+A{% zK_JVmVMkg&sF40s!usV3E_%)))s0j}2Y}Xm4YC+P(X7RW&P|~+ErrK58vgY$R}5qX z(q@Ix#S>4lWS}3cVBK-flGnZB;uKx z?owGE`v@}8xJ)fPIt%oG%*tN&-Ma=o->0rEcE;m#@#;OI<4YIUP<5;--OEx z5#?5UR5KucRQzS#)W)Cfx%ZBP{k-h{T$t0D=}OWmou)LZun!miF+BZ!Sk~Tdl?o#YFJzT~td0_@#*q zA_i4oe@&v^oaW*@AGUHQCMu5xLO%J#K4i>;Cpd-}Luq6G1`MWeBMUZK+=e{nFM4=cq3pJzQdx>pkl0 zM(RJdE=k|NdtJ(Asc@2IUi6)e9x#yC3a4*QL@Wzj<5fr;^xaPGHnLV9>JG<^q;D>+ ziK~9sd$;_yv+UIlb2TRQAW^1th|BQNNAMPEJ~$zYTg$4rt##CVvQjFpD``t+R(-)? zn^(1bIyJ`SE<(27esuk96p{F>V=><>HnmI2(z&rn3-;5F{h&08LofnI%0G;KXYqXL zdtu4CyN{$%(_Je0j0l1wMg}I3d`s{rdNhU9^6vdoQBJ?bO}UN_{_)0~%r<7x=YHw6 z2RvHFZfxri-E6G2tT_1AfWw-QHNz1Q9@70YQ6i;4Ki^;N?{ZQ!0?P*MBjAGD0 z=93;f41hAtq(Rm*6(UB-MSsWrXo7u29wW7sysMS8t5xrqU$E#T#(${a-j}64d64(> z>TL?(L<3Y#Ysws+0+fVoJf}vcpZ&SgoCJYH?McLV8;1Tkn<9@n1~|uA9|Firf5SWN z!HY2Mn5j4Hdu^Y0q%&C5{-;G@<->?#drX5%LSezLar_wyyOjyF-+2(fSTv>q% zS|=2%_WiI-VexI5S^O0NPALEf%jWe`@|V}4f0);}>9HoDs|K%o7mzrr<@Xuy$|X_c z8G5yJ<3lIhySs;Z@I)6((S_CS$o~rjw zYNN}ftW&kU|5F=SVJZNZ?Rvp?jff~qAzM%FCT3P|n9FG%E$M0;@Ue@ADNm-@n`31v zA-$xK!pWcEfM^nTN#A!4%3Y^EW;hb%Kk+g(E@&N%&j{~Tj2y*jkw|Gqk*7)Ij}je} zFpk{z!tEpgrtXTfiw&r{{tsQ>;v{FjG>DuIC?mh$aZd0PNLu({Mk74;F4|q9WApjh%dA~Q6RZThqztO-$&ZHR zvN1h$e}yIa{k>iZm%2L+ER`U-NNJ}-s(!sPYtR^O+jLwS74VXLSp1AF`{CtsN9&Ij z%MIS&gCkb`%j~|SVtLf6E}GPMT=u*vU&S{I9v4CM)=>IruPQtDAb&I>`5-b|l_Z#b zO?XG&k9TrtDL6G~P0yH*{raZ*V1DNZIl7~;UQv+g`_*} zBCh8NZeNQ?Q={G(lv_dcmv%lL+s2yLb*ilndSjA7TO9BTn8n3pPv*x-D6>-nLrd0s zXq7{`UkppfaUPdnMneju&!{3pnx2Iu#6)aliHj#pMdG@8#?J4}I>84wW-OxhHQBfR zlB@lS#frz#+0D3&hTI2@Hm@$3PRgaBYGFFlKiC@+D()O^yK0q;iW6z_sM)UX0xErs z=wlpQs(px4!f?v&Sd$1KTaI$1zdlr-o`N_HHcGV~BO)98goQ2c_ze;)ky(Q>+l0PSLm+ODE043Iv!4ItB)wq3?33#K!e>#bJVfdR{L3Iz|y`lzt^Ecm@3rjv?NOI<2#Dng=;_M*v1dJ;kHpCtJ6 zWpE*-zeMi~zTfV5tX(Y7{&ITlsh4Fx9yQgeF1*iNO6JPOhp47b!szk;c1gE|Q z9oL(YdaX2XY?1g0^c*u#sBAOjZ4N< z9wg-`Y2$A~1hw)0)hvzHV&;X^n}6wMY zO{r&$EtNLIEPR!Y+c$6zj*p^93lyUKZWX{$F#9uF5{L3@KPtGF(alRhLkj=$$QucE z{qCyAA60DfoTdpJ1J^I9v`BqgRUoi>^;0hx4@Yr-3;TauIDpEkNpPL#2_Fq8l9je! zZ7@zDz?43g28FXHw&`4eCd#)DOfV3jVG{=B%4ZRM-$uiD0r47nOuYWLB7iL3L6F^d z33yo_JFVBdo+Iz=$v^IGq@i?=&0N@&0l@*J)$aF;gChwis>4<-J{4)>Pf$n;EIRHz zV55|w>va%e+Tz9)d-KO+{_&05+@Epq1u=BKRH5ZCHjK1`hyhAu3dsn+GsViMR5FAT z`HQjsSC8HAC*HqMaei0uF-PuXG}j1EJ4IuuNc#^DPJ$m){RVd%CM+E-L7n@F)c}Tk zwEC1FpM%7;06O1p)t+l{CiyMYpnhG-qt=me4*rILF!B9?2k*(R`Ez}CsCFd|?Y5GD zkws6$Sn({x-6QMvU@`&~Hws>tW*(PrlQwyL%_cpu&l#x@B;0N?taW22xv3*4n1nEq zEHM2^%@k27z+r?my68L1C%(WT4k?EBQ#55SED6ZWC)g)^Rrj9&@O17w@P#6Ckk~ zQ72CFxcl&Nb+S}&S7-7-pJSnoZV-=3KnvJn`O=%Tg=&#g>vun7X_mMkUR?LMa^j|7 z`MCqO_7Z244RvKv!X{JR;!t(Txy*92iRkO6zV`yJ915e~h$~hK1l=rVf0vv6Yk*(z zeYXDsv=@~UC3fA8EQ;B~De(HIz?T_{$EEQ>p;ufBy_um>RP8tHREz%*^GDQkqRa!> z<};S3?{8R3aw(;aI*Ml}jy`x%2hd0fa}23P`AE?SGIAoc#On*`$y4S~B2;a%TjnZ{ z##x;<22<8i+)<}^@5}<}C6fB<9iH}`Mbox=f~5+V{Ms=}|4&mgLLp1=Xn%3!*e8m{ zOCdAQds(1(yA27w&cu$k`QonQwz%*Ik#9etxcVM%JAzC6%31$@jT?6}u+pQ1s_7}+ zd*6wT!&7jXX!8Xe%>aoX1ZYh0Uo!oypJC5&ny7v&kfL_$I9btohWAOLzb^i2Ib5P+ zl&T%esA^rG?Jmnn`oks_bRG~%SP3QdH_lgHAxso9^OQJoT%cvs>got#yKfC4-9at! zqbYBS!5TE+e3GtPej}gIgb2QW86hK&R(W)N_&i)}qJk_|EYCnO{8tnAf1*x_lCK`K zsYnTHX!go=m+zCu7&u3;$(qn?ZyCgY_*X~Qdkb**E6`gfJxj4O`>kscv}GMu(b>(%5`Pio;HR6Bj_v*DqMd% z#!Ii|vy9^iLQ@`#vj#;iV^an7YE50m&KleyVYvCrSU$`akgGG_9eR)7b*ZYKd11MB z{r3w1Q2msAc>J{yv%l)>dAIc{mWFo6%Nw)15)DKzujQW#qlX9vmNTn}LBK-+G5zs_*M> zl0@o&O`y#9!`5AjkI5tWN7H|rBNopQf^O3Aw8abp5PEn@iTXum0N0AzhP zh46GHc(TvM_+=nq1nN{LtcN_+X{O5gT{Dy`Z%B&2_=y(&9r_s1kL>XK@TArda z91_Y35hT2$%zxdEkK3qu$ga9@lI@-0-)&m|Ni|4j>2F>l$O@p_N$uXtBxF3O#k`6- z?@lf6HA1Dp&}04_aOR(dLe!RnxIgjmeVo{85#Dlf!>s+GWd8DZiM+7zEJUegii;t{ zn4+rYrRM_lX%{E*lb=A*ZSktxySbOtMN7pWY54irz~@_+); zFXy)2va{8gKqfXYbViT3p)P@9yE0@Rr?$8W6a8zrXnpNDC+6|^I9SR0F6s0i_L3j~ zLgqSJEQ31jcI|>nuYX9&vf|S#Fg6D26-^r!Am-HjLctn*-v?;;+R6GIs@Wq-I{viQ zpv$C7NdpMDnP_l6vq!tW)znNt?}z|iJ#j-*CC2{Vw+KZ7-ZTMx!V6tnk64ZZ;}T!t zv@6;)ziSK7SR2y&j!?NeF2}iV+qe;d;^uU_$QFvh$1Bf>>S^X~0njYZwo2&?sd=AZ zp)uJ#6PD)?zpzQwIc0f5;0YiSAcrTl)v)8+0F@Rv3PEN5WnDeD-cRPS$tE%@xvG;+ zpq}cRRchj}MA@HndJbz*qHfp|den^QwCE;Y8KssfZp@T*FFt|p=vm_iT zCUE5>u;;9!Ev_ka)ZX(M;3J^XP2cD|rnsznh4u@}MyI zJ$->EdLN2Er-CC;lYAT_9I&sGK%idl>s~Q6w~`&5%%(wOcYhnrReNMz*jrLbQKD^j$D;DnNB` ztJ0tg&7NuaCoYRLCrsH>1UqVt&bI!bl99u+9Tv=vn?<2`YiS5X@?*?%JPI`lcqbZr zlWV0e*4k})!RJR3ew4_H{t;HKTzpcB=0dTz-^5dFmJ{o`!b1?tc-L%&_@aHNR}U`h zRjgAe2)Am2gS($QX|WvC`Ie$K^{dA`1@OFgr2Y_Sr_-awEmnnhC*7VxB^MMS(7J3D zcM0bNmRbqZzFH;GpPAcfKXhV-X#Cr!8J^??)b?s@2jRpPD$(th3;7}^_q?eILgFpu z$VO~3QKt45paVS-f~?MnDVM?cew?>@!x2l3thAE{h<(pGioMhY(!|vYAHr9y#aBLi3ax>oY@d26A6TUaGOdd5d4*Oyk z?W4;MTTw)7@?pEqv{+0(b#g(M?q7OhavU};zVmQ5amPw7K32U~IQTQV)%-5)$xR0} zAp?O(wJIjuSJlDmSw-o!HvHpFVKa1L8PBE*037_eC&?P+%9W~ow`&QTVp1*@G4R9j z+@E5_aI0y?7q`g1XsCMH6eOQxMQL~!*jys#S5l9Ou~0IGpVN}3)w7VWK5lV{t;?#| zmVWU}!l|L)?|`NMePz7dccg~B%ZG4n7&_0n+b=fo%D5zGAitcm?n9Lkez|1%bihIo zl(pV$Q_bX?Fo?gngttGG;0srFcy*HA$mRPyHiq^2A-KZ1?YE{f>m>oZd=EXXd@p>$ zK(oY+NBTNp;=XI061Q6kyz8+qEw+e#(b%S1f3jUGCLbhZe$!*nYz6RI!vsw9Tq=RO zBs8DcWOoVi#Sy%v*(7oE`nT801XdruaJpLC9v1-m^v55MZ5ueqAaI+4a+F#KIQig-S4mN?e4z*OcS;4 zgGg5Vr(fvbOBx2~l)uv}(XBq`7azAiJ;(N0HgEDeH^u1O0(LypUrPZLJ<)zvmd=)< zX)$`vEjM(@`Z`Un@t8Fo=0#im+241aGO?=Z5WHL(5fwaxP+fjrSjZvrvrqEu$2n_p z%V&)`%dA-MP8;#c`>lKgF%fvU`^~f`tACNsoa9kMlQ=Wa;_b{;%lNDT*2JuF+{;^Ae?^WEghTErLT2E z!YMp6y~}H9oh?H7?(dfaN=QR_V|WbF%*Kn{?r)fMNnjC0?#XZ4d4_j;IIXvq?)4Jw zmQG#-kd4YO=w@DCxGI&`BdpN0z4!X4u6M)43~B3Eo{C#D!|O&J{TNM4p=WgQdyzz@YyC%(qWmD2t0ha(&E4N6iPWq#miuXl zNLD_1J^{`EpF;s<-Y04U8=OT5n~BUtXXo5F`?V&3*?lL<+ffg;LROtdfC+jp!>XAV zT}!3z&ZJKrG%`|i7-w9K`i4vV!}J_?w2k4uY`cq3s$WRgY)sLtD=aq|&qjf#?9S-j z7o74T`{EZ!t43f&nNyRNC2Trwp@y&eqRf|uJniy1e@U2}_w8Yp*opOnH!N>$ia262#=0R^Z)LItal2z~-=S}3}g~_dmOpQ-w z41#EfftC4$7eR{deZrn@r>JO)=1N-1Ovm1*J%$bkkJ_y6Y!QHL1F`(8jmxb(Kismi z+Er_7otD@a)7I*81^amKUOVAfGo&F)ns&>k?h9`moV?8AibkMJuBuRRXP2fL33HW3 z=8-#`fOHN%`w)p}_s|wLiFWhfEgyV8vBiG&q3qvt%Ko(yl%)KnD9;5R?-v`3^c0PA z-POrHy4LR>H%-^<$x(ca^bvo;eokAOFwv~yyEjadvBWzX2mitpWP^v59DP=Lm>ycf z_y-`qlptSjjM6K_I}GdOS)*AJW)-Vb2Cp*XK$d-CyVYJbMAYgM{7vJ4WJ-RhEk1|8bMqlE`-Q3(cNqY37A z1b;BU9h`TtlfGF4Z*+wrf_gw}c$8r)JV+W|UugdJOG~q`MkJAG=5nU_)j8hp10`;Z z(P=ffp!%-jFuQbsF1&YOl9eYLt=ITW#g%Pfj+0)ZTtB0`52Di!GCRXJTn1&*yHnfi zbTRBY?`_oya&NFEPdrl3OTqCo?4rly89AiLz)Rulhl7V@Sl0m!ZtC>yZ`G4dd~d*^uF6PntZ zbDGLvYe_$x9npH72JmR?;#8;G(9c?7V^?wRgCt&CTl}(v?3n!^T6E`)^R1IYZwRTJ zKb-b*@awFqGg--*>{iB&Kqc36CVkU^4XVE-_7Obg;6*MSz6PF3=1plBow}X(!F;-_ zHx^43(b@S2#L}cJed*3Dl`_=BPHZwY!W86`KxxxKy6xg68aRV+vTm{HLYOV!NR_AU zgWNK2XOZ1MXEK8rBuLp;-_>s%>RH=VA3EeoOi3EkduVw0^KtO>pZUO6vf&)%9#JMy z&mRWv#Tq@vQU14^5i0&Uh@X{+w-S?`>*Gs#o8CsRvI$wO(6?@IClLa52z{7iX8oR} zm~nifZpQ;P;Nkr7$N$Cc$U?%rHe22wcDwD_B^7X)KyFUwBS%)=(9 zq&Rj%`42WWQot0?{|pR>Z1>3*VI}B?C9L+N@ihjw>`HIBG_)~KmF=q}Tx{>-+P;b4 z1G#f?6)qFIZY}KdQ4RaWJvih1a4V0(JI7e7_cvP7yJe1foTgYB+ z39Z%;*GA3l7<-qFn=d_WW35t2sh_VAb@uYhdf0gVR;!r#wq|T`=Dq*K2z-(cf?#2J zPMAI}BY~+ImtOhMl;uxdr?a+gVU)@)=Q%R zSvw=Athdf97Y+$m$H!~=W)9z~I388^pE#{>l~y7Sa8~7w)@o`{nLa}(jy1w{n@bOV zzmgq~p+C@1U{|G7vTk~8tmQstV}<^SYcb6MqhyqrjowpRMA6&>@n---K@qX}#=3p^ z-7!N$edClA0}t-H!8;d!zmq%%XTbbnH?ub?#gR=%RhNCPh~7Pq3;B&xf!@eCwsK$P zlpro6B(|X4W8~mcrqGjnU{G%=ckIz*9?e?ad%B%bjh4dqNm-_$T_o$H1p~tD1sF`x zbox`e|HStA)8XkwD_(DA@sj;se0Yo?&y9wyUX(@+H5UF9}J7``Xc538PdsHeB*sa+5$e5vkj&R@Tu zi=YOfch47Wjob7~P1H4E9TCAy1$yzHnLre*LVWNE9=b8>^IQFEBVE%40c6@4P8TY|WoKY}P`enLjn;Z9xTLdg3WwpFU>XPCSeWm)o!Go4R1@g0 zpPe7D=(O>C+@we|U8fc?p7Dyv#1&;Dz8r$$S4F%nu^zKomJ#29kTt1K_~A<=8;YqCb0Hw+FtWbL;lXg!%|ctoAgx@a^y(zrQlhU8Ys44@Y`{XX-g z*HW3uC#olqd%|)Imnez&2=XnAR06?Jwb`dpHnw;HRX{}~^P1$jG-Cz}z3Fu{k%vtf z%;E@3Rr-~GyP1D&+XRt*aZ7hgS7#3ku~GQgW*c_rlFY(!U{n6cbtZ%uHja&GJNRBq z!e>HBnAo18wf=(XNiRo;&tSa(Q-%`=59kKU%c^?up{{0@n;Sh3uEagF5eqUud6$0b zIrvyt7;}Q(=Oy@fP!08^UOhoQuvbX}dN1AG)NCn+AAePJm+3pbTU`0ST7a)1VkzU$ zekKAgwgdvqizlZ&l2RgdTLXvhG|!{Q3N+g=I1Em?{T}g-_!YSL{?Af)BcTvhajd|lexU3 zm1k<8DWv;yKPi)$V?)_D}Gp_(8u-4W7p_z;xiNGJz_m2l<3z_4S+Xq0($ zcTmAF|Dc>dR5b7tvdxr(C~M`M2A&dKOg?J)9yM91*xz(d{2qBI>B_C5BNit~=^jd&51A zlvsKvOM8+Jy~X$0R@7Y_X6V^5A!{Q*XT&xIlPDH`=-O$cQM4c+ciT~FsT<*RN>DOJ zDNu%A<`wMzS>1~e!Di13xDk*gbzX0NEZ>67l}x%|?y?3q*c|Qb%+oxo(C9$j=Vlo_ z88qaBDulO=<24pB_$r=A&hz5SYJlZhlNSHk=QyM0g^S`{v&7vc3}z=xguv%1HJlST zah>DH=svY55r!ncbr_XK_v+L^jtBvXN4UEiS<^qyQ2V!gl7#E| zy3?r--s8SJLD5&!87aab+z%5kY=F(yVHt5;-RrGIOwf~XI9K5F7;vJlS;p8ZQCz~d zqIGdiC$I-0c%N(qdiPc?jW1W<(`(chDliz$-}-7f-`u1HsG*-u7?;b;{)`ThAxY2fB&cQHH{%e>XXnp5RLtnF?kc4<@m-g|oYp{yd-h;bqmlYQ@qpyaw@pfGh?)TGThMzWUDh2Ae-()$5q zO+n(_%~YEDud-2`xOI#1nlbH#A-HvRLx@^u9zF$`;%C6dq{(_Bo(-swZ>aL?0+3); z@FypF(1#z#T}v$p76SWjBtDm^7P;XGJET8OM!A4Q(p)M8l(=2KV;w#ci%^Toekd+f z((SM6sO3u=S)jXZtf#N%J-fKLSSz&f@wYicz^MkjJR`zX8P=7eoA!<*ZbV@1Gmo<5 zo?;+R@-5x!@a~Si=m}?ilOMd}ZtizESMj&Jy~~cv*Y%c%BjSx;aYyL_v#N&DSSOGe8Mz;lOyUTR*W$osphS>@h21Dxwu46{Bcf z`kmE|*M-Zam5|4^;J=yiuSOaDFxH|;kM&@rrh!!%$PH}($tO@m!`B<A>EMP#;=Bt*5Qh?*xweE5X#pJJZeSzc`_^Y^=2_Hr zSGv${|6Y!>2AbYW12yDa1T^kP>L|G0j;Tmb$d_vkH=~(@qDqz%sm!xFuSs2KAvV)t zx8%iCpyGf0=8*3g6DI9M6Pf6T1vY;TF`c`|;f{+UHWgXPB!jzoM$LFR$=R9m0$CA{ zP?uaLSBp3!%MA{(K2S!a2T8{Dsn+0uU6Y~^CfQgt^Ve)rcZv^z4TZo;6 z?E8e*UP9?wyaX{lh!odiY(~hT+2>;hC`z(c_)$eTQ?^7hYYe~gn_vfyHnU z+{Bc}Z$}t=Umh-Xn;L(3V^$6Q_1K>fYnNHoKNeJyUFhQi^xlkDFKa}$z4#>g`-JFF zWiTfcHz(iadP>;&MbU_mvJ@xlph9DbD++7XQ0Hgn>A4w|G%_+EznKMIP4ypA2c^Z2 zE0d+l1}e(OdY#_W8#!~or=iH5TjL@ttC3=>MX}bFTY?%S&Bm($fo_3&QHN=Pd(AHj zr6g;1q)c3Bzb1QNh*fRZzyLI;Q(5JXu(4S}mY0|3wHC4e;b5+x*6(T=EKW&CE0e0Y zedksnn_g#lU+1%NLug&SO7vF8(C&y)ILO|Q?+Z!pf$Esg20S#NlDF&}dwDI+M{uo` z3mGe(^v&5L)%Bk7fwA=`%$7ZEt`1fTUE?$Veq^M!+C#2)u zq^{Fge*PLld=D_L$?H4~XWOx>D%PmS9Lh2H+n%_u+$TA z;@cr?I;Ws(2ffSQVrR5V@Wu}f^(Dlm#QjQwCGY)j_S4_`Zn{X!F(l?_j2N77c|399 zu7u5u8af+=GlVilI=M?ZqX+e%YkKYv`@DIdLU~xyiA-+~;{uWwdB18L3AHDK)U7IF zsN9dLa8IhFy9bKtg7VAK=7-aQQKJ9J1`pMZ;Yoyp-NEQi^Ve2YVH1&u--%5`3f>YM zg8~eoalUD&g(xCVutr!nJ-82JAkGT-Qkzz9Se4a^X3vw}<{Bv;T#pD8!}`+4Zr}iP zFU-$>|GvgWow#bKbs|v}@SS`EUIl9?MKv7eI=n#*xS*4u0RDbemCVoV3>&|ew`rYB zqeQb=w_{$RE|WVUOyzU=@aMwVUqDLm`$8#c7g(H5T>~+gtQ?Z7#n*T(RjI+NaLi`1 z!qaTRpx{13mN}gEcR9)6hm?J3>-O>-?S6~K5t(q4W~up4*=d9q64C$+;;zg^QBl(l z@2@ozG0n298Pi3zaiB)op$yBn$Xtgi_!`2C?m7b$oZD_BY9G_J`dvWI z`8b)47wds!~MTGK;&Wktp30vCFh4@$4;2+PRndZMu>N)So%W z*9juuXOgZdE3?5K86OzwAQD|EmC{m(Y!}a|Hq0O53(JMekI$X9U5g+ zS2wJ#4bFs-Z@pE3@Jo(yv-3ul~Wvb6cr#Hu-@>PK(RVv&{7d!)&GOYp_f2iR=!~R7Qo}`v8Y&*m?l*(F*PR6tE5~# zPU{`xRBci9f?E;GDO(aGVo;3KRk+5z%WgKmC-8YFOB0T;*kXg8W&265W-+jbZ8Coi zYAQ2D_JWAgM-?g)Z5jgn?4=(FHW82v^tw2!M%MBpUxS-K_zg>mlq!c^9+$6%q;BZ` zes+=|-Z?uLsl`?)er{IZAAg8*!fce2hmIO zp$V>KMmrN-%b5We$f|0DO~%vDQ~N|Ei7^pzu0)rZiN=kBgFNGHb1u13W>ZyxL7egj zZ%JQ%S@)}`p7tRm9HlQa?CFU>n3=&4s}4E6Ie$;t`rC-o8fMg?U3!U4(w1DKujOjp zu38{A<(`Y4xIT)+a(Wtbg9WxN_XAr>7balW_cdG~zoW$xD>PUACF{*1bjL+RXt z_LNE;Y9%R{>WuzW1Kl2tG9v+&hb#wa8U3H*Ofne*hKWzlN2OlB(7@W5)Dbjv5R#00B!b)_Awz zex?xxoTYk7MROwbkRj{Y zf1X$Z*q?>#3zl|2c0E(J6=}w-mYlhV4nWdl&36!N^|c%xf-Ex6egmzA9?{4w%Z^o7 zrLdV~Czl7;*LnEN`EzZZg_*P+WAg;`#_r^uy3Ayu+T+?QAA-6XjS{$zSdNd&7n`pP z^Kv^H*m;)IKlS`_k9=0nfA?QK!(D3}tp_DB2p(GbKkZ#-S5sTJMv8(;7o|xN6FQ+v zZ_)`xy0p+i0qGqB#6m<7FdzvapmdOS2)%@AL3)!Kique*Dxux&(R1H3?jN{c-i*Pw zgt7M8vpn;e&s@tZO06bD$*c1fKzt(@@a9%-wY9Q#yB@*Ou?^0h)Jp)S!-wi@Nmp#@ zf1}8A9r!hIRSMO$<)(gfFY4n7*&C)x-|XJa!JKRsQS+S@*;`rD6_aC4(`!LNSFc)Z z)?gi${!gUGJc?TPslgP5my7ec+Q^$ECOOkWn%2AVscb&J`CNb&*e_U{0a1J(5#0FE z)numh`g)@rfbSHPn|*@C#_m!43km(WH0&OZmIm-v-ax^IEKuA4rSXminfPY$l^&p_ zg{;_aTJgjbKggG|&&I+kJ%Q$_F<l{d$GR?2lY!=MKqC-Zz|hFS$u9$_s?|8FT{Iw4sso&+5&>Y!0=}E2Dy2S$Gn>;9_sp9=*wLX z+qfKSqlQ*y>eYL*pQv%4`#v8qjNTDYe*jFsWwBivq67f%dHagwn}jVQJg94+MXz2V zIMoT2QxjGWB$D;1_2afIA?TMcvL?*;SpP+esoX`t%EHRSeNVo==9F3+NjII z)mOt-7Y04%B`oRy>LKE%DY$-^j&ax*r$>oG(4tK{kKrP3k#0!w1RiCutoic!zx1kf zF;UdDQxmnJ8w7yXWZS>dFyqHlR~j5FGsqQtUQ3d`w4wc#JXT`|r%eJ*C;NB;!v&#P z3DqO400m`02t)0FP(Ms_+yTDE*!ya}FoC>L4rGMpscU6Ad|XH?4T&{)pa+5aWzK__ z6;mC@2$gIXF34Y#-}p*w`-bYFm1r8&M+f_@~fJgd{4&HH}*yw@YUopgOk$v zZcVl4n5m!DHn0;0xo!P&TA72Pgxx_Nc--++y3{;)Y-GN^D~^~eO!-)&F!$F?;}@?! zjcjZ(N!_GrLnK$Os@EeSTP&eB**9`)DcZND_-l*7cHM~k`qq|Lle^o;^+^{Uw+C6% zA8bAw>HI5TgMr!5mg3FL;^xZ0wTaL)C$aQpjk1v;ouDCW{d~ra`c_8$w`tSHa!tpd z)48(`VN+3Y=V8PL5*yRBdUq1kUTXj>uw_`i%tini|mnnb@Tdb2*@YS#2!Xo(xjew6V97wl)g$lyX0+PAX=B5SQ+S z)ft7YxdnUNm!3rd+PbCiPTh*N-iN;Nb4%d^v$T_X@n82E-PM6v8lJWv6)~5b^{MnA z+`3yyHzV&#Y0sAu0=oPnO9Acd8!@Ea0ZK(LFmlQF~qm*FFepM z`PpyDzuBwqm1P_J;{Ku4PE!u!T773Q9v>G#K&3fbkcr8$X_XymAewh+We6AOed*;a4x6$}tY4F}u(TflIS6zC-d>Oa$ z5_jqWe#BZ2YCEOgKmZw&+qKbL*EOVa#`iyZ0^Fe^=e39>r(eW&-+o0))v+?VZ5aWP zwO;Tz6zYmzP-9sAazNys>FV1HA3xN#TRyev(&Kd699|tq8kD5NhkKvbNe8K{BL7nh zx9I$u{^;`3_5CZX9P5?&Uc!38#cQ?=KhAd&7h)v7X6)qg$!8dOm+P*~6xyW!G> zUSVHf02Qb7l+TVvTx|O#dS)#^3MdoS7&HM~U93qa3g|z$UYvK36y<5XLj8qZnhh+- z$8+v#3e$XVLFdJ`dw250Yszbbh`abLJ1a|gj&WfEuj@qi(|_@3yG-SUH1a^DA^59% zTD_61=|m2@+5d{Be&v9bdB8%g`$8CF#sI^!vfe^B?xD-;5p`C{=|rl^DcwXw*s%n$DdY>U}+&`84(9l zQ*E|n)i3h@wM%q1Z}Fa+rtjq~_78%+cGq!(9AuDsa&593zmk`rpAc1x_N+RolGpZ> zgKN`@uO!L5h%9Oe7_R)u_l@MA^UFSnh_0h(2eLE+344*jmQEuNz0qMnEVCn+k%Qj}uytfQ6^D-!jDC1hy z)$h6McIOw`C%mpeLb^ZKvW-r8-^lTqT5>i z0UNrfZ7jKBo6nlJA5)0Xd+>#A%Re5&yt>=)9K+F3$*r?o;;_}+_>@+53n2^ZZAkr6Gkws>|iMyp;``VF#UT z2i?%|f+E)|9UaB`0}8dxXS;!cCwrV_nUOoA@0TH`5B>Zm*hr25pZ)vAaH-hyegFP_ zZs}xFTDd9wsD{(}=XO^an+8)CUqB(EtKbuqT;wm2qB}&7U8h1gZ1wv)X7{B0_}(tf z_Lti~{7vw6Md+}X8COWXc>Y#-1)G$r<|UV9=Ssi%MP6C_fY5P+<_loxZ8R%x!5zJljcQLWP>Ok;G;z6RKeY3mZU#kRv}oYxLDNLrCfNS^ zctAaHkZvsR{9W>;B8MCI2xgGF+j-~3LaTFdrMG5Ew)}q%jta9RC#hj(%sx~)y?JA6 zV`FC*dD8blGgsLb20QyPZozv}drJSugeckTRnnSPmX=P=D$PaC@VC*KTU(n%$zJ-r zj*-zhjnI>+Voi86N5Dc6+GuEUDlIqC4oR({(Oqx`oxX*HNQK1E@m0sqY0`@>dUVfl z5*cTS`!*^h*k$Q{LYc6r88u^jg5%1-RCx}iYaS8TO(8}<)giX+kuJ+0&7;vWIC>D- zOl{(h<*$0D3yG+$5Brh-V(r>lNKnuze&R;ZKg*;WvqW62Xk0}=J#vox*_?JOdSIsS zZHRT=4E4Jwe%|Oh{c?9-5)!6j9d%Vx2hF-`P#W7C>YYrGzi{Wpvfa__iYo9c|gk(?vKCaqA8YRRHUFP3Bib9=LJ6V`ZHAitIf&L zFUc#142V08?iJzBXo>W8i6l$Uym8R82Up8~%C4wtTvlZ@%T}+_ElG}v0=ep^uCgQ| zZ!Y$O_RAC<+=r%Z=ow8cMdCjydkS$wTa3=YY!uH@GZWZj09;cLhZ~29UU#Hos^zJ2!hj*VT$t252xEOfL0FD4Ah>-OY6JGlV8UU z4$J0-TBl5}-To)yawFnP5*9a30QH3V+#t>ihM&eo!Xtxsyi~^+5V{f9g}boKABgPr z>MdeY!v(h{O4MFzjtJ4W#R|auzN6AsmT=RrVxBGsY17UKf z>uUEKyNK|hh=E5b*k#@a+KKkA${hA?I=@%E{-os-lJ-FQfOB&Ofaf@ORp=$_>1IHg zaZqno-Jz#;sGct%x0;Yu*8(bAQ`I`NNF#jh2U)x=PPGavA_YS-S=}pdhQ#=HQU^(m z<6}OJ>i}0@k}UnDaou}{!n`Lr>2WgibIEHR3v=53b9(8e^+?gZ+H7v!(64zmdkiy% zW}mvxi~BN$i~0uz`Qk}a_5)9|EWT9QFV(*uu&MD`A`biH!6T>Bm4BNc()Z*R^_;Mi-vgX!Znpd}mmuUrr5gTA0&(gqF(GO4~w5k+?Q*qOtf46^`U94jP-Z zSb=ARNzD&>=>$HD=HV|GBYTtl_R{uO=4Ky(Yh&#UZJ;*R)XuBhLTA<{Gt;v*Qm0J{ z_Y<9Ja+VtR(6Y+1@=Y>_MNJviqeJ@>&piwbaB|`Me@T&foxw+zdNx7Qk&!3E`FYpN zAU}tN#>?ZnV0qlEZ$o<@R5s4$|B z%F!J=J&-gMs=LOavY;fYxDaz-q=>y48&ibF^%V%X-sh6I_GKZ;mAN#2E_@ z#rj*|-(lw}rNURvqrl`WO6V&8a1`i*cy^%C^$G!>7&@?_U^?=uFqLhX3)HKF4GUQm z%`@-rI8ty4IJIf*dW7r;f8v>?O`WeBEe-HT7)4@mo~1Xyw4AKeX3tsT@<@~AB#blY z@9QK^7oa+u9G2QJlsY#W30BzxDeR5I_Mm1vrut$l<$CM1b?l*S4exI|^0`c!J?lIY zST^A%;N1DHd$1g|&tg{BQBfenA~jkfacR*VT`1}z;8S=`pV|sA7A>`x#KVskca_cQ zs#m8i4QF+L;B5G1tNlQ4*8dR()5Aw=oBH0}lBs_f&U3Hx6TrushPTDuPNB5SyPd+` zCUl}Svs%cd(Nf{2OlJU`k`Clsc0`NmScUVUO%*i%ML%~m!(zFMNJvVmfgI^8_OOM7 zo3u=<)bgwpLUlL5q-hV2PvO_MC9N{muEAk(vll*r;(#S&Tqa$+N*VnfC=O36KDAD>jyxt=Wda{R_h zEkP8?PlS9m11Cc=+oLh>_>xCBASPS+q-e7ym?oBOgbqxr|Ak3RHkL3sd@6E?b;2ag zx-|6V8&0a7JJ-!IEt%gaK?;3@x%Y9>P_D@2#^+~ru0@4jFeQs0sI>22zk?&qug4`J z`4@FDg#sy*E`Bm5=np+C6q2$zmP{RbcxN+l`JJEg^nc@!@&nTM(F`M(iYG@MB&6&K zN1v1q1KllY#2s~)QO$2L)Iv+jUG3$b!|KS@exQW`^fjc=ye2m<>B}pt4VzNRhMBMpX*~`2ZXw9<4XhtLO0jB zlBjv2V@?fWeJVu%SzTpdrmx32sT~c1!-%(x>WtelMk}cN=e=w5GA5ZRkCQ0_{l>(L zP6y@}yOi6N9B6@@6z-Gw=G!!-5a4CB7`a{EBFEJrDV5GOEhf>bAKs?lI)02^MuVxpyID)VJB@Dd1>Ku5l7**^e46B|xQ+H7jhCOG2 zTQA!I>RSw2yO9txry2TXb*y;?%TBp>VDwU)>GOgQc=J&1#L+RckHvjg_K0K1f7R;m zO=;o2R4m_kPv9<#aOTM@X}=clq(!A16Ad<;hm4jQ5E1WL2*?{DQQ@1+OU#dy&? z+rE=O2JV%Z{!|x@T&hPNGcHbWXsD3v@Ws;Hwl}sfHPpLoR5T(&A295oS{LSG#>|K? zERAC^8yR+OtTODL>d%SDsIu$ki|W*W=mbA+ZN@Fpw%5=_d;L$&C~O&=6E$g%y%ECP z6n7hKGk_W${elk3d~fI{!?>1TWVS?XA7(*iWq~dz9{xO0(8@G%lVGU#Bwm@=;-fgG z_fM+9YbYaHmd!s1Q9CV>zP4duZ0)phnr`edb($`OiP9H!M5uDmtnDHTYoJfN7!_KS zej{pjObhB_iWwZ{4(c9W*96Rz#+B$c5+Rzcl6zjfN_Nx6UgBE)0=MR&jcEh>*yAm~ z40GVYD^Hb9ev+^D*?0}7HD|JAnYLpTVharTufOXWzEwr#vm3~wuYWyL{-P@}y|}&D zZ?Oy2;v#VONBHW`2m>3jzaM+7y2aG2yNC{q6wKc8=fp67lNb%Di53rx&NhN1%Xm%S zic3U7UJ7`*tKp9i{YOLq5wZB*(CwY-K(nl>xtewV6|6qvtqt6e*#J}Me=1uR;jU+iH^-29$ZNG5fvJu}~PFXZkuO`M4^2*ntYi};p?HFzGj?)V}hTv4*e;p-QJ?d(mN z7|&^3uV91&C!C_%Ulx+MT>0El-E=YU?0rx0j_=Mb`YiSN>0_LE>%v?d6gb#VySJV@7gsZZEmfECT zvLWK?#=T44b}qBG8rYe?w+3Fu>dQVIE+8cf1MUE_H zL%WHwEiR?BdQSuc3yf^kGQ{{Vh{)b!*?U5jlgr&bxMBWn@((POxr+cP+W9fR;&z;w z*a2N&3Utl3$z}LdVq&`dPCMHkY*AW#(PrCC{WHTHbc1jsKz8iY)YFZ60F8`pCG5z% zA_nMkDHR=UIr1dUn6Nh!Vxn@8EV4-O6Gg^dw%UbiMT& z3tU|Liv+Mkk+2L|AZ!BZGD8Gz zTN)5^F!yfIB{CE4hPyyYiczf9F?glIh$)JVAptiBl}~g?C-03KVW*60Q8nooEi_*S zs5l-O(PGAwkb+h2xtn(J zCgJ_DMK*ba(qEDo?(009)Ae2$+3?Z%(4rUgILt`E&iBNyr(n zLz)eQ*`A8V8=b>)m*Ia``UswDnD}v3;E-cd_si+CUf2Qeh#dJ z_>YJWTn;XB1Y6V$leh}l45*L#>)RuN7a;%8{|zfb>nesA%4ya)d?)X`P&N({%4edq zR~R9Zy+dEAu&o~~^M^2SLKyuNXYv`wiJhqVOF?P$G?^sRo(P+8cYnO*35Zm1#lOlJ zqMRJU_A2J+u2UoW^4N$5WAp<0KjB-~WuOEh&MSTE3{Y+vYRsaUyGD z@kKM!+7J$^^}hgDi1*Gg;r&iQZhm5bNki~o5I-E&bm(0f?s>RN;Z>l<@VgSv1c?@T z0x3J&-q~~nW$0>#sc=7Wv&E!S(T(9+ij=FXBQ=#?ksxfZ+}&<)B+%uD!J%}jl z&?imQ-}hysq>~Xn7fF77j5<)3Jm_xAR@!x(tij9Q?8=z7N_ho+TKYfS)SqAfPEvpB y^M8o5|9Dd!O?Gh5;qoZM{QHo(%JlCe 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 literal 268308 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

hjw?6(Urd@T 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 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 9583c467d54f8b90282757cab5d7e985f0750093..9988ac2260bb266f0495b06cc6a63f75dd5e87a0 100644 GIT binary patch literal 6235 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 literal 15382 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 A3IG5A diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index b578a6739edb3e463247387058465f4d30f09279..c23f1e0cb1073690ed402d17e413edec01528ae9 100644 GIT binary patch delta 474 zcmV<00VV$51@i-tBYy$9NklOMFeDwn__Di-Lnrir^n`_cOS- ziIalh?5A*XQXE|Ln<$Ece^8`DLE73-W1E_WHc7or+i10wf_F;pJ?HoCdmM&;7HfU< z^@&kM8`=;>Hu{&rb)Ae=Dja&As|SF(IW{_RB{C_|%cjV6gdo zy<#-s_o`R>aBZU{6*>Z>nN{SacZlaFD3tRJ=*tM)<#lkHxi@ER`Zhp~$#{!}!K_z| z@HosSK+74NbQz2(AqbM(H73SfL7rTAPI|>WMT9K`{01fY9AN zurLSlxd5SL1%3Yf08dlF!-EaYPXNU;>u=zBP%f_Vvs2`B_E(QQ`2axKK2`_9JB&%O zU&;>UI8~E8M*)B`oz^p{6^iFBC2Zm^Go73x^8tBo0zeazq-<~XvcdQI1X^{e;o4l1 Q0{{R307*qoM6N<$f=P|wp#T5? delta 712 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 X;Xq?;=ga#G8bDrJS*lXPIN<*Q?ympf literal 39099 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 Z_+Q3oyL(a?qLKgr002ovPDHLkV1iT*66yc| delta 2029 zcmVK6@BYy|MNklpjN0VkV5-WHHgrJv_iO{Ng6c{ZWEFy zBu*{{`J|$%!@8z#RW-e&C`$4&iXuul69)dtIF4W9qvt3WDE|LSz@Y3> z6!kl%mHVKT%d5I!K~*)V0-g~-91DpKlGy2c?nhm>@u=rIFY?6?`1W;5xLN|DSzP>h zE?;~gUuYq)34cw~DH?IrM3CVNfjA`r5>>dy@O^hry;ixGM1IN{k5Q^OOF-1#K`Zx{ zTH5-pTtP{|bpskLX9&=A{UQeGCuS&O1Cbs==X_l^EvHd^q*k39BEipa;?=h!AQ}g0 z>4BCt9qZ|G7<9QHIZJopD-f%zi#am&!Q)u{QGS<+Z>qK5} zg*|f$6BnOBtuo3SQ48;_!^Z2)%r`{0*x?&3kba_Vus@6NBIP#r^U z{3Ys&p=(S|>dqHi3jVD75Ep(`ywD`DgKqzTk!8D@Y&8Y?+Re~5ydNk3x)1Lf*aNFr z!hhwX-$dk0Epl80zy42@&pruz`fpgb;~QuMRh&Ned-M%_3iYX1p?WrA>J;6knWKlz z2YuiBo+PA>w7h=WvI@k_wpy~y6sYh12*#(5!zi{R*VBiYBab0o0={(k<dZo#8q!M6jlaj;y9F^t*DM2h0#BNB4jJZ*?*Sg z_M|6h?6xQjbs_LhmREf-c+6a=ymvQzrG}Wrr*3+%8fCO~?S^i4;@V|N;-%$X)e5+! zcP|UlY1Hdea9d60#w_YB2Ey(4p!M~G8G+0bs&*?07($?(tdd%h{sHBIA)7O#~lBVa+xkfg`Ay0phu7*e^d1dw4gri8IKL zpIacIs0A)d2rN6hot|}w$Ir4}RhSDFJ>nsz3v0TAP@|~Jk9%L^GsWfHhMdocbw42= zPcm=p3Ao+s5(3u`Au!8BM9wop#3`F(Z?MnM7@(;Ft= zUw?=QftUn5A>a!E5w6vhl#CKDfYU=^6kci)sIo@C#b#nqUL+*6jDV35(9?vgSq_uY zBd?VShzDvUP^f1*Of4lrU4OAUZ#g3rfC+e#%L38k5&THt`-71gChQUqNSqnN1rJDQ z7*{P!tXVcxc`jsw^u1UuYek3XW7rbQ!+^)OD+&%HE5#Dv{jOX8nzUSD#DY|vV?VS$ z1x-$pGzTD73W1e+P9;ifs?1TdH3F_vK}QjqJx8|(2m>Kdw>jg*W`DZLIOaNy5x?Nw zCH1=X=rJ_D^dREwobyYFqnxPFhe#eHeBP-7k;u zL^EJCoMi;^Q`1mSoPUB|Z6M59XnSQONlL9^qd58|!de{!2Kz*@{>NCMA2{qdwcoO- z+$(LAS!U%MIi9v+S@BREZb6Y73~Sa-BUKI1@t4=qgbTyO^1yfD)T?pedq3io^Yflt zv|f7nhpYDN4)$=H<{MAWklp~~<9c=O2*E##>pJ3<2sBBYq6Nd1x#^$eJZJA}E+$d7 z)!6q*!nyy=#b%^QLfC$Rv3r_Z^k%MRiQDP&m^CF}v5~8p087PN_0_C7Br*R$*B*AA z`XHrwIlY~UTKs=pPMgD}yhb_Ba;p20XVKJ7{%%F;t#T%-zMlUZi#W!b0h3$(00000 LNkvXXu0mjf`GwrU diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index 6ea670e18e2c8976bcaa3cad448194e11779a41f..e93200f01a738ac9c8767d0b735b3d757e674024 100644 GIT binary patch literal 27418 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%0A3Oq@|-7J<(jpR-QlRMQ6*K!&7ayul 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

vgwWgx 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 O00006v~{3+(E^uJr2H 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 Date: Sun, 8 Dec 2024 23:36:55 +0600 Subject: [PATCH 09/11] chore: bump version and generate changelogs --- CHANGELOG.md | 16 ++ README.md | 74 ++++--- lib/l10n/app_ar.arb | 16 +- lib/l10n/app_bn.arb | 16 +- lib/l10n/app_ca.arb | 16 +- lib/l10n/app_cs.arb | 16 +- lib/l10n/app_de.arb | 16 +- lib/l10n/app_es.arb | 16 +- lib/l10n/app_eu.arb | 16 +- lib/l10n/app_fa.arb | 16 +- lib/l10n/app_fi.arb | 16 +- lib/l10n/app_fr.arb | 16 +- lib/l10n/app_hi.arb | 16 +- lib/l10n/app_id.arb | 16 +- lib/l10n/app_it.arb | 16 +- lib/l10n/app_ja.arb | 16 +- lib/l10n/app_ka.arb | 16 +- lib/l10n/app_ko.arb | 16 +- lib/l10n/app_ne.arb | 16 +- lib/l10n/app_nl.arb | 16 +- lib/l10n/app_pl.arb | 16 +- lib/l10n/app_pt.arb | 16 +- lib/l10n/app_ru.arb | 16 +- lib/l10n/app_th.arb | 16 +- lib/l10n/app_tr.arb | 16 +- lib/l10n/app_uk.arb | 16 +- lib/l10n/app_vi.arb | 16 +- lib/l10n/app_zh.arb | 16 +- pubspec.lock | 28 +-- pubspec.yaml | 18 +- untranslated_messages.json | 444 +------------------------------------ 31 files changed, 451 insertions(+), 545 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b06ed0..471d5a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [3.9.0](https://github.com/krtirtho/spotube/compare/v3.8.3...v3.9.0) (2024-12-08) + +## Changes + +### Bug Fixes + +- UI glitch when loading more user artists and albums +- selecting an Alternative Track Source removes the current song from the queue #2039 +- **mobile**: ensure audio session is activated when playback is resumed after interruption #2092 + +### Features + +- add invidious audio source and fix auto skipping tracks (#2005) +- track caching and cached track export support (#2117) + + ## [3.8.3](https://github.com/krtirtho/spotube/compare/v3.8.2...v3.8.3) (2024-10-09) ## Changes diff --git a/README.md b/README.md index 71c879ba..1532e3a8 100644 --- a/README.md +++ b/README.md @@ -213,40 +213,32 @@ If you are concerned, you can [read the reason of choosing this license](https:/ 1. [app_links](https://github.com/llfbandit/app_links) - Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter (desktop included). 1. [args](https://pub.dev/packages/args) - Library for defining parsers for parsing raw command-line arguments into a set of options and values using GNU and POSIX style options. 1. [async](https://pub.dev/packages/async) - Utility functions and classes related to the 'dart:async' library. -1. [audio_service_mpris](https://github.com/bdrazhzhov/audio-service-mpris) - audio_service platform interface supporting Media Player Remote Interfacing Specification. 1. [audio_service](https://pub.dev/packages/audio_service) - Flutter plugin to play audio in the background while the screen is off. +1. [audio_service_mpris](https://github.com/bdrazhzhov/audio-service-mpris) - audio_service platform interface supporting Media Player Remote Interfacing Specification. 1. [audio_session](https://github.com/ryanheise/audio_session) - Sets the iOS audio session category and Android audio attributes for your app, and manages your app's audio focus, mixing and ducking behaviour. 1. [auto_size_text](https://github.com/leisim/auto_size_text) - Flutter widget that automatically resizes text to fit perfectly within its bounds. 1. [bonsoir](https://bonsoir.skyost.eu) - A Zeroconf library that allows you to discover network services and to broadcast your own. Based on Apple Bonjour and Android NSD. -1. [build_runner](https://pub.dev/packages/build_runner) - A build system for Dart code generation and modular compilation. 1. [buttons_tabbar](https://afonsoraposo.com) - A Flutter package that implements a TabBar where each label is a toggle button. 1. [cached_network_image](https://github.com/Baseflow/flutter_cached_network_image) - Flutter library to load and cache network images. Can also be used with placeholder and error widgets. -1. [catcher_2](https://github.com/ThexXTURBOXx/catcher_2) - Plugin for error catching which provides multiple handlers for dealing with errors when they are not caught by the developer. 1. [collection](https://pub.dev/packages/collection) - Collections and utilities functions and classes related to collections. -1. [crypto](https://pub.dev/packages/crypto) - Implementations of SHA, MD5, and HMAC cryptographic functions. 1. [curved_navigation_bar](https://github.com/rafalbednarczuk/curved_navigation_bar) - Stunning Animating Curved Shape Navigation Bar. Adjustable color, background color, animation curve, animation duration. -1. [custom_lint](https://pub.dev/packages/custom_lint) - Lint rules are a powerful way to improve the maintainability of a project. Custom Lint allows package authors and developers to easily write custom lint rules. -1. [dart_discord_rpc](https://github.com/alexmercerind/dart_discord_rpc) - Discord Rich Presence for Flutter & Dart apps & games. -1. [dbus](https://github.com/canonical/dbus.dart) - A native Dart implementation of the D-Bus message bus client. This package allows Dart applications to directly access services on the Linux desktop. -1. [device_info_plus](https://plus.fluttercommunity.dev/) - Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. +1. [device_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. 1. [dio](https://github.com/cfug/dio) - A powerful HTTP networking package,supports Interceptors,Aborting and canceling a request,Custom adapters, Transformers, etc. 1. [disable_battery_optimization](https://github.com/pvsvamsi/Disable-Battery-Optimizations) - Flutter plugin to check and disable battery optimizations. Also shows custom steps to disable the optimizations in devices like mi, xiaomi, samsung, oppo, huawei, oneplus etc -1. [draggable_scrollbar](https://github.com/fluttercommunity/flutter-draggable-scrollbar) - A scrollbar that can be dragged for quickly navigation through a vertical list. Additional option is showing label next to scrollthumb with information about current item. +1. [drift](https://drift.simonbinder.eu/) - Drift is a reactive library to store relational data in Dart and Flutter applications. 1. [duration](https://github.com/desktop-dart/duration) - Utilities to make working with 'Duration's easier. Formats duration in human readable form and also parses duration in human readable form to Dart's Duration. -1. [envied_generator](https://github.com/petercinibulk/envied) - Generator for the Envied package. See https://pub.dev/packages/envied. +1. [encrypt](https://pub.dev/packages/encrypt) - A set of high-level APIs over PointyCastle for two-way cryptography. 1. [envied](https://github.com/petercinibulk/envied) - Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times. 1. [file_picker](https://github.com/miguelpruivo/plugins_flutter_file_picker) - A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support. 1. [file_selector](https://pub.dev/packages/file_selector) - Flutter plugin for opening and saving files, or selecting directories, using native file selection UI. 1. [fluentui_system_icons](https://github.com/microsoft/fluentui-system-icons/tree/main) - Fluent UI System Icons are a collection of familiar, friendly and modern icons from Microsoft. 1. [flutter_broadcasts](https://pub.dev/packages/flutter_broadcasts) - A plugin for sending and receiving broadcasts with Android intents and iOS notifications. 1. [flutter_cache_manager](https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager) - Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using sqflite. +1. [flutter_discord_rpc](https://pub.dev/packages/flutter_discord_rpc) - Discord RPC support for Flutter desktop platforms 1. [flutter_displaymode](https://github.com/ajinasokan/flutter_displaymode) - A Flutter plugin to set display mode (resolution, refresh rate) on Android platform. Allows to enable high refresh rate on supported devices. 1. [flutter_feather_icons](https://github.com/muj-programmer/flutter_feather_icons) - Feather is a collection of simply beautiful open source icons. Each icon is designed on a 24x24 grid with an emphasis on simplicity, consistency and usability. -1. [flutter_gen_runner](https://github.com/FlutterGen/flutter_gen) - The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs. 1. [flutter_hooks](https://github.com/rrousselGit/flutter_hooks) - A flutter implementation of React hooks. It adds a new kind of widget with enhanced code reuse. 1. [flutter_inappwebview](https://inappwebview.dev/) - A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. -1. [flutter_launcher_icons](https://github.com/fluttercommunity/flutter_launcher_icons) - A package which simplifies the task of updating your Flutter app's launcher icon. -1. [flutter_lints](https://pub.dev/packages/flutter_lints) - Recommended lints for Flutter apps, packages, and plugins to encourage good coding practices. 1. [flutter_native_splash](https://pub.dev/packages/flutter_native_splash) - Customize Flutter's default white native splash screen with background color and splash image. Supports dark mode, full screen, and more. 1. [flutter_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. 1. [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) - Flutter Secure Storage provides API to store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android. @@ -254,58 +246,53 @@ If you are concerned, you can [read the reason of choosing this license](https:/ 1. [flutter_svg](https://pub.dev/packages/flutter_svg) - An SVG rendering and widget library for Flutter, which allows painting and displaying Scalable Vector Graphics 1.1 files. 1. [form_validator](https://github.com/TheMisir/form-validator) - Simplest form validation library for flutter's form field widgets 1. [freezed_annotation](https://pub.dev/packages/freezed_annotation) - Annotations for the freezed code-generator. This package does nothing without freezed too. -1. [freezed](https://pub.dev/packages/freezed) - Code generation for immutable classes that has a simple syntax/API without compromising on the features. 1. [fuzzywuzzy](https://github.com/sphericalkat/dart-fuzzywuzzy) - An implementation of the popular fuzzywuzzy package in Dart, to suit all your fuzzy string matching/searching needs! 1. [gap](https://github.com/letsar/gap) - Flutter widgets for easily adding gaps inside Flex widgets such as Columns and Rows or scrolling views. 1. [go_router](https://pub.dev/packages/go_router) - A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more 1. [google_fonts](https://pub.dev/packages/google_fonts) - A Flutter package to use fonts from fonts.google.com. Supports HTTP fetching, caching, and asset bundling. -1. [hive_flutter](https://github.com/hivedb/hive/tree/master/hive_flutter) - Extension for Hive. Makes it easier to use Hive in Flutter apps. -1. [hive_generator](https://github.com/hivedb/hive/tree/master/hive_generator) - Extension for Hive. Automatically generates TypeAdapters to store any class. 1. [hive](https://github.com/hivedb/hive/tree/master/hive) - Lightweight and blazing fast key-value database written in pure Dart. Strongly encrypted using AES-256. +1. [hive_flutter](https://github.com/hivedb/hive/tree/master/hive_flutter) - Extension for Hive. Makes it easier to use Hive in Flutter apps. 1. [hooks_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. -1. [html_unescape](https://github.com/filiph/html_unescape) - A small library for un-escaping HTML. Supports all Named Character References, Decimal Character References and Hexadecimal Character References. 1. [html](https://pub.dev/packages/html) - APIs for parsing and manipulating HTML content outside the browser. +1. [html_unescape](https://github.com/filiph/html_unescape) - A small library for un-escaping HTML. Supports all Named Character References, Decimal Character References and Hexadecimal Character References. 1. [http](https://pub.dev/packages/http) - A composable, multi-platform, Future-based API for HTTP requests. 1. [image_picker](https://pub.dev/packages/image_picker) - Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. 1. [intl](https://pub.dev/packages/intl) - Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues. -1. [introduction_screen](https://pub.dev/packages/introduction_screen) - Introduction/Onboarding package for flutter app with some customizations possibilities -1. [io](https://pub.dev/packages/io) - Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values. +1. [invidious](https://pub.dev/packages/invidious) - Invidious API client for Dart and Flutter. 1. [jiosaavn](https://github.com/KRTirtho/jiosaavn) - Unofficial API client for jiosaavn.com 1. [json_annotation](https://pub.dev/packages/json_annotation) - Classes and helper functions that support JSON code generation via the `json_serializable` package. -1. [json_serializable](https://pub.dev/packages/json_serializable) - Automatically generate code for converting to and from JSON by annotating Dart classes. 1. [local_notifier](https://github.com/leanflutter/local_notifier) - This plugin allows Flutter desktop apps to displaying local notifications. 1. [logger](https://pub.dev/packages/logger) - Small, easy to use and extensible logger which prints beautiful logs. 1. [lrc](https://pub.dev/packages/lrc) - A Dart-only package that creates, parses, and handles LRC, which is a format that stores song lyrics. -1. [media_kit_libs_audio](https://github.com/media-kit/media-kit.git) - package:media_kit audio (only) playback native libraries for all platforms. 1. [media_kit](https://github.com/media-kit/media-kit) - A cross-platform video player & audio player for Flutter & Dart. Performant, stable, feature-proof & modular. -1. [metadata_god](https://github.com/KRTirtho/metadata_god) - Plugin for retrieving and writing audio tags/metadata from audio files +1. [media_kit_libs_audio](https://github.com/media-kit/media-kit.git) - package:media_kit audio (only) playback native libraries for all platforms. +1. [metadata_god](https://pub.dev/packages/metadata_god) - Plugin for retrieving and writing audio tags/metadata from audio files 1. [mime](https://pub.dev/packages/mime) - Utilities for handling media (MIME) types, including determining a type from a file extension and file contents. -1. [package_info_plus](https://plus.fluttercommunity.dev/) - Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android. +1. [open_file](https://pub.dev/packages/open_file) - A plug-in that can call native APP to open files with string result in flutter, support iOS(UTI) / android(intent) / PC(ffi) / web(dart:html) +1. [package_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android. 1. [palette_generator](https://pub.dev/packages/palette_generator) - Flutter package for generating palette colors from a source image. -1. [path_provider](https://pub.dev/packages/path_provider) - Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories. 1. [path](https://pub.dev/packages/path) - A string-based path manipulation library. All of the path operations you know and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web. +1. [path_provider](https://pub.dev/packages/path_provider) - Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories. 1. [permission_handler](https://pub.dev/packages/permission_handler) - Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. 1. [piped_client](https://github.com/KRTirtho/piped_client) - API Client for piped.video 1. [popover](https://github.com/minikin/popover) - A popover is a transient view that appears above other content onscreen when you tap a control or in an area. -1. [process_run](https://github.com/tekartik/process_run.dart/blob/master/packages/process_run) - Process run helpers for Linux/Win/Mac and which like feature for finding executables. -1. [pub_api_client](https://github.com/leoafarias/pub_api_client) - An API Client for Pub to interact with public package information. -1. [pubspec_parse](https://pub.dev/packages/pubspec_parse) - Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting. -1. [riverpod_lint](https://riverpod.dev) - Riverpod_lint is a developer tool for users of Riverpod, designed to help stop common issues and simplify repetitive tasks. -1. [scrobblenaut](https://github.com/Nebulino/Scrobblenaut) - A deadly simple LastFM API Wrapper for Dart. So deadly simple that it's gonna hit the mark. +1. [riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. 1. [scroll_to_index](https://github.com/quire-io/scroll-to-index) - Scroll to a specific child of any scrollable widget in Flutter 1. [shared_preferences](https://pub.dev/packages/shared_preferences) - Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. +1. [shelf](https://pub.dev/packages/shelf) - A model for web server middleware that encourages composition and easy reuse. 1. [shelf_router](https://pub.dev/packages/shelf_router) - A convenient request router for the shelf web-framework, with support for URL-parameters, nested routers and routers generated from source annotations. 1. [shelf_web_socket](https://pub.dev/packages/shelf_web_socket) - A shelf handler that wires up a listener for every connection. -1. [shelf](https://pub.dev/packages/shelf) - A model for web server middleware that encourages composition and easy reuse. 1. [sidebarx](https://github.com/Frezyx/sidebarx) - flutter multiplatform navigation sidebar / side navigationbar / drawer widget 1. [simple_icons](https://teavelopment.com/) - The Simple Icon pack available as Flutter Icons. Provides over 1500 Free SVG icons for popular brands. -1. [skeleton_text](https://github.com/101Loop/Skeleton-Text) - A package that provides an easy way to add skeleton text loading animation in Flutter project. This project is a part of 101Loop community. 1. [skeletonizer](https://github.com/Milad-Akarie/skeletonizer) - Converts already built widgets into skeleton loaders with no extra effort. 1. [sliver_tools](https://github.com/Kavantix) - A set of useful sliver tools that are missing from the flutter framework -1. [smtc_windows](https://github.com/KRTirtho/smtc_windows) - Windows `SystemMediaTransportControls` implementation for Flutter giving access to Windows OS Media Control applet. +1. [smtc_windows](https://pub.dev/packages/smtc_windows) - Windows `SystemMediaTransportControls` implementation for Flutter giving access to Windows OS Media Control applet. 1. [spotify](https://github.com/rinukkusu/spotify-dart) - An incomplete dart library for interfacing with the Spotify Web API. +1. [sqlite3](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3) - Provides lightweight yet convenient bindings to SQLite by using dart:ffi +1. [sqlite3_flutter_libs](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3_flutter_libs) - Flutter plugin to include native sqlite3 libraries with your app 1. [stroke_text](https://github.com/MohamedAbd0/stroke_text) - A Simple Flutter plugin for applying stroke (border) style to a text widget -1. [system_theme](https://pub.dev/packages/system_theme) - A plugin to get the current system theme info. Supports Android, Web, Windows, Linux and macOS +1. [system_theme](https://github.com/bdlukaa/system_theme/tree/master/system_theme) - A plugin to get the current system theme info. Supports Android, Web, Windows, Linux and macOS +1. [test](https://pub.dev/packages/test) - A full featured library for writing and running Dart tests across platforms. 1. [timezone](https://pub.dev/packages/timezone) - Time zone database and time zone aware DateTime. 1. [titlebar_buttons](https://github.com/gtk-flutter/titlebar_buttons) - A package which provides most of the titlebar buttons from windows, linux and macos. 1. [tray_manager](https://github.com/leanflutter/tray_manager) - This plugin allows Flutter desktop apps to defines system tray. @@ -318,8 +305,27 @@ If you are concerned, you can [read the reason of choosing this license](https:/ 1. [wikipedia_api](https://github.com/KRTirtho/wikipedia_api) - Wikipedia API for dart and flutter 1. [win32_registry](https://pub.dev/packages/win32_registry) - A package that provides a friendly Dart API for accessing the Windows Registry. 1. [window_manager](https://github.com/leanflutter/window_manager) - This plugin allows Flutter desktop apps to resizing and repositioning the window. -1. [xml](https://github.com/renggli/dart-xml) - A lightweight library for parsing, traversing, querying, transforming and building XML documents. 1. [youtube_explode_dart](https://github.com/Hexer10/youtube_explode_dart) - A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key. +1. [build_runner](https://pub.dev/packages/build_runner) - A build system for Dart code generation and modular compilation. +1. [crypto](https://pub.dev/packages/crypto) - Implementations of SHA, MD5, and HMAC cryptographic functions. +1. [envied_generator](https://github.com/petercinibulk/envied) - Generator for the Envied package. See https://pub.dev/packages/envied. +1. [flutter_gen_runner](https://github.com/FlutterGen/flutter_gen) - The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs. +1. [flutter_launcher_icons](https://github.com/fluttercommunity/flutter_launcher_icons) - A package which simplifies the task of updating your Flutter app's launcher icon. +1. [flutter_lints](https://pub.dev/packages/flutter_lints) - Recommended lints for Flutter apps, packages, and plugins to encourage good coding practices. +1. [hive_generator](https://github.com/hivedb/hive/tree/master/hive_generator) - Extension for Hive. Automatically generates TypeAdapters to store any class. +1. [json_serializable](https://pub.dev/packages/json_serializable) - Automatically generate code for converting to and from JSON by annotating Dart classes. +1. [freezed](https://pub.dev/packages/freezed) - Code generation for immutable classes that has a simple syntax/API without compromising on the features. +1. [custom_lint](https://pub.dev/packages/custom_lint) - Lint rules are a powerful way to improve the maintainability of a project. Custom Lint allows package authors and developers to easily write custom lint rules. +1. [riverpod_lint](https://riverpod.dev) - Riverpod_lint is a developer tool for users of Riverpod, designed to help stop common issues and simplify repetitive tasks. +1. [process_run](https://github.com/tekartik/process_run.dart/blob/master/packages/process_run) - Process run helpers for Linux/Win/Mac and which like feature for finding executables. +1. [pubspec_parse](https://pub.dev/packages/pubspec_parse) - Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting. +1. [pub_api_client](https://github.com/leoafarias/pub_api_client) - An API Client for Pub to interact with public package information. +1. [xml](https://github.com/renggli/dart-xml) - A lightweight library for parsing, traversing, querying, transforming and building XML documents. +1. [io](https://pub.dev/packages/io) - Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values. +1. [drift_dev](https://drift.simonbinder.eu/) - Dev-dependency for users of drift. Contains the generator and development tools. +1. [desktop_webview_window](https://github.com/MixinNetwork/flutter-plugins/tree/main/packages/desktop_webview_window) - Show a webview window on your flutter desktop application. +1. [draggable_scrollbar](https://github.com/fluttercommunity/flutter-draggable-scrollbar) - A scrollbar that can be dragged for quickly navigation through a vertical list. Additional option is showing label next to scrollthumb with information about current item. +1. [scrobblenaut](https://github.com/Nebulino/Scrobblenaut) - A deadly simple LastFM API Wrapper for Dart. So deadly simple that it's gonna hit the mark.

diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 141e10f0..8cb52b38 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -387,5 +387,19 @@ "total_money": "المجموع {money}", "webview_not_found": "لم يتم العثور على Webview", "webview_not_found_description": "لم يتم تثبيت بيئة تشغيل Webview على جهازك.\nإذا كانت مثبتة، تأكد من وجودها في environment PATH\n\nبعد التثبيت، أعد تشغيل التطبيق", - "unsupported_platform": "المنصة غير مدعومة" + "unsupported_platform": "المنصة غير مدعومة", + "invidious_instance": "مثيل خادم Invidious", + "invidious_description": "مثيل خادم Invidious المستخدم لمطابقة المسارات", + "invidious_warning": "قد لا تعمل بعض الخوادم بشكل جيد. استخدمها على مسؤوليتك الخاصة", + "invidious_source_description": "مشابه لـ Piped ولكن بتوافر أعلى", + "cache_music": "تخزين الموسيقى مؤقتًا", + "open": "فتح", + "cache_folder": "مجلد التخزين المؤقت", + "export": "تصدير", + "clear_cache": "مسح التخزين المؤقت", + "clear_cache_confirmation": "هل تريد مسح التخزين المؤقت؟", + "export_cache_files": "تصدير الملفات المخزنة مؤقتًا", + "found_n_files": "تم العثور على {count} ملف", + "export_cache_confirmation": "هل تريد تصدير هذه الملفات إلى", + "exported_n_out_of_m_files": "تم تصدير {filesExported} من أصل {files} ملفات" } \ No newline at end of file diff --git a/lib/l10n/app_bn.arb b/lib/l10n/app_bn.arb index ae088b45..ff49aafd 100644 --- a/lib/l10n/app_bn.arb +++ b/lib/l10n/app_bn.arb @@ -387,5 +387,19 @@ "total_money": "মোট {money}", "webview_not_found": "ওয়েবভিউ পাওয়া যায়নি", "webview_not_found_description": "আপনার ডিভাইসে কোনো ওয়েবভিউ রানটাইম ইনস্টল করা নেই।\nযদি ইনস্টল থাকে, তা নিশ্চিত করুন যে এটি environment PATH এ রয়েছে\n\nইনস্টল করার পর, অ্যাপটি পুনরায় চালু করুন", - "unsupported_platform": "সমর্থিত প্ল্যাটফর্ম নয়" + "unsupported_platform": "সমর্থিত প্ল্যাটফর্ম নয়", + "invidious_instance": "ইনভিডিয়াস সার্ভার ইন্সটেন্স", + "invidious_description": "ট্রাক মিলানোর জন্য ব্যবহৃত ইনভিডিয়াস সার্ভার", + "invidious_warning": "কিছু সার্ভার ভাল কাজ নাও করতে পারে। নিজের ঝুঁকিতে ব্যবহার করুন", + "invidious_source_description": "পাইপের মতো কিন্তু আরও বেশি উপলব্ধতা সহ", + "cache_music": "ক্যাশে সংগীত", + "open": "খুলুন", + "cache_folder": "ক্যাশে ফোল্ডার", + "export": "রপ্তানি", + "clear_cache": "ক্যাশে পরিষ্কার", + "clear_cache_confirmation": "আপনি কি ক্যাশে পরিষ্কার করতে চান?", + "export_cache_files": "ক্যাশে ফাইল রপ্তানি", + "found_n_files": "{count} টি ফাইল পাওয়া গেছে", + "export_cache_confirmation": "আপনি কি এই ফাইলগুলি রপ্তানি করতে চান", + "exported_n_out_of_m_files": "{filesExported} টি ফাইল রপ্তানি করা হয়েছে {files} এর মধ্যে" } \ No newline at end of file diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index 58805e62..aee39ffd 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -387,5 +387,19 @@ "total_money": "total {money}", "webview_not_found": "No s'ha trobat el Webview", "webview_not_found_description": "No hi ha cap temps d'execució de Webview instal·lat al dispositiu.\nSi està instal·lat, assegureu-vos que estigui en el environment PATH\n\nDesprés d'instal·lar-lo, reinicieu l'aplicació", - "unsupported_platform": "Plataforma no compatible" + "unsupported_platform": "Plataforma no compatible", + "invidious_instance": "Instància del servidor Invidious", + "invidious_description": "La instància del servidor Invidious per fer coincidir pistes", + "invidious_warning": "Algunes instàncies podrien no funcionar bé. Feu-les servir sota la vostra responsabilitat", + "invidious_source_description": "Similar a Piped però amb més disponibilitat", + "cache_music": "Música en caché", + "open": "Obrir", + "cache_folder": "Carpeta de caché", + "export": "Exportar", + "clear_cache": "Netejar caché", + "clear_cache_confirmation": "Voleu netejar la memòria cau?", + "export_cache_files": "Exportar arxius en caché", + "found_n_files": "S'han trobat {count} arxius", + "export_cache_confirmation": "Voleu exportar aquests arxius a", + "exported_n_out_of_m_files": "S'han exportat {filesExported} de {files} arxius" } \ No newline at end of file diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index 99ee0962..a40251c0 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -387,5 +387,19 @@ "total_money": "Celkem {money}", "webview_not_found": "Webview nebyl nalezen", "webview_not_found_description": "Na vašem zařízení není nainstalováno žádné runtime prostředí Webview.\nPokud je nainstalováno, ujistěte se, že je v environment PATH\n\nPo instalaci restartujte aplikaci", - "unsupported_platform": "Nepodporovaná platforma" + "unsupported_platform": "Nepodporovaná platforma", + "invidious_instance": "Instance serveru Invidious", + "invidious_description": "Instance serveru Invidious pro párování stop", + "invidious_warning": "Některé instance nemusí fungovat správně. Používejte na vlastní riziko", + "invidious_source_description": "Podobné Piped, ale s vyšší dostupností", + "cache_music": "Hudba v mezipaměti", + "open": "Otevřít", + "cache_folder": "Složka mezipaměti", + "export": "Exportovat", + "clear_cache": "Vymazat mezipaměť", + "clear_cache_confirmation": "Opravdu chcete vymazat mezipaměť?", + "export_cache_files": "Exportovat soubory z mezipaměti", + "found_n_files": "Nalezeno {count} souborů", + "export_cache_confirmation": "Chcete exportovat tyto soubory do", + "exported_n_out_of_m_files": "Exportováno {filesExported} z {files} souborů" } \ No newline at end of file diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 36da0b3e..76ec2218 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -387,5 +387,19 @@ "total_money": "Gesamt {money}", "webview_not_found": "Webview nicht gefunden", "webview_not_found_description": "Es ist keine Webview-Laufzeitumgebung auf Ihrem Gerät installiert.\nFalls installiert, stellen Sie sicher, dass es im environment PATH ist\n\nNach der Installation starten Sie die App neu", - "unsupported_platform": "Nicht unterstützte Plattform" + "unsupported_platform": "Nicht unterstützte Plattform", + "invidious_instance": "Invidious-Serverinstanz", + "invidious_description": "Die Invidious-Serverinstanz zur Titelerkennung", + "invidious_warning": "Einige Instanzen funktionieren möglicherweise nicht gut. Benutzung auf eigene Gefahr", + "invidious_source_description": "Ähnlich wie Piped, aber mit höherer Verfügbarkeit", + "cache_music": "Musik zwischenspeichern", + "open": "Öffnen", + "cache_folder": "Cache-Ordner", + "export": "Exportieren", + "clear_cache": "Cache leeren", + "clear_cache_confirmation": "Möchten Sie den Cache leeren?", + "export_cache_files": "Cachedateien exportieren", + "found_n_files": "{count} Dateien gefunden", + "export_cache_confirmation": "Möchten Sie diese Dateien exportieren nach", + "exported_n_out_of_m_files": "{filesExported} von {files} Dateien exportiert" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index d3c8b389..9fc7e560 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -387,5 +387,19 @@ "total_money": "Total {money}", "webview_not_found": "No se encontró el Webview", "webview_not_found_description": "No hay tiempo de ejecución de Webview instalado en su dispositivo.\nSi está instalado, asegúrese de que esté en el environment PATH\n\nDespués de instalar, reinicie la aplicación", - "unsupported_platform": "Plataforma no soportada" + "unsupported_platform": "Plataforma no soportada", + "invidious_instance": "Instancia del Servidor Invidious", + "invidious_description": "La instancia del servidor Invidious para identificar pistas", + "invidious_warning": "Algunas instancias podrían no funcionar bien. Úselas bajo su propio riesgo", + "invidious_source_description": "Similar a Piped, pero con mayor disponibilidad", + "cache_music": "Caché de música", + "open": "Abrir", + "cache_folder": "Carpeta de caché", + "export": "Exportar", + "clear_cache": "Limpiar caché", + "clear_cache_confirmation": "¿Desea limpiar la caché?", + "export_cache_files": "Exportar archivos en caché", + "found_n_files": "Se encontraron {count} archivos", + "export_cache_confirmation": "¿Desea exportar estos archivos a", + "exported_n_out_of_m_files": "Se exportaron {filesExported} de {files} archivos" } \ No newline at end of file diff --git a/lib/l10n/app_eu.arb b/lib/l10n/app_eu.arb index 36986804..98596725 100644 --- a/lib/l10n/app_eu.arb +++ b/lib/l10n/app_eu.arb @@ -387,5 +387,19 @@ "total_money": "Guztira {money}", "webview_not_found": "Ez da Webview aurkitu", "webview_not_found_description": "Ez dago Webview abiarazte denbora-instalaziorik zure gailuan.\nInstalatuta badago, ziurtatu environment PATH-an dagoela\n\nInstalatu ondoren, berrabiarazi aplikazioa", - "unsupported_platform": "Plataforma ez onartua" + "unsupported_platform": "Plataforma ez onartua", + "invidious_instance": "Invidious zerbitzari instantzia", + "invidious_description": "Invidious zerbitzari instantzia, pistak bat egiteko", + "invidious_warning": "Instantzia batzuek ez dute ondo funtzionatuko. Zure erantzukizunpean erabili", + "invidious_source_description": "Piped-en antzekoa, baina eskuragarritasun handiagoarekin", + "cache_music": "Musika cachean", + "open": "Ireki", + "cache_folder": "Cache karpeta", + "export": "Esportatu", + "clear_cache": "Garbitu cachea", + "clear_cache_confirmation": "Cachea garbitu nahi al duzu?", + "export_cache_files": "Esportatu cache fitxategiak", + "found_n_files": "{count} fitxategi aurkitu dira", + "export_cache_confirmation": "Fitxategi hauek esportatu nahi al dituzu", + "exported_n_out_of_m_files": "{filesExported} fitxategi esportatu dira {files} -tik" } \ No newline at end of file diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb index 47242a04..4d11dd81 100644 --- a/lib/l10n/app_fa.arb +++ b/lib/l10n/app_fa.arb @@ -387,5 +387,19 @@ "total_money": "مجموع {money}", "webview_not_found": "وب‌ویو پیدا نشد", "webview_not_found_description": "هیچ اجرای وب‌ویو روی دستگاه شما نصب نشده است.\nدر صورت نصب، مطمئن شوید که در environment PATH قرار دارد\n\nپس از نصب، برنامه را مجدداً راه‌اندازی کنید", - "unsupported_platform": "پلتفرم پشتیبانی نمی‌شود" + "unsupported_platform": "پلتفرم پشتیبانی نمی‌شود", + "invidious_instance": "نمونه سرور Invidious", + "invidious_description": "نمونه سرور Invidious برای تطبیق آهنگ", + "invidious_warning": "برخی از نمونه‌ها ممکن است به خوبی کار نکنند. با احتیاط استفاده کنید", + "invidious_source_description": "شبیه Piped اما با در دسترس بودن بیشتر", + "cache_music": "موسیقی در حافظه موقت", + "open": "باز کردن", + "cache_folder": "پوشه حافظه موقت", + "export": "صادر کردن", + "clear_cache": "پاک کردن حافظه موقت", + "clear_cache_confirmation": "آیا می‌خواهید حافظه موقت را پاک کنید؟", + "export_cache_files": "صادر کردن فایل‌های حافظه موقت", + "found_n_files": "{count} فایل یافت شد", + "export_cache_confirmation": "آیا می‌خواهید این فایل‌ها را صادر کنید به", + "exported_n_out_of_m_files": "{filesExported} از {files} فایل صادر شد" } \ No newline at end of file diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 53b948a6..f6794043 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -387,5 +387,19 @@ "total_money": "Yhteensä {money}", "webview_not_found": "Webview ei löydy", "webview_not_found_description": "Laitteellasi ei ole asennettua Webview-ajonaikaa.\nJos se on asennettu, varmista, että se on environment PATH:ssa\n\nAsennuksen jälkeen käynnistä sovellus uudelleen", - "unsupported_platform": "Ei tuettu alusta" + "unsupported_platform": "Ei tuettu alusta", + "invidious_instance": "Invidious-palvelinesiintymä", + "invidious_description": "Invidious-palvelinesiintymä raitojen yhteensovittamiseen", + "invidious_warning": "Jotkin esiintymät eivät välttämättä toimi hyvin. Käytä omalla vastuullasi", + "invidious_source_description": "Samankaltainen kuin Piped, mutta korkeammalla saatavuudella", + "cache_music": "Musiikki välimuistissa", + "open": "Avaa", + "cache_folder": "Välimuistikansio", + "export": "Vie", + "clear_cache": "Tyhjennä välimuisti", + "clear_cache_confirmation": "Haluatko tyhjentää välimuistin?", + "export_cache_files": "Vie välimuistitiedostot", + "found_n_files": "Löydettiin {count} tiedostoa", + "export_cache_confirmation": "Haluatko viedä nämä tiedostot", + "exported_n_out_of_m_files": "Vietiin {filesExported}/{files} tiedostoa" } \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 522a2af4..9062ada7 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -387,5 +387,19 @@ "total_money": "Total {money}", "webview_not_found": "Webview non trouvé", "webview_not_found_description": "Aucun environnement d'exécution Webview installé sur votre appareil.\nSi c'est installé, assurez-vous qu'il soit dans le environment PATH\n\nAprès l'installation, redémarrez l'application", - "unsupported_platform": "Plateforme non prise en charge" + "unsupported_platform": "Plateforme non prise en charge", + "invidious_instance": "Instance de serveur Invidious", + "invidious_description": "L'instance de serveur Invidious à utiliser pour la correspondance de pistes", + "invidious_warning": "Certaines instances pourraient ne pas bien fonctionner. À utiliser à vos risques et périls", + "invidious_source_description": "Similaire à Piped mais avec une meilleure disponibilité", + "cache_music": "Mettre la musique en cache", + "open": "Ouvrir", + "cache_folder": "Dossier du cache", + "export": "Exporter", + "clear_cache": "Effacer le cache", + "clear_cache_confirmation": "Voulez-vous effacer le cache ?", + "export_cache_files": "Exporter les fichiers en cache", + "found_n_files": "{count} fichiers trouvés", + "export_cache_confirmation": "Voulez-vous exporter ces fichiers vers", + "exported_n_out_of_m_files": "{filesExported} fichiers exportés sur {files}" } \ No newline at end of file diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index ce01aebe..7a1eae4e 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", "webview_not_found": "वेबव्यू नहीं मिला", "webview_not_found_description": "आपके डिवाइस पर वेबव्यू रनटाइम इंस्टॉल नहीं है।\nअगर इंस्टॉल है, तो सुनिश्चित करें कि यह environment PATH में है\n\nइंस्टॉल करने के बाद, ऐप को पुनः शुरू करें", - "unsupported_platform": "असमर्थित प्लेटफार्म" + "unsupported_platform": "असमर्थित प्लेटफार्म", + "invidious_instance": "इन्विडियस सर्वर इंस्टेंस", + "invidious_description": "ट्रैक मिलान के लिए इन्विडियस सर्वर इंस्टेंस", + "invidious_warning": "कुछ इंस्टेंस अच्छी तरह से काम नहीं कर सकते। अपने जोखिम पर उपयोग करें", + "invidious_source_description": "पाइप्ड के समान, लेकिन अधिक उपलब्धता के साथ", + "cache_music": "संगीत को कैश करें", + "open": "खोलें", + "cache_folder": "कैश फ़ोल्डर", + "export": "निर्यात करें", + "clear_cache": "कैश साफ़ करें", + "clear_cache_confirmation": "क्या आप कैश साफ़ करना चाहते हैं?", + "export_cache_files": "कैश फ़ाइलें निर्यात करें", + "found_n_files": "{count} फ़ाइलें मिलीं", + "export_cache_confirmation": "क्या आप इन फ़ाइलों को निर्यात करना चाहते हैं", + "exported_n_out_of_m_files": "{filesExported} फ़ाइलें निर्यात की गईं {files} में से" } \ No newline at end of file diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 121695f4..5e041dc0 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -387,5 +387,19 @@ "total_money": "Total {money}", "webview_not_found": "Webview tidak ditemukan", "webview_not_found_description": "Tidak ada runtime Webview yang diinstal di perangkat Anda.\nJika sudah diinstal, pastikan itu ada di environment PATH\n\nSetelah diinstal, restart aplikasi", - "unsupported_platform": "Platform tidak didukung" + "unsupported_platform": "Platform tidak didukung", + "invidious_instance": "Invidious Server Instance", + "invidious_description": "The Invidious server instance to use for track matching", + "invidious_warning": "Some of them might not work well. So use at your own risk", + "invidious_source_description": "Similar to Piped but with higher availability.", + "cache_music": "Cache music", + "open": "Open", + "cache_folder": "Cache folder", + "export": "Export", + "clear_cache": "Clear cache", + "clear_cache_confirmation": "Do you want to clear the cache?", + "export_cache_files": "Export Cached Files", + "found_n_files": "Found {count} files", + "export_cache_confirmation": "Do you want to export these files to", + "exported_n_out_of_m_files": "Exported {filesExported} out of {files} files" } \ No newline at end of file diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 3a2c57c3..c4954dd1 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -388,5 +388,19 @@ "total_money": "Totale {money}", "webview_not_found": "Webview non trovato", "webview_not_found_description": "Nessun runtime Webview installato nel tuo dispositivo.\nSe è installato, assicurati che sia nel environment PATH\n\nDopo l'installazione, riavvia l'app", - "unsupported_platform": "Piattaforma non supportata" + "unsupported_platform": "Piattaforma non supportata", + "invidious_instance": "Istanza del server Invidious", + "invidious_description": "L'istanza del server Invidious da utilizzare per il matching delle tracce", + "invidious_warning": "Alcuni potrebbero non funzionare bene. Usali a tuo rischio", + "invidious_source_description": "Simile a Piped ma con maggiore disponibilità.", + "cache_music": "Cache musica", + "open": "Apri", + "cache_folder": "Cartella cache", + "export": "Esporta", + "clear_cache": "Cancella cache", + "clear_cache_confirmation": "Vuoi cancellare la cache?", + "export_cache_files": "Esporta file nella cache", + "found_n_files": "Trovati {count} file", + "export_cache_confirmation": "Vuoi esportare questi file su", + "exported_n_out_of_m_files": "Esportati {filesExported} su {files} file" } \ No newline at end of file diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index ed779478..4f299025 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*これは、Spotifyのストリームごとの支払い\nが $0.003 から $0.005 の範囲で計算されています。これは仮想的な\n計算で、Spotify で曲を聴いた場合に、アーティストに\nどれくらい支払ったかをユーザーに示すためのものです。", "webview_not_found": "Webviewが見つかりません", "webview_not_found_description": "デバイスにWebviewランタイムがインストールされていません。\nインストールされている場合は、environment PATHにあることを確認してください\n\nインストール後、アプリを再起動してください", - "unsupported_platform": "サポートされていないプラットフォーム" + "unsupported_platform": "サポートされていないプラットフォーム", + "invidious_instance": "Invidiousサーバーインスタンス", + "invidious_description": "トラックマッチングに使用するInvidiousサーバーインスタンス", + "invidious_warning": "一部はうまく機能しない可能性があります。自己責任で使用してください", + "invidious_source_description": "Pipedに似ていますが、より高い可用性があります。", + "cache_music": "音楽をキャッシュ", + "open": "開く", + "cache_folder": "キャッシュフォルダー", + "export": "エクスポート", + "clear_cache": "キャッシュをクリア", + "clear_cache_confirmation": "キャッシュをクリアしますか?", + "export_cache_files": "キャッシュされたファイルをエクスポート", + "found_n_files": "{count}ファイルが見つかりました", + "export_cache_confirmation": "これらのファイルをエクスポートしますか", + "exported_n_out_of_m_files": "{filesExported} / {files}ファイルがエクスポートされました" } \ No newline at end of file diff --git a/lib/l10n/app_ka.arb b/lib/l10n/app_ka.arb index 888dbb6f..3bcd0748 100644 --- a/lib/l10n/app_ka.arb +++ b/lib/l10n/app_ka.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*ეს გამოითვლება Spotify-ის თითოეულ სტრიმზე\nგადახდის შესაბამისად, რომელიც $0.003 დან $0.005-მდეა. ეს არის ჰიპოთეტური\nგამოთვლა, რომელიც აჩვენებს მომხმარებელს რამდენი გადაიხდიდა\nარტისტებს, თუკი ისინი უსმენდნენ მათ სიმღერებს Spotify-ზე.", "webview_not_found": "ვებვიუ ვერ მოიძებნა", "webview_not_found_description": "თქვენს მოწყობილობაზე ვებვიუის შესრულების დრო არ არის დაყენებული.\nთუ დაყენებულია, დარწმუნდით, რომ ის environment PATH-შია\n\nდაყენების შემდეგ, გადატვირთეთ აპი", - "unsupported_platform": "მოუხერხებელი პლატფორმა" + "unsupported_platform": "მოუხერხებელი პლატფორმა", + "invidious_instance": "Invidious სერვერის ინსტანცია", + "invidious_description": "Invidious სერვერის ინსტანცია, რომელიც გამოიყენება ტრეკის შესატყვისად", + "invidious_warning": "ზოგიერთი შეიძლება კარგად არ მუშაობდეს. გამოიყენეთ თქვენს პასუხისმგებლობაზე", + "invidious_source_description": "მსგავსია Piped-ის, მაგრამ მაღალი ხელმისაწვდომობით.", + "cache_music": "მუსიკის ქეში", + "open": "გახსენით", + "cache_folder": "ქეშის საქაღალდე", + "export": "ექსპორტი", + "clear_cache": "ქეშის გასუფთავება", + "clear_cache_confirmation": "გსურთ ქეშის გასუფთავება?", + "export_cache_files": "ქეშირებული ფაილების ექსპორტი", + "found_n_files": "ნაპოვნია {count} ფაილი", + "export_cache_confirmation": "გსურთ ამ ფაილების ექსპორტი", + "exported_n_out_of_m_files": "{filesExported} ფაილი {files}-დან ექსპორტირებულია" } \ No newline at end of file diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index a71b59ae..7e368081 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -388,5 +388,19 @@ "spotify_hipotetical_calculation": "*Spotify의 스트림당 지불금 $0.003에서 $0.005까지의\n기준으로 계산되었습니다. 이는 사용자가 Spotify에서\n곡을 들을 때 아티스트에게 얼마를 지불했을지를\n알려주기 위한 가상의 계산입니다.", "webview_not_found": "웹뷰를 찾을 수 없음", "webview_not_found_description": "기기에 웹뷰 런타임이 설치되지 않았습니다.\n설치되어 있으면 environment PATH에 있는지 확인하십시오\n\n설치 후 앱을 다시 시작하세요", - "unsupported_platform": "지원되지 않는 플랫폼" + "unsupported_platform": "지원되지 않는 플랫폼", + "invidious_instance": "Invidious 서버 인스턴스", + "invidious_description": "트랙 매칭에 사용할 Invidious 서버 인스턴스", + "invidious_warning": "일부는 제대로 작동하지 않을 수 있습니다. 자신의 책임 하에 사용하세요", + "invidious_source_description": "Piped와 비슷하지만 가용성이 높습니다.", + "cache_music": "음악 캐시", + "open": "열기", + "cache_folder": "캐시 폴더", + "export": "내보내기", + "clear_cache": "캐시 지우기", + "clear_cache_confirmation": "캐시를 지우시겠습니까?", + "export_cache_files": "캐시된 파일 내보내기", + "found_n_files": "{count}개의 파일을 찾았습니다", + "export_cache_confirmation": "이 파일들을 내보내시겠습니까", + "exported_n_out_of_m_files": "{files}개 중 {filesExported}개 파일을 내보냈습니다" } \ No newline at end of file diff --git a/lib/l10n/app_ne.arb b/lib/l10n/app_ne.arb index 9bcfebad..77eea7d0 100644 --- a/lib/l10n/app_ne.arb +++ b/lib/l10n/app_ne.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", "webview_not_found": "वेबभ्यू फेला परेन", "webview_not_found_description": "तपाईंको उपकरणमा कुनै वेबभ्यू रनटाइम स्थापना गरिएको छैन।\nयदि स्थापना गरिएको छ भने, environment PATH मा छ कि छैन भनेर सुनिश्चित गर्नुहोस्\n\nस्थापना पछि, अनुप्रयोग पुनः सुरु गर्नुहोस्", - "unsupported_platform": "असमर्थित प्लेटफार्म" + "unsupported_platform": "असमर्थित प्लेटफार्म", + "invidious_instance": "Invidious सर्भर इन्स्टेन्स", + "invidious_description": "ट्र्याक मिलाउनका लागि प्रयोग हुने Invidious सर्भर इन्स्टेन्स", + "invidious_warning": "केहीले राम्रोसँग काम नगर्न सक्छ। आफ्नो जोखिममा प्रयोग गर्नुहोस्", + "invidious_source_description": "Piped जस्तै तर उच्च उपलब्धतासँग।", + "cache_music": "सङ्गीत क्यास गर्नुहोस्", + "open": "खोल्नुहोस्", + "cache_folder": "क्यास फोल्डर", + "export": "निर्यात गर्नुहोस्", + "clear_cache": "क्यास खाली गर्नुहोस्", + "clear_cache_confirmation": "के तपाई क्यास खाली गर्न चाहनुहुन्छ?", + "export_cache_files": "क्यास फाइलहरू निर्यात गर्नुहोस्", + "found_n_files": "{count} फाइलहरू फेला परे", + "export_cache_confirmation": "यी फाइलहरू निर्यात गर्न चाहनुहुन्छ", + "exported_n_out_of_m_files": "{filesExported} मध्ये {files} फाइलहरू निर्यात गरियो" } \ No newline at end of file diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 93ab02a1..50b5e3bd 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -388,5 +388,19 @@ "spotify_hipotetical_calculation": "*Dit is berekend op basis van Spotify's betaling per stream\nvan $0.003 tot $0.005. Dit is een hypothetische\nberekening om de gebruiker inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun liedjes op Spotify\nzouden luisteren.", "webview_not_found": "Webview niet gevonden", "webview_not_found_description": "Er is geen Webview-runtime geïnstalleerd op uw apparaat.\nAls het is geïnstalleerd, zorg ervoor dat het in het environment PATH staat\n\nHerstart de app na installatie", - "unsupported_platform": "Niet ondersteund platform" + "unsupported_platform": "Niet ondersteund platform", + "invidious_instance": "Invidious-serverinstantie", + "invidious_description": "De Invidious-serverinstantie die gebruikt wordt voor trackmatching", + "invidious_warning": "Sommigen werken mogelijk niet goed. Gebruik op eigen risico", + "invidious_source_description": "Vergelijkbaar met Piped, maar met een hogere beschikbaarheid.", + "cache_music": "Cache muziek", + "open": "Open", + "cache_folder": "Cachemap", + "export": "Exporteren", + "clear_cache": "Cache wissen", + "clear_cache_confirmation": "Wilt u de cache wissen?", + "export_cache_files": "Gecacheerde bestanden exporteren", + "found_n_files": "{count} bestanden gevonden", + "export_cache_confirmation": "Wilt u deze bestanden exporteren naar", + "exported_n_out_of_m_files": "{filesExported} van de {files} bestanden geëxporteerd" } \ No newline at end of file diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index c003ef08..11ab51ce 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Obliczone na podstawie płatności Spotify za strumień\nw zakresie od $0.003 do $0.005. Jest to hipotetyczne\nobliczenie mające na celu pokazanie użytkownikowi, ile\nzapłaciliby artystom, gdyby słuchali ich utworów na Spotify.", "webview_not_found": "Nie znaleziono Webview", "webview_not_found_description": "Na twoim urządzeniu nie zainstalowano środowiska uruchomieniowego Webview.\nJeśli jest zainstalowany, upewnij się, że jest w environment PATH\n\nPo instalacji uruchom ponownie aplikację", - "unsupported_platform": "Nieobsługiwana platforma" + "unsupported_platform": "Nieobsługiwana platforma", + "invidious_instance": "Instancja serwera Invidious", + "invidious_description": "Instancja serwera Invidious do dopasowywania utworów", + "invidious_warning": "Niektóre z nich mogą nie działać dobrze. Używaj na własne ryzyko", + "invidious_source_description": "Podobne do Piped, ale o wyższej dostępności.", + "cache_music": "Pamięć podręczna muzyki", + "open": "Otwórz", + "cache_folder": "Folder pamięci podręcznej", + "export": "Eksportuj", + "clear_cache": "Wyczyść pamięć podręczną", + "clear_cache_confirmation": "Czy chcesz wyczyścić pamięć podręczną?", + "export_cache_files": "Eksportuj pliki z pamięci podręcznej", + "found_n_files": "Znaleziono {count} plików", + "export_cache_confirmation": "Czy chcesz wyeksportować te pliki do", + "exported_n_out_of_m_files": "Wyeksportowano {filesExported} z {files} plików" } \ No newline at end of file diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 02772b1e..72841eab 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Isso é calculado com base no pagamento por stream do Spotify\nque varia de $0.003 a $0.005. Esta é uma cálculo hipotético\npara dar ao usuário uma visão de quanto teriam pago aos artistas\nse eles ouvissem suas músicas no Spotify.", "webview_not_found": "Webview não encontrado", "webview_not_found_description": "Nenhum runtime Webview está instalado no seu dispositivo.\nSe estiver instalado, certifique-se de que está no environment PATH\n\nApós a instalação, reinicie o aplicativo", - "unsupported_platform": "Plataforma não suportada" + "unsupported_platform": "Plataforma não suportada", + "invidious_instance": "Instância do Servidor Invidious", + "invidious_description": "A instância do servidor Invidious a ser usada para correspondência de faixas", + "invidious_warning": "Alguns podem não funcionar bem. Use por sua conta e risco", + "invidious_source_description": "Semelhante ao Piped, mas com maior disponibilidade.", + "cache_music": "Música em cache", + "open": "Abrir", + "cache_folder": "Pasta de cache", + "export": "Exportar", + "clear_cache": "Limpar cache", + "clear_cache_confirmation": "Deseja limpar o cache?", + "export_cache_files": "Exportar Arquivos em Cache", + "found_n_files": "Encontrados {count} arquivos", + "export_cache_confirmation": "Deseja exportar estes arquivos para", + "exported_n_out_of_m_files": "Exportados {filesExported} de {files} arquivos" } \ No newline at end of file diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 189e644f..6be53ba9 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Это рассчитано на основе выплат Spotify за стрим\nот $0.003 до $0.005. Это гипотетический расчет,\nчтобы дать пользователю представление о том, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.", "webview_not_found": "Webview не найден", "webview_not_found_description": "На вашем устройстве не установлена среда выполнения Webview.\nЕсли он установлен, убедитесь, что он находится в environment PATH\n\nПосле установки перезапустите приложение", - "unsupported_platform": "Платформа не поддерживается" + "unsupported_platform": "Платформа не поддерживается", + "invidious_instance": "Экземпляр сервера Invidious", + "invidious_description": "Экземпляр сервера Invidious для сопоставления треков", + "invidious_warning": "Некоторые могут работать не очень хорошо. Используйте на свой страх и риск", + "invidious_source_description": "Похож на Piped, но с более высокой доступностью.", + "cache_music": "Кэшировать музыку", + "open": "Открыть", + "cache_folder": "Папка кэша", + "export": "Экспорт", + "clear_cache": "Очистить кэш", + "clear_cache_confirmation": "Вы хотите очистить кэш?", + "export_cache_files": "Экспортировать кэшированные файлы", + "found_n_files": "Найдено {count} файлов", + "export_cache_confirmation": "Вы хотите экспортировать эти файлы в", + "exported_n_out_of_m_files": "Экспортировано {filesExported} из {files} файлов" } \ No newline at end of file diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 27c05a5d..1b72f1a3 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -388,5 +388,19 @@ "spotify_hipotetical_calculation": "*คำนวณตามการจ่ายต่อสตรีมของ Spotify\nซึ่งอยู่ในช่วง $0.003 ถึง $0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ผู้ใช้ทราบว่าพวกเขาจะจ่ายเงินให้ศิลปินเท่าไหร่\nหากพวกเขาฟังเพลงของพวกเขาใน Spotify.", "webview_not_found": "ไม่พบ Webview", "webview_not_found_description": "ไม่พบ runtime ของ Webview บนอุปกรณ์ของคุณ\nหากติดตั้งแล้วตรวจสอบให้แน่ใจว่าอยู่ใน environment PATH\n\nหลังจากติดตั้งแล้ว ให้รีสตาร์ทแอป", - "unsupported_platform": "แพลตฟอร์มไม่รองรับ" + "unsupported_platform": "แพลตฟอร์มไม่รองรับ", + "invidious_instance": "อินสแตนซ์เซิร์ฟเวอร์ Invidious", + "invidious_description": "อินสแตนซ์เซิร์ฟเวอร์ Invidious ที่ใช้สำหรับการจับคู่เพลง", + "invidious_warning": "บางอันอาจใช้งานไม่ดี ใช้ด้วยความเสี่ยงของคุณเอง", + "invidious_source_description": "คล้ายกับ Piped แต่มีความพร้อมใช้งานสูงกว่า", + "cache_music": "แคชเพลง", + "open": "เปิด", + "cache_folder": "โฟลเดอร์แคช", + "export": "ส่งออก", + "clear_cache": "ล้างแคช", + "clear_cache_confirmation": "คุณต้องการล้างแคชหรือไม่?", + "export_cache_files": "ส่งออกไฟล์แคช", + "found_n_files": "พบ {count} ไฟล์", + "export_cache_confirmation": "คุณต้องการส่งออกไฟล์เหล่านี้ไปยัง", + "exported_n_out_of_m_files": "ส่งออก {filesExported} จาก {files} ไฟล์" } \ No newline at end of file diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 230f14e8..7f2bf5fb 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Bu, Spotify'ın her yayın başına ödemenin\n$0.003 ile $0.005 arasında olduğu varsayımıyla hesaplanmıştır. Bu\nhipotetik bir hesaplamadır, kullanıcıya şarkılarını Spotify'da dinlediklerinde\nsanatçılara ne kadar ödeme yapacaklarını gösterir.", "webview_not_found": "Webview bulunamadı", "webview_not_found_description": "Cihazınızda herhangi bir Webview çalışma zamanı yüklü değil.\nEğer kuruluysa, ortam YOLUNDA olduğundan emin olun\n\nKurulumdan sonra uygulamayı yeniden başlatın", - "unsupported_platform": "Desteklenmeyen platform" + "unsupported_platform": "Desteklenmeyen platform", + "invidious_instance": "Invidious Sunucu Örneği", + "invidious_description": "Parça eşleştirmesi için kullanılacak Invidious sunucu örneği", + "invidious_warning": "Bazıları iyi çalışmayabilir. Kendi riskinizde kullanın", + "invidious_source_description": "Piped'a benzer, ancak daha yüksek kullanılabilirliğe sahip.", + "cache_music": "Müziği önbellekle", + "open": "Aç", + "cache_folder": "Önbellek klasörü", + "export": "Dışa aktar", + "clear_cache": "Önbelleği temizle", + "clear_cache_confirmation": "Önbelleği temizlemek istiyor musunuz?", + "export_cache_files": "Önbelleğe Alınmış Dosyaları Dışa Aktar", + "found_n_files": "{count} dosya bulundu", + "export_cache_confirmation": "Bu dosyaları dışa aktarmak istiyor musunuz", + "exported_n_out_of_m_files": "{filesExported} / {files} dosya dışa aktarıldı" } \ No newline at end of file diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 0c65f756..245c87e1 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Це розраховано на основі виплат Spotify за стрім\nвід $0.003 до $0.005. Це гіпотетичний розрахунок,\nщоб дати користувачеві уявлення про те, скільки б він заплатив\nартистам, якби слухав їхні пісні на Spotify.", "webview_not_found": "Webview не знайдено", "webview_not_found_description": "На вашому пристрої не встановлено виконуване середовище Webview.\nЯкщо воно встановлено, переконайтеся, що воно знаходиться в environment PATH\n\nПісля встановлення перезапустіть програму", - "unsupported_platform": "Непідтримувана платформа" + "unsupported_platform": "Непідтримувана платформа", + "invidious_instance": "Екземпляр сервера Invidious", + "invidious_description": "Екземпляр сервера Invidious для зіставлення треків", + "invidious_warning": "Деякі можуть працювати не дуже добре. Використовуйте на власний ризик", + "invidious_source_description": "Подібний до Piped, але з вищою доступністю.", + "cache_music": "Кешувати музику", + "open": "Відкрити", + "cache_folder": "Тека кешу", + "export": "Експорт", + "clear_cache": "Очистити кеш", + "clear_cache_confirmation": "Ви хочете очистити кеш?", + "export_cache_files": "Експортувати кешовані файли", + "found_n_files": "Знайдено {count} файлів", + "export_cache_confirmation": "Ви хочете експортувати ці файли до", + "exported_n_out_of_m_files": "Експортовано {filesExported} з {files} файлів" } \ No newline at end of file diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb index 75dc1532..37f7f709 100644 --- a/lib/l10n/app_vi.arb +++ b/lib/l10n/app_vi.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*Được tính toán dựa trên khoản thanh toán của Spotify cho mỗi lượt phát\ntừ $0.003 đến $0.005. Đây là một tính toán giả định để\ncung cấp cho người dùng cái nhìn về số tiền họ sẽ phải trả\ncho các nghệ sĩ nếu họ nghe bài hát của họ trên Spotify.", "webview_not_found": "Không tìm thấy Webview", "webview_not_found_description": "Không có runtime Webview nào được cài đặt trên thiết bị của bạn.\nNếu đã cài đặt, hãy đảm bảo rằng nó nằm trong environment PATH\n\nSau khi cài đặt, hãy khởi động lại ứng dụng", - "unsupported_platform": "Nền tảng không được hỗ trợ" + "unsupported_platform": "Nền tảng không được hỗ trợ", + "invidious_instance": "Phiên bản máy chủ Invidious", + "invidious_description": "Phiên bản máy chủ Invidious để sử dụng để so khớp bản nhạc", + "invidious_warning": "Một số có thể sẽ không hoạt động tốt. Vì vậy hãy sử dụng với rủi ro của riêng bạn", + "invidious_source_description": "Tương tự như Piped nhưng có tính khả dụng cao hơn.", + "cache_music": "Lưu nhạc vào bộ nhớ đệm", + "open": "Mở", + "cache_folder": "Thư mục bộ nhớ đệm", + "export": "Xuất", + "clear_cache": "Xóa bộ nhớ đệm", + "clear_cache_confirmation": "Bạn có muốn xóa bộ nhớ đệm không?", + "export_cache_files": "Xuất các tệp được lưu trong bộ nhớ đệm", + "found_n_files": "Tìm thấy {count} tệp", + "export_cache_confirmation": "Bạn có muốn xuất các tệp này đến", + "exported_n_out_of_m_files": "Đã xuất {filesExported} trên {files} tệp" } \ No newline at end of file diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index c9bf35df..dc2920ed 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -387,5 +387,19 @@ "spotify_hipotetical_calculation": "*根据 Spotify 每次流媒体的支付金额\n$0.003 到 $0.005 进行计算。这是一个假设性的\n计算,用于给用户了解他们如果在 Spotify 上\n收听歌曲会支付给艺术家的金额。", "webview_not_found": "未找到 Webview", "webview_not_found_description": "您的设备中未安装 Webview 运行时。\n如果已安装,请确保它在 environment PATH 中\n\n安装后,重新启动应用程序", - "unsupported_platform": "不支持的平台" + "unsupported_platform": "不支持的平台", + "invidious_instance": "Invidious服务器实例", + "invidious_description": "用于音轨匹配的Invidious服务器实例", + "invidious_warning": "有些可能无法正常工作。请自行承担风险", + "invidious_source_description": "类似于Piped,但可用性更高。", + "cache_music": "缓存音乐", + "open": "打开", + "cache_folder": "缓存文件夹", + "export": "导出", + "clear_cache": "清除缓存", + "clear_cache_confirmation": "您要清除缓存吗?", + "export_cache_files": "导出缓存文件", + "found_n_files": "找到 {count} 个文件", + "export_cache_confirmation": "您要导出这些文件到", + "exported_n_out_of_m_files": "导出了 {filesExported} / {files} 个文件" } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index fd9c3961..b7d41ce0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1847,10 +1847,10 @@ packages: dependency: "direct dev" description: name: pub_api_client - sha256: "06321793e558b2dfac3a11098a530b816a8f752a5cf9208a382be9a418e3f5fc" + sha256: d9ced27bb5b933012a5218120f1fbee2a7d3bd234a7d5cc6fe29dedf4df6127a url: "https://pub.dev" source: hosted - version: "2.7.1" + version: "3.0.0" pub_semver: dependency: transitive description: @@ -1859,14 +1859,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - pubspec: - dependency: transitive - description: - name: pubspec - sha256: f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e - url: "https://pub.dev" - source: hosted - version: "2.3.0" pubspec_parse: dependency: "direct dev" description: @@ -1875,14 +1867,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - quiver: - dependency: transitive - description: - name: quiver - sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.dev" - source: hosted - version: "3.2.2" recase: dependency: transitive description: @@ -2449,14 +2433,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - uri: - dependency: transitive - description: - name: uri - sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" - url: "https://pub.dev" - source: hosted - version: "1.0.0" uri_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4551f956..b192ee5e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Open source Spotify client that doesn't require Premium nor uses El publish_to: "none" -version: 3.8.3+37 +version: 3.9.0+38 homepage: https://spotube.krtirtho.dev repository: https://github.com/KRTirtho/spotube @@ -145,7 +145,7 @@ dev_dependencies: riverpod_lint: ^2.6.3 process_run: ^0.14.2 pubspec_parse: ^1.3.0 - pub_api_client: ^2.7.0 + pub_api_client: ^3.0.0 xml: ^6.5.0 io: ^1.0.4 drift_dev: ^2.21.0 @@ -163,20 +163,6 @@ flutter: - assets/logos/ - LICENSE -flutter_launcher_icons: - ios: true - android: true - image_path: "assets/spotube-logo.png" - adaptive_icon_foreground: "assets/spotube-logo-foreground.jpg" - adaptive_icon_background: "#242832" - windows: - generate: true - image_path: "assets/spotube-logo.png" - icon_size: 48 # min:48, max:256, default: 48 - macos: - generate: true - image_path: "assets/spotube-logo.png" - flutter_gen: output: lib/collections diff --git a/untranslated_messages.json b/untranslated_messages.json index 9cbff978..9e26dfee 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -1,443 +1 @@ -{ - "ar": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "bn": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ca": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "cs": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "de": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "es": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "eu": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "fa": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "fi": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "fr": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "hi": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "id": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "it": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ja": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ka": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ko": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ne": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "nl": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "pl": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "pt": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "ru": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "th": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "tr": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "uk": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "vi": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ], - - "zh": [ - "invidious_instance", - "invidious_description", - "invidious_warning", - "invidious_source_description", - "cache_music", - "open", - "cache_folder", - "export", - "clear_cache", - "clear_cache_confirmation", - "export_cache_files", - "found_n_files", - "export_cache_confirmation", - "exported_n_out_of_m_files" - ] -} +{} \ No newline at end of file From b32ec667a9a1f39bba1b3ca21f81e4e55c686a0f Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 8 Dec 2024 23:56:58 +0600 Subject: [PATCH 10/11] chore: add iOS IPA download section --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 1532e3a8..deeba646 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,19 @@ This handy table lists all the methods you can use to install Spotube: + + + iOS + + + Download iOS IPA + +
+
+ *iPA file only. Requires sideloading with AltStore or similar tools. +
+ + Flatpak From 12f3ec1776934326553280ac9a03f9f9d279ff1b Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 13 Dec 2024 00:17:19 +0600 Subject: [PATCH 11/11] downgrade: chose the path of ads --- website/package.json | 1 + website/pnpm-lock.yaml | 95 +++++++++++++++ website/posts/images/.gitkeep | 0 website/posts/spotube-basics.md | 1 + website/src/app.d.ts | 8 +- website/src/app.html | 3 + website/src/lib/components/ads/ads.svelte | 32 +++++ .../components/navbar/darkmode-toggle.svelte | 4 +- website/src/lib/index.ts | 115 ++++++++++++------ website/src/lib/posts.ts | 21 ++-- website/src/routes/+page.svelte | 5 + website/src/routes/blog/+page.svelte | 75 +++++++++--- website/src/routes/blog/+page.ts | 7 +- website/src/routes/blog/[slug]/+page.svelte | 26 ++-- website/src/routes/downloads/+page.svelte | 8 +- .../src/routes/downloads/packages/+page.svx | 18 +++ .../posts/images/spotube-basics/cover.jpg | Bin 0 -> 209177 bytes website/svelte.config.js | 20 +++ 18 files changed, 356 insertions(+), 83 deletions(-) delete mode 100644 website/posts/images/.gitkeep create mode 100644 website/src/lib/components/ads/ads.svelte create mode 100644 website/static/posts/images/spotube-basics/cover.jpg diff --git a/website/package.json b/website/package.json index acb9f507..b8095342 100644 --- a/website/package.json +++ b/website/package.json @@ -50,6 +50,7 @@ "highlight.js": "11.9.0", "lucide-svelte": "^0.323.0", "mdsvex-relative-images": "^1.0.3", + "rehype-auto-ads": "^1.2.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "remark-container": "^0.1.2", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index d2e9f5fe..7fa6b46c 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: mdsvex-relative-images: specifier: ^1.0.3 version: 1.0.3 + rehype-auto-ads: + specifier: ^1.2.0 + version: 1.2.0 rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -783,6 +786,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -873,6 +879,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -1069,15 +1079,27 @@ packages: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.2: + resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + highlight.js@11.9.0: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} @@ -1467,6 +1489,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1609,6 +1634,9 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1634,6 +1662,9 @@ packages: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} + rehype-auto-ads@1.2.0: + resolution: {integrity: sha512-w0ysjJQginhKai13wcUF/4t1fu3UvPsVt4Y3htGGGs6ojA+J5Nz01I1NOqwrOhgSoT5Bfv7Mihww6tmtV108+g==} + rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} @@ -1960,6 +1991,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} @@ -2016,6 +2050,9 @@ packages: vite: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2660,6 +2697,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} commander@4.1.1: {} @@ -2725,6 +2764,8 @@ snapshots: emoji-regex@9.2.2: {} + entities@4.5.0: {} + es6-promise@3.3.1: {} esbuild@0.19.12: @@ -2982,6 +3023,26 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.1 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -2990,10 +3051,22 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@9.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + highlight.js@11.9.0: {} ignore@5.3.1: {} @@ -3510,6 +3583,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -3617,6 +3694,8 @@ snapshots: prismjs@1.29.0: {} + property-information@6.5.0: {} + punycode@2.3.1: {} purgecss@6.0.0-alpha.0: @@ -3640,6 +3719,15 @@ snapshots: regexparam@3.0.0: {} + rehype-auto-ads@1.2.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + hast-util-is-element: 3.0.0 + unified: 11.0.4 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -4072,6 +4160,11 @@ snapshots: util-deprecate@1.0.2: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.10 @@ -4119,6 +4212,8 @@ snapshots: optionalDependencies: vite: 5.1.0(@types/node@20.11.16) + web-namespaces@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 diff --git a/website/posts/images/.gitkeep b/website/posts/images/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/website/posts/spotube-basics.md b/website/posts/spotube-basics.md index 841fbac9..43a33d67 100644 --- a/website/posts/spotube-basics.md +++ b/website/posts/spotube-basics.md @@ -3,6 +3,7 @@ title: Spotube Basics author: Kingkor Roy Tirtho date: 2024-02-10 published: true +cover_img: /images/spotube-basics/cover.jpg --- Spotube is an open-source Spotify client that allows users to stream music from Spotify. To use Spotube, you need to sign in with your Spotify account. Here's a step-by-step guide on how to sign in to Spotube. diff --git a/website/src/app.d.ts b/website/src/app.d.ts index c627dc68..c2f2a735 100644 --- a/website/src/app.d.ts +++ b/website/src/app.d.ts @@ -17,6 +17,10 @@ declare namespace App { } } -declare module '@fortawesome/pro-solid-svg-icons/index.es' { - export * from '@fortawesome/pro-solid-svg-icons'; +declare namespace globalThis { + declare var adsbygoogle: any[]; +} + +declare module "@fortawesome/pro-solid-svg-icons/index.es" { + export * from "@fortawesome/pro-solid-svg-icons"; } diff --git a/website/src/app.html b/website/src/app.html index 088ddd5d..470db728 100644 --- a/website/src/app.html +++ b/website/src/app.html @@ -13,6 +13,9 @@ + + %sveltekit.head% diff --git a/website/src/lib/components/ads/ads.svelte b/website/src/lib/components/ads/ads.svelte new file mode 100644 index 00000000..54cfc2c0 --- /dev/null +++ b/website/src/lib/components/ads/ads.svelte @@ -0,0 +1,32 @@ + + + diff --git a/website/src/lib/components/navbar/darkmode-toggle.svelte b/website/src/lib/components/navbar/darkmode-toggle.svelte index ec4f757c..d05622f9 100644 --- a/website/src/lib/components/navbar/darkmode-toggle.svelte +++ b/website/src/lib/components/navbar/darkmode-toggle.svelte @@ -17,10 +17,8 @@
- {#if label} - - {/if} = { - '/': ['Home', Home], - '/blog': ['Blog', Newspaper], - '/downloads': ['Downloads', Download], - '/about': ['About', null] + "/": ["Home", Home], + "/blog": ["Blog", Newspaper], + "/downloads": ["Downloads", Download], + "/about": ["About", null], }; -const releasesUrl = 'https://github.com/KRTirtho/Spotube/releases/latest/download'; +const releasesUrl = + "https://github.com/KRTirtho/Spotube/releases/latest/download"; export const downloadLinks: Record = { - 'Android Apk': [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid]], - 'Windows Executable': [`${releasesUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows]], - 'macOS Dmg': [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple]], - 'Ubuntu, Debian': [`${releasesUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian]], - 'Fedora, Redhat, Opensuse': [ - `${releasesUrl}/Spotube-linux-x86_64.rpm`, - [faFedora, faRedhat, faOpensuse] + "Android Apk": [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid]], + "Windows Executable": [ + `${releasesUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], ], - 'iPhone Ipa': [`${releasesUrl}/Spotube-iOS.ipa`, [faApple]] -}; - -export const extendedDownloadLinks: Record = { - Android: [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid], 'apk'], - Windows: [`${releasesUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows], 'exe'], - macOS: [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple], 'dmg'], - 'Ubuntu, Debian': [`${releasesUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian], 'deb'], - 'Fedora, Redhat, Opensuse': [ + "macOS Dmg": [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple]], + "Ubuntu, Debian": [ + `${releasesUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + ], + "Fedora, Redhat, Opensuse": [ `${releasesUrl}/Spotube-linux-x86_64.rpm`, [faFedora, faRedhat, faOpensuse], - 'rpm' ], - iPhone: [`${releasesUrl}/Spotube-iOS.ipa`, [faApple], 'ipa'] + "iPhone Ipa": [`${releasesUrl}/Spotube-iOS.ipa`, [faApple]], }; -const nightlyReleaseUrl = 'https://github.com/KRTirtho/Spotube/releases/download/nightly'; +export const extendedDownloadLinks: Record< + string, + [string, IconDefinition[], string] +> = { + Android: [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid], "apk"], + Windows: [ + `${releasesUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], + "exe", + ], + macOS: [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple], "dmg"], + "Ubuntu, Debian": [ + `${releasesUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + "deb", + ], + "Fedora, Redhat, Opensuse": [ + `${releasesUrl}/Spotube-linux-x86_64.rpm`, + [faFedora, faRedhat, faOpensuse], + "rpm", + ], + iPhone: [`${releasesUrl}/Spotube-iOS.ipa`, [faApple], "ipa"], +}; -export const extendedNightlyDownloadLinks: Record = { - Android: [`${nightlyReleaseUrl}/Spotube-android-all-arch.apk`, [faAndroid], 'apk'], - Windows: [`${nightlyReleaseUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows], 'exe'], - macOS: [`${nightlyReleaseUrl}/Spotube-macos-universal.dmg`, [faApple], 'dmg'], - 'Ubuntu, Debian': [`${nightlyReleaseUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian], 'deb'], - 'Fedora, Redhat, Opensuse': [ +const nightlyReleaseUrl = + "https://github.com/KRTirtho/Spotube/releases/download/nightly"; + +export const extendedNightlyDownloadLinks: Record< + string, + [string, IconDefinition[], string] +> = { + Android: [ + `${nightlyReleaseUrl}/Spotube-android-all-arch.apk`, + [faAndroid], + "apk", + ], + Windows: [ + `${nightlyReleaseUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], + "exe", + ], + macOS: [`${nightlyReleaseUrl}/Spotube-macos-universal.dmg`, [faApple], "dmg"], + "Ubuntu, Debian": [ + `${nightlyReleaseUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + "deb", + ], + "Fedora, Redhat, Opensuse": [ `${nightlyReleaseUrl}/Spotube-linux-x86_64.rpm`, [faFedora, faRedhat, faOpensuse], - 'rpm' + "rpm", ], - iPhone: [`${nightlyReleaseUrl}/Spotube-iOS.ipa`, [faApple], 'ipa'] + iPhone: [`${nightlyReleaseUrl}/Spotube-iOS.ipa`, [faApple], "ipa"], }; + +export const ADS_SLOTS = Object.freeze({ + rootPageDisplay: 5979549631, + blogPageInFeed: 3386010031, + downloadPageDisplay: 9521642154, + packagePageArticle: 9119323068, + // This is being used for rehype-auto-ads in svelte.config.js + blogArticlePageArticle: 6788673194, +}); diff --git a/website/src/lib/posts.ts b/website/src/lib/posts.ts index 02fa3d07..b46c49eb 100644 --- a/website/src/lib/posts.ts +++ b/website/src/lib/posts.ts @@ -4,6 +4,7 @@ export interface Post { tags: string[]; published: boolean; author: string; + cover_img: string | null; readingTime: { text: string; minutes: number; @@ -21,21 +22,23 @@ export interface Post { export const getPosts = async () => { // Fetch posts from local Markdown files const posts: Post[] = await Promise.all( - Object.entries(import.meta.glob('../../posts/**/*.md')).map(async ([path, resolver]) => { - const resolved = (await resolver()) as { metadata: Post }; - const { metadata } = resolved; - const slug = path.split('/').pop()?.slice(0, -3) ?? ''; - return { ...metadata, slug }; - }) - ); + Object.entries(import.meta.glob("../../posts/**/*.md")).map( + async ([path, resolver]) => { + const resolved = (await resolver()) as { metadata: Post }; + const { metadata } = resolved; + const slug = path.split("/").pop()?.slice(0, -3) ?? ""; + return { ...metadata, slug }; + }, + ), + ).then((posts) => posts.filter((post) => post.published)); let sortedPosts = posts.sort((a, b) => +new Date(b.date) - +new Date(a.date)); sortedPosts = sortedPosts.map((post) => ({ - ...post + ...post, })); return { - posts: sortedPosts + posts: sortedPosts, }; }; diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 7fe0a36f..7e26b4c2 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -10,6 +10,8 @@ import { Download, Heart } from 'lucide-svelte'; import type { PageData } from './$types'; import { Avatar } from '@skeletonlabs/skeleton'; + import Ads from '$lib/components/ads/ads.svelte'; + import { ADS_SLOTS } from '$lib'; export let data: PageData; @@ -75,6 +77,8 @@
+ +

@@ -111,4 +115,5 @@ {/each} + diff --git a/website/src/routes/blog/+page.svelte b/website/src/routes/blog/+page.svelte index 5ee98938..c800c63c 100644 --- a/website/src/routes/blog/+page.svelte +++ b/website/src/routes/blog/+page.svelte @@ -1,4 +1,7 @@

Blog Posts


-
diff --git a/website/src/routes/blog/+page.ts b/website/src/routes/blog/+page.ts index c48ac87f..fca1bb62 100644 --- a/website/src/routes/blog/+page.ts +++ b/website/src/routes/blog/+page.ts @@ -1,11 +1,10 @@ -import type { Post } from '$lib/posts.js'; +import type { Post } from "$lib/posts.js"; export const load = async ({ fetch }) => { - const res = await fetch(`api/posts`); + const res = await fetch("api/posts"); if (res.ok) { const posts: Post[] = await res.json(); return { posts }; - } else { - return { posts: [] }; } + return { posts: [] }; }; diff --git a/website/src/routes/blog/[slug]/+page.svelte b/website/src/routes/blog/[slug]/+page.svelte index 1931a991..444c3a4a 100644 --- a/website/src/routes/blog/[slug]/+page.svelte +++ b/website/src/routes/blog/[slug]/+page.svelte @@ -3,9 +3,9 @@ import type { PageData } from './$types'; export let data: PageData; - let { + const { Content, - meta: { date, title, readingTime } + meta: { date, title, readingTime, cover_img } } = data as Required; @@ -14,13 +14,19 @@
-

{title}

+
+

{title}

+
+

{new Date(date).toDateString()}

+

{readingTime?.text ?? ''}

+

-
-

{new Date(date).toDateString()}

-

{readingTime?.text ?? ''}

- - - -
+ + +
diff --git a/website/src/routes/downloads/+page.svelte b/website/src/routes/downloads/+page.svelte index 50d101ee..9ee994c8 100644 --- a/website/src/routes/downloads/+page.svelte +++ b/website/src/routes/downloads/+page.svelte @@ -1,8 +1,9 @@ -
+

Download @@ -22,7 +23,7 @@ -


+

Other Downloads



@@ -36,4 +37,5 @@ {/each} +

diff --git a/website/src/routes/downloads/packages/+page.svx b/website/src/routes/downloads/packages/+page.svx index 0ab570c2..f10c3989 100644 --- a/website/src/routes/downloads/packages/+page.svx +++ b/website/src/routes/downloads/packages/+page.svx @@ -6,6 +6,8 @@ author: Kingkor Roy Tirtho
@@ -40,6 +42,14 @@ $ pamac install spotube-bin $ paru -Sy spotube-bin ``` + + ## MacOS ### Homebrew🍻 @@ -51,6 +61,14 @@ $ brew tap krtirtho/apps $ brew install --cask spotube ``` + + ## Windows ### Chocolatey🍫 diff --git a/website/static/posts/images/spotube-basics/cover.jpg b/website/static/posts/images/spotube-basics/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..603b3dda2521f03f955a4eac64c3dce7bba701e7 GIT binary patch literal 209177 zcmb@tdt6#)x-b5&#YL_L0SRJs0Fj_#0%S>zsWXd<1{G5@#!XD88$k^i%&ktQwWo6y zCXXh*J$9F1s zD0YJ9zw^rRcH5E8UZJ(~u;Xa8_<#Q7=VGCwqgwn|6^)9<2V%?x$2c_@i&cE;pbo9-YFJ-Q>6Duwb=ah)sMw(plWLs$G+EFEygK-)1|uOy*32zWz8%2 z&3|tmFKzp#@t1o$cK)XVJ5>rrWw}CCuG;-|&%ddE+l zO`Tr6{LbE!?T(|J9UAB1V<#QG_8y0=v9rU`{{KPh|6ekH8DW*~Bu*Hg#m4rIPT}|Q zz6kdoJ9gOFDb&=7cjD{0^WPWr>(jq*#tYlplSW~FeFGv8iDVL)Mkdqnd(8iOZ27O3|JSQO zCqNE`f^SCxBnEH}M96{uoCE~`zsCQ*-n{>QKrn$wB4<&k_~RB9fMEzClCmfiA_*n| zI)LCD0-Hz@Dao3q_7hngvC1_TD$+JvPsSHkD3V<-kB8^}nd`p#TSV8p_<634x4-}5 zYVpL)haJ?d6)p38yw&`Fqxhd_;;nu|6o07B!SCZl2{0KSGYrFoZ%8UdM7BoNMB<3s zPmH;CX+zwi<~XuI{;g!?pRKunegGKwIPk9JfbW3+rxT%`;bsK`=h_AkFDd?y7DBq> zxd(zNcjEdb_0Gy9p?uU>5sR@hBU9=GaCTew+d#fxYWKI(EW7i|*oO%@a;QSR{kaDq zD}H6P(LV|@A1+;ah6#zE-h5v{g9TIFR=h%{+mf(!w_65L_1VlJ8Cv6PJYx-QJZl@g zf^9%0@y{$(OyWOU=Dxj>7N)mve^6~CmTftF<(c>G2LvOcEq~^A_Hql!i!B0YgbowTG{%^kN>YwW4Cgv=i^gV z)|ocVbDSk_29NN!dNrK?j=V4f-B=!4|1tK|)w5LC|GFr0g_nuGQTMKIwa~lnu$ho> zfH`O2Hr5Ck^KWQ^5~2r~c6cSeMJkZ^qPecga zjYAo!G~vYAwE6Y0(Q=6Ql{S-3()UxApPhF1>pG9kmp>bkqgTAw6*{QyYc>Od{OT9x z+wirOIkuqZe{<~C5I*s`K;idr zhH@#HGk3oF>%Vv7Uq5X{63*xU?%G!i9j}MlEn5yfVLDsEmP1?5zaFGecK>YUv)98h zBjd}Tr9b?t#%6~;dp(GAz1c+g;*I%z$L0a~?)%@yN!|HMGqe<%`|zv!{Wuj-u-bFx zS?r59u6>nEv_bc9njho6V@(yV&3>gj^n?XDzhN;qTAp|0^@|^VrJvgD%f~lz;fZGx zw%E!h-tFvT^C&5PY(D?>&}BISPdq97AwI4;tnlXTuYMryyFW@ItNiONG}_xGR{CPmcW35chc+AXwHgvSH-vxG!oRx9|Dg}4W- zbTf5MdEkO38jMfp=e0_cKcFg37I?70Ou>i)`{!0HXtXs64~%97hM{@FA8M?f=9w+R z%WYnsP`=H*pddvnPJ4yJ1*aF3Zlkjm5%UO5f|RmsH|2pF>v;?NqB9sMEch=0_;oXl(Z+(!rB#jjOcWXNrEOSQT!79wQ6dDB_IY( zX1@96z0->~TfDAUV{6&%?~(&eoWOl1!Nl=hCOjaqA0j*fDR?qPv8MOAp6?_SzVr6I z;d|3&#UBi&tdV#5i`%G86*Rb`Ol{Z)GZKFfKIeQQ%=+{u`Xw+T-hd_~Tm6oDKxx1K zY4Y>4-fCXv)%dGdPbgY5kBcvkMfQo)ADwRMBYr}j+#~SKyY6sU8}cm+X7fUDwK?@VhxW+4G!rIOuOcZM_4;tX_QE$h0Gk7s0 zsI8zkY0$bg!BCK}FSxd!sKUR$OQMJj@^p)0RA+oQPqag0qZN(_=Ozk#W0nI$H)~tB zi)ZL?xo(ZOhhMIVvYuj+n@xr`Omv$�LAcMyHi>l39~Bjj9F1xs0KOczUz8l>o#s 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 (A1f!h5+G08T0&x~nkfeqE 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 + + `, + paragraphInterval: 2, + maxAds: 5, + } ] ] })