spotube/lib/models/database/tables/preferences.dart

154 lines
5.2 KiB
Dart

part of '../database.dart';
enum LayoutMode {
compact,
extended,
adaptive,
}
enum CloseBehavior {
minimizeToTray,
close,
}
enum AudioSource {
youtube,
piped,
jiosaavn,
invidious;
String get label => name[0].toUpperCase() + name.substring(1);
}
enum YoutubeClientEngine {
ytDlp("yt-dlp"),
youtubeExplode("YouTubeExplode"),
newPipe("NewPipe");
final String label;
const YoutubeClientEngine(this.label);
bool isAvailableForPlatform() {
return switch (this) {
YoutubeClientEngine.youtubeExplode =>
YouTubeExplodeEngine.isAvailableForPlatform,
YoutubeClientEngine.ytDlp => YtDlpEngine.isAvailableForPlatform,
YoutubeClientEngine.newPipe => NewPipeEngine.isAvailableForPlatform,
};
}
}
enum MusicCodec {
m4a._("M4a (Best for downloaded music)"),
weba._("WebA (Best for streamed music)\nDoesn't support audio metadata");
final String label;
const MusicCodec._(this.label);
}
enum SearchMode {
youtube._("YouTube"),
youtubeMusic._("YouTube Music");
final String label;
const SearchMode._(this.label);
factory SearchMode.fromString(String key) {
return SearchMode.values.firstWhere((e) => e.name == key);
}
}
class PreferencesTable extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get audioQuality => textEnum<SourceQualities>()
.withDefault(Constant(SourceQualities.high.name))();
BoolColumn get albumColorSync =>
boolean().withDefault(const Constant(true))();
BoolColumn get amoledDarkTheme =>
boolean().withDefault(const Constant(false))();
BoolColumn get checkUpdate => boolean().withDefault(const Constant(true))();
BoolColumn get normalizeAudio =>
boolean().withDefault(const Constant(false))();
BoolColumn get showSystemTrayIcon =>
boolean().withDefault(const Constant(false))();
BoolColumn get systemTitleBar =>
boolean().withDefault(const Constant(false))();
BoolColumn get skipNonMusic => boolean().withDefault(const Constant(false))();
TextColumn get closeBehavior => textEnum<CloseBehavior>()
.withDefault(Constant(CloseBehavior.close.name))();
TextColumn get accentColorScheme => text()
.withDefault(const Constant("Orange:0xFFf97315"))
.map(const SpotubeColorConverter())();
TextColumn get layoutMode =>
textEnum<LayoutMode>().withDefault(Constant(LayoutMode.adaptive.name))();
TextColumn get locale => text()
.withDefault(
const Constant('{"languageCode":"system","countryCode":"system"}'),
)
.map(const LocaleConverter())();
TextColumn get market =>
textEnum<Market>().withDefault(Constant(Market.US.name))();
TextColumn get searchMode =>
textEnum<SearchMode>().withDefault(Constant(SearchMode.youtube.name))();
TextColumn get downloadLocation => text().withDefault(const Constant(""))();
TextColumn get localLibraryLocation =>
text().withDefault(const Constant("")).map(const StringListConverter())();
TextColumn get pipedInstance =>
text().withDefault(const Constant("https://pipedapi.kavin.rocks"))();
TextColumn get invidiousInstance =>
text().withDefault(const Constant("https://inv.nadeko.net"))();
TextColumn get themeMode =>
textEnum<ThemeMode>().withDefault(Constant(ThemeMode.system.name))();
TextColumn get audioSource =>
textEnum<AudioSource>().withDefault(Constant(AudioSource.youtube.name))();
TextColumn get youtubeClientEngine => textEnum<YoutubeClientEngine>()
.withDefault(Constant(YoutubeClientEngine.youtubeExplode.name))();
TextColumn get streamMusicCodec =>
textEnum<SourceCodecs>().withDefault(Constant(SourceCodecs.weba.name))();
TextColumn get downloadMusicCodec =>
textEnum<SourceCodecs>().withDefault(Constant(SourceCodecs.m4a.name))();
BoolColumn get discordPresence =>
boolean().withDefault(const Constant(true))();
BoolColumn get endlessPlayback =>
boolean().withDefault(const Constant(true))();
BoolColumn get enableConnect =>
boolean().withDefault(const Constant(false))();
BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))();
// Default values as PreferencesTableData
static PreferencesTableData defaults() {
return PreferencesTableData(
id: 0,
audioQuality: SourceQualities.high,
albumColorSync: true,
amoledDarkTheme: false,
checkUpdate: true,
normalizeAudio: false,
showSystemTrayIcon: false,
systemTitleBar: false,
skipNonMusic: false,
closeBehavior: CloseBehavior.close,
accentColorScheme: SpotubeColor(Colors.orange.value, name: "Orange"),
layoutMode: LayoutMode.adaptive,
locale: const Locale("system", "system"),
market: Market.US,
searchMode: SearchMode.youtube,
downloadLocation: "",
localLibraryLocation: [],
pipedInstance: "https://pipedapi.kavin.rocks",
invidiousInstance: "https://inv.nadeko.net",
themeMode: ThemeMode.system,
audioSource: AudioSource.youtube,
youtubeClientEngine: YoutubeClientEngine.youtubeExplode,
streamMusicCodec: SourceCodecs.m4a,
downloadMusicCodec: SourceCodecs.m4a,
discordPresence: true,
endlessPlayback: true,
enableConnect: false,
cacheMusic: true,
);
}
}