diff --git a/.env.example b/.env.example
index 56665663..6a88cb99 100644
--- a/.env.example
+++ b/.env.example
@@ -12,3 +12,5 @@ LASTFM_API_SECRET=
# Release channel. Can be: nightly, stable
RELEASE_CHANNEL=
+
+HIDE_DONATIONS=
diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json
index 160b5b29..305f34df 100644
--- a/.fvm/fvm_config.json
+++ b/.fvm/fvm_config.json
@@ -1,4 +1,3 @@
{
- "flutterSdkVersion": "3.22.3",
- "flavors": {}
+ "flutterSdkVersion": "3.24.3"
}
\ No newline at end of file
diff --git a/.fvmrc b/.fvmrc
new file mode 100644
index 00000000..c62692b4
--- /dev/null
+++ b/.fvmrc
@@ -0,0 +1,4 @@
+{
+ "flutter": "3.24.3",
+ "flavors": {}
+}
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index fed66850..a9c57836 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -7,8 +7,12 @@ labels:
body:
- type: checkboxes
attributes:
- label: Is there an existing issue for this?
- description: Make sure to check if this issue is a duplicate.
+ label: Is there an existing issue for this? (Please read the description)
+ description: |
+ PLEASE! Make sure to check if this issue is a duplicate.
+ Don't waste our time, we are working hard to make Spotube better for you.
+
+ Try with multiple similar keywords, and check the closed issues too.
options:
- label: I have searched the existing issues
required: true
@@ -16,23 +20,41 @@ body:
attributes:
label: Current Behavior
description: Write what you are experiencing currently.
+ placeholder: |
+ The app isn't working as expected. It crashes when I do this...
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: Write what you expected to happen.
+ placeholder: |
+ The app should do this when I do that...
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
- description: Steps to reproduce the issue. A not well written description might delay the resolve of it.
+ description: Steps to reproduce the issue. A not well written description might lead to the delay in fixing the issue.
placeholder: |
1. I opened the app
2. I did this
3. And that
4. Then this happened
+ - type: textarea
+ attributes:
+ label: Logs
+ description: |
+ If you have any logs, paste them here. Make sure to remove any sensitive information.
+ You can find the logs in the app's Settings > Developers > Logs page.
+ value: |
+
+ Logs
+
+ ```
+
+ ```
+
validations:
required: true
- type: input
@@ -74,7 +96,7 @@ body:
- type: checkboxes
attributes:
label: Self grab
- description: If you are a developer and want to work on this issue yourself, you can check this box and wait for maintainer response. We welcome contributions!
+ description: If you are a developer and want to work on this issue yourself, you can check this box and wait for maintainer response. Any contributions are welcome!
options:
- label: I'm ready to work on this issue!
required: false
diff --git a/.github/workflows/spotube-publish-binary.yml b/.github/workflows/spotube-publish-binary.yml
index a5ee3449..3a456bda 100644
--- a/.github/workflows/spotube-publish-binary.yml
+++ b/.github/workflows/spotube-publish-binary.yml
@@ -4,7 +4,7 @@ on:
inputs:
version:
description: Version to publish (x.x.x)
- default: 3.8.1
+ default: 3.8.3
required: true
dry_run:
description: Dry run
diff --git a/.github/workflows/spotube-release-binary.yml b/.github/workflows/spotube-release-binary.yml
index 19fbac82..d059a067 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.22.3
+ FLUTTER_VERSION: 3.24.3
permissions:
contents: write
diff --git a/.gitignore b/.gitignore
index 4f9ebc28..f9bd15f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,8 +73,10 @@ dist
appimage-build
android/key.properties
-.fvm/flutter_sdk
**/pb_data
tm.json
+
+# FVM Version Cache
+.fvm/
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 0ec6ca76..11fae610 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -25,6 +25,7 @@
"explorer.fileNesting.patterns": {
"pubspec.yaml": "pubspec.lock,analysis_options.yaml,.packages,.flutter-plugins,.flutter-plugins-dependencies,flutter_launcher_icons*.yaml,flutter_native_splash*.yaml",
"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": "${capture}.g.dart,${capture}.freezed.dart"
+ },
+ "dart.flutterSdkPath": ".fvm/flutter_sdk"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 20b48c26..11b06ed0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+## [3.8.3](https://github.com/krtirtho/spotube/compare/v3.8.2...v3.8.3) (2024-10-09)
+
+## Changes
+
+### Bug Fixes
+
+- update youtube_explode_dart to 2.2.3 to fix no playback (#1980)
+
+### Features
+
+- **macos**: enable same window webview support
+
+## [3.8.2](https://github.com/krtirtho/spotube/compare/v3.8.1...v3.8.2) (2024-09-30)
+
+## Changes
+
+### Bug Fixes
+
+- endless song loading issue and no playback #1925
+
+
## [3.8.1](https://github.com/krtirtho/spotube/compare/v3.8.0...v3.8.1) (2024-09-15)
## Changes
diff --git a/android/gradle.properties b/android/gradle.properties
index 94adc3a3..ed508580 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,3 +1,3 @@
-org.gradle.jvmargs=-Xmx1536M
+org.gradle.jvmargs=-Xmx4608m
android.useAndroidX=true
android.enableJetifier=true
diff --git a/assets/invidious.jpg b/assets/invidious.jpg
new file mode 100644
index 00000000..12c5f107
Binary files /dev/null and b/assets/invidious.jpg differ
diff --git a/build.yaml b/build.yaml
index 8dbfe45d..17d5bc50 100644
--- a/build.yaml
+++ b/build.yaml
@@ -10,6 +10,8 @@ targets:
explicit_to_json: true
drift_dev:
options:
+ databases:
+ app_db: lib/models/database/database.dart
sql:
dialect: sqlite
options:
diff --git a/cli/commands/build/android.dart b/cli/commands/build/android.dart
index 800522b8..4216553a 100644
--- a/cli/commands/build/android.dart
+++ b/cli/commands/build/android.dart
@@ -25,7 +25,8 @@ class AndroidBuildCommand extends Command with BuildCommandCommonSteps {
);
await dotEnvFile.writeAsString(
- "\nENABLE_UPDATE_CHECK=0",
+ "\nENABLE_UPDATE_CHECK=0"
+ "\nHIDE_DONATIONS=1",
mode: FileMode.append,
);
@@ -50,6 +51,7 @@ class AndroidBuildCommand extends Command with BuildCommandCommonSteps {
await shell.run(
"""
+ dart run build_runner clean
dart run build_runner build --delete-conflicting-outputs
flutter build appbundle --flavor ${CliEnv.channel.name}
""",
diff --git a/drift_schemas/app_db/drift_schema_v1.json b/drift_schemas/app_db/drift_schema_v1.json
new file mode 100644
index 00000000..b894446c
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v1.json
@@ -0,0 +1 @@
+{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"authentication_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"cookie","getter_name":"cookie","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"access_token","getter_name":"accessToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"expiration","getter_name":"expiration","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"blacklist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"element_type","getter_name":"elementType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BlacklistedType.values)","dart_type_name":"BlacklistedType"}},{"name":"element_id","getter_name":"elementId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"preferences_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_quality","getter_name":"audioQuality","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceQualities.high.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceQualities.values)","dart_type_name":"SourceQualities"}},{"name":"album_color_sync","getter_name":"albumColorSync","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"album_color_sync\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"album_color_sync\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"amoled_dark_theme","getter_name":"amoledDarkTheme","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"amoled_dark_theme\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"amoled_dark_theme\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"check_update","getter_name":"checkUpdate","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"check_update\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"check_update\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"normalize_audio","getter_name":"normalizeAudio","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"normalize_audio\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"normalize_audio\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"show_system_tray_icon","getter_name":"showSystemTrayIcon","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"show_system_tray_icon\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"show_system_tray_icon\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"system_title_bar","getter_name":"systemTitleBar","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"system_title_bar\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"system_title_bar\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"skip_non_music","getter_name":"skipNonMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"skip_non_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"skip_non_music\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"close_behavior","getter_name":"closeBehavior","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(CloseBehavior.close.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CloseBehavior.values)","dart_type_name":"CloseBehavior"}},{"name":"accent_color_scheme","getter_name":"accentColorScheme","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"Blue:0xFF2196F3\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeColorConverter()","dart_type_name":"SpotubeColor"}},{"name":"layout_mode","getter_name":"layoutMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(LayoutMode.adaptive.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(LayoutMode.values)","dart_type_name":"LayoutMode"}},{"name":"locale","getter_name":"locale","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('{\"languageCode\":\"system\",\"countryCode\":\"system\"}')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const LocaleConverter()","dart_type_name":"Locale"}},{"name":"market","getter_name":"market","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(Market.US.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(Market.values)","dart_type_name":"Market"}},{"name":"search_mode","getter_name":"searchMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SearchMode.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SearchMode.values)","dart_type_name":"SearchMode"}},{"name":"download_location","getter_name":"downloadLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[]},{"name":"local_library_location","getter_name":"localLibraryLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}},{"name":"piped_instance","getter_name":"pipedInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://pipedapi.kavin.rocks\")","default_client_dart":null,"dsl_features":[]},{"name":"theme_mode","getter_name":"themeMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(ThemeMode.system.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ThemeMode.values)","dart_type_name":"ThemeMode"}},{"name":"audio_source","getter_name":"audioSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(AudioSource.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(AudioSource.values)","dart_type_name":"AudioSource"}},{"name":"stream_music_codec","getter_name":"streamMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.weba.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"download_music_codec","getter_name":"downloadMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.m4a.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"discord_presence","getter_name":"discordPresence","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"discord_presence\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"discord_presence\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"endless_playback","getter_name":"endlessPlayback","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"endless_playback\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"endless_playback\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"enable_connect","getter_name":"enableConnect","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"enable_connect\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"enable_connect\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"scrobbler_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"password_hash","getter_name":"passwordHash","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"skip_segment_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"start","getter_name":"start","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end","getter_name":"end","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"source_match_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_id","getter_name":"sourceId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_type","getter_name":"sourceType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceType.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceType.values)","dart_type_name":"SourceType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[],"type":"table","data":{"name":"audio_player_state_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playing","getter_name":"playing","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"playing\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"playing\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"loop_mode","getter_name":"loopMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(PlaylistMode.values)","dart_type_name":"PlaylistMode"}},{"name":"shuffled","getter_name":"shuffled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"shuffled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"shuffled\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"collections","getter_name":"collections","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"references":[6],"type":"table","data":{"name":"playlist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_player_state_id","getter_name":"audioPlayerStateId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES audio_player_state_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES audio_player_state_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"index","getter_name":"index","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":8,"references":[7],"type":"table","data":{"name":"playlist_media_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playlist_id","getter_name":"playlistId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES playlist_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES playlist_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"uri","getter_name":"uri","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"extras","getter_name":"extras","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}},{"name":"http_headers","getter_name":"httpHeaders","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":9,"references":[],"type":"table","data":{"name":"history_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(HistoryEntryType.values)","dart_type_name":"HistoryEntryType"}},{"name":"item_id","getter_name":"itemId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[],"type":"table","data":{"name":"lyrics_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"SubtitleTypeConverter()","dart_type_name":"SubtitleSimple"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":11,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":12,"references":[5],"type":"index","data":{"on":5,"name":"uniq_track_match","sql":null,"unique":true,"columns":["track_id","source_id","source_type"]}}]}
\ No newline at end of file
diff --git a/drift_schemas/app_db/drift_schema_v2.json b/drift_schemas/app_db/drift_schema_v2.json
new file mode 100644
index 00000000..668afb3f
--- /dev/null
+++ b/drift_schemas/app_db/drift_schema_v2.json
@@ -0,0 +1 @@
+{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"authentication_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"cookie","getter_name":"cookie","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"access_token","getter_name":"accessToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}},{"name":"expiration","getter_name":"expiration","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"blacklist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"element_type","getter_name":"elementType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(BlacklistedType.values)","dart_type_name":"BlacklistedType"}},{"name":"element_id","getter_name":"elementId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"preferences_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_quality","getter_name":"audioQuality","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceQualities.high.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceQualities.values)","dart_type_name":"SourceQualities"}},{"name":"album_color_sync","getter_name":"albumColorSync","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"album_color_sync\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"album_color_sync\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"amoled_dark_theme","getter_name":"amoledDarkTheme","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"amoled_dark_theme\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"amoled_dark_theme\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"check_update","getter_name":"checkUpdate","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"check_update\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"check_update\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"normalize_audio","getter_name":"normalizeAudio","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"normalize_audio\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"normalize_audio\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"show_system_tray_icon","getter_name":"showSystemTrayIcon","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"show_system_tray_icon\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"show_system_tray_icon\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"system_title_bar","getter_name":"systemTitleBar","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"system_title_bar\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"system_title_bar\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"skip_non_music","getter_name":"skipNonMusic","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"skip_non_music\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"skip_non_music\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]},{"name":"close_behavior","getter_name":"closeBehavior","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(CloseBehavior.close.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(CloseBehavior.values)","dart_type_name":"CloseBehavior"}},{"name":"accent_color_scheme","getter_name":"accentColorScheme","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"Blue:0xFF2196F3\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const SpotubeColorConverter()","dart_type_name":"SpotubeColor"}},{"name":"layout_mode","getter_name":"layoutMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(LayoutMode.adaptive.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(LayoutMode.values)","dart_type_name":"LayoutMode"}},{"name":"locale","getter_name":"locale","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant('{\"languageCode\":\"system\",\"countryCode\":\"system\"}')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const LocaleConverter()","dart_type_name":"Locale"}},{"name":"market","getter_name":"market","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(Market.US.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(Market.values)","dart_type_name":"Market"}},{"name":"search_mode","getter_name":"searchMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SearchMode.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SearchMode.values)","dart_type_name":"SearchMode"}},{"name":"download_location","getter_name":"downloadLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[]},{"name":"local_library_location","getter_name":"localLibraryLocation","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"\")","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}},{"name":"piped_instance","getter_name":"pipedInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://pipedapi.kavin.rocks\")","default_client_dart":null,"dsl_features":[]},{"name":"invidious_instance","getter_name":"invidiousInstance","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const Constant(\"https://inv.nadeko.net\")","default_client_dart":null,"dsl_features":[]},{"name":"theme_mode","getter_name":"themeMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(ThemeMode.system.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ThemeMode.values)","dart_type_name":"ThemeMode"}},{"name":"audio_source","getter_name":"audioSource","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(AudioSource.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(AudioSource.values)","dart_type_name":"AudioSource"}},{"name":"stream_music_codec","getter_name":"streamMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.weba.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"download_music_codec","getter_name":"downloadMusicCodec","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceCodecs.m4a.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceCodecs.values)","dart_type_name":"SourceCodecs"}},{"name":"discord_presence","getter_name":"discordPresence","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"discord_presence\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"discord_presence\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"endless_playback","getter_name":"endlessPlayback","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"endless_playback\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"endless_playback\" IN (0, 1))"},"default_dart":"const Constant(true)","default_client_dart":null,"dsl_features":[]},{"name":"enable_connect","getter_name":"enableConnect","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"enable_connect\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"enable_connect\" IN (0, 1))"},"default_dart":"const Constant(false)","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"scrobbler_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"password_hash","getter_name":"passwordHash","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"EncryptedTextConverter()","dart_type_name":"DecryptedText"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"skip_segment_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"start","getter_name":"start","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"end","getter_name":"end","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"source_match_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_id","getter_name":"sourceId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"source_type","getter_name":"sourceType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Constant(SourceType.youtube.name)","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SourceType.values)","dart_type_name":"SourceType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[],"type":"table","data":{"name":"audio_player_state_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playing","getter_name":"playing","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"playing\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"playing\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"loop_mode","getter_name":"loopMode","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(PlaylistMode.values)","dart_type_name":"PlaylistMode"}},{"name":"shuffled","getter_name":"shuffled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"shuffled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"shuffled\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"collections","getter_name":"collections","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const StringListConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":7,"references":[6],"type":"table","data":{"name":"playlist_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"audio_player_state_id","getter_name":"audioPlayerStateId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES audio_player_state_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES audio_player_state_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"index","getter_name":"index","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":8,"references":[7],"type":"table","data":{"name":"playlist_media_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"playlist_id","getter_name":"playlistId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES playlist_table (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES playlist_table (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"uri","getter_name":"uri","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"extras","getter_name":"extras","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}},{"name":"http_headers","getter_name":"httpHeaders","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":9,"references":[],"type":"table","data":{"name":"history_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"currentDateAndTime","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(HistoryEntryType.values)","dart_type_name":"HistoryEntryType"}},{"name":"item_id","getter_name":"itemId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapTypeConverter()","dart_type_name":"Map"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":10,"references":[],"type":"table","data":{"name":"lyrics_table","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"track_id","getter_name":"trackId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"SubtitleTypeConverter()","dart_type_name":"SubtitleSimple"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":11,"references":[1],"type":"index","data":{"on":1,"name":"unique_blacklist","sql":null,"unique":true,"columns":["element_type","element_id"]}},{"id":12,"references":[5],"type":"index","data":{"on":5,"name":"uniq_track_match","sql":null,"unique":true,"columns":["track_id","source_id","source_type"]}}]}
\ No newline at end of file
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index a59f65eb..2d570cbc 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,5 +1,5 @@
PODS:
- - app_links (0.0.1):
+ - app_links (0.0.2):
- Flutter
- audio_service (0.0.1):
- Flutter
@@ -54,10 +54,10 @@ PODS:
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
- - OrderedSet (~> 5.0)
+ - OrderedSet (~> 6.0.3)
- flutter_inappwebview_ios/Core (0.0.1):
- Flutter
- - OrderedSet (~> 5.0)
+ - OrderedSet (~> 6.0.3)
- flutter_native_splash (0.0.1):
- Flutter
- flutter_secure_storage (6.0.0):
@@ -74,7 +74,7 @@ PODS:
- Flutter
- metadata_god (0.0.1):
- Flutter
- - OrderedSet (5.0.0)
+ - OrderedSet (6.0.3)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
@@ -202,7 +202,7 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios"
SPEC CHECKSUMS:
- app_links: e70ca16b4b0f88253b3b3660200d4a10b4ea9795
+ app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
audio_service: f509d65da41b9521a61f1c404dd58651f265a567
audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207
bonsoir_darwin: e3b8526c42ca46a885142df84229131dfabea842
@@ -214,16 +214,16 @@ SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_broadcasts: 3ece15b27d8ccbe2132c3df303e7c3401feab882
flutter_discord_rpc: e1c342f29ceb9dd76cdc01db59a70c93bb4d9ec5
- flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0
+ flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_sharing_intent: e35380d0e1501d7111dbb7e46d5ac6339da6da98
image_picker_ios: b545a5f16c0fa88e3ecbbce3ed4de45567a8ec18
- integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
+ integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
media_kit_libs_ios_audio: 8f39d96a9c630685dfb844c289bd1d114c486fb3
media_kit_native_event_loop: 99111eded5acbdc9c2738021ea6550dd36ca8837
metadata_god: 4bbd8523cdb5d42c5e59d2fabad01ff8f4bc53f9
- OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
+ OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart
index 2a30260b..f10242e8 100644
--- a/lib/collections/assets.gen.dart
+++ b/lib/collections/assets.gen.dart
@@ -49,6 +49,7 @@ class Assets {
AssetGenImage('assets/bengali-patterns-bg.jpg');
static const AssetGenImage branding = AssetGenImage('assets/branding.png');
static const AssetGenImage emptyBox = AssetGenImage('assets/empty_box.png');
+ static const AssetGenImage invidious = AssetGenImage('assets/invidious.jpg');
static const AssetGenImage jiosaavn = AssetGenImage('assets/jiosaavn.png');
static const AssetGenImage likedTracks =
AssetGenImage('assets/liked-tracks.jpg');
@@ -59,6 +60,8 @@ class Assets {
AssetGenImage('assets/spotube-hero-banner.png');
static const AssetGenImage spotubeLogoForeground =
AssetGenImage('assets/spotube-logo-foreground.jpg');
+ 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');
@@ -93,11 +96,13 @@ class Assets {
bengaliPatternsBg,
branding,
emptyBox,
+ invidious,
jiosaavn,
likedTracks,
placeholder,
spotubeHeroBanner,
spotubeLogoForeground,
+ spotubeLogoBmp,
spotubeLogoIco,
spotubeLogoPng,
spotubeLogoSvg,
diff --git a/lib/collections/env.dart b/lib/collections/env.dart
index df45cee9..eb60851f 100644
--- a/lib/collections/env.dart
+++ b/lib/collections/env.dart
@@ -19,6 +19,11 @@ abstract class Env {
@EnviedField(varName: 'LASTFM_API_SECRET')
static final String lastFmApiSecret = _Env.lastFmApiSecret;
+ @EnviedField(varName: 'HIDE_DONATIONS', defaultValue: "0")
+ static final int _hideDonations = _Env._hideDonations;
+
+ static bool get hideDonations => _hideDonations == 1;
+
static final spotifySecrets = rawSpotifySecrets.split(',').map((e) {
final secrets = e.trim().split(":").map((e) => e.trim());
return {
@@ -41,4 +46,4 @@ abstract class Env {
kIsFlatpak || _enableUpdateChecker == "1";
static String discordAppId = "1176718791388975124";
-}
\ No newline at end of file
+}
diff --git a/lib/hooks/configurators/use_deep_linking.dart b/lib/hooks/configurators/use_deep_linking.dart
index 0bb27a11..ec6d8516 100644
--- a/lib/hooks/configurators/use_deep_linking.dart
+++ b/lib/hooks/configurators/use_deep_linking.dart
@@ -11,7 +11,7 @@ import 'package:spotube/services/logger/logger.dart';
import 'package:spotube/utils/platform.dart';
final appLinks = AppLinks();
-final linkStream = appLinks.allStringLinkStream.asBroadcastStream();
+final linkStream = appLinks.stringLinkStream.asBroadcastStream();
void useDeepLinking(WidgetRef ref) {
// single instance no worries
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index c63f8543..27a64c87 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -190,6 +190,9 @@
"piped_instance": "Piped Server Instance",
"piped_description": "The Piped server instance to use for track matching",
"piped_warning": "Some of them might not work well. So use at your own risk",
+ "invidious_instance": "Invidious Server Instance",
+ "invidious_description": "The Invidious server instance to use for track matching",
+ "invidious_warning": "Some of them might not work well. So use at your own risk",
"generate_playlist": "Generate Playlist",
"track_exists": "Track {track} already exists",
"replace_downloaded_tracks": "Replace all downloaded tracks",
@@ -307,6 +310,7 @@
"youtube_source_description": "Recommended and works best.",
"piped_source_description": "Feeling free? Same as YouTube but a lot free.",
"jiosaavn_source_description": "Best for South Asian region.",
+ "invidious_source_description": "Similar to Piped but with higher availability.",
"highest_quality": "Highest Quality: {quality}",
"select_audio_source": "Select Audio Source",
"endless_playback_description": "Automatically append new songs\nto the end of the queue",
diff --git a/lib/models/connect/connect.g.dart b/lib/models/connect/connect.g.dart
index f297024b..10f46c65 100644
--- a/lib/models/connect/connect.g.dart
+++ b/lib/models/connect/connect.g.dart
@@ -16,7 +16,7 @@ _$WebSocketLoadEventDataPlaylistImpl
? null
: PlaylistSimple.fromJson(
Map.from(json['collection'] as Map)),
- initialIndex: json['initialIndex'] as int?,
+ initialIndex: (json['initialIndex'] as num?)?.toInt(),
$type: json['runtimeType'] as String?,
);
@@ -39,7 +39,7 @@ _$WebSocketLoadEventDataAlbumImpl _$$WebSocketLoadEventDataAlbumImplFromJson(
? null
: AlbumSimple.fromJson(
Map.from(json['collection'] as Map)),
- initialIndex: json['initialIndex'] as int?,
+ initialIndex: (json['initialIndex'] as num?)?.toInt(),
$type: json['runtimeType'] as String?,
);
diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart
index 21137174..978ceeb8 100644
--- a/lib/models/database/database.dart
+++ b/lib/models/database/database.dart
@@ -9,6 +9,7 @@ import 'package:media_kit/media_kit.dart' hide Track;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:spotify/spotify.dart' hide Playlist;
+import 'package:spotube/models/database/database.steps.dart';
import 'package:spotube/models/lyrics.dart';
import 'package:spotube/services/kv_store/encrypted_kv_store.dart';
import 'package:spotube/services/kv_store/kv_store.dart';
@@ -57,7 +58,20 @@ class AppDatabase extends _$AppDatabase {
AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection());
@override
- int get schemaVersion => 1;
+ int get schemaVersion => 2;
+
+ @override
+ MigrationStrategy get migration {
+ return MigrationStrategy(
+ onUpgrade: stepByStep(from1To2: (m, schema) async {
+ // Add invidiousInstance column to preferences table
+ await m.addColumn(
+ schema.preferencesTable,
+ schema.preferencesTable.invidiousInstance,
+ );
+ }),
+ );
+ }
}
LazyDatabase _openConnection() {
diff --git a/lib/models/database/database.g.dart b/lib/models/database/database.g.dart
index 1e585fa8..def70bd2 100644
--- a/lib/models/database/database.g.dart
+++ b/lib/models/database/database.g.dart
@@ -167,6 +167,17 @@ class AuthenticationTableData extends DataClass
accessToken: accessToken ?? this.accessToken,
expiration: expiration ?? this.expiration,
);
+ AuthenticationTableData copyWithCompanion(AuthenticationTableCompanion data) {
+ return AuthenticationTableData(
+ id: data.id.present ? data.id.value : this.id,
+ cookie: data.cookie.present ? data.cookie.value : this.cookie,
+ accessToken:
+ data.accessToken.present ? data.accessToken.value : this.accessToken,
+ expiration:
+ data.expiration.present ? data.expiration.value : this.expiration,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('AuthenticationTableData(')
@@ -430,6 +441,16 @@ class BlacklistTableData extends DataClass
elementType: elementType ?? this.elementType,
elementId: elementId ?? this.elementId,
);
+ BlacklistTableData copyWithCompanion(BlacklistTableCompanion data) {
+ return BlacklistTableData(
+ id: data.id.present ? data.id.value : this.id,
+ name: data.name.present ? data.name.value : this.name,
+ elementType:
+ data.elementType.present ? data.elementType.value : this.elementType,
+ elementId: data.elementId.present ? data.elementId.value : this.elementId,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('BlacklistTableData(')
@@ -712,6 +733,14 @@ class $PreferencesTableTable extends PreferencesTable
type: DriftSqlType.string,
requiredDuringInsert: false,
defaultValue: const Constant("https://pipedapi.kavin.rocks"));
+ static const VerificationMeta _invidiousInstanceMeta =
+ const VerificationMeta('invidiousInstance');
+ @override
+ late final GeneratedColumn invidiousInstance =
+ GeneratedColumn('invidious_instance', aliasedName, false,
+ type: DriftSqlType.string,
+ requiredDuringInsert: false,
+ defaultValue: const Constant("https://inv.nadeko.net"));
static const VerificationMeta _themeModeMeta =
const VerificationMeta('themeMode');
@override
@@ -803,6 +832,7 @@ class $PreferencesTableTable extends PreferencesTable
downloadLocation,
localLibraryLocation,
pipedInstance,
+ invidiousInstance,
themeMode,
audioSource,
streamMusicCodec,
@@ -888,6 +918,12 @@ class $PreferencesTableTable extends PreferencesTable
pipedInstance.isAcceptableOrUnknown(
data['piped_instance']!, _pipedInstanceMeta));
}
+ if (data.containsKey('invidious_instance')) {
+ context.handle(
+ _invidiousInstanceMeta,
+ invidiousInstance.isAcceptableOrUnknown(
+ data['invidious_instance']!, _invidiousInstanceMeta));
+ }
context.handle(_themeModeMeta, const VerificationResult.success());
context.handle(_audioSourceMeta, const VerificationResult.success());
context.handle(_streamMusicCodecMeta, const VerificationResult.success());
@@ -964,6 +1000,8 @@ class $PreferencesTableTable extends PreferencesTable
data['${effectivePrefix}local_library_location'])!),
pipedInstance: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}piped_instance'])!,
+ invidiousInstance: attachedDatabase.typeMapping.read(
+ DriftSqlType.string, data['${effectivePrefix}invidious_instance'])!,
themeMode: $PreferencesTableTable.$converterthemeMode.fromSql(
attachedDatabase.typeMapping.read(
DriftSqlType.string, data['${effectivePrefix}theme_mode'])!),
@@ -1040,6 +1078,7 @@ class PreferencesTableData extends DataClass
final String downloadLocation;
final List localLibraryLocation;
final String pipedInstance;
+ final String invidiousInstance;
final ThemeMode themeMode;
final AudioSource audioSource;
final SourceCodecs streamMusicCodec;
@@ -1066,6 +1105,7 @@ class PreferencesTableData extends DataClass
required this.downloadLocation,
required this.localLibraryLocation,
required this.pipedInstance,
+ required this.invidiousInstance,
required this.themeMode,
required this.audioSource,
required this.streamMusicCodec,
@@ -1120,6 +1160,7 @@ class PreferencesTableData extends DataClass
.toSql(localLibraryLocation));
}
map['piped_instance'] = Variable(pipedInstance);
+ map['invidious_instance'] = Variable(invidiousInstance);
{
map['theme_mode'] = Variable(
$PreferencesTableTable.$converterthemeMode.toSql(themeMode));
@@ -1164,6 +1205,7 @@ class PreferencesTableData extends DataClass
downloadLocation: Value(downloadLocation),
localLibraryLocation: Value(localLibraryLocation),
pipedInstance: Value(pipedInstance),
+ invidiousInstance: Value(invidiousInstance),
themeMode: Value(themeMode),
audioSource: Value(audioSource),
streamMusicCodec: Value(streamMusicCodec),
@@ -1203,6 +1245,7 @@ class PreferencesTableData extends DataClass
localLibraryLocation:
serializer.fromJson>(json['localLibraryLocation']),
pipedInstance: serializer.fromJson(json['pipedInstance']),
+ invidiousInstance: serializer.fromJson(json['invidiousInstance']),
themeMode: $PreferencesTableTable.$converterthemeMode
.fromJson(serializer.fromJson(json['themeMode'])),
audioSource: $PreferencesTableTable.$converteraudioSource
@@ -1244,6 +1287,7 @@ class PreferencesTableData extends DataClass
'localLibraryLocation':
serializer.toJson>(localLibraryLocation),
'pipedInstance': serializer.toJson(pipedInstance),
+ 'invidiousInstance': serializer.toJson(invidiousInstance),
'themeMode': serializer.toJson(
$PreferencesTableTable.$converterthemeMode.toJson(themeMode)),
'audioSource': serializer.toJson(
@@ -1279,6 +1323,7 @@ class PreferencesTableData extends DataClass
String? downloadLocation,
List? localLibraryLocation,
String? pipedInstance,
+ String? invidiousInstance,
ThemeMode? themeMode,
AudioSource? audioSource,
SourceCodecs? streamMusicCodec,
@@ -1305,6 +1350,7 @@ class PreferencesTableData extends DataClass
downloadLocation: downloadLocation ?? this.downloadLocation,
localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation,
pipedInstance: pipedInstance ?? this.pipedInstance,
+ invidiousInstance: invidiousInstance ?? this.invidiousInstance,
themeMode: themeMode ?? this.themeMode,
audioSource: audioSource ?? this.audioSource,
streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec,
@@ -1313,6 +1359,77 @@ class PreferencesTableData extends DataClass
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
enableConnect: enableConnect ?? this.enableConnect,
);
+ PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) {
+ return PreferencesTableData(
+ id: data.id.present ? data.id.value : this.id,
+ audioQuality: data.audioQuality.present
+ ? data.audioQuality.value
+ : this.audioQuality,
+ albumColorSync: data.albumColorSync.present
+ ? data.albumColorSync.value
+ : this.albumColorSync,
+ amoledDarkTheme: data.amoledDarkTheme.present
+ ? data.amoledDarkTheme.value
+ : this.amoledDarkTheme,
+ checkUpdate:
+ data.checkUpdate.present ? data.checkUpdate.value : this.checkUpdate,
+ normalizeAudio: data.normalizeAudio.present
+ ? data.normalizeAudio.value
+ : this.normalizeAudio,
+ showSystemTrayIcon: data.showSystemTrayIcon.present
+ ? data.showSystemTrayIcon.value
+ : this.showSystemTrayIcon,
+ systemTitleBar: data.systemTitleBar.present
+ ? data.systemTitleBar.value
+ : this.systemTitleBar,
+ skipNonMusic: data.skipNonMusic.present
+ ? data.skipNonMusic.value
+ : this.skipNonMusic,
+ closeBehavior: data.closeBehavior.present
+ ? data.closeBehavior.value
+ : this.closeBehavior,
+ accentColorScheme: data.accentColorScheme.present
+ ? data.accentColorScheme.value
+ : this.accentColorScheme,
+ layoutMode:
+ data.layoutMode.present ? data.layoutMode.value : this.layoutMode,
+ locale: data.locale.present ? data.locale.value : this.locale,
+ market: data.market.present ? data.market.value : this.market,
+ searchMode:
+ data.searchMode.present ? data.searchMode.value : this.searchMode,
+ downloadLocation: data.downloadLocation.present
+ ? data.downloadLocation.value
+ : this.downloadLocation,
+ localLibraryLocation: data.localLibraryLocation.present
+ ? data.localLibraryLocation.value
+ : this.localLibraryLocation,
+ pipedInstance: data.pipedInstance.present
+ ? data.pipedInstance.value
+ : this.pipedInstance,
+ invidiousInstance: data.invidiousInstance.present
+ ? data.invidiousInstance.value
+ : this.invidiousInstance,
+ themeMode: data.themeMode.present ? data.themeMode.value : this.themeMode,
+ audioSource:
+ data.audioSource.present ? data.audioSource.value : this.audioSource,
+ streamMusicCodec: data.streamMusicCodec.present
+ ? data.streamMusicCodec.value
+ : this.streamMusicCodec,
+ downloadMusicCodec: data.downloadMusicCodec.present
+ ? data.downloadMusicCodec.value
+ : this.downloadMusicCodec,
+ discordPresence: data.discordPresence.present
+ ? data.discordPresence.value
+ : this.discordPresence,
+ endlessPlayback: data.endlessPlayback.present
+ ? data.endlessPlayback.value
+ : this.endlessPlayback,
+ enableConnect: data.enableConnect.present
+ ? data.enableConnect.value
+ : this.enableConnect,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('PreferencesTableData(')
@@ -1334,6 +1451,7 @@ class PreferencesTableData extends DataClass
..write('downloadLocation: $downloadLocation, ')
..write('localLibraryLocation: $localLibraryLocation, ')
..write('pipedInstance: $pipedInstance, ')
+ ..write('invidiousInstance: $invidiousInstance, ')
..write('themeMode: $themeMode, ')
..write('audioSource: $audioSource, ')
..write('streamMusicCodec: $streamMusicCodec, ')
@@ -1365,6 +1483,7 @@ class PreferencesTableData extends DataClass
downloadLocation,
localLibraryLocation,
pipedInstance,
+ invidiousInstance,
themeMode,
audioSource,
streamMusicCodec,
@@ -1395,6 +1514,7 @@ class PreferencesTableData extends DataClass
other.downloadLocation == this.downloadLocation &&
other.localLibraryLocation == this.localLibraryLocation &&
other.pipedInstance == this.pipedInstance &&
+ other.invidiousInstance == this.invidiousInstance &&
other.themeMode == this.themeMode &&
other.audioSource == this.audioSource &&
other.streamMusicCodec == this.streamMusicCodec &&
@@ -1423,6 +1543,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
final Value downloadLocation;
final Value> localLibraryLocation;
final Value pipedInstance;
+ final Value invidiousInstance;
final Value themeMode;
final Value audioSource;
final Value streamMusicCodec;
@@ -1449,6 +1570,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
this.downloadLocation = const Value.absent(),
this.localLibraryLocation = const Value.absent(),
this.pipedInstance = const Value.absent(),
+ this.invidiousInstance = const Value.absent(),
this.themeMode = const Value.absent(),
this.audioSource = const Value.absent(),
this.streamMusicCodec = const Value.absent(),
@@ -1476,6 +1598,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
this.downloadLocation = const Value.absent(),
this.localLibraryLocation = const Value.absent(),
this.pipedInstance = const Value.absent(),
+ this.invidiousInstance = const Value.absent(),
this.themeMode = const Value.absent(),
this.audioSource = const Value.absent(),
this.streamMusicCodec = const Value.absent(),
@@ -1503,6 +1626,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
Expression? downloadLocation,
Expression? localLibraryLocation,
Expression? pipedInstance,
+ Expression? invidiousInstance,
Expression? themeMode,
Expression? audioSource,
Expression? streamMusicCodec,
@@ -1532,6 +1656,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
if (localLibraryLocation != null)
'local_library_location': localLibraryLocation,
if (pipedInstance != null) 'piped_instance': pipedInstance,
+ if (invidiousInstance != null) 'invidious_instance': invidiousInstance,
if (themeMode != null) 'theme_mode': themeMode,
if (audioSource != null) 'audio_source': audioSource,
if (streamMusicCodec != null) 'stream_music_codec': streamMusicCodec,
@@ -1562,6 +1687,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
Value? downloadLocation,
Value>? localLibraryLocation,
Value? pipedInstance,
+ Value? invidiousInstance,
Value? themeMode,
Value? audioSource,
Value? streamMusicCodec,
@@ -1588,6 +1714,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
downloadLocation: downloadLocation ?? this.downloadLocation,
localLibraryLocation: localLibraryLocation ?? this.localLibraryLocation,
pipedInstance: pipedInstance ?? this.pipedInstance,
+ invidiousInstance: invidiousInstance ?? this.invidiousInstance,
themeMode: themeMode ?? this.themeMode,
audioSource: audioSource ?? this.audioSource,
streamMusicCodec: streamMusicCodec ?? this.streamMusicCodec,
@@ -1667,6 +1794,9 @@ class PreferencesTableCompanion extends UpdateCompanion {
if (pipedInstance.present) {
map['piped_instance'] = Variable(pipedInstance.value);
}
+ if (invidiousInstance.present) {
+ map['invidious_instance'] = Variable(invidiousInstance.value);
+ }
if (themeMode.present) {
map['theme_mode'] = Variable(
$PreferencesTableTable.$converterthemeMode.toSql(themeMode.value));
@@ -1719,6 +1849,7 @@ class PreferencesTableCompanion extends UpdateCompanion {
..write('downloadLocation: $downloadLocation, ')
..write('localLibraryLocation: $localLibraryLocation, ')
..write('pipedInstance: $pipedInstance, ')
+ ..write('invidiousInstance: $invidiousInstance, ')
..write('themeMode: $themeMode, ')
..write('audioSource: $audioSource, ')
..write('streamMusicCodec: $streamMusicCodec, ')
@@ -1890,6 +2021,17 @@ class ScrobblerTableData extends DataClass
username: username ?? this.username,
passwordHash: passwordHash ?? this.passwordHash,
);
+ ScrobblerTableData copyWithCompanion(ScrobblerTableCompanion data) {
+ return ScrobblerTableData(
+ id: data.id.present ? data.id.value : this.id,
+ createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+ username: data.username.present ? data.username.value : this.username,
+ passwordHash: data.passwordHash.present
+ ? data.passwordHash.value
+ : this.passwordHash,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('ScrobblerTableData(')
@@ -2165,6 +2307,16 @@ class SkipSegmentTableData extends DataClass
trackId: trackId ?? this.trackId,
createdAt: createdAt ?? this.createdAt,
);
+ SkipSegmentTableData copyWithCompanion(SkipSegmentTableCompanion data) {
+ return SkipSegmentTableData(
+ id: data.id.present ? data.id.value : this.id,
+ start: data.start.present ? data.start.value : this.start,
+ end: data.end.present ? data.end.value : this.end,
+ trackId: data.trackId.present ? data.trackId.value : this.trackId,
+ createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('SkipSegmentTableData(')
@@ -2463,6 +2615,17 @@ class SourceMatchTableData extends DataClass
sourceType: sourceType ?? this.sourceType,
createdAt: createdAt ?? this.createdAt,
);
+ SourceMatchTableData copyWithCompanion(SourceMatchTableCompanion data) {
+ return SourceMatchTableData(
+ id: data.id.present ? data.id.value : this.id,
+ trackId: data.trackId.present ? data.trackId.value : this.trackId,
+ sourceId: data.sourceId.present ? data.sourceId.value : this.sourceId,
+ sourceType:
+ data.sourceType.present ? data.sourceType.value : this.sourceType,
+ createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('SourceMatchTableData(')
@@ -2769,6 +2932,18 @@ class AudioPlayerStateTableData extends DataClass
shuffled: shuffled ?? this.shuffled,
collections: collections ?? this.collections,
);
+ AudioPlayerStateTableData copyWithCompanion(
+ AudioPlayerStateTableCompanion data) {
+ return AudioPlayerStateTableData(
+ id: data.id.present ? data.id.value : this.id,
+ playing: data.playing.present ? data.playing.value : this.playing,
+ loopMode: data.loopMode.present ? data.loopMode.value : this.loopMode,
+ shuffled: data.shuffled.present ? data.shuffled.value : this.shuffled,
+ collections:
+ data.collections.present ? data.collections.value : this.collections,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('AudioPlayerStateTableData(')
@@ -3019,6 +3194,16 @@ class PlaylistTableData extends DataClass
audioPlayerStateId: audioPlayerStateId ?? this.audioPlayerStateId,
index: index ?? this.index,
);
+ PlaylistTableData copyWithCompanion(PlaylistTableCompanion data) {
+ return PlaylistTableData(
+ id: data.id.present ? data.id.value : this.id,
+ audioPlayerStateId: data.audioPlayerStateId.present
+ ? data.audioPlayerStateId.value
+ : this.audioPlayerStateId,
+ index: data.index.present ? data.index.value : this.index,
+ );
+ }
+
@override
String toString() {
return (StringBuffer('PlaylistTableData(')
@@ -3210,11 +3395,11 @@ class $PlaylistMediaTableTable extends PlaylistMediaTable
}
static TypeConverter