mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45:18 +00:00

* feat: add one additional library folder This folder just doesn't get downloaded to. I think I'm going to rework it so that it can be multiple folders, but I'm going to commit my progress so far anyway. Signed-off-by: Blake Leonard <me@blakes.dev> * chore: update dependencies so that it builds I'm not sure if this breaks CI or something, but I couldn't build it locally to test my changes, so I made these changes and it builds again. Signed-off-by: Blake Leonard <me@blakes.dev> * feat: index multiple folders of local music If you used a previous commit from this branch, this is a breaking change, because it changes the type of a configuration field. but since this is still in development, it should be fine. Signed-off-by: Blake Leonard <me@blakes.dev> * refactor: manage local library in local tracks tab This also refactors the list to use slivers instead. That's the easiest way to have multiple scrolling lists here... The console keeps getting spammed with some intermediate layout error but I can't hold it long enough to figure out what's causing it. Signed-off-by: Blake Leonard <me@blakes.dev> * refactor: use folder add/remove icons in library Signed-off-by: Blake Leonard <me@blakes.dev> * refactor: remove redundant settings page Signed-off-by: Blake Leonard <me@blakes.dev> * refactor: rename "Local Tracks" to just "Local" Not sure if this would be the recommended way to do it... Signed-off-by: Blake Leonard <me@blakes.dev> * fix: console spam about useless Expanded Signed-off-by: Blake Leonard <me@blakes.dev> * chore: remove completed TODO Signed-off-by: Blake Leonard <me@blakes.dev> * chore: use new Platform constants; regenerate plugins Signed-off-by: Blake Leonard <me@blakes.dev> * refactor: put local libraries on separate pages Signed-off-by: Blake Leonard <me@blakes.dev> --------- Signed-off-by: Blake Leonard <me@blakes.dev>
183 lines
5.0 KiB
Dart
183 lines
5.0 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:spotify/spotify.dart';
|
|
import 'package:spotube/components/settings/color_scheme_picker_dialog.dart';
|
|
import 'package:spotube/provider/palette_provider.dart';
|
|
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
|
|
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
|
import 'package:spotube/services/sourced_track/enums.dart';
|
|
|
|
import 'package:spotube/utils/persisted_state_notifier.dart';
|
|
import 'package:spotube/utils/platform.dart';
|
|
import 'package:path/path.dart' as path;
|
|
import 'package:window_manager/window_manager.dart';
|
|
|
|
class UserPreferencesNotifier extends PersistedStateNotifier<UserPreferences> {
|
|
final Ref ref;
|
|
|
|
UserPreferencesNotifier(this.ref)
|
|
: super(UserPreferences.withDefaults(), "preferences");
|
|
|
|
void reset() {
|
|
state = UserPreferences.withDefaults();
|
|
}
|
|
|
|
void setStreamMusicCodec(SourceCodecs codec) {
|
|
state = state.copyWith(streamMusicCodec: codec);
|
|
}
|
|
|
|
void setDownloadMusicCodec(SourceCodecs codec) {
|
|
state = state.copyWith(downloadMusicCodec: codec);
|
|
}
|
|
|
|
void setThemeMode(ThemeMode mode) {
|
|
state = state.copyWith(themeMode: mode);
|
|
}
|
|
|
|
void setRecommendationMarket(Market country) {
|
|
state = state.copyWith(recommendationMarket: country);
|
|
}
|
|
|
|
void setAccentColorScheme(SpotubeColor color) {
|
|
state = state.copyWith(accentColorScheme: color);
|
|
}
|
|
|
|
void setAlbumColorSync(bool sync) {
|
|
state = state.copyWith(albumColorSync: sync);
|
|
|
|
if (!sync) {
|
|
ref.read(paletteProvider.notifier).state = null;
|
|
} else {
|
|
ref.read(proxyPlaylistProvider.notifier).updatePalette();
|
|
}
|
|
}
|
|
|
|
void setCheckUpdate(bool check) {
|
|
state = state.copyWith(checkUpdate: check);
|
|
}
|
|
|
|
void setAudioQuality(SourceQualities quality) {
|
|
state = state.copyWith(audioQuality: quality);
|
|
}
|
|
|
|
void setDownloadLocation(String downloadDir) {
|
|
if (downloadDir.isEmpty) return;
|
|
state = state.copyWith(downloadLocation: downloadDir);
|
|
}
|
|
|
|
void setLocalLibraryLocation(List<String> localLibraryDirs) {
|
|
//if (localLibraryDir.isEmpty) return;
|
|
state = state.copyWith(localLibraryLocation: localLibraryDirs);
|
|
}
|
|
|
|
void setLayoutMode(LayoutMode mode) {
|
|
state = state.copyWith(layoutMode: mode);
|
|
}
|
|
|
|
void setCloseBehavior(CloseBehavior behavior) {
|
|
state = state.copyWith(closeBehavior: behavior);
|
|
}
|
|
|
|
void setShowSystemTrayIcon(bool show) {
|
|
state = state.copyWith(showSystemTrayIcon: show);
|
|
}
|
|
|
|
void setLocale(Locale locale) {
|
|
state = state.copyWith(locale: locale);
|
|
}
|
|
|
|
void setPipedInstance(String instance) {
|
|
state = state.copyWith(pipedInstance: instance);
|
|
}
|
|
|
|
void setSearchMode(SearchMode mode) {
|
|
state = state.copyWith(searchMode: mode);
|
|
}
|
|
|
|
void setSkipNonMusic(bool skip) {
|
|
state = state.copyWith(skipNonMusic: skip);
|
|
}
|
|
|
|
void setAudioSource(AudioSource type) {
|
|
state = state.copyWith(audioSource: type);
|
|
}
|
|
|
|
void setSystemTitleBar(bool isSystemTitleBar) {
|
|
state = state.copyWith(systemTitleBar: isSystemTitleBar);
|
|
if (kIsDesktop) {
|
|
windowManager.setTitleBarStyle(
|
|
isSystemTitleBar ? TitleBarStyle.normal : TitleBarStyle.hidden,
|
|
);
|
|
}
|
|
}
|
|
|
|
void setDiscordPresence(bool discordPresence) {
|
|
state = state.copyWith(discordPresence: discordPresence);
|
|
}
|
|
|
|
void setAmoledDarkTheme(bool isAmoled) {
|
|
state = state.copyWith(amoledDarkTheme: isAmoled);
|
|
}
|
|
|
|
void setNormalizeAudio(bool normalize) {
|
|
state = state.copyWith(normalizeAudio: normalize);
|
|
audioPlayer.setAudioNormalization(normalize);
|
|
}
|
|
|
|
void setEndlessPlayback(bool endless) {
|
|
state = state.copyWith(endlessPlayback: endless);
|
|
}
|
|
|
|
void setEnableConnect(bool enable) {
|
|
state = state.copyWith(enableConnect: enable);
|
|
}
|
|
|
|
Future<String> _getDefaultDownloadDirectory() async {
|
|
if (kIsAndroid) return "/storage/emulated/0/Download/Spotube";
|
|
|
|
if (kIsMacOS) {
|
|
return path.join((await getLibraryDirectory()).path, "Caches");
|
|
}
|
|
|
|
return getDownloadsDirectory().then((dir) {
|
|
return path.join(dir!.path, "Spotube");
|
|
});
|
|
}
|
|
|
|
@override
|
|
FutureOr<void> onInit() async {
|
|
if (state.downloadLocation.isEmpty) {
|
|
state = state.copyWith(
|
|
downloadLocation: await _getDefaultDownloadDirectory(),
|
|
);
|
|
}
|
|
|
|
if (kIsDesktop) {
|
|
await windowManager.setTitleBarStyle(
|
|
state.systemTitleBar ? TitleBarStyle.normal : TitleBarStyle.hidden,
|
|
);
|
|
}
|
|
|
|
await audioPlayer.setAudioNormalization(state.normalizeAudio);
|
|
}
|
|
|
|
@override
|
|
FutureOr<UserPreferences> fromJson(Map<String, dynamic> json) {
|
|
return UserPreferences.fromJson(json);
|
|
}
|
|
|
|
@override
|
|
Map<String, dynamic> toJson() {
|
|
return state.toJson();
|
|
}
|
|
}
|
|
|
|
final userPreferencesProvider =
|
|
StateNotifierProvider<UserPreferencesNotifier, UserPreferences>(
|
|
(ref) => UserPreferencesNotifier(ref),
|
|
);
|