From f8b7812943f08d5e17d21785d6bd0fa8cc9ab996 Mon Sep 17 00:00:00 2001 From: Amonoman Date: Sat, 2 May 2026 18:47:09 +0200 Subject: [PATCH] feat: add deduplicateDownloads setting & fix build errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add deduplicateDownloads field to AppSettings (default: true) - Add setDeduplicateDownloads() to SettingsNotifier - Fix type mismatch in files_settings_page (Object → String cast) - Run build_runner to regenerate settings.g.dart --- .github/workflows/release.yml | 3 +++ lib/models/settings.dart | 6 ++++++ lib/providers/settings_provider.dart | 5 +++++ lib/screens/settings/files_settings_page.dart | 2 +- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2d0a080..51f74317 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,6 +76,9 @@ jobs: - name: Get Flutter dependencies run: flutter pub get + - name: Generate code + run: dart run build_runner build --delete-conflicting-outputs + - name: Build APK (Only arm64) run: flutter build apk --release --target-platform android-arm64 diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 147c2c20..17f125d5 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -82,6 +82,9 @@ class AppSettings { final String lastSeenVersion; // Last app version the user has acknowledged (e.g. '3.7.0') + final bool + deduplicateDownloads; // Skip downloading tracks already present in history + const AppSettings({ this.defaultService = 'tidal', this.audioQuality = 'LOSSLESS', @@ -144,6 +147,7 @@ class AppSettings { this.lyricsMultiPersonWordByWord = false, this.musixmatchLanguage = '', this.lastSeenVersion = '', + this.deduplicateDownloads = true, }); AppSettings copyWith({ @@ -205,6 +209,7 @@ class AppSettings { bool? lyricsMultiPersonWordByWord, String? musixmatchLanguage, String? lastSeenVersion, + bool? deduplicateDownloads, }) { return AppSettings( defaultService: defaultService ?? this.defaultService, @@ -281,6 +286,7 @@ class AppSettings { lyricsMultiPersonWordByWord ?? this.lyricsMultiPersonWordByWord, musixmatchLanguage: musixmatchLanguage ?? this.musixmatchLanguage, lastSeenVersion: lastSeenVersion ?? this.lastSeenVersion, + deduplicateDownloads: deduplicateDownloads ?? this.deduplicateDownloads, ); } diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 4e2ea6ca..906715c3 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -544,6 +544,11 @@ class SettingsNotifier extends Notifier { state = state.copyWith(hasCompletedTutorial: true); _saveSettings(); } + + void setDeduplicateDownloads(bool enabled) { + state = state.copyWith(deduplicateDownloads: enabled); + _saveSettings(); + } } final settingsProvider = NotifierProvider( diff --git a/lib/screens/settings/files_settings_page.dart b/lib/screens/settings/files_settings_page.dart index 0382abc4..85a7bee6 100644 --- a/lib/screens/settings/files_settings_page.dart +++ b/lib/screens/settings/files_settings_page.dart @@ -753,7 +753,7 @@ class _FilesSettingsPageState extends ConsumerState { ), const SizedBox(height: 8), Text( - description ?? context.l10n.downloadFilenameDescription, + description ?? context.l10n.downloadFilenameDescription as String, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: colorScheme.onSurfaceVariant, ),