mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-06-10 00:23:58 +02:00
8c201b5b4a
- Add cloud upload settings to settings model (provider, URL, credentials, path) - Create CloudSettingsPage with WebDAV and SFTP provider options - Add Cloud Save menu item in main settings - Add localization strings for cloud settings - Actual upload implementation will come in v3.4.0 Settings fields added: - cloudUploadEnabled: toggle auto-upload - cloudProvider: 'webdav', 'sftp', or 'none' - cloudServerUrl: server URL - cloudUsername/cloudPassword: credentials - cloudRemotePath: destination folder path
179 lines
7.0 KiB
Dart
179 lines
7.0 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
|
|
|
part 'settings.g.dart';
|
|
|
|
@JsonSerializable()
|
|
class AppSettings {
|
|
final String defaultService;
|
|
final String audioQuality;
|
|
final String filenameFormat;
|
|
final String downloadDirectory;
|
|
final bool autoFallback;
|
|
final bool embedLyrics;
|
|
final bool maxQualityCover;
|
|
final bool isFirstLaunch;
|
|
final int concurrentDownloads;
|
|
final bool checkForUpdates;
|
|
final String updateChannel;
|
|
final bool hasSearchedBefore;
|
|
final String folderOrganization;
|
|
final String historyViewMode;
|
|
final String historyFilterMode;
|
|
final bool askQualityBeforeDownload;
|
|
final String spotifyClientId;
|
|
final String spotifyClientSecret;
|
|
final bool useCustomSpotifyCredentials;
|
|
final String metadataSource;
|
|
final bool enableLogging;
|
|
final bool useExtensionProviders;
|
|
final String? searchProvider;
|
|
final bool separateSingles;
|
|
final String albumFolderStructure;
|
|
final bool showExtensionStore;
|
|
final String locale;
|
|
final String lyricsMode;
|
|
final String tidalHighFormat; // Format for Tidal HIGH quality: 'mp3_320' or 'opus_128'
|
|
final bool useAllFilesAccess; // Android 13+ only: enable MANAGE_EXTERNAL_STORAGE
|
|
final bool autoExportFailedDownloads; // Auto export failed downloads to TXT file
|
|
final String downloadNetworkMode; // 'any' = WiFi + Mobile, 'wifi_only' = WiFi only
|
|
|
|
// Cloud Upload Settings
|
|
final bool cloudUploadEnabled; // Enable auto-upload after download
|
|
final String cloudProvider; // 'none', 'webdav', 'sftp', 'gdrive'
|
|
final String cloudServerUrl; // WebDAV/SFTP server URL
|
|
final String cloudUsername; // Server username
|
|
final String cloudPassword; // Server password (encrypted)
|
|
final String cloudRemotePath; // Remote folder path (e.g. /Music/SpotiFLAC)
|
|
|
|
const AppSettings({
|
|
this.defaultService = 'tidal',
|
|
this.audioQuality = 'LOSSLESS',
|
|
this.filenameFormat = '{title} - {artist}',
|
|
this.downloadDirectory = '',
|
|
this.autoFallback = true,
|
|
this.embedLyrics = true,
|
|
this.maxQualityCover = true,
|
|
this.isFirstLaunch = true,
|
|
this.concurrentDownloads = 1,
|
|
this.checkForUpdates = true,
|
|
this.updateChannel = 'stable',
|
|
this.hasSearchedBefore = false,
|
|
this.folderOrganization = 'none',
|
|
this.historyViewMode = 'grid',
|
|
this.historyFilterMode = 'all',
|
|
this.askQualityBeforeDownload = true,
|
|
this.spotifyClientId = '',
|
|
this.spotifyClientSecret = '',
|
|
this.useCustomSpotifyCredentials = true,
|
|
this.metadataSource = 'deezer',
|
|
this.enableLogging = false,
|
|
this.useExtensionProviders = true,
|
|
this.searchProvider,
|
|
this.separateSingles = false,
|
|
this.albumFolderStructure = 'artist_album',
|
|
this.showExtensionStore = true,
|
|
this.locale = 'system',
|
|
this.lyricsMode = 'embed',
|
|
this.tidalHighFormat = 'mp3_320',
|
|
this.useAllFilesAccess = false,
|
|
this.autoExportFailedDownloads = false,
|
|
this.downloadNetworkMode = 'any',
|
|
// Cloud Upload defaults
|
|
this.cloudUploadEnabled = false,
|
|
this.cloudProvider = 'none',
|
|
this.cloudServerUrl = '',
|
|
this.cloudUsername = '',
|
|
this.cloudPassword = '',
|
|
this.cloudRemotePath = '/Music/SpotiFLAC',
|
|
});
|
|
|
|
AppSettings copyWith({
|
|
String? defaultService,
|
|
String? audioQuality,
|
|
String? filenameFormat,
|
|
String? downloadDirectory,
|
|
bool? autoFallback,
|
|
bool? embedLyrics,
|
|
bool? maxQualityCover,
|
|
bool? isFirstLaunch,
|
|
int? concurrentDownloads,
|
|
bool? checkForUpdates,
|
|
String? updateChannel,
|
|
bool? hasSearchedBefore,
|
|
String? folderOrganization,
|
|
String? historyViewMode,
|
|
String? historyFilterMode,
|
|
bool? askQualityBeforeDownload,
|
|
String? spotifyClientId,
|
|
String? spotifyClientSecret,
|
|
bool? useCustomSpotifyCredentials,
|
|
String? metadataSource,
|
|
bool? enableLogging,
|
|
bool? useExtensionProviders,
|
|
String? searchProvider,
|
|
bool clearSearchProvider = false,
|
|
bool? separateSingles,
|
|
String? albumFolderStructure,
|
|
bool? showExtensionStore,
|
|
String? locale,
|
|
String? lyricsMode,
|
|
String? tidalHighFormat,
|
|
bool? useAllFilesAccess,
|
|
bool? autoExportFailedDownloads,
|
|
String? downloadNetworkMode,
|
|
// Cloud Upload
|
|
bool? cloudUploadEnabled,
|
|
String? cloudProvider,
|
|
String? cloudServerUrl,
|
|
String? cloudUsername,
|
|
String? cloudPassword,
|
|
String? cloudRemotePath,
|
|
}) {
|
|
return AppSettings(
|
|
defaultService: defaultService ?? this.defaultService,
|
|
audioQuality: audioQuality ?? this.audioQuality,
|
|
filenameFormat: filenameFormat ?? this.filenameFormat,
|
|
downloadDirectory: downloadDirectory ?? this.downloadDirectory,
|
|
autoFallback: autoFallback ?? this.autoFallback,
|
|
embedLyrics: embedLyrics ?? this.embedLyrics,
|
|
maxQualityCover: maxQualityCover ?? this.maxQualityCover,
|
|
isFirstLaunch: isFirstLaunch ?? this.isFirstLaunch,
|
|
concurrentDownloads: concurrentDownloads ?? this.concurrentDownloads,
|
|
checkForUpdates: checkForUpdates ?? this.checkForUpdates,
|
|
updateChannel: updateChannel ?? this.updateChannel,
|
|
hasSearchedBefore: hasSearchedBefore ?? this.hasSearchedBefore,
|
|
folderOrganization: folderOrganization ?? this.folderOrganization,
|
|
historyViewMode: historyViewMode ?? this.historyViewMode,
|
|
historyFilterMode: historyFilterMode ?? this.historyFilterMode,
|
|
askQualityBeforeDownload: askQualityBeforeDownload ?? this.askQualityBeforeDownload,
|
|
spotifyClientId: spotifyClientId ?? this.spotifyClientId,
|
|
spotifyClientSecret: spotifyClientSecret ?? this.spotifyClientSecret,
|
|
useCustomSpotifyCredentials: useCustomSpotifyCredentials ?? this.useCustomSpotifyCredentials,
|
|
metadataSource: metadataSource ?? this.metadataSource,
|
|
enableLogging: enableLogging ?? this.enableLogging,
|
|
useExtensionProviders: useExtensionProviders ?? this.useExtensionProviders,
|
|
searchProvider: clearSearchProvider ? null : (searchProvider ?? this.searchProvider),
|
|
separateSingles: separateSingles ?? this.separateSingles,
|
|
albumFolderStructure: albumFolderStructure ?? this.albumFolderStructure,
|
|
showExtensionStore: showExtensionStore ?? this.showExtensionStore,
|
|
locale: locale ?? this.locale,
|
|
lyricsMode: lyricsMode ?? this.lyricsMode,
|
|
tidalHighFormat: tidalHighFormat ?? this.tidalHighFormat,
|
|
useAllFilesAccess: useAllFilesAccess ?? this.useAllFilesAccess,
|
|
autoExportFailedDownloads: autoExportFailedDownloads ?? this.autoExportFailedDownloads,
|
|
downloadNetworkMode: downloadNetworkMode ?? this.downloadNetworkMode,
|
|
// Cloud Upload
|
|
cloudUploadEnabled: cloudUploadEnabled ?? this.cloudUploadEnabled,
|
|
cloudProvider: cloudProvider ?? this.cloudProvider,
|
|
cloudServerUrl: cloudServerUrl ?? this.cloudServerUrl,
|
|
cloudUsername: cloudUsername ?? this.cloudUsername,
|
|
cloudPassword: cloudPassword ?? this.cloudPassword,
|
|
cloudRemotePath: cloudRemotePath ?? this.cloudRemotePath,
|
|
);
|
|
}
|
|
|
|
factory AppSettings.fromJson(Map<String, dynamic> json) =>
|
|
_$AppSettingsFromJson(json);
|
|
Map<String, dynamic> toJson() => _$AppSettingsToJson(this);
|
|
}
|