diff --git a/.env.example b/.env.example
index 35c5d563..bbab9bb8 100644
--- a/.env.example
+++ b/.env.example
@@ -1,7 +1,3 @@
-# The format:
-# SPOTIFY_SECRETS=clintId1:clientSecret1,clientId2:clientSecret2
-SPOTIFY_SECRETS=$SPOTIFY_SECRETS
-
# 0 or 1
# 0 = disable
# 1 = enable
@@ -13,5 +9,4 @@ LASTFM_API_SECRET=$LASTFM_API_SECRET
# Release channel. Can be: nightly, stable
RELEASE_CHANNEL=$RELEASE_CHANNEL
-HIDE_DONATIONS=$HIDE_DONATIONS
-DISABLE_SPOTIFY_IMAGES=$DISABLE_SPOTIFY_IMAGES
+HIDE_DONATIONS=$HIDE_DONATIONS
\ No newline at end of file
diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json
index b4cb4720..58b893ee 100644
--- a/.fvm/fvm_config.json
+++ b/.fvm/fvm_config.json
@@ -1,3 +1,3 @@
{
- "flutterSdkVersion": "3.29.2"
+ "flutterSdkVersion": "3.35.2"
}
\ No newline at end of file
diff --git a/.fvmrc b/.fvmrc
index 5b0ad692..cf986e39 100644
--- a/.fvmrc
+++ b/.fvmrc
@@ -1,4 +1,4 @@
{
- "flutter": "3.29.2",
+ "flutter": "3.35.2",
"flavors": {}
}
\ No newline at end of file
diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml
index 245101d8..3e73be4d 100644
--- a/.github/workflows/pr-lint.yml
+++ b/.github/workflows/pr-lint.yml
@@ -4,7 +4,7 @@ on:
pull_request:
env:
- FLUTTER_VERSION: 3.29.2
+ FLUTTER_VERSION: 3.35.2
jobs:
lint:
@@ -21,7 +21,6 @@ jobs:
run: |
envsubst < .env.example > .env
env:
- SPOTIFY_SECRETS: xxx:xxx
ENABLE_UPDATE_CHECK: true
LASTFM_API_KEY: xxx
LASTFM_API_SECRET: xxx
diff --git a/.github/workflows/spotube-release-binary.yml b/.github/workflows/spotube-release-binary.yml
index 05a672d4..4f2cff34 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.29.2
+ FLUTTER_VERSION: 3.35.2
FLUTTER_CHANNEL: master
permissions:
@@ -56,7 +56,7 @@ jobs:
files: |
dist/Spotube-windows-x86_64.nupkg
dist/Spotube-windows-x86_64-setup.exe
- - os: macos-latest
+ - os: macos-14
platform: ios
arch: all
files: |
@@ -95,7 +95,7 @@ jobs:
if: ${{matrix.platform == 'ios'}}
uses: maxim-lobanov/setup-xcode@v1
with:
- xcode-version: "16.1"
+ xcode-version: "16.2"
- name: Install ${{matrix.platform}} dependencies
run: |
diff --git a/.metadata b/.metadata
index 828f2c0a..e8b36fde 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
- revision: "300451adae589accbece3490f4396f10bdf15e6e"
+ revision: "d7b523b356d15fb81e7d340bbe52b47f93937323"
channel: "stable"
project_type: app
@@ -13,11 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: 300451adae589accbece3490f4396f10bdf15e6e
- base_revision: 300451adae589accbece3490f4396f10bdf15e6e
+ create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
+ base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
- platform: windows
- create_revision: 300451adae589accbece3490f4396f10bdf15e6e
- base_revision: 300451adae589accbece3490f4396f10bdf15e6e
+ create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
+ base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
# User provided section
diff --git a/.vscode/launch.json b/.vscode/launch.json
index deabf1d3..b81e2eee 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -17,6 +17,17 @@
"dev"
]
},
+ {
+ "name": "spotube (mobile-skia)",
+ "type": "dart",
+ "request": "launch",
+ "program": "lib/main.dart",
+ "args": [
+ "--flavor",
+ "dev",
+ "--no-enable-impeller"
+ ]
+ },
{
"name": "spotube (profile)",
"type": "dart",
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3229a158..69c80bb3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,10 +5,12 @@
"ambiguate",
"Amoled",
"Buildless",
+ "configurators",
"danceability",
"fuzzywuzzy",
"gapless",
"instrumentalness",
+ "isrc",
"Mpris",
"RGBO",
"riverpod",
@@ -28,5 +30,5 @@
"README.md": "LICENSE,CODE_OF_CONDUCT.md,CONTRIBUTING.md,SECURITY.md,CONTRIBUTION.md,CHANGELOG.md,PRIVACY_POLICY.md",
"*.dart": "${capture}.g.dart,${capture}.freezed.dart"
},
- "dart.flutterSdkPath": ".fvm/versions/3.29.2"
+ "dart.flutterSdkPath": ".fvm/versions/3.35.2"
}
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 48626312..49ae034a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ tar:
mkdir -p $(TEMP_DIR)\
&& cp -r $(BUNDLE_DIR)/* $(TEMP_DIR)\
&& cp linux/spotube.desktop $(TEMP_DIR)\
- && cp assets/spotube-logo.png $(TEMP_DIR)\
+ && cp assets/branding/spotube-logo.png $(TEMP_DIR)\
&& cp linux/com.github.KRTirtho.Spotube.appdata.xml $(TEMP_DIR)\
&& tar -cJf build/spotube-linux-${VERSION}-${PKG_ARCH}.tar.xz -C $(TEMP_DIR) .\
&& rm -rf $(TEMP_DIR)
@@ -52,4 +52,7 @@ dmg:
if [ -f dist/Spotube-macos-universal.dmg ];\
then rm dist/Spotube-macos-universal.dmg;\
fi &&\
- appdmg appdmg.json dist/Spotube-macos-universal.dmg
\ No newline at end of file
+ appdmg appdmg.json dist/Spotube-macos-universal.dmg
+
+changelog:
+ git-cliff --unreleased
\ No newline at end of file
diff --git a/README.md b/README.md
index b2c388e4..39f17945 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
-
+
-An open source, cross-platform Spotify client compatible across multiple platforms
-utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source,
-eliminating the need for Spotify Premium
+A cross-platform extensible open-source music streaming platform.
+Bring your own music metadata/playlist with plugins created by community or by yourself. A small step towards the decentralized music streaming era!
Btw it's not just another Electron app 😉
@@ -19,31 +18,20 @@ Btw it's not just another Electron app 😉
---
-
-
-
-
## 🌃 Features
-- 🚫 No ads, thanks to the use of public & free Spotify and YT Music APIs¹
-- ⬇️ Freely downloadable tracks
-- 🖥️ 📱 Cross-platform support
-- 🪶 Small size & less data usage
-- 🕵️ Anonymous/guest login
-- 🕒 Time synced lyrics
-- ✋ No telemetry, diagnostics or user data collection
-- 🚀 Native performance
-- 📖 Open source/libre software
-- 🔉 Playback control is done locally, not on the server
-
-**¹** It is still **recommended** to support creators by engaging with their YouTube channels/Spotify tracks (or preferably by buying their merch/concert tickets/physical media).
-
-### ❌ Unsupported features
-
-- 🗣️ **Spotify Shows & Podcasts:** Shows and Podcasts will **never be supported** because the audio tracks are _only_ available on Spotify and accessing them would require Spotify Premium.
-- 🎧 **Spotify Listen Along:** [Coming soon!](https://github.com/KRTirtho/spotube/issues/8)
+- 🧩 Plugin powered, supports any platform or custom music service through plugins.
+- 🗺️ Community driven plugins for popular platforms or create your own.
+- ⬇️ Freely downloadable tracks with tagged metadata.
+- 🖥️ 📱 Cross-platform support.
+- 🪶 Small size & less data usage.
+- 🕒 Time synced lyrics regardless of the plugin support.
+- ✋ No telemetry, diagnostics or user data collection.
+- 🚀 Native performance.
+- 📖 Open source/libre software.
+- 🔉 Playback control is done locally, not on the server.
## 📜 ⬇️ Installation guide
@@ -66,7 +54,7 @@ This handy table lists all the methods you can use to install Spotube:
MacOS
-
+
@@ -189,9 +177,7 @@ You can compile Spotube's source code by [following these instructions](CONTRIBU
## 👥 The Spotube team
- [Kingkor Roy Tirtho](https://github.com/KRTirtho) - The Founder, Maintainer and Lead Developer
-- [RaptaG](https://github.com/RaptaG) - The GitHub Moderator and Community Manager
- [Owen Connor](https://github.com/owencz1998) - The Cool Discord Moderator
-- [Meenbeese](https://github.com/meenbeese) - The Android Developer
- [Piotr Rogowski](https://github.com/karniv00l) - The MacOS Developer
- [Rusty Apple](https://github.com/RustyApple) - The Mysterious Unknown Guy
@@ -199,7 +185,7 @@ You can compile Spotube's source code by [following these instructions](CONTRIBU
Spotube is open source and licensed under the [BSD-4-Clause](/LICENSE) License.
-If you are concerned, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
+If you are curious, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
@@ -210,15 +196,14 @@ If you are concerned, you can [read the reason of choosing this license](https:/
1. [Flutter](https://flutter.dev) - Flutter transforms the app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase
1. [MPV](https://mpv.io) - mpv is a free (as in freedom) media player for the command line. It supports a wide variety of media file formats, audio and video codecs, and subtitle types.
-1. [Spotify API](https://developer.spotify.com/documentation/web-api) - The Spotify Web API is a RESTful API that provides access to Spotify data
+1. [Musicbrainz](https://musicbrainz.org) - MusicBrainz is a MetaBrainz project that aims to create a collaborative music database that is similar to the freedb project.
+1. [Listenbrainz](https://listenbrainz.org) - ListenBrainz is a open-source project by the MetaBrainz Foundation that allows users to crowdsource and publicly store their digital music listening data.
1. [Piped](https://piped-docs.kavin.rocks/) - Piped is a privacy friendly alternative YouTube frontend, which is efficient and scalable by design.
1. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube.
-1. [YouTube](https://youtube.com/) - YouTube is an American online video-sharing platform headquartered in San Bruno, California. Three former PayPal employees—Chad Hurley, Steve Chen, and Jawed Karim—created the service in February 2005
- 1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader
- 1. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data from streaming sites
-1. [JioSaavn](https://www.jiosaavn.com) - JioSaavn is an Indian online music streaming service and a digital distributor of Bollywood, English and other regional Indian music across the world. Since it was founded in 2007 as Saavn, the company has acquired rights to over 5 crore (50 million) music tracks in 15 languages
+1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader.
+1. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data from streaming sites.
1. [SongLink](https://song.link) - SongLink is a free smart link service that helps you share music with your audience. It's a one-stop-shop for creating smart links for music, podcasts, and other audio content
-1. [LRCLib](https://lrclib.net/) - A public synced lyric API
+1. [LRCLib](https://lrclib.net/) - A public synced lyric API.
1. [Linux](https://www.linux.org) - Linux is a family of open-source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically packaged in a Linux distribution
1. [AUR](https://aur.archlinux.org) - AUR stands for Arch User Repository. It is a community-driven repository for Arch-based Linux distributions users
1. [Flatpak](https://flatpak.org) - Flatpak is a utility for software deployment and package management for Linux
@@ -304,7 +289,6 @@ If you are concerned, you can [read the reason of choosing this license](https:/
1. [sliding_up_panel](https://github.com/akshathjain/sliding_up_panel) - A draggable Flutter widget that makes implementing a SlidingUpPanel much easier!
1. [sliver_tools](https://github.com/Kavantix) - A set of useful sliver tools that are missing from the flutter framework
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
@@ -350,4 +334,4 @@ If you are concerned, you can [read the reason of choosing this license](https:/
1. [flutter_new_pipe_extractor](https://github.com/KRTirtho/flutter_new_pipe_extractor) - NewPipeExtractor binding for Flutter (Android only)
-
© Copyright Spotube 2024
+
© Copyright Spotube 2025
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 5051f5a3..ee481eca 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -33,7 +33,7 @@ def composeVersion = "1.4.8"
android {
namespace "oss.krtirtho.spotube"
- compileSdkVersion 35
+ compileSdkVersion 36
ndkVersion = "27.0.12077973"
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
index 700901e8..1f5a556c 100644
--- a/android/app/proguard-rules.pro
+++ b/android/app/proguard-rules.pro
@@ -1,3 +1,12 @@
+#Flutter Wrapper
+# -keep class io.flutter.app.** { *; }
+-keep class io.flutter.plugin.** { *; }
+-keep class io.flutter.util.** { *; }
+-keep class io.flutter.view.** { *; }
+# -keep class io.flutter.** { *; }
+-keep class io.flutter.plugins.** { *; }
+-keep class de.prosiebensat1digital.** { *; }
+
-keep class androidx.lifecycle.DefaultLifecycleObserver
-keepnames class kotlinx.serialization.** { *; }
@@ -18,4 +27,33 @@
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
--dontwarn org.mozilla.javascript.tools.**
\ No newline at end of file
+-dontwarn org.mozilla.javascript.tools.**
+
+-dontwarn javax.script.AbstractScriptEngine
+-dontwarn javax.script.Bindings
+-dontwarn javax.script.Compilable
+-dontwarn javax.script.CompiledScript
+-dontwarn javax.script.Invocable
+-dontwarn javax.script.ScriptContext
+-dontwarn javax.script.ScriptEngine
+-dontwarn javax.script.ScriptEngineFactory
+-dontwarn javax.script.ScriptException
+-dontwarn javax.script.SimpleBindings
+-dontwarn jdk.dynalink.CallSiteDescriptor
+-dontwarn jdk.dynalink.DynamicLinker
+-dontwarn jdk.dynalink.DynamicLinkerFactory
+-dontwarn jdk.dynalink.NamedOperation
+-dontwarn jdk.dynalink.Namespace
+-dontwarn jdk.dynalink.NamespaceOperation
+-dontwarn jdk.dynalink.Operation
+-dontwarn jdk.dynalink.RelinkableCallSite
+-dontwarn jdk.dynalink.StandardNamespace
+-dontwarn jdk.dynalink.StandardOperation
+-dontwarn jdk.dynalink.linker.GuardedInvocation
+-dontwarn jdk.dynalink.linker.GuardingDynamicLinker
+-dontwarn jdk.dynalink.linker.LinkRequest
+-dontwarn jdk.dynalink.linker.LinkerServices
+-dontwarn jdk.dynalink.linker.TypeBasedGuardingDynamicLinker
+-dontwarn jdk.dynalink.linker.support.CompositeTypeBasedGuardingDynamicLinker
+-dontwarn jdk.dynalink.linker.support.Guards
+-dontwarn jdk.dynalink.support.ChainedCallSite
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index a32d12af..400c91e8 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -3,4 +3,17 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 0effefe2..a005257e 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -57,10 +57,6 @@
-
-
@@ -74,8 +70,6 @@
-
-
diff --git a/android/app/src/main/res/drawable-hdpi-v31/android12branding.png b/android/app/src/main/res/drawable-hdpi-v31/android12branding.png
index fff3f148..22a9b8d3 100644
Binary files a/android/app/src/main/res/drawable-hdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-hdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png
index 0d4e1c68..adeebcd1 100644
Binary files a/android/app/src/main/res/drawable-hdpi/android12splash.png and b/android/app/src/main/res/drawable-hdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-hdpi/branding.png b/android/app/src/main/res/drawable-hdpi/branding.png
index fff3f148..22a9b8d3 100644
Binary files a/android/app/src/main/res/drawable-hdpi/branding.png and b/android/app/src/main/res/drawable-hdpi/branding.png differ
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
index a65caa1b..204ffe94 100644
Binary files a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png
index 0979b5e4..87eebe5c 100644
Binary files a/android/app/src/main/res/drawable-hdpi/splash.png and b/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-mdpi-v31/android12branding.png b/android/app/src/main/res/drawable-mdpi-v31/android12branding.png
index 5a197da3..3ff2a2da 100644
Binary files a/android/app/src/main/res/drawable-mdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-mdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/android12splash.png b/android/app/src/main/res/drawable-mdpi/android12splash.png
index 5d9760d4..72c22614 100644
Binary files a/android/app/src/main/res/drawable-mdpi/android12splash.png and b/android/app/src/main/res/drawable-mdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/branding.png b/android/app/src/main/res/drawable-mdpi/branding.png
index 5a197da3..3ff2a2da 100644
Binary files a/android/app/src/main/res/drawable-mdpi/branding.png and b/android/app/src/main/res/drawable-mdpi/branding.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
index 3ad0f47e..e7a75c9a 100644
Binary files a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png
index c5e4aca0..6e04efdc 100644
Binary files a/android/app/src/main/res/drawable-mdpi/splash.png and b/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png
index fff3f148..22a9b8d3 100644
Binary files a/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/android/app/src/main/res/drawable-night-hdpi/android12splash.png
index 0d4e1c68..adeebcd1 100644
Binary files a/android/app/src/main/res/drawable-night-hdpi/android12splash.png and b/android/app/src/main/res/drawable-night-hdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png
index 5a197da3..3ff2a2da 100644
Binary files a/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/android/app/src/main/res/drawable-night-mdpi/android12splash.png
index 5d9760d4..72c22614 100644
Binary files a/android/app/src/main/res/drawable-night-mdpi/android12splash.png and b/android/app/src/main/res/drawable-night-mdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png
index efc7e6c8..8e2bb197 100644
Binary files a/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png
index 8e5ceb0a..5adba278 100644
Binary files a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png and b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png
index 593877e0..d301093a 100644
Binary files a/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png
index fb89da37..4e294a2d 100644
Binary files a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png and b/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png
index 9d233302..42b0bdc2 100644
Binary files a/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png
index 38e4a12c..dcc70377 100644
Binary files a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png and b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png
index 203fc77a..4bebb9de 100644
Binary files a/android/app/src/main/res/drawable-v21/background.png and b/android/app/src/main/res/drawable-v21/background.png differ
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
index 52e8749e..5367a886 100644
--- a/android/app/src/main/res/drawable-v21/launch_background.xml
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -6,7 +6,7 @@
-
- -
+
-
diff --git a/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png
index efc7e6c8..8e2bb197 100644
Binary files a/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/app/src/main/res/drawable-xhdpi/android12splash.png
index 8e5ceb0a..5adba278 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/android12splash.png and b/android/app/src/main/res/drawable-xhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/branding.png b/android/app/src/main/res/drawable-xhdpi/branding.png
index efc7e6c8..8e2bb197 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/branding.png and b/android/app/src/main/res/drawable-xhdpi/branding.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
index 8774c0ff..b608dca7 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png
index 41222c6c..51a669aa 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/splash.png and b/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png
index 593877e0..d301093a 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxhdpi/android12splash.png
index fb89da37..4e294a2d 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/android12splash.png and b/android/app/src/main/res/drawable-xxhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/branding.png b/android/app/src/main/res/drawable-xxhdpi/branding.png
index 593877e0..d301093a 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/branding.png and b/android/app/src/main/res/drawable-xxhdpi/branding.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
index a379c006..b1e93458 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png
index 5ab19d32..cc79cb85 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/splash.png and b/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png
index 9d233302..42b0bdc2 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png and b/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png
index 38e4a12c..dcc70377 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png and b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/branding.png b/android/app/src/main/res/drawable-xxxhdpi/branding.png
index 9d233302..42b0bdc2 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/branding.png and b/android/app/src/main/res/drawable-xxxhdpi/branding.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
index 44621df8..d178ba12 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png
index a6d40b89..f526b26d 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/splash.png and b/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png
index 203fc77a..4bebb9de 100644
Binary files a/android/app/src/main/res/drawable/background.png and b/android/app/src/main/res/drawable/background.png differ
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
index 52e8749e..5367a886 100644
--- a/android/app/src/main/res/drawable/launch_background.xml
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -6,7 +6,7 @@
-
- -
+
-
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index f606c4d8..c79c58a3 100644
--- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,9 @@
-
-
+
+
+
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index d26a3a6e..c9e5cfad 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 63d16c60..159b302f 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index fe2957ad..9c81fb60 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 85c1d793..3450fb00 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index f22fa5cf..f94fd407 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/nightly/res/drawable-hdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-hdpi-v31/android12branding.png
index 9e62c813..22a9b8d3 100644
Binary files a/android/app/src/nightly/res/drawable-hdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-hdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-hdpi/android12splash.png b/android/app/src/nightly/res/drawable-hdpi/android12splash.png
index 98fd87f4..1d1cb853 100644
Binary files a/android/app/src/nightly/res/drawable-hdpi/android12splash.png and b/android/app/src/nightly/res/drawable-hdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-hdpi/branding.png b/android/app/src/nightly/res/drawable-hdpi/branding.png
index 9e62c813..22a9b8d3 100644
Binary files a/android/app/src/nightly/res/drawable-hdpi/branding.png and b/android/app/src/nightly/res/drawable-hdpi/branding.png differ
diff --git a/android/app/src/nightly/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/nightly/res/drawable-hdpi/ic_launcher_foreground.png
index 20a57ba2..7373eec1 100644
Binary files a/android/app/src/nightly/res/drawable-hdpi/ic_launcher_foreground.png and b/android/app/src/nightly/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/nightly/res/drawable-hdpi/splash.png b/android/app/src/nightly/res/drawable-hdpi/splash.png
index 07c7024a..e3869211 100644
Binary files a/android/app/src/nightly/res/drawable-hdpi/splash.png and b/android/app/src/nightly/res/drawable-hdpi/splash.png differ
diff --git a/android/app/src/nightly/res/drawable-mdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-mdpi-v31/android12branding.png
index 80579983..3ff2a2da 100644
Binary files a/android/app/src/nightly/res/drawable-mdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-mdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-mdpi/android12splash.png b/android/app/src/nightly/res/drawable-mdpi/android12splash.png
index a86a2222..3f2a1a0a 100644
Binary files a/android/app/src/nightly/res/drawable-mdpi/android12splash.png and b/android/app/src/nightly/res/drawable-mdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-mdpi/branding.png b/android/app/src/nightly/res/drawable-mdpi/branding.png
index 80579983..3ff2a2da 100644
Binary files a/android/app/src/nightly/res/drawable-mdpi/branding.png and b/android/app/src/nightly/res/drawable-mdpi/branding.png differ
diff --git a/android/app/src/nightly/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/nightly/res/drawable-mdpi/ic_launcher_foreground.png
index 43f5e0fe..8d5a9656 100644
Binary files a/android/app/src/nightly/res/drawable-mdpi/ic_launcher_foreground.png and b/android/app/src/nightly/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/nightly/res/drawable-mdpi/splash.png b/android/app/src/nightly/res/drawable-mdpi/splash.png
index 86d3fe74..d8f7cc0e 100644
Binary files a/android/app/src/nightly/res/drawable-mdpi/splash.png and b/android/app/src/nightly/res/drawable-mdpi/splash.png differ
diff --git a/android/app/src/nightly/res/drawable-night-hdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-night-hdpi-v31/android12branding.png
index 9e62c813..22a9b8d3 100644
Binary files a/android/app/src/nightly/res/drawable-night-hdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-night-hdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-night-hdpi/android12splash.png b/android/app/src/nightly/res/drawable-night-hdpi/android12splash.png
index 98fd87f4..1d1cb853 100644
Binary files a/android/app/src/nightly/res/drawable-night-hdpi/android12splash.png and b/android/app/src/nightly/res/drawable-night-hdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-night-mdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-night-mdpi-v31/android12branding.png
index 80579983..3ff2a2da 100644
Binary files a/android/app/src/nightly/res/drawable-night-mdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-night-mdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-night-mdpi/android12splash.png b/android/app/src/nightly/res/drawable-night-mdpi/android12splash.png
index a86a2222..3f2a1a0a 100644
Binary files a/android/app/src/nightly/res/drawable-night-mdpi/android12splash.png and b/android/app/src/nightly/res/drawable-night-mdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-night-xhdpi-v31/android12branding.png
index 0bcf138d..8e2bb197 100644
Binary files a/android/app/src/nightly/res/drawable-night-xhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-night-xhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xhdpi/android12splash.png b/android/app/src/nightly/res/drawable-night-xhdpi/android12splash.png
index ad3f39d0..ba73b0e2 100644
Binary files a/android/app/src/nightly/res/drawable-night-xhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-night-xhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xxhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-night-xxhdpi-v31/android12branding.png
index c7d01776..d301093a 100644
Binary files a/android/app/src/nightly/res/drawable-night-xxhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-night-xxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xxhdpi/android12splash.png b/android/app/src/nightly/res/drawable-night-xxhdpi/android12splash.png
index 133fb647..5e5cdc45 100644
Binary files a/android/app/src/nightly/res/drawable-night-xxhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-night-xxhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xxxhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-night-xxxhdpi-v31/android12branding.png
index 5477b799..42b0bdc2 100644
Binary files a/android/app/src/nightly/res/drawable-night-xxxhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-night-xxxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/nightly/res/drawable-night-xxxhdpi/android12splash.png
index fa5a8c92..adff9bec 100644
Binary files a/android/app/src/nightly/res/drawable-night-xxxhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-night-xxxhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-v21/background.png b/android/app/src/nightly/res/drawable-v21/background.png
index 203fc77a..4bebb9de 100644
Binary files a/android/app/src/nightly/res/drawable-v21/background.png and b/android/app/src/nightly/res/drawable-v21/background.png differ
diff --git a/android/app/src/nightly/res/drawable-v21/launch_background.xml b/android/app/src/nightly/res/drawable-v21/launch_background.xml
index 52e8749e..5367a886 100644
--- a/android/app/src/nightly/res/drawable-v21/launch_background.xml
+++ b/android/app/src/nightly/res/drawable-v21/launch_background.xml
@@ -6,7 +6,7 @@
-
- -
+
-
diff --git a/android/app/src/nightly/res/drawable-xhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-xhdpi-v31/android12branding.png
index 0bcf138d..8e2bb197 100644
Binary files a/android/app/src/nightly/res/drawable-xhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-xhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xhdpi/android12splash.png b/android/app/src/nightly/res/drawable-xhdpi/android12splash.png
index ad3f39d0..ba73b0e2 100644
Binary files a/android/app/src/nightly/res/drawable-xhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-xhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-xhdpi/branding.png b/android/app/src/nightly/res/drawable-xhdpi/branding.png
index 0bcf138d..8e2bb197 100644
Binary files a/android/app/src/nightly/res/drawable-xhdpi/branding.png and b/android/app/src/nightly/res/drawable-xhdpi/branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/nightly/res/drawable-xhdpi/ic_launcher_foreground.png
index 4cf86d25..f4f416f7 100644
Binary files a/android/app/src/nightly/res/drawable-xhdpi/ic_launcher_foreground.png and b/android/app/src/nightly/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/nightly/res/drawable-xhdpi/splash.png b/android/app/src/nightly/res/drawable-xhdpi/splash.png
index dbb0ea02..17a2c373 100644
Binary files a/android/app/src/nightly/res/drawable-xhdpi/splash.png and b/android/app/src/nightly/res/drawable-xhdpi/splash.png differ
diff --git a/android/app/src/nightly/res/drawable-xxhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-xxhdpi-v31/android12branding.png
index c7d01776..d301093a 100644
Binary files a/android/app/src/nightly/res/drawable-xxhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-xxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xxhdpi/android12splash.png b/android/app/src/nightly/res/drawable-xxhdpi/android12splash.png
index 133fb647..5e5cdc45 100644
Binary files a/android/app/src/nightly/res/drawable-xxhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-xxhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-xxhdpi/branding.png b/android/app/src/nightly/res/drawable-xxhdpi/branding.png
index c7d01776..d301093a 100644
Binary files a/android/app/src/nightly/res/drawable-xxhdpi/branding.png and b/android/app/src/nightly/res/drawable-xxhdpi/branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/nightly/res/drawable-xxhdpi/ic_launcher_foreground.png
index 95fa3443..9f88e976 100644
Binary files a/android/app/src/nightly/res/drawable-xxhdpi/ic_launcher_foreground.png and b/android/app/src/nightly/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/nightly/res/drawable-xxhdpi/splash.png b/android/app/src/nightly/res/drawable-xxhdpi/splash.png
index 12eb5531..db53f016 100644
Binary files a/android/app/src/nightly/res/drawable-xxhdpi/splash.png and b/android/app/src/nightly/res/drawable-xxhdpi/splash.png differ
diff --git a/android/app/src/nightly/res/drawable-xxxhdpi-v31/android12branding.png b/android/app/src/nightly/res/drawable-xxxhdpi-v31/android12branding.png
index 5477b799..42b0bdc2 100644
Binary files a/android/app/src/nightly/res/drawable-xxxhdpi-v31/android12branding.png and b/android/app/src/nightly/res/drawable-xxxhdpi-v31/android12branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xxxhdpi/android12splash.png b/android/app/src/nightly/res/drawable-xxxhdpi/android12splash.png
index fa5a8c92..adff9bec 100644
Binary files a/android/app/src/nightly/res/drawable-xxxhdpi/android12splash.png and b/android/app/src/nightly/res/drawable-xxxhdpi/android12splash.png differ
diff --git a/android/app/src/nightly/res/drawable-xxxhdpi/branding.png b/android/app/src/nightly/res/drawable-xxxhdpi/branding.png
index 5477b799..42b0bdc2 100644
Binary files a/android/app/src/nightly/res/drawable-xxxhdpi/branding.png and b/android/app/src/nightly/res/drawable-xxxhdpi/branding.png differ
diff --git a/android/app/src/nightly/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/nightly/res/drawable-xxxhdpi/ic_launcher_foreground.png
index 3de8a2ee..7e2bb4c3 100644
Binary files a/android/app/src/nightly/res/drawable-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/nightly/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/nightly/res/drawable-xxxhdpi/splash.png b/android/app/src/nightly/res/drawable-xxxhdpi/splash.png
index 68e806f4..a74c95a4 100644
Binary files a/android/app/src/nightly/res/drawable-xxxhdpi/splash.png and b/android/app/src/nightly/res/drawable-xxxhdpi/splash.png differ
diff --git a/android/app/src/nightly/res/drawable/background.png b/android/app/src/nightly/res/drawable/background.png
index 203fc77a..4bebb9de 100644
Binary files a/android/app/src/nightly/res/drawable/background.png and b/android/app/src/nightly/res/drawable/background.png differ
diff --git a/android/app/src/nightly/res/drawable/launch_background.xml b/android/app/src/nightly/res/drawable/launch_background.xml
index 52e8749e..5367a886 100644
--- a/android/app/src/nightly/res/drawable/launch_background.xml
+++ b/android/app/src/nightly/res/drawable/launch_background.xml
@@ -6,7 +6,7 @@
-
- -
+
-
diff --git a/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
index 83e651db..c79c58a3 100644
--- a/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,9 @@
-
-
-
-
\ No newline at end of file
+
+
+
+
+
diff --git a/android/app/src/nightly/res/mipmap-hdpi/ic_launcher.png b/android/app/src/nightly/res/mipmap-hdpi/ic_launcher.png
index a826bb73..8164cc67 100644
Binary files a/android/app/src/nightly/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/nightly/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/nightly/res/mipmap-mdpi/ic_launcher.png b/android/app/src/nightly/res/mipmap-mdpi/ic_launcher.png
index 3743861d..bff95e97 100644
Binary files a/android/app/src/nightly/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/nightly/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/nightly/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/nightly/res/mipmap-xhdpi/ic_launcher.png
index 1be1daa7..df515ed1 100644
Binary files a/android/app/src/nightly/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/nightly/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/nightly/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/nightly/res/mipmap-xxhdpi/ic_launcher.png
index 3a8a7832..e58ef25f 100644
Binary files a/android/app/src/nightly/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/nightly/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/nightly/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/nightly/res/mipmap-xxxhdpi/ic_launcher.png
index 781c9c1a..d39a5e64 100644
Binary files a/android/app/src/nightly/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/nightly/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/appdmg.json b/appdmg.json
index eb9b5236..6e365f23 100644
--- a/appdmg.json
+++ b/appdmg.json
@@ -1,6 +1,6 @@
{
"title": "Spotube",
- "icon": "assets/spotube-logo-macos.png",
+ "icon": "assets/branding/spotube-logo-macos.png",
"contents": [
{
"x": 448,
@@ -15,4 +15,4 @@
"path": "build/macos/Build/Products/Release/Spotube.app"
}
]
-}
\ No newline at end of file
+}
diff --git a/assets/backgrounds/xmas-effect.png b/assets/backgrounds/xmas-effect.png
deleted file mode 100644
index e7c8eeef..00000000
Binary files a/assets/backgrounds/xmas-effect.png and /dev/null differ
diff --git a/assets/bengali-patterns-bg.jpg b/assets/bengali-patterns-bg.jpg
deleted file mode 100644
index 513557a3..00000000
Binary files a/assets/bengali-patterns-bg.jpg and /dev/null differ
diff --git a/assets/branding.png b/assets/branding/branding.png
similarity index 100%
rename from assets/branding.png
rename to assets/branding/branding.png
diff --git a/assets/mobile-screenshots/android-1.jpg b/assets/branding/mobile-screenshots/android-1.jpg
similarity index 100%
rename from assets/mobile-screenshots/android-1.jpg
rename to assets/branding/mobile-screenshots/android-1.jpg
diff --git a/assets/mobile-screenshots/android-2.jpg b/assets/branding/mobile-screenshots/android-2.jpg
similarity index 100%
rename from assets/mobile-screenshots/android-2.jpg
rename to assets/branding/mobile-screenshots/android-2.jpg
diff --git a/assets/mobile-screenshots/android-3.jpg b/assets/branding/mobile-screenshots/android-3.jpg
similarity index 100%
rename from assets/mobile-screenshots/android-3.jpg
rename to assets/branding/mobile-screenshots/android-3.jpg
diff --git a/assets/branding/mobile-screenshots/android-4.jpg b/assets/branding/mobile-screenshots/android-4.jpg
new file mode 100644
index 00000000..278aae21
Binary files /dev/null and b/assets/branding/mobile-screenshots/android-4.jpg differ
diff --git a/assets/mobile-screenshots/android-5.jpg b/assets/branding/mobile-screenshots/android-5.jpg
similarity index 100%
rename from assets/mobile-screenshots/android-5.jpg
rename to assets/branding/mobile-screenshots/android-5.jpg
diff --git a/assets/mobile-screenshots/android-6.jpg b/assets/branding/mobile-screenshots/android-6.jpg
similarity index 100%
rename from assets/mobile-screenshots/android-6.jpg
rename to assets/branding/mobile-screenshots/android-6.jpg
diff --git a/assets/branding/mobile-screenshots/combined.png b/assets/branding/mobile-screenshots/combined.png
new file mode 100644
index 00000000..a7a394f6
Binary files /dev/null and b/assets/branding/mobile-screenshots/combined.png differ
diff --git a/assets/spotube-hero-banner.png b/assets/branding/spotube-hero-banner.png
similarity index 100%
rename from assets/spotube-hero-banner.png
rename to assets/branding/spotube-hero-banner.png
diff --git a/assets/branding/spotube-logo-foreground.png b/assets/branding/spotube-logo-foreground.png
new file mode 100644
index 00000000..997d3209
Binary files /dev/null and b/assets/branding/spotube-logo-foreground.png differ
diff --git a/assets/branding/spotube-logo-item.png b/assets/branding/spotube-logo-item.png
new file mode 100644
index 00000000..476dda29
Binary files /dev/null and b/assets/branding/spotube-logo-item.png differ
diff --git a/assets/branding/spotube-logo-light.png b/assets/branding/spotube-logo-light.png
new file mode 100644
index 00000000..8c86d621
Binary files /dev/null and b/assets/branding/spotube-logo-light.png differ
diff --git a/assets/branding/spotube-logo-macos.png b/assets/branding/spotube-logo-macos.png
new file mode 100644
index 00000000..2694b530
Binary files /dev/null and b/assets/branding/spotube-logo-macos.png differ
diff --git a/assets/branding/spotube-logo.bmp b/assets/branding/spotube-logo.bmp
new file mode 100644
index 00000000..f95df092
Binary files /dev/null and b/assets/branding/spotube-logo.bmp differ
diff --git a/assets/branding/spotube-logo.ico b/assets/branding/spotube-logo.ico
new file mode 100644
index 00000000..562110b9
Binary files /dev/null and b/assets/branding/spotube-logo.ico differ
diff --git a/assets/branding/spotube-logo.png b/assets/branding/spotube-logo.png
new file mode 100644
index 00000000..d46d9ce5
Binary files /dev/null and b/assets/branding/spotube-logo.png differ
diff --git a/assets/branding/spotube-logo_android12.png b/assets/branding/spotube-logo_android12.png
new file mode 100644
index 00000000..4af89de4
Binary files /dev/null and b/assets/branding/spotube-logo_android12.png differ
diff --git a/assets/branding/spotube-nightly-item.png b/assets/branding/spotube-nightly-item.png
new file mode 100644
index 00000000..61ef1c5d
Binary files /dev/null and b/assets/branding/spotube-nightly-item.png differ
diff --git a/assets/branding/spotube-nightly-logo-foreground.png b/assets/branding/spotube-nightly-logo-foreground.png
new file mode 100644
index 00000000..def278cf
Binary files /dev/null and b/assets/branding/spotube-nightly-logo-foreground.png differ
diff --git a/assets/branding/spotube-nightly-logo-foreground.svg b/assets/branding/spotube-nightly-logo-foreground.svg
new file mode 100644
index 00000000..de2bf370
--- /dev/null
+++ b/assets/branding/spotube-nightly-logo-foreground.svg
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/branding/spotube-nightly-logo.png b/assets/branding/spotube-nightly-logo.png
new file mode 100644
index 00000000..269aaabc
Binary files /dev/null and b/assets/branding/spotube-nightly-logo.png differ
diff --git a/assets/branding/spotube-nightly-logo_android12.png b/assets/branding/spotube-nightly-logo_android12.png
new file mode 100644
index 00000000..e5683399
Binary files /dev/null and b/assets/branding/spotube-nightly-logo_android12.png differ
diff --git a/assets/spotube-screenshot.png b/assets/branding/spotube-screenshot.png
similarity index 100%
rename from assets/spotube-screenshot.png
rename to assets/branding/spotube-screenshot.png
diff --git a/assets/branding/spotube-tall-capsule.png b/assets/branding/spotube-tall-capsule.png
new file mode 100644
index 00000000..53bff791
Binary files /dev/null and b/assets/branding/spotube-tall-capsule.png differ
diff --git a/assets/branding/spotube-wide-capsule-large.png b/assets/branding/spotube-wide-capsule-large.png
new file mode 100644
index 00000000..41614c80
Binary files /dev/null and b/assets/branding/spotube-wide-capsule-large.png differ
diff --git a/assets/branding/spotube-wide-capsule-small.png b/assets/branding/spotube-wide-capsule-small.png
new file mode 100644
index 00000000..e0717dc5
Binary files /dev/null and b/assets/branding/spotube-wide-capsule-small.png differ
diff --git a/assets/branding/spotube_banner.png b/assets/branding/spotube_banner.png
new file mode 100644
index 00000000..c9450265
Binary files /dev/null and b/assets/branding/spotube_banner.png differ
diff --git a/assets/empty_box.png b/assets/empty_box.png
deleted file mode 100644
index 24e95b23..00000000
Binary files a/assets/empty_box.png and /dev/null differ
diff --git a/assets/fonts/Cookie-Regular.ttf b/assets/fonts/Cookie-Regular.ttf
new file mode 100644
index 00000000..e3ac74eb
Binary files /dev/null and b/assets/fonts/Cookie-Regular.ttf differ
diff --git a/assets/fonts/Ubuntu_Mono/UFL.txt b/assets/fonts/Ubuntu_Mono/UFL.txt
new file mode 100644
index 00000000..6e722c88
--- /dev/null
+++ b/assets/fonts/Ubuntu_Mono/UFL.txt
@@ -0,0 +1,96 @@
+-------------------------------
+UBUNTU FONT LICENCE Version 1.0
+-------------------------------
+
+PREAMBLE
+This licence allows the licensed fonts to be used, studied, modified and
+redistributed freely. The fonts, including any derivative works, can be
+bundled, embedded, and redistributed provided the terms of this licence
+are met. The fonts and derivatives, however, cannot be released under
+any other licence. The requirement for fonts to remain under this
+licence does not require any document created using the fonts or their
+derivatives to be published under this licence, as long as the primary
+purpose of the document is not to be a vehicle for the distribution of
+the fonts.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this licence and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Original Version" refers to the collection of Font Software components
+as received under this licence.
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to
+a new environment.
+
+"Copyright Holder(s)" refers to all individuals and companies who have a
+copyright ownership of the Font Software.
+
+"Substantially Changed" refers to Modified Versions which can be easily
+identified as dissimilar to the Font Software by users of the Font
+Software comparing the Original Version with the Modified Version.
+
+To "Propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification and with or without charging
+a redistribution fee), making available to the public, and in some
+countries other activities as well.
+
+PERMISSION & CONDITIONS
+This licence does not grant any rights under trademark law and all such
+rights are reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of the Font Software, to propagate the Font Software, subject to
+the below conditions:
+
+1) Each copy of the Font Software must contain the above copyright
+notice and this licence. These can be included either as stand-alone
+text files, human-readable headers or in the appropriate machine-
+readable metadata fields within text or binary files as long as those
+fields can be easily viewed by the user.
+
+2) The font name complies with the following:
+(a) The Original Version must retain its name, unmodified.
+(b) Modified Versions which are Substantially Changed must be renamed to
+avoid use of the name of the Original Version or similar names entirely.
+(c) Modified Versions which are not Substantially Changed must be
+renamed to both (i) retain the name of the Original Version and (ii) add
+additional naming elements to distinguish the Modified Version from the
+Original Version. The name of such Modified Versions must be the name of
+the Original Version, with "derivative X" where X represents the name of
+the new work, appended to that name.
+
+3) The name(s) of the Copyright Holder(s) and any contributor to the
+Font Software shall not be used to promote, endorse or advertise any
+Modified Version, except (i) as required by this licence, (ii) to
+acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
+their explicit written permission.
+
+4) The Font Software, modified or unmodified, in part or in whole, must
+be distributed entirely under this licence, and must not be distributed
+under any other licence. The requirement for fonts to remain under this
+licence does not affect any document created using the Font Software,
+except any version of the Font Software extracted from a document
+created using the Font Software may only be distributed under this
+licence.
+
+TERMINATION
+This licence becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
+DEALINGS IN THE FONT SOFTWARE.
diff --git a/assets/fonts/Ubuntu_Mono/UbuntuMono-Bold.ttf b/assets/fonts/Ubuntu_Mono/UbuntuMono-Bold.ttf
new file mode 100644
index 00000000..01ad81bf
Binary files /dev/null and b/assets/fonts/Ubuntu_Mono/UbuntuMono-Bold.ttf differ
diff --git a/assets/fonts/Ubuntu_Mono/UbuntuMono-BoldItalic.ttf b/assets/fonts/Ubuntu_Mono/UbuntuMono-BoldItalic.ttf
new file mode 100644
index 00000000..731884eb
Binary files /dev/null and b/assets/fonts/Ubuntu_Mono/UbuntuMono-BoldItalic.ttf differ
diff --git a/assets/fonts/Ubuntu_Mono/UbuntuMono-Italic.ttf b/assets/fonts/Ubuntu_Mono/UbuntuMono-Italic.ttf
new file mode 100644
index 00000000..b89338d4
Binary files /dev/null and b/assets/fonts/Ubuntu_Mono/UbuntuMono-Italic.ttf differ
diff --git a/assets/fonts/Ubuntu_Mono/UbuntuMono-Regular.ttf b/assets/fonts/Ubuntu_Mono/UbuntuMono-Regular.ttf
new file mode 100644
index 00000000..4977028d
Binary files /dev/null and b/assets/fonts/Ubuntu_Mono/UbuntuMono-Regular.ttf differ
diff --git a/assets/album-placeholder.png b/assets/images/album-placeholder.png
similarity index 100%
rename from assets/album-placeholder.png
rename to assets/images/album-placeholder.png
diff --git a/assets/images/bengali-patterns-bg.jpg b/assets/images/bengali-patterns-bg.jpg
new file mode 100644
index 00000000..a4090a01
Binary files /dev/null and b/assets/images/bengali-patterns-bg.jpg differ
diff --git a/assets/images/liked-tracks.jpg b/assets/images/liked-tracks.jpg
new file mode 100644
index 00000000..71e010dc
Binary files /dev/null and b/assets/images/liked-tracks.jpg differ
diff --git a/assets/images/logos/invidious.jpg b/assets/images/logos/invidious.jpg
new file mode 100644
index 00000000..3a54ace1
Binary files /dev/null and b/assets/images/logos/invidious.jpg differ
diff --git a/assets/jiosaavn.png b/assets/images/logos/jiosaavn.png
similarity index 100%
rename from assets/jiosaavn.png
rename to assets/images/logos/jiosaavn.png
diff --git a/assets/images/logos/songlink-transparent.png b/assets/images/logos/songlink-transparent.png
new file mode 100644
index 00000000..fc4ae541
Binary files /dev/null and b/assets/images/logos/songlink-transparent.png differ
diff --git a/assets/placeholder.png b/assets/images/placeholder.png
similarity index 100%
rename from assets/placeholder.png
rename to assets/images/placeholder.png
diff --git a/assets/user-placeholder.png b/assets/images/user-placeholder.png
similarity index 100%
rename from assets/user-placeholder.png
rename to assets/images/user-placeholder.png
diff --git a/assets/invidious.jpg b/assets/invidious.jpg
deleted file mode 100644
index 12c5f107..00000000
Binary files a/assets/invidious.jpg and /dev/null differ
diff --git a/assets/liked-tracks.jpg b/assets/liked-tracks.jpg
deleted file mode 100644
index 62dad65e..00000000
Binary files a/assets/liked-tracks.jpg and /dev/null differ
diff --git a/assets/logos/songlink-transparent.png b/assets/logos/songlink-transparent.png
deleted file mode 100644
index 6b7064c9..00000000
Binary files a/assets/logos/songlink-transparent.png and /dev/null differ
diff --git a/assets/logos/songlink.png b/assets/logos/songlink.png
deleted file mode 100644
index 43d823a5..00000000
Binary files a/assets/logos/songlink.png and /dev/null differ
diff --git a/assets/mobile-screenshots/android-4.jpg b/assets/mobile-screenshots/android-4.jpg
deleted file mode 100644
index 3057c69a..00000000
Binary files a/assets/mobile-screenshots/android-4.jpg and /dev/null differ
diff --git a/assets/mobile-screenshots/combined.png b/assets/mobile-screenshots/combined.png
deleted file mode 100644
index 9584e9c7..00000000
Binary files a/assets/mobile-screenshots/combined.png and /dev/null differ
diff --git a/assets/patterns/black_white_visualized.jpg b/assets/patterns/black_white_visualized.jpg
deleted file mode 100644
index e56a2780..00000000
Binary files a/assets/patterns/black_white_visualized.jpg and /dev/null differ
diff --git a/assets/patterns/brazil_carnival.jpg b/assets/patterns/brazil_carnival.jpg
deleted file mode 100644
index a7cdb3a1..00000000
Binary files a/assets/patterns/brazil_carnival.jpg and /dev/null differ
diff --git a/assets/patterns/cotton_balls.jpg b/assets/patterns/cotton_balls.jpg
deleted file mode 100644
index db6f02a8..00000000
Binary files a/assets/patterns/cotton_balls.jpg and /dev/null differ
diff --git a/assets/patterns/cute_worms.jpg b/assets/patterns/cute_worms.jpg
deleted file mode 100644
index 0c9f4fbb..00000000
Binary files a/assets/patterns/cute_worms.jpg and /dev/null differ
diff --git a/assets/patterns/flash_cross_axis.jpg b/assets/patterns/flash_cross_axis.jpg
deleted file mode 100644
index c6e52283..00000000
Binary files a/assets/patterns/flash_cross_axis.jpg and /dev/null differ
diff --git a/assets/patterns/memphis_shapes.jpg b/assets/patterns/memphis_shapes.jpg
deleted file mode 100644
index 2db8e775..00000000
Binary files a/assets/patterns/memphis_shapes.jpg and /dev/null differ
diff --git a/assets/patterns/oval_gloomy.jpg b/assets/patterns/oval_gloomy.jpg
deleted file mode 100644
index b44bf945..00000000
Binary files a/assets/patterns/oval_gloomy.jpg and /dev/null differ
diff --git a/assets/patterns/oval_sunny.jpg b/assets/patterns/oval_sunny.jpg
deleted file mode 100644
index bc07ae83..00000000
Binary files a/assets/patterns/oval_sunny.jpg and /dev/null differ
diff --git a/assets/patterns/red_nimbuses.jpg b/assets/patterns/red_nimbuses.jpg
deleted file mode 100644
index 6527999c..00000000
Binary files a/assets/patterns/red_nimbuses.jpg and /dev/null differ
diff --git a/assets/patterns/tree_bark.jpg b/assets/patterns/tree_bark.jpg
deleted file mode 100644
index 0dac37d7..00000000
Binary files a/assets/patterns/tree_bark.jpg and /dev/null differ
diff --git a/assets/patterns/vibrant_pentagons.jpg b/assets/patterns/vibrant_pentagons.jpg
deleted file mode 100644
index d9e8d537..00000000
Binary files a/assets/patterns/vibrant_pentagons.jpg and /dev/null differ
diff --git a/assets/patterns/wiring_pattern.jpg b/assets/patterns/wiring_pattern.jpg
deleted file mode 100644
index 9fc3b781..00000000
Binary files a/assets/patterns/wiring_pattern.jpg and /dev/null differ
diff --git a/assets/patterns/zigzags_gloomy.jpg b/assets/patterns/zigzags_gloomy.jpg
deleted file mode 100644
index c6ccd2a3..00000000
Binary files a/assets/patterns/zigzags_gloomy.jpg and /dev/null differ
diff --git a/assets/patterns/zigzags_sunny.jpg b/assets/patterns/zigzags_sunny.jpg
deleted file mode 100644
index 7470d5ef..00000000
Binary files a/assets/patterns/zigzags_sunny.jpg and /dev/null differ
diff --git a/assets/spotube-logo-foreground.jpg b/assets/spotube-logo-foreground.jpg
deleted file mode 100644
index 0af774c9..00000000
Binary files a/assets/spotube-logo-foreground.jpg and /dev/null differ
diff --git a/assets/spotube-logo-macos.png b/assets/spotube-logo-macos.png
deleted file mode 100644
index b14a7691..00000000
Binary files a/assets/spotube-logo-macos.png and /dev/null differ
diff --git a/assets/spotube-logo.bmp b/assets/spotube-logo.bmp
deleted file mode 100644
index c3503e85..00000000
Binary files a/assets/spotube-logo.bmp and /dev/null differ
diff --git a/assets/spotube-logo.ico b/assets/spotube-logo.ico
deleted file mode 100644
index 84906308..00000000
Binary files a/assets/spotube-logo.ico and /dev/null differ
diff --git a/assets/spotube-logo_android12.png b/assets/spotube-logo_android12.png
deleted file mode 100644
index f04e25b0..00000000
Binary files a/assets/spotube-logo_android12.png and /dev/null differ
diff --git a/assets/spotube-nightly-logo-foreground.jpg b/assets/spotube-nightly-logo-foreground.jpg
deleted file mode 100644
index a0c849b6..00000000
Binary files a/assets/spotube-nightly-logo-foreground.jpg and /dev/null differ
diff --git a/assets/spotube-nightly-logo.png b/assets/spotube-nightly-logo.png
deleted file mode 100644
index ea7a8b20..00000000
Binary files a/assets/spotube-nightly-logo.png and /dev/null differ
diff --git a/assets/spotube-nightly-logo.svg b/assets/spotube-nightly-logo.svg
deleted file mode 100644
index 7601108e..00000000
--- a/assets/spotube-nightly-logo.svg
+++ /dev/null
@@ -1,359 +0,0 @@
-
-
diff --git a/assets/spotube-nightly-logo_android12.png b/assets/spotube-nightly-logo_android12.png
deleted file mode 100644
index 1a5bf4f1..00000000
Binary files a/assets/spotube-nightly-logo_android12.png and /dev/null differ
diff --git a/assets/spotube-tall-capsule.png b/assets/spotube-tall-capsule.png
deleted file mode 100644
index 43fb8229..00000000
Binary files a/assets/spotube-tall-capsule.png and /dev/null differ
diff --git a/assets/spotube-wide-capsule-large.png b/assets/spotube-wide-capsule-large.png
deleted file mode 100644
index 09a93d83..00000000
Binary files a/assets/spotube-wide-capsule-large.png and /dev/null differ
diff --git a/assets/spotube-wide-capsule-small.png b/assets/spotube-wide-capsule-small.png
deleted file mode 100644
index 17566550..00000000
Binary files a/assets/spotube-wide-capsule-small.png and /dev/null differ
diff --git a/assets/spotube_banner.png b/assets/spotube_banner.png
deleted file mode 100644
index b2be4539..00000000
Binary files a/assets/spotube_banner.png and /dev/null differ
diff --git a/assets/success.png b/assets/success.png
deleted file mode 100644
index 65cdba35..00000000
Binary files a/assets/success.png and /dev/null differ
diff --git a/assets/tutorial/step-1.png b/assets/tutorial/step-1.png
deleted file mode 100644
index 1182f054..00000000
Binary files a/assets/tutorial/step-1.png and /dev/null differ
diff --git a/assets/tutorial/step-2.png b/assets/tutorial/step-2.png
deleted file mode 100644
index af4616b0..00000000
Binary files a/assets/tutorial/step-2.png and /dev/null differ
diff --git a/assets/tutorial/step-3.png b/assets/tutorial/step-3.png
deleted file mode 100644
index ddbea140..00000000
Binary files a/assets/tutorial/step-3.png and /dev/null differ
diff --git a/aur-struct/.SRCINFO b/aur-struct/.SRCINFO
index 772594f6..0460932b 100644
--- a/aur-struct/.SRCINFO
+++ b/aur-struct/.SRCINFO
@@ -1,5 +1,5 @@
pkgbase = spotube-bin
-pkgdesc = Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
+pkgdesc = Open source Music client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
pkgver = 4.0.0
pkgrel = 1
url = https://spotube.krtirtho.dev
diff --git a/aur-struct/PKGBUILD b/aur-struct/PKGBUILD
index cf6c0134..4f884f0d 100644
--- a/aur-struct/PKGBUILD
+++ b/aur-struct/PKGBUILD
@@ -3,7 +3,7 @@ pkgname=spotube-bin
pkgver=%{{SPOTUBE_VERSION}}%
pkgrel=%{{PKGREL}}%
epoch=
-pkgdesc="Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!"
+pkgdesc="Open source Music client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!"
arch=(x86_64)
url="https://spotube.krtirtho.dev"
license=('BSD-4-Clause')
diff --git a/choco-struct/spotube.nuspec b/choco-struct/spotube.nuspec
index 1ebcd3c7..40941c08 100644
--- a/choco-struct/spotube.nuspec
+++ b/choco-struct/spotube.nuspec
@@ -15,7 +15,7 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t
Kingkor Roy Tirtho
https://spotube.krtirtho.dev
- https://rawcdn.githack.com/KRTirtho/spotube/7edb0bb834eb18c05551e30a891720a6abf53dbe/assets/spotube-logo.png
+ https://rawcdn.githack.com/KRTirtho/spotube/7edb0bb834eb18c05551e30a891720a6abf53dbe/assets/branding/spotube-logo.png
2022 Spotube
https://github.com/KRTirtho/spotube/blob/master/LICENSE
@@ -23,12 +23,13 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t
https://github.com/KRTirtho/spotube
https://spotube.krtirtho.dev
https://github.com/KRTirtho/spotube/issues/new
- spotube music audio spotify youtube flutter
- 🎧 Open source Spotify client that doesn't require Premium nor uses Electron! Available
+ spotube music audio youtube flutter
+ 🎧 Open source music client that doesn't require Premium nor uses Electron! Available
for both desktop & mobile!
- Spotube is a Flutter based lightweight spotify client. It utilizes the power
- of Spotify & Youtube's public API & creates a hazardless, performant & resource
+ Spotube is a Flutter based lightweight music client. It utilizes the power
+ of music metadata providers & Youtube's public API & creates a hazardless, performant
+ & resource
friendly User Experience
# Features
@@ -40,10 +41,9 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t
- Native performance (Thanks to Flutter+Skia)
- Playback control is done locally instead of on the server
- Small size & less data usage
- - No Spotify or YouTube ads since it uses all public & free APIs (It is still recommended
+ - No ads since it uses all public & free APIs (It is still recommended
to support the creators by watching/liking/subscribing to the artists' YouTube channels or
- liking their tracks on Spotify. Purchasing Spotify Premium is usually the best way to support
- their valuable creations.)
+ liking their tracks on different music platforms.)
- Time synced lyrics
- Downloadable tracks
diff --git a/cli/commands/build/linux.dart b/cli/commands/build/linux.dart
index 3fd8a0b9..378f5a72 100644
--- a/cli/commands/build/linux.dart
+++ b/cli/commands/build/linux.dart
@@ -74,7 +74,7 @@ class LinuxBuildCommand extends Command with BuildCommandCommonSteps {
).copy(
join(tempDir, "com.github.KRTirtho.Spotube.appdata.xml"),
);
- await File(join(cwd.path, "assets", "spotube-logo.png")).copy(
+ await File(join(cwd.path, "assets", "branding", "spotube-logo.png")).copy(
join(tempDir, "spotube-logo.png"),
);
diff --git a/cliff.toml b/cliff.toml
new file mode 100644
index 00000000..688ecfbb
--- /dev/null
+++ b/cliff.toml
@@ -0,0 +1,92 @@
+# git-cliff ~ configuration file
+# https://git-cliff.org/docs/configuration
+
+
+[changelog]
+# A Tera template to be rendered for each release in the changelog.
+# See https://keats.github.io/tera/docs/#introduction
+body = """
+{% if version %}\
+ ## [{{ version | trim_start_matches(pat="v") }}](/compare/v{{ previous.version | trim_start_matches(pat="v") }}...v{{ version | trim_start_matches(pat="v") }}) ({{ timestamp | date(format="%Y-%m-%d") }})
+{% else %}\
+ ## [unreleased]
+{% endif %}\
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | striptags | trim | upper_first }}
+ {% for commit in commits %}
+ - {% if commit.scope %}**{{ commit.scope }}**: {% endif %}\
+ {% if commit.breaking %}[**breaking**] {% endif %}\
+ {{ commit.message | upper_first }}\
+ {% endfor %}
+{% endfor %}
+"""
+# Remove leading and trailing whitespaces from the changelog's body.
+trim = true
+# Render body even when there are no releases to process.
+render_always = true
+# An array of regex based postprocessors to modify the changelog.
+postprocessors = [
+ # Replace the placeholder with a URL.
+ { pattern = '', replace = "https://github.com/KRTirtho/spotube" },
+]
+# render body even when there are no releases to process
+# render_always = true
+# output file path
+# output = "test.md"
+
+[git]
+# Parse commits according to the conventional commits specification.
+# See https://www.conventionalcommits.org
+conventional_commits = true
+# Exclude commits that do not match the conventional commits specification.
+filter_unconventional = true
+# Require all commits to be conventional.
+# Takes precedence over filter_unconventional.
+require_conventional = false
+# Split commits on newlines, treating each line as an individual commit.
+split_commits = false
+# An array of regex based parsers to modify commit messages prior to further processing.
+commit_preprocessors = [
+ # Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
+ { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" },
+ # Check spelling of the commit message using https://github.com/crate-ci/typos.
+ # If the spelling is incorrect, it will be fixed automatically.
+ #{ pattern = '.*', replace_command = 'typos --write-changes -' },
+]
+# Prevent commits that are breaking from being excluded by commit parsers.
+protect_breaking_commits = false
+# An array of regex based parsers for extracting data from the commit message.
+# Assigns commits to groups.
+# Optionally sets the commit's scope and can decide to exclude commits from further processing.
+commit_parsers = [
+ { message = "^feat", group = "Features" },
+ { message = "^fix", group = "Bug Fixes" },
+ # { message = "^doc", group = "📚 Documentation" },
+ # { message = "^perf", group = "⚡ Performance" },
+ # { message = "^refactor", group = "🚜 Refactor" },
+ # { message = "^style", group = "🎨 Styling" },
+ # { message = "^test", group = "🧪 Testing" },
+ # { message = "^chore\\(release\\): prepare for", skip = true },
+ # { message = "^chore\\(deps.*\\)", skip = true },
+ # { message = "^chore\\(pr\\)", skip = true },
+ # { message = "^chore\\(pull\\)", skip = true },
+ # { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" },
+ # { body = ".*security", group = "🛡️ Security" },
+ # { message = "^revert", group = "◀️ Revert" },
+ # { message = ".*", group = "💼 Other" },
+]
+# Exclude commits that are not matched by any commit parser.
+filter_commits = true
+# An array of link parsers for extracting external references, and turning them into URLs, using regex.
+link_parsers = []
+# Include only the tags that belong to the current branch.
+use_branch_tags = false
+# Order releases topologically instead of chronologically.
+topo_order = false
+# Order releases topologically instead of chronologically.
+topo_order_commits = true
+# Order of commits in each group/release within the changelog.
+# Allowed values: newest, oldest
+sort_commits = "oldest"
+# Process submodules commits
+recurse_submodules = false
diff --git a/drift_schemas/app_db/drift_schema_v5.json b/drift_schemas/app_db/drift_schema_v5.json
new file mode 100644
index 00000000..eefe0205
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v5.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(\"Orange:0xFFf97315\")","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":"youtube_client_engine","getter_name":"youtubeClientEngine","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(YoutubeClientEngine.youtubeExplode.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(YoutubeClientEngine.values)","dart_type_name":"YoutubeClientEngine"}},{"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/drift_schemas/app_db/drift_schema_v6.json b/drift_schemas/app_db/drift_schema_v6.json
new file mode 100644
index 00000000..8a646be1
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v6.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(\"Orange:0xFFf97315\")","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":"youtube_client_engine","getter_name":"youtubeClientEngine","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(YoutubeClientEngine.youtubeExplode.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(YoutubeClientEngine.values)","dart_type_name":"YoutubeClientEngine"}},{"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":"connect_port","getter_name":"connectPort","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const Constant(-1)","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/drift_schemas/app_db/drift_schema_v7.json b/drift_schemas/app_db/drift_schema_v7.json
new file mode 100644
index 00000000..d6644857
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v7.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(\"Orange:0xFFf97315\")","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":"youtube_client_engine","getter_name":"youtubeClientEngine","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(YoutubeClientEngine.youtubeExplode.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(YoutubeClientEngine.values)","dart_type_name":"YoutubeClientEngine"}},{"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":"connect_port","getter_name":"connectPort","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const Constant(-1)","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"}},{"name":"tracks","getter_name":"tracks","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"[]\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeTrackObjectListConverter()","dart_type_name":"List"}},{"name":"current_index","getter_name":"currentIndex","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const Constant(0)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"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":8,"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":9,"references":[],"type":"table","data":{"name":"metadata_plugins_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":[{"allowed-lengths":{"min":1,"max":50}}]},{"name":"description","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"version","getter_name":"version","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"author","getter_name":"author","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"entry_point","getter_name":"entryPoint","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"apis","getter_name":"apis","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"}},{"name":"abilities","getter_name":"abilities","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"}},{"name":"selected","getter_name":"selected","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"selected\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"selected\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"repository","getter_name":"repository","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"plugin_api_version","getter_name":"pluginApiVersion","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":11,"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_v8.json b/drift_schemas/app_db/drift_schema_v8.json
new file mode 100644
index 00000000..b2cc7428
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v8.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(\"Orange:0xFFf97315\")","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":"youtube_client_engine","getter_name":"youtubeClientEngine","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(YoutubeClientEngine.youtubeExplode.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(YoutubeClientEngine.values)","dart_type_name":"YoutubeClientEngine"}},{"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":"connect_port","getter_name":"connectPort","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const Constant(-1)","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"}},{"name":"tracks","getter_name":"tracks","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"[]\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeTrackObjectListConverter()","dart_type_name":"List"}},{"name":"current_index","getter_name":"currentIndex","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const Constant(0)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"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":8,"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":9,"references":[],"type":"table","data":{"name":"metadata_plugins_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":[{"allowed-lengths":{"min":1,"max":50}}]},{"name":"description","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"version","getter_name":"version","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"author","getter_name":"author","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"entry_point","getter_name":"entryPoint","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"apis","getter_name":"apis","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"}},{"name":"abilities","getter_name":"abilities","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"}},{"name":"selected","getter_name":"selected","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"selected\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"selected\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"repository","getter_name":"repository","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"plugin_api_version","getter_name":"pluginApiVersion","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('1.0.0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":11,"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/flutter_launcher_icons-nightly.yaml b/flutter_launcher_icons-nightly.yaml
index c6892d4b..9e4e805c 100644
--- a/flutter_launcher_icons-nightly.yaml
+++ b/flutter_launcher_icons-nightly.yaml
@@ -1,6 +1,6 @@
flutter_launcher_icons:
android: true
ios: true
- image_path: "assets/spotube-nightly-logo.png"
- adaptive_icon_foreground: "assets/spotube-nightly-logo-foreground.jpg"
+ image_path: "assets/branding/spotube-nightly-logo.png"
+ adaptive_icon_foreground: "assets/branding/spotube-nightly-logo-foreground.png"
adaptive_icon_background: "#242832"
diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml
index 372117b1..e5b26882 100644
--- a/flutter_launcher_icons.yaml
+++ b/flutter_launcher_icons.yaml
@@ -1,19 +1,19 @@
# flutter pub run flutter_launcher_icons
flutter_launcher_icons:
- image_path: "assets/spotube-logo.png"
+ image_path: "assets/branding/spotube-logo.png"
android: true
- # image_path_android: "assets/icon/icon.png"
+ # image_path_android: "assets/branding/icon/icon.png"
min_sdk_android: 21 # android min sdk min:16, default 21
adaptive_icon_background: "#242832"
- adaptive_icon_foreground: "assets/spotube-logo-foreground.jpg"
- # adaptive_icon_monochrome: "assets/icon/monochrome.png"
+ adaptive_icon_foreground: "assets/branding/spotube-logo-foreground.png"
+ # adaptive_icon_monochrome: "assets/branding/icon/monochrome.png"
ios: true
- # image_path_ios: "assets/icon/icon.png"
+ # image_path_ios: "assets/branding/icon/icon.png"
remove_alpha_channel_ios: true
- # image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
- # image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
+ # image_path_ios_dark_transparent: "assets/branding/icon/icon_dark.png"
+ # image_path_ios_tinted_grayscale: "assets/branding/icon/icon_tinted.png"
# desaturate_tinted_to_grayscale_ios: true
web:
@@ -21,9 +21,9 @@ flutter_launcher_icons:
windows:
generate: true
- image_path: "assets/spotube-logo.png"
+ image_path: "assets/branding/spotube-logo.png"
icon_size: 48 # min:48, max:256, default: 48
macos:
generate: true
- image_path: "assets/spotube-logo-macos.png"
+ image_path: "assets/branding/spotube-logo-macos.png"
diff --git a/flutter_native_splash-nightly.yaml b/flutter_native_splash-nightly.yaml
index 37da37d9..3b7daeec 100644
--- a/flutter_native_splash-nightly.yaml
+++ b/flutter_native_splash-nightly.yaml
@@ -1,9 +1,9 @@
flutter_native_splash:
- background_image: assets/bengali-patterns-bg.jpg
- image: assets/spotube-nightly-logo.png
- branding: assets/branding.png
+ background_image: assets/images/bengali-patterns-bg.jpg
+ image: assets/branding/spotube-nightly-logo.png
+ branding: assets/branding/branding.png
android_12:
- image: assets/spotube-nightly-logo_android12.png
- branding: assets/branding.png
+ image: assets/branding/spotube-nightly-logo_android12.png
+ branding: assets/branding/branding.png
color: "#000000"
icon_background_color: "#000000"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index bbfc1404..88a40d6f 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -2135,7 +2135,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2159,7 +2159,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2183,7 +2183,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2207,7 +2207,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2230,7 +2230,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2253,7 +2253,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2276,7 +2276,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2299,7 +2299,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2322,7 +2322,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2472,7 +2472,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2617,7 +2617,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2759,7 +2759,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -2781,9 +2781,9 @@
E612EC4A2D0F07AD0022720C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -2824,9 +2824,9 @@
E612EC4B2D0F07AD0022720C /* Debug-nightly */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -2867,9 +2867,9 @@
E612EC4C2D0F07AD0022720C /* Debug-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -2910,9 +2910,9 @@
E612EC4D2D0F07AD0022720C /* Debug-stable */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -2953,9 +2953,9 @@
E612EC4E2D0F07AD0022720C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -2993,9 +2993,9 @@
E612EC4F2D0F07AD0022720C /* Release-nightly */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3033,9 +3033,9 @@
E612EC502D0F07AD0022720C /* Release-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3073,9 +3073,9 @@
E612EC512D0F07AD0022720C /* Release-stable */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3113,9 +3113,9 @@
E612EC522D0F07AD0022720C /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3153,9 +3153,9 @@
E612EC532D0F07AD0022720C /* Profile-nightly */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3193,9 +3193,9 @@
E612EC542D0F07AD0022720C /* Profile-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -3233,9 +3233,9 @@
E612EC552D0F07AD0022720C /* Profile-stable */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png
index dbc4596b..2185c35d 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png
index 4836771d..172bc383 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png
index 90954ce9..876617d9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png
index 9c0ebd5f..fec86d87 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png
index 94cd79be..fbb0f45a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png
index ff70cab7..854e1e45 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png
index 6cdda1b6..420d2a17 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png
index 90954ce9..876617d9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png
index 5184f84f..6b7a608d 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png
index 57e21a75..d871fa3f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png
index 93e157b6..e77b38df 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png
index d175beb2..358cb28f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png
index 6d634c87..87f4290b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png
index 22da4950..53c10a09 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png
index 57e21a75..d871fa3f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png
index 3cfd01c2..4bb39789 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png
index a826bb73..8164cc67 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png
index 3a8a7832..e58ef25f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png
index f233322b..f5e1ae5a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png
index 2f5b082a..99bd36c9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png
index e4ecc19a..8d199658 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index 05843b52..d0d98aa1 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1 +1 @@
-{"images":[{"size":"20x20","idiom":"iphone","filename":"AppIcon-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"AppIcon-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-40x40@3x.png","scale":"3x"},{"size":"50x50","idiom":"ipad","filename":"AppIcon-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"AppIcon-50x50@2x.png","scale":"2x"},{"size":"57x57","idiom":"iphone","filename":"AppIcon-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"AppIcon-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-40x40@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"AppIcon-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"AppIcon-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"AppIcon-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppIcon-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
+{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..59407b44
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..5eacaa5f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..bbb9f839
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..28d0d8a8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..b1df0e72
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..24b76e25
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..5c0b6d57
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..bbb9f839
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..bdc5656b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..c03c89fe
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
new file mode 100644
index 00000000..40b88968
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
new file mode 100644
index 00000000..2050f427
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
new file mode 100644
index 00000000..d1ccab30
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
new file mode 100644
index 00000000..47c629f3
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..c03c89fe
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..22d28c12
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
new file mode 100644
index 00000000..c9e5cfad
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
new file mode 100644
index 00000000..3450fb00
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..3dd3eda3
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..2e69c843
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..f769eb6e
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png
index 5a197da3..3ff2a2da 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png and b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png
index efc7e6c8..8e2bb197 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png and b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png
index 593877e0..d301093a 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png and b/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage.png b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage.png
index 80579983..3ff2a2da 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage.png and b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@2x.png b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@2x.png
index 0bcf138d..8e2bb197 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@2x.png and b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@3x.png b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@3x.png
index c7d01776..d301093a 100644
Binary files a/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@3x.png and b/ios/Runner/Assets.xcassets/BrandingImageNightly.imageset/BrandingImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
index 203fc77a..4bebb9de 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchBackgroundNightly.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackgroundNightly.imageset/background.png
index 203fc77a..4bebb9de 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchBackgroundNightly.imageset/background.png and b/ios/Runner/Assets.xcassets/LaunchBackgroundNightly.imageset/background.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
index c5e4aca0..6e04efdc 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
index 41222c6c..51a669aa 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
index 5ab19d32..cc79cb85 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage.png
index 86d3fe74..d8f7cc0e 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@2x.png
index dbb0ea02..17a2c373 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@3x.png
index 12eb5531..db53f016 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImageNightly.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
index 208e1c53..ec8a1de3 100644
--- a/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -22,7 +22,7 @@
-
+
diff --git a/ios/Runner/Base.lproj/LaunchScreenNightly.storyboard b/ios/Runner/Base.lproj/LaunchScreenNightly.storyboard
index 6869214f..645a417f 100644
--- a/ios/Runner/Base.lproj/LaunchScreenNightly.storyboard
+++ b/ios/Runner/Base.lproj/LaunchScreenNightly.storyboard
@@ -22,7 +22,7 @@
-
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 91b7ad94..8d6c09a2 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -1,82 +1,82 @@
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Spotube
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- spotube
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSRequiresIPhoneOS
-
- NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
- NSAllowsArbitraryLoadsForMedia
-
-
- NSCameraUsageDescription
- This app require access to the device camera
- NSMicrophoneUsageDescription
- This app does not require access to the device microphone
- NSPhotoLibraryUsageDescription
- This app require access to the photo library
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- audio
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIStatusBarHidden
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
- NSLocalNetworkUsageDescription
- To allow other devices on the network control playback of Spotube securely.
- NSBonjourServices
-
- _spotube._tcp
-
- UIFileSharingEnabled
-
- LSSupportsOpeningDocumentsInPlace
-
- UISupportsDocumentBrowser
-
-
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Spotube
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ spotube
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+ NSAllowsArbitraryLoadsForMedia
+
+
+ NSCameraUsageDescription
+ This app require access to the device camera
+ NSMicrophoneUsageDescription
+ This app does not require access to the device microphone
+ NSPhotoLibraryUsageDescription
+ This app require access to the photo library
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ audio
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ NSLocalNetworkUsageDescription
+ To allow other devices on the network control playback of Spotube securely.
+ NSBonjourServices
+
+ _spotube._tcp
+
+ UIFileSharingEnabled
+
+ LSSupportsOpeningDocumentsInPlace
+
+ UISupportsDocumentBrowser
+
+
diff --git a/l10n.yaml b/l10n.yaml
index ffab1c86..d5911fe1 100644
--- a/l10n.yaml
+++ b/l10n.yaml
@@ -2,4 +2,3 @@ arb-dir: lib/l10n
template-arb-file: app_en.arb
output-dir: lib/l10n/generated
untranslated-messages-file: untranslated_messages.json
-synthetic-package: false
diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart
index 004001f2..31fb54b8 100644
--- a/lib/collections/assets.gen.dart
+++ b/lib/collections/assets.gen.dart
@@ -9,212 +9,89 @@
import 'package:flutter/widgets.dart';
-class $AssetsBackgroundsGen {
- const $AssetsBackgroundsGen();
+class $AssetsBrandingGen {
+ const $AssetsBrandingGen();
- /// File path: assets/backgrounds/xmas-effect.png
- AssetGenImage get xmasEffect =>
- const AssetGenImage('assets/backgrounds/xmas-effect.png');
+ /// File path: assets/branding/spotube-logo-light.png
+ AssetGenImage get spotubeLogoLight =>
+ const AssetGenImage('assets/branding/spotube-logo-light.png');
+
+ /// File path: assets/branding/spotube-logo.ico
+ String get spotubeLogoIco => 'assets/branding/spotube-logo.ico';
+
+ /// File path: assets/branding/spotube-logo.png
+ AssetGenImage get spotubeLogoPng =>
+ const AssetGenImage('assets/branding/spotube-logo.png');
/// List of all assets
- List get values => [xmasEffect];
+ List get values =>
+ [spotubeLogoLight, spotubeLogoIco, spotubeLogoPng];
}
-class $AssetsLogosGen {
- const $AssetsLogosGen();
+class $AssetsImagesGen {
+ const $AssetsImagesGen();
- /// File path: assets/logos/songlink-transparent.png
- AssetGenImage get songlinkTransparent =>
- const AssetGenImage('assets/logos/songlink-transparent.png');
+ /// File path: assets/images/album-placeholder.png
+ AssetGenImage get albumPlaceholder =>
+ const AssetGenImage('assets/images/album-placeholder.png');
- /// File path: assets/logos/songlink.png
- AssetGenImage get songlink =>
- const AssetGenImage('assets/logos/songlink.png');
+ /// File path: assets/images/bengali-patterns-bg.jpg
+ AssetGenImage get bengaliPatternsBg =>
+ const AssetGenImage('assets/images/bengali-patterns-bg.jpg');
- /// List of all assets
- List get values => [songlinkTransparent, songlink];
-}
+ /// File path: assets/images/liked-tracks.jpg
+ AssetGenImage get likedTracks =>
+ const AssetGenImage('assets/images/liked-tracks.jpg');
-class $AssetsPatternsGen {
- const $AssetsPatternsGen();
+ /// Directory path: assets/images/logos
+ $AssetsImagesLogosGen get logos => const $AssetsImagesLogosGen();
- /// File path: assets/patterns/black_white_visualized.jpg
- AssetGenImage get blackWhiteVisualized =>
- const AssetGenImage('assets/patterns/black_white_visualized.jpg');
+ /// File path: assets/images/placeholder.png
+ AssetGenImage get placeholder =>
+ const AssetGenImage('assets/images/placeholder.png');
- /// File path: assets/patterns/brazil_carnival.jpg
- AssetGenImage get brazilCarnival =>
- const AssetGenImage('assets/patterns/brazil_carnival.jpg');
-
- /// File path: assets/patterns/cotton_balls.jpg
- AssetGenImage get cottonBalls =>
- const AssetGenImage('assets/patterns/cotton_balls.jpg');
-
- /// File path: assets/patterns/cute_worms.jpg
- AssetGenImage get cuteWorms =>
- const AssetGenImage('assets/patterns/cute_worms.jpg');
-
- /// File path: assets/patterns/flash_cross_axis.jpg
- AssetGenImage get flashCrossAxis =>
- const AssetGenImage('assets/patterns/flash_cross_axis.jpg');
-
- /// File path: assets/patterns/memphis_shapes.jpg
- AssetGenImage get memphisShapes =>
- const AssetGenImage('assets/patterns/memphis_shapes.jpg');
-
- /// File path: assets/patterns/oval_gloomy.jpg
- AssetGenImage get ovalGloomy =>
- const AssetGenImage('assets/patterns/oval_gloomy.jpg');
-
- /// File path: assets/patterns/oval_sunny.jpg
- AssetGenImage get ovalSunny =>
- const AssetGenImage('assets/patterns/oval_sunny.jpg');
-
- /// File path: assets/patterns/red_nimbuses.jpg
- AssetGenImage get redNimbuses =>
- const AssetGenImage('assets/patterns/red_nimbuses.jpg');
-
- /// File path: assets/patterns/tree_bark.jpg
- AssetGenImage get treeBark =>
- const AssetGenImage('assets/patterns/tree_bark.jpg');
-
- /// File path: assets/patterns/vibrant_pentagons.jpg
- AssetGenImage get vibrantPentagons =>
- const AssetGenImage('assets/patterns/vibrant_pentagons.jpg');
-
- /// File path: assets/patterns/wiring_pattern.jpg
- AssetGenImage get wiringPattern =>
- const AssetGenImage('assets/patterns/wiring_pattern.jpg');
-
- /// File path: assets/patterns/zigzags_gloomy.jpg
- AssetGenImage get zigzagsGloomy =>
- const AssetGenImage('assets/patterns/zigzags_gloomy.jpg');
-
- /// File path: assets/patterns/zigzags_sunny.jpg
- AssetGenImage get zigzagsSunny =>
- const AssetGenImage('assets/patterns/zigzags_sunny.jpg');
+ /// File path: assets/images/user-placeholder.png
+ AssetGenImage get userPlaceholder =>
+ const AssetGenImage('assets/images/user-placeholder.png');
/// List of all assets
List get values => [
- blackWhiteVisualized,
- brazilCarnival,
- cottonBalls,
- cuteWorms,
- flashCrossAxis,
- memphisShapes,
- ovalGloomy,
- ovalSunny,
- redNimbuses,
- treeBark,
- vibrantPentagons,
- wiringPattern,
- zigzagsGloomy,
- zigzagsSunny
+ albumPlaceholder,
+ bengaliPatternsBg,
+ likedTracks,
+ placeholder,
+ userPlaceholder
];
}
-class $AssetsTutorialGen {
- const $AssetsTutorialGen();
+class $AssetsImagesLogosGen {
+ const $AssetsImagesLogosGen();
- /// File path: assets/tutorial/step-1.png
- AssetGenImage get step1 => const AssetGenImage('assets/tutorial/step-1.png');
+ /// File path: assets/images/logos/invidious.jpg
+ AssetGenImage get invidious =>
+ const AssetGenImage('assets/images/logos/invidious.jpg');
- /// File path: assets/tutorial/step-2.png
- AssetGenImage get step2 => const AssetGenImage('assets/tutorial/step-2.png');
+ /// File path: assets/images/logos/jiosaavn.png
+ AssetGenImage get jiosaavn =>
+ const AssetGenImage('assets/images/logos/jiosaavn.png');
- /// File path: assets/tutorial/step-3.png
- AssetGenImage get step3 => const AssetGenImage('assets/tutorial/step-3.png');
+ /// File path: assets/images/logos/songlink-transparent.png
+ AssetGenImage get songlinkTransparent =>
+ const AssetGenImage('assets/images/logos/songlink-transparent.png');
/// List of all assets
- List get values => [step1, step2, step3];
+ List get values => [invidious, jiosaavn, songlinkTransparent];
}
class Assets {
Assets._();
static const String license = 'LICENSE';
- static const AssetGenImage albumPlaceholder =
- AssetGenImage('assets/album-placeholder.png');
- static const $AssetsBackgroundsGen backgrounds = $AssetsBackgroundsGen();
- static const AssetGenImage bengaliPatternsBg =
- 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');
- static const $AssetsLogosGen logos = $AssetsLogosGen();
- static const $AssetsPatternsGen patterns = $AssetsPatternsGen();
- static const AssetGenImage placeholder =
- AssetGenImage('assets/placeholder.png');
- static const AssetGenImage spotubeHeroBanner =
- AssetGenImage('assets/spotube-hero-banner.png');
- static const AssetGenImage spotubeLogoForeground =
- AssetGenImage('assets/spotube-logo-foreground.jpg');
- static const AssetGenImage spotubeLogoMacos =
- AssetGenImage('assets/spotube-logo-macos.png');
- static const AssetGenImage spotubeLogoBmp =
- AssetGenImage('assets/spotube-logo.bmp');
- static const String spotubeLogoIco = 'assets/spotube-logo.ico';
- static const AssetGenImage spotubeLogoPng =
- AssetGenImage('assets/spotube-logo.png');
- static const String spotubeLogoSvg = 'assets/spotube-logo.svg';
- static const AssetGenImage spotubeLogoAndroid12 =
- AssetGenImage('assets/spotube-logo_android12.png');
- static const AssetGenImage spotubeNightlyLogoForeground =
- AssetGenImage('assets/spotube-nightly-logo-foreground.jpg');
- static const AssetGenImage spotubeNightlyLogoPng =
- AssetGenImage('assets/spotube-nightly-logo.png');
- static const String spotubeNightlyLogoSvg = 'assets/spotube-nightly-logo.svg';
- static const AssetGenImage spotubeNightlyLogoAndroid12 =
- AssetGenImage('assets/spotube-nightly-logo_android12.png');
- static const AssetGenImage spotubeScreenshot =
- AssetGenImage('assets/spotube-screenshot.png');
- static const AssetGenImage spotubeTallCapsule =
- AssetGenImage('assets/spotube-tall-capsule.png');
- static const AssetGenImage spotubeWideCapsuleLarge =
- AssetGenImage('assets/spotube-wide-capsule-large.png');
- static const AssetGenImage spotubeWideCapsuleSmall =
- AssetGenImage('assets/spotube-wide-capsule-small.png');
- static const AssetGenImage spotubeBanner =
- AssetGenImage('assets/spotube_banner.png');
- static const AssetGenImage success = AssetGenImage('assets/success.png');
- static const $AssetsTutorialGen tutorial = $AssetsTutorialGen();
- static const AssetGenImage userPlaceholder =
- AssetGenImage('assets/user-placeholder.png');
+ static const $AssetsBrandingGen branding = $AssetsBrandingGen();
+ static const $AssetsImagesGen images = $AssetsImagesGen();
/// List of all assets
- static List get values => [
- license,
- albumPlaceholder,
- bengaliPatternsBg,
- branding,
- emptyBox,
- invidious,
- jiosaavn,
- likedTracks,
- placeholder,
- spotubeHeroBanner,
- spotubeLogoForeground,
- spotubeLogoMacos,
- spotubeLogoBmp,
- spotubeLogoIco,
- spotubeLogoPng,
- spotubeLogoSvg,
- spotubeLogoAndroid12,
- spotubeNightlyLogoForeground,
- spotubeNightlyLogoPng,
- spotubeNightlyLogoSvg,
- spotubeNightlyLogoAndroid12,
- spotubeScreenshot,
- spotubeTallCapsule,
- spotubeWideCapsuleLarge,
- spotubeWideCapsuleSmall,
- spotubeBanner,
- success,
- userPlaceholder
- ];
+ static List get values => [license];
}
class AssetGenImage {
diff --git a/lib/collections/env.dart b/lib/collections/env.dart
index feb2a2db..52ef2bbf 100644
--- a/lib/collections/env.dart
+++ b/lib/collections/env.dart
@@ -10,9 +10,6 @@ enum ReleaseChannel {
@Envied(obfuscate: true, requireEnvFile: true, path: ".env")
abstract class Env {
- @EnviedField(varName: 'SPOTIFY_SECRETS')
- static final String rawSpotifySecrets = _Env.rawSpotifySecrets;
-
@EnviedField(varName: 'LASTFM_API_KEY')
static final String lastFmApiKey = _Env.lastFmApiKey;
@@ -24,25 +21,12 @@ abstract class Env {
static bool get hideDonations => _hideDonations == 1;
- static final spotifySecrets = rawSpotifySecrets.split(',').map((e) {
- final secrets = e.trim().split(":").map((e) => e.trim());
- return {
- "clientId": secrets.first,
- "clientSecret": secrets.last,
- };
- }).toList();
-
@EnviedField(varName: 'ENABLE_UPDATE_CHECK', defaultValue: "1")
static final String _enableUpdateChecker = _Env._enableUpdateChecker;
@EnviedField(varName: "RELEASE_CHANNEL", defaultValue: "nightly")
static final String _releaseChannel = _Env._releaseChannel;
- @EnviedField(varName: "DISABLE_SPOTIFY_IMAGES", defaultValue: "0")
- static final String _disableSpotifyImages = _Env._disableSpotifyImages;
-
- static bool get disableSpotifyImages => _disableSpotifyImages == "1";
-
static ReleaseChannel get releaseChannel => _releaseChannel == "stable"
? ReleaseChannel.stable
: ReleaseChannel.nightly;
diff --git a/lib/collections/fake.dart b/lib/collections/fake.dart
index 31f97e0c..7d201ae2 100644
--- a/lib/collections/fake.dart
+++ b/lib/collections/fake.dart
@@ -1,230 +1,112 @@
-import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart';
-import 'package:spotube/models/spotify/home_feed.dart';
-import 'package:spotube/models/spotify_friends.dart';
+import 'package:spotube/models/metadata/metadata.dart';
import 'package:spotube/provider/history/summary.dart';
abstract class FakeData {
- static final Image image = Image()
- ..height = 1
- ..width = 1
- ..url = "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg";
+ static final SpotubeImageObject image = SpotubeImageObject(
+ height: 100,
+ width: 100,
+ url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg",
+ );
- static final Followers followers = Followers()
- ..href = "text"
- ..total = 1;
-
- static final Artist artist = Artist()
- ..id = "1"
- ..name = "Wow artist Good!"
- ..images = [image]
- ..popularity = 1
- ..type = "type"
- ..uri = "uri"
- ..externalUrls = externalUrls
- ..genres = ["genre"]
- ..href = "text"
- ..followers = followers;
-
- static final externalIds = ExternalIds()
- ..isrc = "text"
- ..ean = "text"
- ..upc = "text";
-
- static final externalUrls = ExternalUrls()..spotify = "text";
-
- static final Album album = Album()
- ..id = "1"
- ..genres = ["genre"]
- ..label = "label"
- ..popularity = 1
- ..albumType = AlbumType.album
- ..artists = [artist]
- ..availableMarkets = [Market.BD]
- ..externalUrls = externalUrls
- ..href = "text"
- ..images = [image]
- ..name = "Another good album"
- ..releaseDate = "2021-01-01"
- ..releaseDatePrecision = DatePrecision.day
- ..tracks = [track]
- ..type = "type"
- ..uri = "uri"
- ..externalIds = externalIds
- ..copyrights = [
- Copyright()
- ..type = CopyrightType.C
- ..text = "text",
- ];
-
- static final ArtistSimple artistSimple = ArtistSimple()
- ..id = "1"
- ..name = "What an artist"
- ..type = "type"
- ..uri = "uri"
- ..externalUrls = externalUrls;
-
- static final AlbumSimple albumSimple = AlbumSimple()
- ..id = "1"
- ..albumType = AlbumType.album
- ..artists = [artistSimple]
- ..availableMarkets = [Market.BD]
- ..externalUrls = externalUrls
- ..href = "text"
- ..images = [image]
- ..name = "A good album"
- ..releaseDate = "2021-01-01"
- ..releaseDatePrecision = DatePrecision.day
- ..type = "type"
- ..uri = "uri";
-
- static final Track track = Track()
- ..id = "1"
- ..artists = [artist, artist, artist]
- ..album = albumSimple
- ..availableMarkets = [Market.BD]
- ..discNumber = 1
- ..durationMs = 50000
- ..explicit = false
- ..externalUrls = externalUrls
- ..href = "text"
- ..name = "A Track Name"
- ..popularity = 1
- ..previewUrl = "url"
- ..trackNumber = 1
- ..type = "type"
- ..uri = "uri"
- ..isPlayable = true
- ..explicit = false
- ..linkedFrom = trackLink;
-
- static final TrackLink trackLink = TrackLink()
- ..id = "1"
- ..type = "type"
- ..uri = "uri"
- ..externalUrls = {"spotify": "text"}
- ..href = "text";
-
- static final Paging paging = Paging()
- ..href = "text"
- ..itemsNative = [track.toJson()]
- ..limit = 1
- ..next = "text"
- ..offset = 1
- ..previous = "text"
- ..total = 1;
-
- static final User user = User()
- ..id = "1"
- ..displayName = "Your Name"
- ..birthdate = "2021-01-01"
- ..country = Market.BD
- ..email = "test@email.com"
- ..followers = followers
- ..href = "text"
- ..images = [image]
- ..type = "type"
- ..uri = "uri";
-
- static final TracksLink tracksLink = TracksLink()
- ..href = "text"
- ..total = 1;
-
- static final Playlist playlist = Playlist()
- ..id = "1"
- ..collaborative = false
- ..description = "A very good playlist description"
- ..externalUrls = externalUrls
- ..followers = followers
- ..href = "text"
- ..images = [image]
- ..name = "A good playlist"
- ..owner = user
- ..public = true
- ..snapshotId = "text"
- ..tracks = paging
- ..tracksLink = tracksLink
- ..type = "type"
- ..uri = "uri";
-
- static final PlaylistSimple playlistSimple = PlaylistSimple()
- ..id = "1"
- ..collaborative = false
- ..externalUrls = externalUrls
- ..href = "text"
- ..images = [image]
- ..name = "A good playlist"
- ..owner = user
- ..public = true
- ..snapshotId = "text"
- ..tracksLink = tracksLink
- ..type = "type"
- ..description = "A very good playlist description"
- ..uri = "uri";
-
- static final Category category = Category()
- ..href = "text"
- ..icons = [image]
- ..id = "1"
- ..name = "category";
-
- static final friends = SpotifyFriends(
- friends: [
- for (var i = 0; i < 3; i++)
- SpotifyFriendActivity(
- user: const SpotifyFriend(
- name: "name",
- imageUrl: "imageUrl",
- uri: "uri",
- ),
- track: SpotifyActivityTrack(
- name: "name",
- artist: const SpotifyActivityArtist(
- name: "name",
- uri: "uri",
- ),
- album: const SpotifyActivityAlbum(
- name: "name",
- uri: "uri",
- ),
- context: SpotifyActivityContext(
- name: "name",
- index: i,
- uri: "uri",
- ),
- imageUrl: "imageUrl",
- uri: "uri",
- ),
- ),
+ static final SpotubeFullArtistObject artist = SpotubeFullArtistObject(
+ id: "1",
+ name: "What an artist",
+ externalUri: "https://example.com",
+ followers: 10000,
+ genres: ["genre"],
+ images: [
+ SpotubeImageObject(
+ height: 100,
+ width: 100,
+ url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg",
+ ),
],
);
- static final feedSection = SpotifyHomeFeedSection(
- typename: "HomeGenericSectionData",
- uri: "spotify:section:lol",
- title: "Dummy",
- items: [
- for (int i = 0; i < 10; i++)
- SpotifyHomeFeedSectionItem(
- typename: "PlaylistResponseWrapper",
- playlist: SpotifySectionPlaylist(
- name: "Playlist $i",
- description: "Really super important description $i",
- format: "daily-mix",
- images: [
- const SpotifySectionItemImage(
- height: 1,
- width: 1,
- url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg",
- ),
- ],
- owner: "Spotify",
- uri: "spotify:playlist:id",
- ),
- )
+ static final SpotubeFullAlbumObject album = SpotubeFullAlbumObject(
+ id: "1",
+ name: "A good album",
+ externalUri: "https://example.com",
+ artists: [artistSimple],
+ releaseDate: "2021-01-01",
+ albumType: SpotubeAlbumType.album,
+ images: [image],
+ totalTracks: 10,
+ genres: ["genre"],
+ recordLabel: "Record Label",
+ );
+
+ static final SpotubeSimpleArtistObject artistSimple =
+ SpotubeSimpleArtistObject(
+ id: "1",
+ name: "What an artist",
+ externalUri: "https://example.com",
+ images: null,
+ );
+
+ static final SpotubeSimpleAlbumObject albumSimple = SpotubeSimpleAlbumObject(
+ albumType: SpotubeAlbumType.album,
+ artists: [],
+ externalUri: "https://example.com",
+ id: "1",
+ name: "A good album",
+ releaseDate: "2021-01-01",
+ images: [
+ SpotubeImageObject(
+ height: 1,
+ width: 1,
+ url: "https://dummyimage.com/100x100/cfcfcf/cfcfcf.jpg",
+ )
],
);
+ static final SpotubeFullTrackObject track = SpotubeTrackObject.full(
+ id: "1",
+ name: "A good track",
+ externalUri: "https://example.com",
+ album: albumSimple,
+ durationMs: 3 * 60 * 1000, // 3 minutes
+ isrc: "USUM72112345",
+ explicit: false,
+ ) as SpotubeFullTrackObject;
+
+ static final SpotubeUserObject user = SpotubeUserObject(
+ id: "1",
+ name: "User Name",
+ externalUri: "https://example.com",
+ images: [image],
+ );
+
+ static final SpotubeFullPlaylistObject playlist = SpotubeFullPlaylistObject(
+ id: "1",
+ name: "A good playlist",
+ description: "A very good playlist description",
+ externalUri: "https://example.com",
+ collaborative: false,
+ public: true,
+ owner: user,
+ images: [image],
+ collaborators: [user]);
+
+ static final SpotubeSimplePlaylistObject playlistSimple =
+ SpotubeSimplePlaylistObject(
+ id: "1",
+ name: "A good playlist",
+ description: "A very good playlist description",
+ externalUri: "https://example.com",
+ owner: user,
+ images: [image],
+ );
+
+ static final SpotubeBrowseSectionObject browseSection =
+ SpotubeBrowseSectionObject(
+ id: "section-id",
+ title: "Browse Section",
+ browseMore: true,
+ externalUri: "https://example.com/browse/section",
+ items: [playlistSimple, playlistSimple, playlistSimple]);
+
static const historySummary = PlaybackHistorySummary(
albums: 1,
artists: 1,
diff --git a/lib/collections/fonts.gen.dart b/lib/collections/fonts.gen.dart
index 033d3a79..16cc6e82 100644
--- a/lib/collections/fonts.gen.dart
+++ b/lib/collections/fonts.gen.dart
@@ -13,6 +13,12 @@ class FontFamily {
/// Font family: BootstrapIcons
static const String bootstrapIcons = 'BootstrapIcons';
+ /// Font family: Cookie
+ static const String cookie = 'Cookie';
+
/// Font family: RadixIcons
static const String radixIcons = 'RadixIcons';
+
+ /// Font family: Ubuntu Mono
+ static const String ubuntuMono = 'Ubuntu Mono';
}
diff --git a/lib/collections/http-override.dart b/lib/collections/http-override.dart
new file mode 100644
index 00000000..3bf4f30e
--- /dev/null
+++ b/lib/collections/http-override.dart
@@ -0,0 +1,17 @@
+import 'dart:io';
+
+const allowList = [
+ "spotify.com",
+];
+
+class BadCertificateAllowlistOverrides extends HttpOverrides {
+ @override
+ HttpClient createHttpClient(SecurityContext? context) {
+ return super.createHttpClient(context)
+ ..badCertificateCallback = (X509Certificate cert, String host, int port) {
+ return allowList.any((allowedHost) {
+ return host.endsWith(allowedHost);
+ });
+ };
+ }
+}
diff --git a/lib/collections/intents.dart b/lib/collections/intents.dart
index e4e3fa07..42c580ca 100644
--- a/lib/collections/intents.dart
+++ b/lib/collections/intents.dart
@@ -75,7 +75,7 @@ class HomeTabAction extends Action {
router.navigate(const SearchRoute());
break;
case HomeTabs.lyrics:
- router.navigate(LyricsRoute());
+ router.navigate(const LyricsRoute());
break;
case HomeTabs.userPlaylists:
router.navigate(const UserPlaylistsRoute());
diff --git a/lib/collections/language_codes.dart b/lib/collections/language_codes.dart
index 75d1e65d..f97a16bf 100644
--- a/lib/collections/language_codes.dart
+++ b/lib/collections/language_codes.dart
@@ -137,6 +137,10 @@ abstract class LanguageLocals {
name: "Simplified Chinese",
nativeName: "简体中文",
),
+ "zh_TW": const ISOLanguageName(
+ name: "Traditional Chinese",
+ nativeName: "繁體中文(台灣)",
+ ),
// "cv": const ISOLanguageName(
// name: "Chuvash",
// nativeName: "чӑваш чӗлхи",
diff --git a/lib/collections/spotify_markets.dart b/lib/collections/markets.dart
similarity index 98%
rename from lib/collections/spotify_markets.dart
rename to lib/collections/markets.dart
index 514b3f0b..8398c662 100644
--- a/lib/collections/spotify_markets.dart
+++ b/lib/collections/markets.dart
@@ -1,8 +1,8 @@
// Country Codes contributed by momobobe
-import 'package:spotify/spotify.dart';
+import 'package:spotube/models/metadata/market.dart';
-final spotifyMarkets = [
+final marketsMap = [
(Market.AL, "Albania (AL)"),
(Market.DZ, "Algeria (DZ)"),
(Market.AD, "Andorra (AD)"),
diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart
index 543bc471..4dcd9657 100644
--- a/lib/collections/routes.dart
+++ b/lib/collections/routes.dart
@@ -3,7 +3,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/routes.gr.dart';
-import 'package:spotube/provider/authentication/authentication.dart';
+import 'package:spotube/provider/metadata_plugin/core/auth.dart';
import 'package:spotube/services/kv_store/kv_store.dart';
final rootNavigatorKey = GlobalKey();
@@ -28,9 +28,10 @@ class AppRouter extends RootStackRouter {
guards: [
AutoRouteGuardCallback(
(resolver, router) async {
- final auth = await ref.read(authenticationProvider.future);
+ final authenticated = await ref
+ .read(metadataPluginAuthenticatedProvider.future);
- if (auth == null && !KVStoreService.doneGettingStarted) {
+ if (!authenticated && !KVStoreService.doneGettingStarted) {
resolver.redirect(const GettingStartedRoute());
} else {
resolver.next(true);
@@ -40,16 +41,8 @@ class AppRouter extends RootStackRouter {
],
),
AutoRoute(
- path: "home/genres",
- page: GenreRoute.page,
- ),
- AutoRoute(
- path: "home/genre/:categoryId",
- page: GenrePlaylistsRoute.page,
- ),
- AutoRoute(
- path: "home/feeds/:feedId",
- page: HomeFeedSectionRoute.page,
+ path: "home/sections/:sectionId",
+ page: HomeBrowseSectionItemsRoute.page,
),
AutoRoute(
path: "search",
@@ -86,14 +79,6 @@ class AppRouter extends RootStackRouter {
page: LocalLibraryRoute.page,
// parentNavigatorKey: shellRouteNavigatorKey,
),
- AutoRoute(
- path: "library/generate",
- page: PlaylistGeneratorRoute.page,
- ),
- AutoRoute(
- path: "library/generate/result",
- page: PlaylistGenerateResultRoute.page,
- ),
AutoRoute(
path: "lyrics",
page: LyricsRoute.page,
@@ -102,6 +87,14 @@ class AppRouter extends RootStackRouter {
path: "settings",
page: SettingsRoute.page,
),
+ AutoRoute(
+ path: "settings/metadata-provider",
+ page: SettingsMetadataProviderRoute.page,
+ ),
+ AutoRoute(
+ path: "settings/metadata-provider/metadata-form",
+ page: SettingsMetadataProviderFormRoute.page,
+ ),
AutoRoute(
path: "settings/blacklist",
page: BlackListRoute.page,
@@ -115,6 +108,10 @@ class AppRouter extends RootStackRouter {
path: "settings/about",
page: AboutSpotubeRoute.page,
),
+ AutoRoute(
+ path: "settings/scrobbling",
+ page: SettingsScrobblingRoute.page,
+ ),
AutoRoute(
path: "album/:id",
page: AlbumRoute.page,
@@ -221,11 +218,6 @@ class AppRouter extends RootStackRouter {
page: GettingStartedRoute.page,
// parentNavigatorKey: rootNavigatorKey,
),
- AutoRoute(
- path: "/login",
- page: WebViewLoginRoute.page,
- // parentNavigatorKey: rootNavigatorKey,
- ),
AutoRoute(
path: "/lastfm-login",
page: LastFMLoginRoute.page,
diff --git a/lib/collections/routes.gr.dart b/lib/collections/routes.gr.dart
index 1d608896..e039abb9 100644
--- a/lib/collections/routes.gr.dart
+++ b/lib/collections/routes.gr.dart
@@ -8,62 +8,57 @@
// coverage:ignore-file
// ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'package:auto_route/auto_route.dart' as _i43;
-import 'package:flutter/material.dart' as _i44;
-import 'package:shadcn_flutter/shadcn_flutter.dart' as _i46;
-import 'package:spotify/spotify.dart' as _i45;
-import 'package:spotube/models/spotify/recommendation_seeds.dart' as _i47;
+import 'package:auto_route/auto_route.dart' as _i41;
+import 'package:flutter/material.dart' as _i42;
+import 'package:shadcn_flutter/shadcn_flutter.dart' as _i44;
+import 'package:spotube/models/metadata/metadata.dart' as _i43;
import 'package:spotube/pages/album/album.dart' as _i2;
import 'package:spotube/pages/artist/artist.dart' as _i3;
import 'package:spotube/pages/connect/connect.dart' as _i6;
import 'package:spotube/pages/connect/control/control.dart' as _i5;
-import 'package:spotube/pages/getting_started/getting_started.dart' as _i9;
-import 'package:spotube/pages/home/feed/feed_section.dart' as _i10;
-import 'package:spotube/pages/home/genres/genre_playlists.dart' as _i8;
-import 'package:spotube/pages/home/genres/genres.dart' as _i7;
-import 'package:spotube/pages/home/home.dart' as _i11;
-import 'package:spotube/pages/lastfm_login/lastfm_login.dart' as _i12;
-import 'package:spotube/pages/library/library.dart' as _i13;
-import 'package:spotube/pages/library/playlist_generate/playlist_generate.dart'
- as _i23;
-import 'package:spotube/pages/library/playlist_generate/playlist_generate_result.dart'
- as _i22;
-import 'package:spotube/pages/library/user_albums.dart' as _i37;
-import 'package:spotube/pages/library/user_artists.dart' as _i38;
-import 'package:spotube/pages/library/user_downloads.dart' as _i39;
+import 'package:spotube/pages/getting_started/getting_started.dart' as _i7;
+import 'package:spotube/pages/home/home.dart' as _i9;
+import 'package:spotube/pages/home/sections/section_items.dart' as _i8;
+import 'package:spotube/pages/lastfm_login/lastfm_login.dart' as _i10;
+import 'package:spotube/pages/library/library.dart' as _i11;
+import 'package:spotube/pages/library/user_albums.dart' as _i36;
+import 'package:spotube/pages/library/user_artists.dart' as _i37;
+import 'package:spotube/pages/library/user_downloads.dart' as _i38;
import 'package:spotube/pages/library/user_local_tracks/local_folder.dart'
- as _i15;
+ as _i13;
import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart'
- as _i40;
-import 'package:spotube/pages/library/user_playlists.dart' as _i41;
-import 'package:spotube/pages/lyrics/lyrics.dart' as _i17;
-import 'package:spotube/pages/lyrics/mini_lyrics.dart' as _i18;
-import 'package:spotube/pages/mobile_login/mobile_login.dart' as _i42;
-import 'package:spotube/pages/player/lyrics.dart' as _i19;
-import 'package:spotube/pages/player/queue.dart' as _i20;
-import 'package:spotube/pages/player/sources.dart' as _i21;
-import 'package:spotube/pages/playlist/liked_playlist.dart' as _i14;
-import 'package:spotube/pages/playlist/playlist.dart' as _i24;
-import 'package:spotube/pages/profile/profile.dart' as _i25;
-import 'package:spotube/pages/root/root_app.dart' as _i26;
-import 'package:spotube/pages/search/search.dart' as _i27;
+ as _i39;
+import 'package:spotube/pages/library/user_playlists.dart' as _i40;
+import 'package:spotube/pages/lyrics/lyrics.dart' as _i15;
+import 'package:spotube/pages/lyrics/mini_lyrics.dart' as _i16;
+import 'package:spotube/pages/player/lyrics.dart' as _i17;
+import 'package:spotube/pages/player/queue.dart' as _i18;
+import 'package:spotube/pages/player/sources.dart' as _i19;
+import 'package:spotube/pages/playlist/liked_playlist.dart' as _i12;
+import 'package:spotube/pages/playlist/playlist.dart' as _i20;
+import 'package:spotube/pages/profile/profile.dart' as _i21;
+import 'package:spotube/pages/root/root_app.dart' as _i22;
+import 'package:spotube/pages/search/search.dart' as _i23;
import 'package:spotube/pages/settings/about.dart' as _i1;
import 'package:spotube/pages/settings/blacklist.dart' as _i4;
-import 'package:spotube/pages/settings/logs.dart' as _i16;
-import 'package:spotube/pages/settings/settings.dart' as _i28;
-import 'package:spotube/pages/stats/albums/albums.dart' as _i29;
-import 'package:spotube/pages/stats/artists/artists.dart' as _i30;
-import 'package:spotube/pages/stats/fees/fees.dart' as _i34;
-import 'package:spotube/pages/stats/minutes/minutes.dart' as _i31;
-import 'package:spotube/pages/stats/playlists/playlists.dart' as _i33;
-import 'package:spotube/pages/stats/stats.dart' as _i32;
-import 'package:spotube/pages/stats/streams/streams.dart' as _i35;
-import 'package:spotube/pages/track/track.dart' as _i36;
+import 'package:spotube/pages/settings/logs.dart' as _i14;
+import 'package:spotube/pages/settings/metadata/metadata_form.dart' as _i24;
+import 'package:spotube/pages/settings/metadata_plugins.dart' as _i25;
+import 'package:spotube/pages/settings/scrobbling/scrobbling.dart' as _i27;
+import 'package:spotube/pages/settings/settings.dart' as _i26;
+import 'package:spotube/pages/stats/albums/albums.dart' as _i28;
+import 'package:spotube/pages/stats/artists/artists.dart' as _i29;
+import 'package:spotube/pages/stats/fees/fees.dart' as _i33;
+import 'package:spotube/pages/stats/minutes/minutes.dart' as _i30;
+import 'package:spotube/pages/stats/playlists/playlists.dart' as _i32;
+import 'package:spotube/pages/stats/stats.dart' as _i31;
+import 'package:spotube/pages/stats/streams/streams.dart' as _i34;
+import 'package:spotube/pages/track/track.dart' as _i35;
/// generated route for
/// [_i1.AboutSpotubePage]
-class AboutSpotubeRoute extends _i43.PageRouteInfo {
- const AboutSpotubeRoute({List<_i43.PageRouteInfo>? children})
+class AboutSpotubeRoute extends _i41.PageRouteInfo {
+ const AboutSpotubeRoute({List<_i41.PageRouteInfo>? children})
: super(
AboutSpotubeRoute.name,
initialChildren: children,
@@ -71,7 +66,7 @@ class AboutSpotubeRoute extends _i43.PageRouteInfo {
static const String name = 'AboutSpotubeRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
return const _i1.AboutSpotubePage();
@@ -81,12 +76,12 @@ class AboutSpotubeRoute extends _i43.PageRouteInfo {
/// generated route for
/// [_i2.AlbumPage]
-class AlbumRoute extends _i43.PageRouteInfo {
+class AlbumRoute extends _i41.PageRouteInfo {
AlbumRoute({
- _i44.Key? key,
+ _i42.Key? key,
required String id,
- required _i45.AlbumSimple album,
- List<_i43.PageRouteInfo>? children,
+ required _i43.SpotubeSimpleAlbumObject album,
+ List<_i41.PageRouteInfo>? children,
}) : super(
AlbumRoute.name,
args: AlbumRouteArgs(
@@ -100,7 +95,7 @@ class AlbumRoute extends _i43.PageRouteInfo {
static const String name = 'AlbumRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final args = data.argsAs();
@@ -120,11 +115,11 @@ class AlbumRouteArgs {
required this.album,
});
- final _i44.Key? key;
+ final _i42.Key? key;
final String id;
- final _i45.AlbumSimple album;
+ final _i43.SpotubeSimpleAlbumObject album;
@override
String toString() {
@@ -134,11 +129,11 @@ class AlbumRouteArgs {
/// generated route for
/// [_i3.ArtistPage]
-class ArtistRoute extends _i43.PageRouteInfo {
+class ArtistRoute extends _i41.PageRouteInfo {
ArtistRoute({
required String artistId,
- _i44.Key? key,
- List<_i43.PageRouteInfo>? children,
+ _i42.Key? key,
+ List<_i41.PageRouteInfo>? children,
}) : super(
ArtistRoute.name,
args: ArtistRouteArgs(
@@ -151,7 +146,7 @@ class ArtistRoute extends _i43.PageRouteInfo {
static const String name = 'ArtistRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final pathParams = data.inheritedPathParams;
@@ -173,7 +168,7 @@ class ArtistRouteArgs {
final String artistId;
- final _i44.Key? key;
+ final _i42.Key? key;
@override
String toString() {
@@ -183,8 +178,8 @@ class ArtistRouteArgs {
/// generated route for
/// [_i4.BlackListPage]
-class BlackListRoute extends _i43.PageRouteInfo {
- const BlackListRoute({List<_i43.PageRouteInfo>? children})
+class BlackListRoute extends _i41.PageRouteInfo {
+ const BlackListRoute({List<_i41.PageRouteInfo>? children})
: super(
BlackListRoute.name,
initialChildren: children,
@@ -192,7 +187,7 @@ class BlackListRoute extends _i43.PageRouteInfo {
static const String name = 'BlackListRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
return const _i4.BlackListPage();
@@ -202,8 +197,8 @@ class BlackListRoute extends _i43.PageRouteInfo {
/// generated route for
/// [_i5.ConnectControlPage]
-class ConnectControlRoute extends _i43.PageRouteInfo {
- const ConnectControlRoute({List<_i43.PageRouteInfo>? children})
+class ConnectControlRoute extends _i41.PageRouteInfo {
+ const ConnectControlRoute({List<_i41.PageRouteInfo>? children})
: super(
ConnectControlRoute.name,
initialChildren: children,
@@ -211,7 +206,7 @@ class ConnectControlRoute extends _i43.PageRouteInfo {
static const String name = 'ConnectControlRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
return const _i5.ConnectControlPage();
@@ -221,8 +216,8 @@ class ConnectControlRoute extends _i43.PageRouteInfo {
/// generated route for
/// [_i6.ConnectPage]
-class ConnectRoute extends _i43.PageRouteInfo {
- const ConnectRoute({List<_i43.PageRouteInfo>? children})
+class ConnectRoute extends _i41.PageRouteInfo {
+ const ConnectRoute({List<_i41.PageRouteInfo>? children})
: super(
ConnectRoute.name,
initialChildren: children,
@@ -230,7 +225,7 @@ class ConnectRoute extends _i43.PageRouteInfo {
static const String name = 'ConnectRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
return const _i6.ConnectPage();
@@ -239,81 +234,9 @@ class ConnectRoute extends _i43.PageRouteInfo {
}
/// generated route for
-/// [_i7.GenrePage]
-class GenreRoute extends _i43.PageRouteInfo {
- const GenreRoute({List<_i43.PageRouteInfo>? children})
- : super(
- GenreRoute.name,
- initialChildren: children,
- );
-
- static const String name = 'GenreRoute';
-
- static _i43.PageInfo page = _i43.PageInfo(
- name,
- builder: (data) {
- return const _i7.GenrePage();
- },
- );
-}
-
-/// generated route for
-/// [_i8.GenrePlaylistsPage]
-class GenrePlaylistsRoute extends _i43.PageRouteInfo {
- GenrePlaylistsRoute({
- _i44.Key? key,
- required String id,
- required _i45.Category category,
- List<_i43.PageRouteInfo>? children,
- }) : super(
- GenrePlaylistsRoute.name,
- args: GenrePlaylistsRouteArgs(
- key: key,
- id: id,
- category: category,
- ),
- rawPathParams: {'categoryId': id},
- initialChildren: children,
- );
-
- static const String name = 'GenrePlaylistsRoute';
-
- static _i43.PageInfo page = _i43.PageInfo(
- name,
- builder: (data) {
- final args = data.argsAs();
- return _i8.GenrePlaylistsPage(
- key: args.key,
- id: args.id,
- category: args.category,
- );
- },
- );
-}
-
-class GenrePlaylistsRouteArgs {
- const GenrePlaylistsRouteArgs({
- this.key,
- required this.id,
- required this.category,
- });
-
- final _i44.Key? key;
-
- final String id;
-
- final _i45.Category category;
-
- @override
- String toString() {
- return 'GenrePlaylistsRouteArgs{key: $key, id: $id, category: $category}';
- }
-}
-
-/// generated route for
-/// [_i9.GettingStartedPage]
-class GettingStartedRoute extends _i43.PageRouteInfo {
- const GettingStartedRoute({List<_i43.PageRouteInfo>? children})
+/// [_i7.GettingStartedPage]
+class GettingStartedRoute extends _i41.PageRouteInfo {
+ const GettingStartedRoute({List<_i41.PageRouteInfo>? children})
: super(
GettingStartedRoute.name,
initialChildren: children,
@@ -321,69 +244,72 @@ class GettingStartedRoute extends _i43.PageRouteInfo {
static const String name = 'GettingStartedRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i9.GettingStartedPage();
+ return const _i7.GettingStartedPage();
},
);
}
/// generated route for
-/// [_i10.HomeFeedSectionPage]
-class HomeFeedSectionRoute
- extends _i43.PageRouteInfo {
- HomeFeedSectionRoute({
- _i46.Key? key,
- required String sectionUri,
- List<_i43.PageRouteInfo>? children,
+/// [_i8.HomeBrowseSectionItemsPage]
+class HomeBrowseSectionItemsRoute
+ extends _i41.PageRouteInfo {
+ HomeBrowseSectionItemsRoute({
+ _i44.Key? key,
+ required String sectionId,
+ required _i43.SpotubeBrowseSectionObject section,
+ List<_i41.PageRouteInfo>? children,
}) : super(
- HomeFeedSectionRoute.name,
- args: HomeFeedSectionRouteArgs(
+ HomeBrowseSectionItemsRoute.name,
+ args: HomeBrowseSectionItemsRouteArgs(
key: key,
- sectionUri: sectionUri,
+ sectionId: sectionId,
+ section: section,
),
- rawPathParams: {'feedId': sectionUri},
+ rawPathParams: {'sectionId': sectionId},
initialChildren: children,
);
- static const String name = 'HomeFeedSectionRoute';
+ static const String name = 'HomeBrowseSectionItemsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- final pathParams = data.inheritedPathParams;
- final args = data.argsAs(
- orElse: () => HomeFeedSectionRouteArgs(
- sectionUri: pathParams.getString('feedId')));
- return _i10.HomeFeedSectionPage(
+ final args = data.argsAs();
+ return _i8.HomeBrowseSectionItemsPage(
key: args.key,
- sectionUri: args.sectionUri,
+ sectionId: args.sectionId,
+ section: args.section,
);
},
);
}
-class HomeFeedSectionRouteArgs {
- const HomeFeedSectionRouteArgs({
+class HomeBrowseSectionItemsRouteArgs {
+ const HomeBrowseSectionItemsRouteArgs({
this.key,
- required this.sectionUri,
+ required this.sectionId,
+ required this.section,
});
- final _i46.Key? key;
+ final _i44.Key? key;
- final String sectionUri;
+ final String sectionId;
+
+ final _i43.SpotubeBrowseSectionObject section;
@override
String toString() {
- return 'HomeFeedSectionRouteArgs{key: $key, sectionUri: $sectionUri}';
+ return 'HomeBrowseSectionItemsRouteArgs{key: $key, sectionId: $sectionId, section: $section}';
}
}
/// generated route for
-/// [_i11.HomePage]
-class HomeRoute extends _i43.PageRouteInfo {
- const HomeRoute({List<_i43.PageRouteInfo>? children})
+/// [_i9.HomePage]
+class HomeRoute extends _i41.PageRouteInfo {
+ const HomeRoute({List<_i41.PageRouteInfo>? children})
: super(
HomeRoute.name,
initialChildren: children,
@@ -391,18 +317,18 @@ class HomeRoute extends _i43.PageRouteInfo {
static const String name = 'HomeRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i11.HomePage();
+ return const _i9.HomePage();
},
);
}
/// generated route for
-/// [_i12.LastFMLoginPage]
-class LastFMLoginRoute extends _i43.PageRouteInfo {
- const LastFMLoginRoute({List<_i43.PageRouteInfo>? children})
+/// [_i10.LastFMLoginPage]
+class LastFMLoginRoute extends _i41.PageRouteInfo {
+ const LastFMLoginRoute({List<_i41.PageRouteInfo>? children})
: super(
LastFMLoginRoute.name,
initialChildren: children,
@@ -410,18 +336,18 @@ class LastFMLoginRoute extends _i43.PageRouteInfo {
static const String name = 'LastFMLoginRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i12.LastFMLoginPage();
+ return const _i10.LastFMLoginPage();
},
);
}
/// generated route for
-/// [_i13.LibraryPage]
-class LibraryRoute extends _i43.PageRouteInfo {
- const LibraryRoute({List<_i43.PageRouteInfo>? children})
+/// [_i11.LibraryPage]
+class LibraryRoute extends _i41.PageRouteInfo {
+ const LibraryRoute({List<_i41.PageRouteInfo>? children})
: super(
LibraryRoute.name,
initialChildren: children,
@@ -429,21 +355,21 @@ class LibraryRoute extends _i43.PageRouteInfo {
static const String name = 'LibraryRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i13.LibraryPage();
+ return const _i11.LibraryPage();
},
);
}
/// generated route for
-/// [_i14.LikedPlaylistPage]
-class LikedPlaylistRoute extends _i43.PageRouteInfo {
+/// [_i12.LikedPlaylistPage]
+class LikedPlaylistRoute extends _i41.PageRouteInfo {
LikedPlaylistRoute({
- _i44.Key? key,
- required _i45.PlaylistSimple playlist,
- List<_i43.PageRouteInfo>? children,
+ _i42.Key? key,
+ required _i43.SpotubeSimplePlaylistObject playlist,
+ List<_i41.PageRouteInfo>? children,
}) : super(
LikedPlaylistRoute.name,
args: LikedPlaylistRouteArgs(
@@ -455,11 +381,11 @@ class LikedPlaylistRoute extends _i43.PageRouteInfo {
static const String name = 'LikedPlaylistRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final args = data.argsAs();
- return _i14.LikedPlaylistPage(
+ return _i12.LikedPlaylistPage(
key: args.key,
playlist: args.playlist,
);
@@ -473,9 +399,9 @@ class LikedPlaylistRouteArgs {
required this.playlist,
});
- final _i44.Key? key;
+ final _i42.Key? key;
- final _i45.PlaylistSimple playlist;
+ final _i43.SpotubeSimplePlaylistObject playlist;
@override
String toString() {
@@ -484,14 +410,14 @@ class LikedPlaylistRouteArgs {
}
/// generated route for
-/// [_i15.LocalLibraryPage]
-class LocalLibraryRoute extends _i43.PageRouteInfo {
+/// [_i13.LocalLibraryPage]
+class LocalLibraryRoute extends _i41.PageRouteInfo {
LocalLibraryRoute({
required String location,
- _i44.Key? key,
+ _i42.Key? key,
bool isDownloads = false,
bool isCache = false,
- List<_i43.PageRouteInfo>? children,
+ List<_i41.PageRouteInfo>? children,
}) : super(
LocalLibraryRoute.name,
args: LocalLibraryRouteArgs(
@@ -505,11 +431,11 @@ class LocalLibraryRoute extends _i43.PageRouteInfo {
static const String name = 'LocalLibraryRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final args = data.argsAs();
- return _i15.LocalLibraryPage(
+ return _i13.LocalLibraryPage(
args.location,
key: args.key,
isDownloads: args.isDownloads,
@@ -529,7 +455,7 @@ class LocalLibraryRouteArgs {
final String location;
- final _i44.Key? key;
+ final _i42.Key? key;
final bool isDownloads;
@@ -542,9 +468,9 @@ class LocalLibraryRouteArgs {
}
/// generated route for
-/// [_i16.LogsPage]
-class LogsRoute extends _i43.PageRouteInfo {
- const LogsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i14.LogsPage]
+class LogsRoute extends _i41.PageRouteInfo {
+ const LogsRoute({List<_i41.PageRouteInfo>? children})
: super(
LogsRoute.name,
initialChildren: children,
@@ -552,18 +478,18 @@ class LogsRoute extends _i43.PageRouteInfo {
static const String name = 'LogsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i16.LogsPage();
+ return const _i14.LogsPage();
},
);
}
/// generated route for
-/// [_i17.LyricsPage]
-class LyricsRoute extends _i43.PageRouteInfo {
- const LyricsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i15.LyricsPage]
+class LyricsRoute extends _i41.PageRouteInfo {
+ const LyricsRoute({List<_i41.PageRouteInfo>? children})
: super(
LyricsRoute.name,
initialChildren: children,
@@ -571,21 +497,21 @@ class LyricsRoute extends _i43.PageRouteInfo {
static const String name = 'LyricsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i17.LyricsPage();
+ return const _i15.LyricsPage();
},
);
}
/// generated route for
-/// [_i18.MiniLyricsPage]
-class MiniLyricsRoute extends _i43.PageRouteInfo {
+/// [_i16.MiniLyricsPage]
+class MiniLyricsRoute extends _i41.PageRouteInfo {
MiniLyricsRoute({
- _i46.Key? key,
- required _i46.Size prevSize,
- List<_i43.PageRouteInfo>? children,
+ _i44.Key? key,
+ required _i44.Size prevSize,
+ List<_i41.PageRouteInfo>? children,
}) : super(
MiniLyricsRoute.name,
args: MiniLyricsRouteArgs(
@@ -597,11 +523,11 @@ class MiniLyricsRoute extends _i43.PageRouteInfo {
static const String name = 'MiniLyricsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final args = data.argsAs();
- return _i18.MiniLyricsPage(
+ return _i16.MiniLyricsPage(
key: args.key,
prevSize: args.prevSize,
);
@@ -615,9 +541,9 @@ class MiniLyricsRouteArgs {
required this.prevSize,
});
- final _i46.Key? key;
+ final _i44.Key? key;
- final _i46.Size prevSize;
+ final _i44.Size prevSize;
@override
String toString() {
@@ -626,9 +552,9 @@ class MiniLyricsRouteArgs {
}
/// generated route for
-/// [_i19.PlayerLyricsPage]
-class PlayerLyricsRoute extends _i43.PageRouteInfo {
- const PlayerLyricsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i17.PlayerLyricsPage]
+class PlayerLyricsRoute extends _i41.PageRouteInfo {
+ const PlayerLyricsRoute({List<_i41.PageRouteInfo>? children})
: super(
PlayerLyricsRoute.name,
initialChildren: children,
@@ -636,18 +562,18 @@ class PlayerLyricsRoute extends _i43.PageRouteInfo {
static const String name = 'PlayerLyricsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i19.PlayerLyricsPage();
+ return const _i17.PlayerLyricsPage();
},
);
}
/// generated route for
-/// [_i20.PlayerQueuePage]
-class PlayerQueueRoute extends _i43.PageRouteInfo {
- const PlayerQueueRoute({List<_i43.PageRouteInfo>? children})
+/// [_i18.PlayerQueuePage]
+class PlayerQueueRoute extends _i41.PageRouteInfo {
+ const PlayerQueueRoute({List<_i41.PageRouteInfo>? children})
: super(
PlayerQueueRoute.name,
initialChildren: children,
@@ -655,18 +581,18 @@ class PlayerQueueRoute extends _i43.PageRouteInfo {
static const String name = 'PlayerQueueRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i20.PlayerQueuePage();
+ return const _i18.PlayerQueuePage();
},
);
}
/// generated route for
-/// [_i21.PlayerTrackSourcesPage]
-class PlayerTrackSourcesRoute extends _i43.PageRouteInfo {
- const PlayerTrackSourcesRoute({List<_i43.PageRouteInfo>? children})
+/// [_i19.PlayerTrackSourcesPage]
+class PlayerTrackSourcesRoute extends _i41.PageRouteInfo {
+ const PlayerTrackSourcesRoute({List<_i41.PageRouteInfo>? children})
: super(
PlayerTrackSourcesRoute.name,
initialChildren: children,
@@ -674,88 +600,22 @@ class PlayerTrackSourcesRoute extends _i43.PageRouteInfo {
static const String name = 'PlayerTrackSourcesRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i21.PlayerTrackSourcesPage();
+ return const _i19.PlayerTrackSourcesPage();
},
);
}
/// generated route for
-/// [_i22.PlaylistGenerateResultPage]
-class PlaylistGenerateResultRoute
- extends _i43.PageRouteInfo {
- PlaylistGenerateResultRoute({
- _i46.Key? key,
- required _i47.GeneratePlaylistProviderInput state,
- List<_i43.PageRouteInfo>? children,
- }) : super(
- PlaylistGenerateResultRoute.name,
- args: PlaylistGenerateResultRouteArgs(
- key: key,
- state: state,
- ),
- initialChildren: children,
- );
-
- static const String name = 'PlaylistGenerateResultRoute';
-
- static _i43.PageInfo page = _i43.PageInfo(
- name,
- builder: (data) {
- final args = data.argsAs();
- return _i22.PlaylistGenerateResultPage(
- key: args.key,
- state: args.state,
- );
- },
- );
-}
-
-class PlaylistGenerateResultRouteArgs {
- const PlaylistGenerateResultRouteArgs({
- this.key,
- required this.state,
- });
-
- final _i46.Key? key;
-
- final _i47.GeneratePlaylistProviderInput state;
-
- @override
- String toString() {
- return 'PlaylistGenerateResultRouteArgs{key: $key, state: $state}';
- }
-}
-
-/// generated route for
-/// [_i23.PlaylistGeneratorPage]
-class PlaylistGeneratorRoute extends _i43.PageRouteInfo {
- const PlaylistGeneratorRoute({List<_i43.PageRouteInfo>? children})
- : super(
- PlaylistGeneratorRoute.name,
- initialChildren: children,
- );
-
- static const String name = 'PlaylistGeneratorRoute';
-
- static _i43.PageInfo page = _i43.PageInfo(
- name,
- builder: (data) {
- return const _i23.PlaylistGeneratorPage();
- },
- );
-}
-
-/// generated route for
-/// [_i24.PlaylistPage]
-class PlaylistRoute extends _i43.PageRouteInfo {
+/// [_i20.PlaylistPage]
+class PlaylistRoute extends _i41.PageRouteInfo {
PlaylistRoute({
- _i44.Key? key,
+ _i42.Key? key,
required String id,
- required _i45.PlaylistSimple playlist,
- List<_i43.PageRouteInfo>? children,
+ required _i43.SpotubeSimplePlaylistObject playlist,
+ List<_i41.PageRouteInfo>? children,
}) : super(
PlaylistRoute.name,
args: PlaylistRouteArgs(
@@ -769,11 +629,11 @@ class PlaylistRoute extends _i43.PageRouteInfo {
static const String name = 'PlaylistRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final args = data.argsAs();
- return _i24.PlaylistPage(
+ return _i20.PlaylistPage(
key: args.key,
id: args.id,
playlist: args.playlist,
@@ -789,11 +649,11 @@ class PlaylistRouteArgs {
required this.playlist,
});
- final _i44.Key? key;
+ final _i42.Key? key;
final String id;
- final _i45.PlaylistSimple playlist;
+ final _i43.SpotubeSimplePlaylistObject playlist;
@override
String toString() {
@@ -802,9 +662,9 @@ class PlaylistRouteArgs {
}
/// generated route for
-/// [_i25.ProfilePage]
-class ProfileRoute extends _i43.PageRouteInfo {
- const ProfileRoute({List<_i43.PageRouteInfo>? children})
+/// [_i21.ProfilePage]
+class ProfileRoute extends _i41.PageRouteInfo {
+ const ProfileRoute({List<_i41.PageRouteInfo>? children})
: super(
ProfileRoute.name,
initialChildren: children,
@@ -812,18 +672,18 @@ class ProfileRoute extends _i43.PageRouteInfo {
static const String name = 'ProfileRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i25.ProfilePage();
+ return const _i21.ProfilePage();
},
);
}
/// generated route for
-/// [_i26.RootAppPage]
-class RootAppRoute extends _i43.PageRouteInfo {
- const RootAppRoute({List<_i43.PageRouteInfo>? children})
+/// [_i22.RootAppPage]
+class RootAppRoute extends _i41.PageRouteInfo {
+ const RootAppRoute({List<_i41.PageRouteInfo>? children})
: super(
RootAppRoute.name,
initialChildren: children,
@@ -831,18 +691,18 @@ class RootAppRoute extends _i43.PageRouteInfo {
static const String name = 'RootAppRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i26.RootAppPage();
+ return const _i22.RootAppPage();
},
);
}
/// generated route for
-/// [_i27.SearchPage]
-class SearchRoute extends _i43.PageRouteInfo {
- const SearchRoute({List<_i43.PageRouteInfo>? children})
+/// [_i23.SearchPage]
+class SearchRoute extends _i41.PageRouteInfo {
+ const SearchRoute({List<_i41.PageRouteInfo>? children})
: super(
SearchRoute.name,
initialChildren: children,
@@ -850,18 +710,90 @@ class SearchRoute extends _i43.PageRouteInfo {
static const String name = 'SearchRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i27.SearchPage();
+ return const _i23.SearchPage();
},
);
}
/// generated route for
-/// [_i28.SettingsPage]
-class SettingsRoute extends _i43.PageRouteInfo {
- const SettingsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i24.SettingsMetadataProviderFormPage]
+class SettingsMetadataProviderFormRoute
+ extends _i41.PageRouteInfo {
+ SettingsMetadataProviderFormRoute({
+ _i44.Key? key,
+ required String title,
+ required List<_i43.MetadataFormFieldObject> fields,
+ List<_i41.PageRouteInfo>? children,
+ }) : super(
+ SettingsMetadataProviderFormRoute.name,
+ args: SettingsMetadataProviderFormRouteArgs(
+ key: key,
+ title: title,
+ fields: fields,
+ ),
+ initialChildren: children,
+ );
+
+ static const String name = 'SettingsMetadataProviderFormRoute';
+
+ static _i41.PageInfo page = _i41.PageInfo(
+ name,
+ builder: (data) {
+ final args = data.argsAs();
+ return _i24.SettingsMetadataProviderFormPage(
+ key: args.key,
+ title: args.title,
+ fields: args.fields,
+ );
+ },
+ );
+}
+
+class SettingsMetadataProviderFormRouteArgs {
+ const SettingsMetadataProviderFormRouteArgs({
+ this.key,
+ required this.title,
+ required this.fields,
+ });
+
+ final _i44.Key? key;
+
+ final String title;
+
+ final List<_i43.MetadataFormFieldObject> fields;
+
+ @override
+ String toString() {
+ return 'SettingsMetadataProviderFormRouteArgs{key: $key, title: $title, fields: $fields}';
+ }
+}
+
+/// generated route for
+/// [_i25.SettingsMetadataProviderPage]
+class SettingsMetadataProviderRoute extends _i41.PageRouteInfo {
+ const SettingsMetadataProviderRoute({List<_i41.PageRouteInfo>? children})
+ : super(
+ SettingsMetadataProviderRoute.name,
+ initialChildren: children,
+ );
+
+ static const String name = 'SettingsMetadataProviderRoute';
+
+ static _i41.PageInfo page = _i41.PageInfo(
+ name,
+ builder: (data) {
+ return const _i25.SettingsMetadataProviderPage();
+ },
+ );
+}
+
+/// generated route for
+/// [_i26.SettingsPage]
+class SettingsRoute extends _i41.PageRouteInfo {
+ const SettingsRoute({List<_i41.PageRouteInfo>? children})
: super(
SettingsRoute.name,
initialChildren: children,
@@ -869,18 +801,37 @@ class SettingsRoute extends _i43.PageRouteInfo {
static const String name = 'SettingsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i28.SettingsPage();
+ return const _i26.SettingsPage();
},
);
}
/// generated route for
-/// [_i29.StatsAlbumsPage]
-class StatsAlbumsRoute extends _i43.PageRouteInfo {
- const StatsAlbumsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i27.SettingsScrobblingPage]
+class SettingsScrobblingRoute extends _i41.PageRouteInfo {
+ const SettingsScrobblingRoute({List<_i41.PageRouteInfo>? children})
+ : super(
+ SettingsScrobblingRoute.name,
+ initialChildren: children,
+ );
+
+ static const String name = 'SettingsScrobblingRoute';
+
+ static _i41.PageInfo page = _i41.PageInfo(
+ name,
+ builder: (data) {
+ return const _i27.SettingsScrobblingPage();
+ },
+ );
+}
+
+/// generated route for
+/// [_i28.StatsAlbumsPage]
+class StatsAlbumsRoute extends _i41.PageRouteInfo {
+ const StatsAlbumsRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsAlbumsRoute.name,
initialChildren: children,
@@ -888,18 +839,18 @@ class StatsAlbumsRoute extends _i43.PageRouteInfo {
static const String name = 'StatsAlbumsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i29.StatsAlbumsPage();
+ return const _i28.StatsAlbumsPage();
},
);
}
/// generated route for
-/// [_i30.StatsArtistsPage]
-class StatsArtistsRoute extends _i43.PageRouteInfo {
- const StatsArtistsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i29.StatsArtistsPage]
+class StatsArtistsRoute extends _i41.PageRouteInfo {
+ const StatsArtistsRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsArtistsRoute.name,
initialChildren: children,
@@ -907,18 +858,18 @@ class StatsArtistsRoute extends _i43.PageRouteInfo {
static const String name = 'StatsArtistsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i30.StatsArtistsPage();
+ return const _i29.StatsArtistsPage();
},
);
}
/// generated route for
-/// [_i31.StatsMinutesPage]
-class StatsMinutesRoute extends _i43.PageRouteInfo {
- const StatsMinutesRoute({List<_i43.PageRouteInfo>? children})
+/// [_i30.StatsMinutesPage]
+class StatsMinutesRoute extends _i41.PageRouteInfo {
+ const StatsMinutesRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsMinutesRoute.name,
initialChildren: children,
@@ -926,18 +877,18 @@ class StatsMinutesRoute extends _i43.PageRouteInfo {
static const String name = 'StatsMinutesRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i31.StatsMinutesPage();
+ return const _i30.StatsMinutesPage();
},
);
}
/// generated route for
-/// [_i32.StatsPage]
-class StatsRoute extends _i43.PageRouteInfo {
- const StatsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i31.StatsPage]
+class StatsRoute extends _i41.PageRouteInfo {
+ const StatsRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsRoute.name,
initialChildren: children,
@@ -945,18 +896,18 @@ class StatsRoute extends _i43.PageRouteInfo {
static const String name = 'StatsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i32.StatsPage();
+ return const _i31.StatsPage();
},
);
}
/// generated route for
-/// [_i33.StatsPlaylistsPage]
-class StatsPlaylistsRoute extends _i43.PageRouteInfo {
- const StatsPlaylistsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i32.StatsPlaylistsPage]
+class StatsPlaylistsRoute extends _i41.PageRouteInfo {
+ const StatsPlaylistsRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsPlaylistsRoute.name,
initialChildren: children,
@@ -964,18 +915,18 @@ class StatsPlaylistsRoute extends _i43.PageRouteInfo {
static const String name = 'StatsPlaylistsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i33.StatsPlaylistsPage();
+ return const _i32.StatsPlaylistsPage();
},
);
}
/// generated route for
-/// [_i34.StatsStreamFeesPage]
-class StatsStreamFeesRoute extends _i43.PageRouteInfo {
- const StatsStreamFeesRoute({List<_i43.PageRouteInfo>? children})
+/// [_i33.StatsStreamFeesPage]
+class StatsStreamFeesRoute extends _i41.PageRouteInfo {
+ const StatsStreamFeesRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsStreamFeesRoute.name,
initialChildren: children,
@@ -983,18 +934,18 @@ class StatsStreamFeesRoute extends _i43.PageRouteInfo {
static const String name = 'StatsStreamFeesRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i34.StatsStreamFeesPage();
+ return const _i33.StatsStreamFeesPage();
},
);
}
/// generated route for
-/// [_i35.StatsStreamsPage]
-class StatsStreamsRoute extends _i43.PageRouteInfo {
- const StatsStreamsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i34.StatsStreamsPage]
+class StatsStreamsRoute extends _i41.PageRouteInfo {
+ const StatsStreamsRoute({List<_i41.PageRouteInfo>? children})
: super(
StatsStreamsRoute.name,
initialChildren: children,
@@ -1002,21 +953,21 @@ class StatsStreamsRoute extends _i43.PageRouteInfo {
static const String name = 'StatsStreamsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i35.StatsStreamsPage();
+ return const _i34.StatsStreamsPage();
},
);
}
/// generated route for
-/// [_i36.TrackPage]
-class TrackRoute extends _i43.PageRouteInfo {
+/// [_i35.TrackPage]
+class TrackRoute extends _i41.PageRouteInfo {
TrackRoute({
- _i46.Key? key,
+ _i44.Key? key,
required String trackId,
- List<_i43.PageRouteInfo>? children,
+ List<_i41.PageRouteInfo>? children,
}) : super(
TrackRoute.name,
args: TrackRouteArgs(
@@ -1029,13 +980,13 @@ class TrackRoute extends _i43.PageRouteInfo {
static const String name = 'TrackRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
final pathParams = data.inheritedPathParams;
final args = data.argsAs(
orElse: () => TrackRouteArgs(trackId: pathParams.getString('id')));
- return _i36.TrackPage(
+ return _i35.TrackPage(
key: args.key,
trackId: args.trackId,
);
@@ -1049,7 +1000,7 @@ class TrackRouteArgs {
required this.trackId,
});
- final _i46.Key? key;
+ final _i44.Key? key;
final String trackId;
@@ -1060,9 +1011,9 @@ class TrackRouteArgs {
}
/// generated route for
-/// [_i37.UserAlbumsPage]
-class UserAlbumsRoute extends _i43.PageRouteInfo {
- const UserAlbumsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i36.UserAlbumsPage]
+class UserAlbumsRoute extends _i41.PageRouteInfo {
+ const UserAlbumsRoute({List<_i41.PageRouteInfo>? children})
: super(
UserAlbumsRoute.name,
initialChildren: children,
@@ -1070,18 +1021,18 @@ class UserAlbumsRoute extends _i43.PageRouteInfo {
static const String name = 'UserAlbumsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i37.UserAlbumsPage();
+ return const _i36.UserAlbumsPage();
},
);
}
/// generated route for
-/// [_i38.UserArtistsPage]
-class UserArtistsRoute extends _i43.PageRouteInfo {
- const UserArtistsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i37.UserArtistsPage]
+class UserArtistsRoute extends _i41.PageRouteInfo {
+ const UserArtistsRoute({List<_i41.PageRouteInfo>? children})
: super(
UserArtistsRoute.name,
initialChildren: children,
@@ -1089,18 +1040,18 @@ class UserArtistsRoute extends _i43.PageRouteInfo {
static const String name = 'UserArtistsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i38.UserArtistsPage();
+ return const _i37.UserArtistsPage();
},
);
}
/// generated route for
-/// [_i39.UserDownloadsPage]
-class UserDownloadsRoute extends _i43.PageRouteInfo {
- const UserDownloadsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i38.UserDownloadsPage]
+class UserDownloadsRoute extends _i41.PageRouteInfo {
+ const UserDownloadsRoute({List<_i41.PageRouteInfo>? children})
: super(
UserDownloadsRoute.name,
initialChildren: children,
@@ -1108,18 +1059,18 @@ class UserDownloadsRoute extends _i43.PageRouteInfo {
static const String name = 'UserDownloadsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i39.UserDownloadsPage();
+ return const _i38.UserDownloadsPage();
},
);
}
/// generated route for
-/// [_i40.UserLocalLibraryPage]
-class UserLocalLibraryRoute extends _i43.PageRouteInfo {
- const UserLocalLibraryRoute({List<_i43.PageRouteInfo>? children})
+/// [_i39.UserLocalLibraryPage]
+class UserLocalLibraryRoute extends _i41.PageRouteInfo {
+ const UserLocalLibraryRoute({List<_i41.PageRouteInfo>? children})
: super(
UserLocalLibraryRoute.name,
initialChildren: children,
@@ -1127,18 +1078,18 @@ class UserLocalLibraryRoute extends _i43.PageRouteInfo {
static const String name = 'UserLocalLibraryRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i40.UserLocalLibraryPage();
+ return const _i39.UserLocalLibraryPage();
},
);
}
/// generated route for
-/// [_i41.UserPlaylistsPage]
-class UserPlaylistsRoute extends _i43.PageRouteInfo {
- const UserPlaylistsRoute({List<_i43.PageRouteInfo>? children})
+/// [_i40.UserPlaylistsPage]
+class UserPlaylistsRoute extends _i41.PageRouteInfo {
+ const UserPlaylistsRoute({List<_i41.PageRouteInfo>? children})
: super(
UserPlaylistsRoute.name,
initialChildren: children,
@@ -1146,29 +1097,10 @@ class UserPlaylistsRoute extends _i43.PageRouteInfo {
static const String name = 'UserPlaylistsRoute';
- static _i43.PageInfo page = _i43.PageInfo(
+ static _i41.PageInfo page = _i41.PageInfo(
name,
builder: (data) {
- return const _i41.UserPlaylistsPage();
- },
- );
-}
-
-/// generated route for
-/// [_i42.WebViewLoginPage]
-class WebViewLoginRoute extends _i43.PageRouteInfo {
- const WebViewLoginRoute({List<_i43.PageRouteInfo>? children})
- : super(
- WebViewLoginRoute.name,
- initialChildren: children,
- );
-
- static const String name = 'WebViewLoginRoute';
-
- static _i43.PageInfo page = _i43.PageInfo(
- name,
- builder: (data) {
- return const _i42.WebViewLoginPage();
+ return const _i40.UserPlaylistsPage();
},
);
}
diff --git a/lib/collections/side_bar_tiles.dart b/lib/collections/side_bar_tiles.dart
index 80ca7306..c647c9fb 100644
--- a/lib/collections/side_bar_tiles.dart
+++ b/lib/collections/side_bar_tiles.dart
@@ -38,7 +38,7 @@ List getSidebarTileList(AppLocalizations l10n) => [
SideBarTiles(
id: "lyrics",
pathPrefix: "/lyrics",
- route: LyricsRoute(),
+ route: const LyricsRoute(),
icon: SpotubeIcons.music,
title: l10n.lyrics,
),
diff --git a/lib/collections/spotube_icons.dart b/lib/collections/spotube_icons.dart
index bd9d037c..b10ef7e3 100644
--- a/lib/collections/spotube_icons.dart
+++ b/lib/collections/spotube_icons.dart
@@ -105,7 +105,6 @@ abstract class SpotubeIcons {
static const file = FeatherIcons.file;
static const stream = Icons.stream_rounded;
static const lastFm = SimpleIcons.lastdotfm;
- static const spotify = SimpleIcons.spotify;
static const eye = FeatherIcons.eye;
static const noEye = FeatherIcons.eyeOff;
static const normalize = FeatherIcons.barChart2;
@@ -135,4 +134,9 @@ abstract class SpotubeIcons {
static const list = FeatherIcons.list;
static const device = FeatherIcons.smartphone;
static const engine = FeatherIcons.server;
+ static const extensions = FeatherIcons.package;
+ static const message = FeatherIcons.send;
+ static const upload = FeatherIcons.uploadCloud;
+ static const plugin = Icons.extension_outlined;
+ static const warning = FeatherIcons.alertTriangle;
}
diff --git a/lib/components/adaptive/adaptive_pop_sheet_list.dart b/lib/components/adaptive/adaptive_pop_sheet_list.dart
index 0f02ee73..6eba1148 100644
--- a/lib/components/adaptive/adaptive_pop_sheet_list.dart
+++ b/lib/components/adaptive/adaptive_pop_sheet_list.dart
@@ -1,4 +1,3 @@
-import 'package:flutter/material.dart' show showModalBottomSheet;
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
import 'package:spotube/collections/spotube_icons.dart';
@@ -26,7 +25,7 @@ class AdaptiveMenuButton extends MenuButton {
/// An adaptive widget that shows a [PopupMenuButton] when screen size is above
/// or equal to 640px
-/// In smaller screen, a [IconButton] with a [showModalBottomSheet] is shown
+/// In smaller screen, a [IconButton] with a [openDrawer] is shown
class AdaptivePopSheetList extends StatelessWidget {
final List> Function(BuildContext context) items;
final Widget? icon;
@@ -39,7 +38,7 @@ class AdaptivePopSheetList extends StatelessWidget {
final Offset offset;
- final ButtonVariance variance;
+ final AbstractButtonStyle variance;
const AdaptivePopSheetList({
super.key,
@@ -92,23 +91,23 @@ class AdaptivePopSheetList extends StatelessWidget {
// ),
position: position,
builder: (context) {
- return DropdownMenu(
- children: childrenModified(context),
+ return WidgetStatesProvider.boundary(
+ child: DropdownMenu(
+ children: childrenModified(context),
+ ),
);
},
).future;
return;
}
- showModalBottomSheet(
+ await openDrawer(
context: context,
- enableDrag: true,
+ draggable: true,
showDragHandle: true,
- useRootNavigator: true,
- shape: RoundedRectangleBorder(
- borderRadius: context.theme.borderRadiusMd,
- ),
- backgroundColor: context.theme.colorScheme.card,
+ position: OverlayPosition.bottom,
+ borderRadius: context.theme.borderRadiusMd,
+ transformBackdrop: false,
builder: (context) {
final children = childrenModified(context);
return ListView.builder(
@@ -125,7 +124,7 @@ class AdaptivePopSheetList extends StatelessWidget {
onPressed: () {
data.onPressed?.call(context);
if (data.autoClose) {
- Navigator.of(context).pop();
+ closeDrawer(context);
}
},
leading: data.leading,
@@ -147,7 +146,7 @@ class AdaptivePopSheetList extends StatelessWidget {
return Tooltip(
tooltip: TooltipContainer(
child: Text(tooltip),
- ),
+ ).call,
child: IconButton(
variance: variance,
icon: icon ?? const Icon(SpotubeIcons.moreVertical),
@@ -171,7 +170,7 @@ class AdaptivePopSheetList extends StatelessWidget {
if (child != null) {
return Tooltip(
- tooltip: TooltipContainer(child: Text(tooltip)),
+ tooltip: TooltipContainer(child: Text(tooltip)).call,
child: Button(
onPressed: () => showDropdownMenu(context, Offset.zero),
style: variance,
@@ -181,7 +180,7 @@ class AdaptivePopSheetList