v3.7.0: roll back from v4, remove internal player — v3 is already complete

Version rolled back from v4.x to v3.7.0. After extensive work on v4's
internal streaming engine, smart queue, DASH pipeline, and media controls,
we realized v3 was already feature-complete. Adding more big features
only made maintenance increasingly difficult and the developer's life
miserable. Stripped back to what works: external player only, cleaner
codebase, sustainable long-term.

- Remove just_audio, audio_service, audio_session and entire internal
  playback engine (smart queue, notification, shuffle/repeat, prefetch)
- Remove PlaybackItem model, MiniPlayerBar widget, notification drawables
- Remove playerMode setting (external-only now)
- Migrate MainActivity from AudioServiceFragmentActivity to
  FlutterFragmentActivity
- Migrate Qobuz to MusicDL API
- Update changelog with v3.7.0 rollback explanation
This commit is contained in:
zarzet
2026-03-04 02:02:25 +07:00
parent 4747119a7f
commit 98abaf6635
56 changed files with 687 additions and 10106 deletions
+2 -2
View File
@@ -1,8 +1,8 @@
/// App version and info constants
/// Update version here only - all other files will reference this
class AppInfo {
static const String version = '4.0.1';
static const String buildNumber = '102';
static const String version = '3.7.0';
static const String buildNumber = '103';
static const String fullVersion = '$version+$buildNumber';
-312
View File
@@ -5699,318 +5699,6 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'You can switch between modes anytime in Settings.'**
String get setupModeChangeableLater;
/// Title for Smart Queue toggle in settings
///
/// In en, this message translates to:
/// **'Smart Queue'**
String get settingsSmartQueueTitle;
/// Subtitle for Smart Queue toggle in settings
///
/// In en, this message translates to:
/// **'Automatically discover and add similar tracks to your queue'**
String get settingsSmartQueueSubtitle;
/// Title for the What's New screen
///
/// In en, this message translates to:
/// **'What\'s New in 4.0'**
String get whatsNewTitle;
/// Subtitle for the What's New screen
///
/// In en, this message translates to:
/// **'SpotiFLAC has evolved — here\'s what changed since 3.x'**
String get whatsNewSubtitle;
/// Welcome page title in What's New screen
///
/// In en, this message translates to:
/// **'SpotiFLAC Mobile 4.0'**
String get whatsNewWelcomeTitle;
/// Welcome page description in What's New screen
///
/// In en, this message translates to:
/// **'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.'**
String get whatsNewWelcomeDesc;
/// Welcome page tip 1
///
/// In en, this message translates to:
/// **'New streaming mode with instant playback'**
String get whatsNewWelcomeTip1;
/// Welcome page tip 2
///
/// In en, this message translates to:
/// **'Redesigned library and full-screen player'**
String get whatsNewWelcomeTip2;
/// Welcome page tip 3
///
/// In en, this message translates to:
/// **'Batch tools, performance boosts, and more'**
String get whatsNewWelcomeTip3;
/// What's New feature: Streaming Mode title
///
/// In en, this message translates to:
/// **'Streaming Mode'**
String get whatsNewStreamingTitle;
/// What's New feature: Streaming Mode description
///
/// In en, this message translates to:
/// **'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.'**
String get whatsNewStreamingDesc;
/// What's New feature: Smart Queue title
///
/// In en, this message translates to:
/// **'Smart Queue'**
String get whatsNewSmartQueueTitle;
/// What's New feature: Smart Queue description
///
/// In en, this message translates to:
/// **'Your queue auto-curates with related tracks and artist discovery. Never run out of music.'**
String get whatsNewSmartQueueDesc;
/// What's New feature: Dual Mode title
///
/// In en, this message translates to:
/// **'Dual Mode'**
String get whatsNewDualModeTitle;
/// What's New feature: Dual Mode description
///
/// In en, this message translates to:
/// **'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.'**
String get whatsNewDualModeDesc;
/// What's New feature: Library redesign title
///
/// In en, this message translates to:
/// **'Redesigned Library'**
String get whatsNewLibraryTitle;
/// What's New feature: Library redesign description
///
/// In en, this message translates to:
/// **'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.'**
String get whatsNewLibraryDesc;
/// What's New feature: Full-Screen Player title
///
/// In en, this message translates to:
/// **'Full-Screen Player'**
String get whatsNewPlayerTitle;
/// What's New feature: Full-Screen Player description
///
/// In en, this message translates to:
/// **'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.'**
String get whatsNewPlayerDesc;
/// What's New feature: Context Menus title
///
/// In en, this message translates to:
/// **'Long-Press Menus'**
String get whatsNewContextMenuTitle;
/// What's New feature: Context Menus description
///
/// In en, this message translates to:
/// **'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.'**
String get whatsNewContextMenuDesc;
/// What's New feature: Performance title
///
/// In en, this message translates to:
/// **'Performance'**
String get whatsNewPerformanceTitle;
/// What's New feature: Performance description
///
/// In en, this message translates to:
/// **'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.'**
String get whatsNewPerformanceDesc;
/// What's New feature: Batch Tools title
///
/// In en, this message translates to:
/// **'Batch Tools'**
String get whatsNewBatchToolsTitle;
/// What's New feature: Batch Tools description
///
/// In en, this message translates to:
/// **'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.'**
String get whatsNewBatchToolsDesc;
/// What's New tip: streaming instant play
///
/// In en, this message translates to:
/// **'Tap any track to start playing instantly'**
String get whatsNewStreamingTip1;
/// What's New tip: streaming synced lyrics
///
/// In en, this message translates to:
/// **'Synced lyrics in the full-screen player'**
String get whatsNewStreamingTip2;
/// What's New tip: streaming download from player
///
/// In en, this message translates to:
/// **'Download tracks directly from the player'**
String get whatsNewStreamingTip3;
/// What's New tip: smart queue auto-fill
///
/// In en, this message translates to:
/// **'Queue auto-fills with related tracks'**
String get whatsNewSmartQueueTip1;
/// What's New tip: smart queue artist discovery
///
/// In en, this message translates to:
/// **'Discover new artists as you listen'**
String get whatsNewSmartQueueTip2;
/// What's New tip: smart queue endless
///
/// In en, this message translates to:
/// **'Never run out of music to play'**
String get whatsNewSmartQueueTip3;
/// What's New tip: dual mode switch
///
/// In en, this message translates to:
/// **'Switch modes anytime in Settings'**
String get whatsNewDualModeTip1;
/// What's New tip: dual mode adaptive UI
///
/// In en, this message translates to:
/// **'UI buttons adapt to your current mode'**
String get whatsNewDualModeTip2;
/// What's New tip: dual mode use cases
///
/// In en, this message translates to:
/// **'Download for offline, stream for instant play'**
String get whatsNewDualModeTip3;
/// What's New tip: library drag and drop
///
/// In en, this message translates to:
/// **'Drag and drop to organize playlists'**
String get whatsNewLibraryTip1;
/// What's New tip: library custom covers
///
/// In en, this message translates to:
/// **'Set custom cover images for playlists'**
String get whatsNewLibraryTip2;
/// What's New tip: library multi-select
///
/// In en, this message translates to:
/// **'Multi-select tracks for batch actions'**
String get whatsNewLibraryTip3;
/// What's New tip: player parallax
///
/// In en, this message translates to:
/// **'Cover art with parallax scrolling effect'**
String get whatsNewPlayerTip1;
/// What's New tip: player persistence
///
/// In en, this message translates to:
/// **'Playback persists across app restarts'**
String get whatsNewPlayerTip2;
/// What's New tip: player lyrics
///
/// In en, this message translates to:
/// **'Synced lyrics while you listen'**
String get whatsNewPlayerTip3;
/// What's New tip: context menu add to playlist
///
/// In en, this message translates to:
/// **'Add tracks to any playlist instantly'**
String get whatsNewContextMenuTip1;
/// What's New tip: context menu share/convert
///
/// In en, this message translates to:
/// **'Share or convert with one tap'**
String get whatsNewContextMenuTip2;
/// What's New tip: context menu re-enrich
///
/// In en, this message translates to:
/// **'Re-enrich metadata when needed'**
String get whatsNewContextMenuTip3;
/// What's New tip: batch share
///
/// In en, this message translates to:
/// **'Share multiple tracks at once'**
String get whatsNewBatchToolsTip1;
/// What's New tip: batch convert
///
/// In en, this message translates to:
/// **'Batch convert to MP3 or Opus format'**
String get whatsNewBatchToolsTip2;
/// What's New tip: batch re-enrich
///
/// In en, this message translates to:
/// **'Re-enrich metadata across your library'**
String get whatsNewBatchToolsTip3;
/// What's New tip: performance startup
///
/// In en, this message translates to:
/// **'Faster app startup time'**
String get whatsNewPerformanceTip1;
/// What's New tip: performance memory
///
/// In en, this message translates to:
/// **'Reduced memory usage during playback'**
String get whatsNewPerformanceTip2;
/// What's New tip: performance SQLite
///
/// In en, this message translates to:
/// **'SQLite-backed storage for reliability'**
String get whatsNewPerformanceTip3;
/// Ready card message on last What's New page
///
/// In en, this message translates to:
/// **'You\'re all set — enjoy the new SpotiFLAC!'**
String get whatsNewReadyMessage;
/// Button text to dismiss What's New screen
///
/// In en, this message translates to:
/// **'Let\'s Go'**
String get whatsNewGetStarted;
/// Page indicator text in What's New screen
///
/// In en, this message translates to:
/// **'{current} of {total}'**
String whatsNewPageIndicator(int current, int total);
}
class _AppLocalizationsDelegate
-173
View File
@@ -3288,177 +3288,4 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Du kannst jederzeit in den Einstellungen zwischen den Modi wechseln.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Automatisch ähnliche Titel entdecken und zu deiner Warteschlange hinzufügen';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-173
View File
@@ -3266,177 +3266,4 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'You can switch between modes anytime in Settings.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Automatically discover and add similar tracks to your queue';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-180
View File
@@ -3267,179 +3267,6 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Puedes cambiar entre modos en cualquier momento en Ajustes.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Descubre y añade automáticamente pistas similares a tu cola de reproducción';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
/// The translations for Spanish Castilian, as used in Spain (`es_ES`).
@@ -6447,11 +6274,4 @@ class AppLocalizationsEsEs extends AppLocalizationsEs {
@override
String get setupModeChangeableLater =>
'Puedes cambiar entre modos en cualquier momento en Ajustes.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Descubre y añade automáticamente pistas similares a tu cola de reproducción';
}
-173
View File
@@ -3273,177 +3273,4 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Vous pouvez changer de mode à tout moment dans les Paramètres.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Découvrir et ajouter automatiquement des pistes similaires à votre file d\'attente';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-173
View File
@@ -3267,177 +3267,4 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'आप सेटिंग्स में कभी भी मोड बदल सकते हैं।';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'स्वचालित रूप से समान ट्रैक खोजें और अपनी कतार में जोड़ें';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-182
View File
@@ -3282,186 +3282,4 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Anda dapat beralih antar mode kapan saja di Pengaturan.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Secara otomatis temukan dan tambahkan trek serupa ke antrean Anda';
@override
String get whatsNewTitle => 'Yang Baru di 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC telah berevolusi — inilah yang berubah sejak 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Selamat datang kembali! Ini pembaruan besar dengan banyak fitur baru. Geser untuk melihat apa yang berubah.';
@override
String get whatsNewWelcomeTip1 =>
'Mode streaming baru dengan pemutaran instan';
@override
String get whatsNewWelcomeTip2 =>
'Perpustakaan dan pemutar layar penuh yang didesain ulang';
@override
String get whatsNewWelcomeTip3 =>
'Alat massal, peningkatan performa, dan lainnya';
@override
String get whatsNewStreamingTitle => 'Mode Streaming';
@override
String get whatsNewStreamingDesc =>
'Ketuk trek apa pun untuk langsung diputar — tanpa perlu mengunduh. Pemutar layar penuh dengan lirik tersinkron dan kontrol media.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Antrean Anda otomatis mengkurasi trek terkait dan penemuan artis. Tak pernah kehabisan musik.';
@override
String get whatsNewDualModeTitle => 'Mode Ganda';
@override
String get whatsNewDualModeDesc =>
'Beralih antara mode Pengunduh dan Streaming kapan saja. Semua tombol menyesuaikan secara otomatis.';
@override
String get whatsNewLibraryTitle => 'Perpustakaan Baru';
@override
String get whatsNewLibraryDesc =>
'Tata letak berbasis playlist dengan kategorisasi seret-dan-lepas, sampul kustom, dan aksi massal multi-pilih.';
@override
String get whatsNewPlayerTitle => 'Pemutar Layar Penuh';
@override
String get whatsNewPlayerDesc =>
'Paralaks seni sampul, lirik tersinkron, pemutaran tetap tersimpan saat restart, dan tombol unduh di pemutar.';
@override
String get whatsNewContextMenuTitle => 'Menu Tekan Lama';
@override
String get whatsNewContextMenuDesc =>
'Tekan lama trek apa pun untuk aksi cepat — tambah ke playlist, bagikan, konversi, atau perbarui metadata.';
@override
String get whatsNewPerformanceTitle => 'Performa';
@override
String get whatsNewPerformanceDesc =>
'Startup lebih cepat, penggunaan memori berkurang, penyimpanan berbasis SQLite, dan pembaruan UI yang lebih efisien.';
@override
String get whatsNewBatchToolsTitle => 'Alat Massal';
@override
String get whatsNewBatchToolsDesc =>
'Berbagi multi-pilih, konversi massal ke MP3/Opus, dan perbarui metadata secara massal di seluruh perpustakaan.';
@override
String get whatsNewStreamingTip1 =>
'Ketuk trek apa pun untuk langsung memutar';
@override
String get whatsNewStreamingTip2 => 'Lirik tersinkron di pemutar layar penuh';
@override
String get whatsNewStreamingTip3 => 'Unduh trek langsung dari pemutar';
@override
String get whatsNewSmartQueueTip1 =>
'Antrean terisi otomatis dengan trek terkait';
@override
String get whatsNewSmartQueueTip2 => 'Temukan artis baru saat mendengarkan';
@override
String get whatsNewSmartQueueTip3 =>
'Tak pernah kehabisan musik untuk diputar';
@override
String get whatsNewDualModeTip1 => 'Beralih mode kapan saja di Pengaturan';
@override
String get whatsNewDualModeTip2 => 'Tombol UI menyesuaikan dengan mode Anda';
@override
String get whatsNewDualModeTip3 =>
'Unduh untuk offline, streaming untuk putar langsung';
@override
String get whatsNewLibraryTip1 => 'Seret dan lepas untuk mengatur playlist';
@override
String get whatsNewLibraryTip2 => 'Atur gambar sampul kustom untuk playlist';
@override
String get whatsNewLibraryTip3 => 'Pilih banyak trek untuk aksi massal';
@override
String get whatsNewPlayerTip1 => 'Seni sampul dengan efek paralaks';
@override
String get whatsNewPlayerTip2 => 'Pemutaran tetap tersimpan saat restart';
@override
String get whatsNewPlayerTip3 => 'Lirik tersinkron saat mendengarkan';
@override
String get whatsNewContextMenuTip1 =>
'Tambahkan trek ke playlist mana pun langsung';
@override
String get whatsNewContextMenuTip2 =>
'Bagikan atau konversi dengan satu ketukan';
@override
String get whatsNewContextMenuTip3 => 'Perbarui metadata saat diperlukan';
@override
String get whatsNewBatchToolsTip1 => 'Bagikan banyak trek sekaligus';
@override
String get whatsNewBatchToolsTip2 =>
'Konversi massal ke format MP3 atau Opus';
@override
String get whatsNewBatchToolsTip3 =>
'Perbarui metadata di seluruh perpustakaan';
@override
String get whatsNewPerformanceTip1 => 'Waktu startup aplikasi lebih cepat';
@override
String get whatsNewPerformanceTip2 =>
'Penggunaan memori berkurang saat pemutaran';
@override
String get whatsNewPerformanceTip3 =>
'Penyimpanan berbasis SQLite untuk keandalan';
@override
String get whatsNewReadyMessage => 'Siap — nikmati SpotiFLAC yang baru!';
@override
String get whatsNewGetStarted => 'Ayo Mulai';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current dari $total';
}
}
-172
View File
@@ -3246,176 +3246,4 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get setupModeChangeableLater => '設定からいつでもモードを切り替えられます。';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle => '類似トラックを自動的に検出してキューに追加';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-172
View File
@@ -3259,176 +3259,4 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get setupModeChangeableLater => '설정에서 언제든지 모드를 전환할 수 있습니다.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle => '유사한 트랙을 자동으로 검색하여 대기열에 추가';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-173
View File
@@ -3267,177 +3267,4 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Je kunt op elk moment wisselen tussen modi in Instellingen.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Ontdek automatisch vergelijkbare nummers en voeg ze toe aan je wachtrij';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-180
View File
@@ -3267,179 +3267,6 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Você pode alternar entre os modos a qualquer momento nas Configurações.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Descubra e adicione automaticamente faixas semelhantes à sua fila';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
/// The translations for Portuguese, as used in Portugal (`pt_PT`).
@@ -6441,11 +6268,4 @@ class AppLocalizationsPtPt extends AppLocalizationsPt {
@override
String get setupModeChangeableLater =>
'Pode alternar entre modos a qualquer momento nas Definições.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Descubra e adicione automaticamente faixas semelhantes à sua fila';
}
-173
View File
@@ -3365,177 +3365,4 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Вы можете переключаться между режимами в любое время в Настройках.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Автоматически находите и добавляйте похожие треки в очередь воспроизведения';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-173
View File
@@ -3281,177 +3281,4 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get setupModeChangeableLater =>
'Ayarlar\'dan istediğiniz zaman modlar arasında geçiş yapabilirsiniz.';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle =>
'Sıranıza otomatik olarak benzer parçalar keşfedin ve ekleyin';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
-184
View File
@@ -3259,178 +3259,6 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get setupModeChangeableLater => '您可以随时在设置中切换模式。';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle => '自动发现并将相似曲目添加到您的队列中';
@override
String get whatsNewTitle => 'What\'s New in 4.0';
@override
String get whatsNewSubtitle =>
'SpotiFLAC has evolved — here\'s what changed since 3.x';
@override
String get whatsNewWelcomeTitle => 'SpotiFLAC Mobile 4.0';
@override
String get whatsNewWelcomeDesc =>
'Welcome back! This is a major update packed with new features. Swipe through to see what\'s changed.';
@override
String get whatsNewWelcomeTip1 => 'New streaming mode with instant playback';
@override
String get whatsNewWelcomeTip2 => 'Redesigned library and full-screen player';
@override
String get whatsNewWelcomeTip3 => 'Batch tools, performance boosts, and more';
@override
String get whatsNewStreamingTitle => 'Streaming Mode';
@override
String get whatsNewStreamingDesc =>
'Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.';
@override
String get whatsNewSmartQueueTitle => 'Smart Queue';
@override
String get whatsNewSmartQueueDesc =>
'Your queue auto-curates with related tracks and artist discovery. Never run out of music.';
@override
String get whatsNewDualModeTitle => 'Dual Mode';
@override
String get whatsNewDualModeDesc =>
'Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.';
@override
String get whatsNewLibraryTitle => 'Redesigned Library';
@override
String get whatsNewLibraryDesc =>
'Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.';
@override
String get whatsNewPlayerTitle => 'Full-Screen Player';
@override
String get whatsNewPlayerDesc =>
'Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.';
@override
String get whatsNewContextMenuTitle => 'Long-Press Menus';
@override
String get whatsNewContextMenuDesc =>
'Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.';
@override
String get whatsNewPerformanceTitle => 'Performance';
@override
String get whatsNewPerformanceDesc =>
'Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.';
@override
String get whatsNewBatchToolsTitle => 'Batch Tools';
@override
String get whatsNewBatchToolsDesc =>
'Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.';
@override
String get whatsNewStreamingTip1 =>
'Tap any track to start playing instantly';
@override
String get whatsNewStreamingTip2 => 'Synced lyrics in the full-screen player';
@override
String get whatsNewStreamingTip3 =>
'Download tracks directly from the player';
@override
String get whatsNewSmartQueueTip1 => 'Queue auto-fills with related tracks';
@override
String get whatsNewSmartQueueTip2 => 'Discover new artists as you listen';
@override
String get whatsNewSmartQueueTip3 => 'Never run out of music to play';
@override
String get whatsNewDualModeTip1 => 'Switch modes anytime in Settings';
@override
String get whatsNewDualModeTip2 => 'UI buttons adapt to your current mode';
@override
String get whatsNewDualModeTip3 =>
'Download for offline, stream for instant play';
@override
String get whatsNewLibraryTip1 => 'Drag and drop to organize playlists';
@override
String get whatsNewLibraryTip2 => 'Set custom cover images for playlists';
@override
String get whatsNewLibraryTip3 => 'Multi-select tracks for batch actions';
@override
String get whatsNewPlayerTip1 => 'Cover art with parallax scrolling effect';
@override
String get whatsNewPlayerTip2 => 'Playback persists across app restarts';
@override
String get whatsNewPlayerTip3 => 'Synced lyrics while you listen';
@override
String get whatsNewContextMenuTip1 => 'Add tracks to any playlist instantly';
@override
String get whatsNewContextMenuTip2 => 'Share or convert with one tap';
@override
String get whatsNewContextMenuTip3 => 'Re-enrich metadata when needed';
@override
String get whatsNewBatchToolsTip1 => 'Share multiple tracks at once';
@override
String get whatsNewBatchToolsTip2 => 'Batch convert to MP3 or Opus format';
@override
String get whatsNewBatchToolsTip3 => 'Re-enrich metadata across your library';
@override
String get whatsNewPerformanceTip1 => 'Faster app startup time';
@override
String get whatsNewPerformanceTip2 => 'Reduced memory usage during playback';
@override
String get whatsNewPerformanceTip3 => 'SQLite-backed storage for reliability';
@override
String get whatsNewReadyMessage =>
'You\'re all set — enjoy the new SpotiFLAC!';
@override
String get whatsNewGetStarted => 'Let\'s Go';
@override
String whatsNewPageIndicator(int current, int total) {
return '$current of $total';
}
}
/// The translations for Chinese, as used in China (`zh_CN`).
@@ -6397,12 +6225,6 @@ class AppLocalizationsZhCn extends AppLocalizationsZh {
@override
String get setupModeChangeableLater => '您可以随时在设置中切换模式。';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle => '自动发现并将相似曲目添加到您的队列中';
}
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -9369,10 +9191,4 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get setupModeChangeableLater => '您可以隨時在設定中切換模式。';
@override
String get settingsSmartQueueTitle => 'Smart Queue';
@override
String get settingsSmartQueueSubtitle => '自動探索並將相似曲目新增到您的佇列中';
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Streame Titel sofort ohne Herunterladen",
"setupModeStreamingFeature2": "Smart Queue entdeckt automatisch neue Musik für dich",
"setupModeStreamingFeature3": "Spiele jeden Titel auf Abruf mit Wiedergabesteuerung",
"setupModeChangeableLater": "Du kannst jederzeit in den Einstellungen zwischen den Modi wechseln.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Automatisch ähnliche Titel entdecken und zu deiner Warteschlange hinzufügen"
"setupModeChangeableLater": "Du kannst jederzeit in den Einstellungen zwischen den Modi wechseln."
}
+1 -113
View File
@@ -2495,117 +2495,5 @@
"setupModeStreamingFeature3": "Play any track on demand with playback controls",
"@setupModeStreamingFeature3": {"description": "Streaming mode feature 3"},
"setupModeChangeableLater": "You can switch between modes anytime in Settings.",
"@setupModeChangeableLater": {"description": "Hint that mode can be changed later"},
"settingsSmartQueueTitle": "Smart Queue",
"@settingsSmartQueueTitle": {"description": "Title for Smart Queue toggle in settings"},
"settingsSmartQueueSubtitle": "Automatically discover and add similar tracks to your queue",
"@settingsSmartQueueSubtitle": {"description": "Subtitle for Smart Queue toggle in settings"},
"whatsNewTitle": "What's New in 4.0",
"@whatsNewTitle": {"description": "Title for the What's New screen"},
"whatsNewSubtitle": "SpotiFLAC has evolved — here's what changed since 3.x",
"@whatsNewSubtitle": {"description": "Subtitle for the What's New screen"},
"whatsNewWelcomeTitle": "SpotiFLAC Mobile 4.0",
"@whatsNewWelcomeTitle": {"description": "Welcome page title in What's New screen"},
"whatsNewWelcomeDesc": "Welcome back! This is a major update packed with new features. Swipe through to see what's changed.",
"@whatsNewWelcomeDesc": {"description": "Welcome page description in What's New screen"},
"whatsNewWelcomeTip1": "New streaming mode with instant playback",
"@whatsNewWelcomeTip1": {"description": "Welcome page tip 1"},
"whatsNewWelcomeTip2": "Redesigned library and full-screen player",
"@whatsNewWelcomeTip2": {"description": "Welcome page tip 2"},
"whatsNewWelcomeTip3": "Batch tools, performance boosts, and more",
"@whatsNewWelcomeTip3": {"description": "Welcome page tip 3"},
"whatsNewStreamingTitle": "Streaming Mode",
"@whatsNewStreamingTitle": {"description": "What's New feature: Streaming Mode title"},
"whatsNewStreamingDesc": "Tap any track to play instantly — no download needed. Full-screen player with synced lyrics and media controls.",
"@whatsNewStreamingDesc": {"description": "What's New feature: Streaming Mode description"},
"whatsNewSmartQueueTitle": "Smart Queue",
"@whatsNewSmartQueueTitle": {"description": "What's New feature: Smart Queue title"},
"whatsNewSmartQueueDesc": "Your queue auto-curates with related tracks and artist discovery. Never run out of music.",
"@whatsNewSmartQueueDesc": {"description": "What's New feature: Smart Queue description"},
"whatsNewDualModeTitle": "Dual Mode",
"@whatsNewDualModeTitle": {"description": "What's New feature: Dual Mode title"},
"whatsNewDualModeDesc": "Switch between Downloader and Streaming modes anytime. All buttons adapt automatically.",
"@whatsNewDualModeDesc": {"description": "What's New feature: Dual Mode description"},
"whatsNewLibraryTitle": "Redesigned Library",
"@whatsNewLibraryTitle": {"description": "What's New feature: Library redesign title"},
"whatsNewLibraryDesc": "Playlist-first layout with drag-and-drop categorization, custom covers, and multi-select batch actions.",
"@whatsNewLibraryDesc": {"description": "What's New feature: Library redesign description"},
"whatsNewPlayerTitle": "Full-Screen Player",
"@whatsNewPlayerTitle": {"description": "What's New feature: Full-Screen Player title"},
"whatsNewPlayerDesc": "Cover art parallax, synced lyrics, playback persistence across restarts, and download button in player.",
"@whatsNewPlayerDesc": {"description": "What's New feature: Full-Screen Player description"},
"whatsNewContextMenuTitle": "Long-Press Menus",
"@whatsNewContextMenuTitle": {"description": "What's New feature: Context Menus title"},
"whatsNewContextMenuDesc": "Long-press any track for quick actions — add to playlist, share, convert, or re-enrich metadata.",
"@whatsNewContextMenuDesc": {"description": "What's New feature: Context Menus description"},
"whatsNewPerformanceTitle": "Performance",
"@whatsNewPerformanceTitle": {"description": "What's New feature: Performance title"},
"whatsNewPerformanceDesc": "Faster startup, reduced memory usage, SQLite-backed persistence, and granular UI updates.",
"@whatsNewPerformanceDesc": {"description": "What's New feature: Performance description"},
"whatsNewBatchToolsTitle": "Batch Tools",
"@whatsNewBatchToolsTitle": {"description": "What's New feature: Batch Tools title"},
"whatsNewBatchToolsDesc": "Multi-select share, batch convert to MP3/Opus, and batch re-enrich metadata across your library.",
"@whatsNewBatchToolsDesc": {"description": "What's New feature: Batch Tools description"},
"whatsNewStreamingTip1": "Tap any track to start playing instantly",
"@whatsNewStreamingTip1": {"description": "What's New tip: streaming instant play"},
"whatsNewStreamingTip2": "Synced lyrics in the full-screen player",
"@whatsNewStreamingTip2": {"description": "What's New tip: streaming synced lyrics"},
"whatsNewStreamingTip3": "Download tracks directly from the player",
"@whatsNewStreamingTip3": {"description": "What's New tip: streaming download from player"},
"whatsNewSmartQueueTip1": "Queue auto-fills with related tracks",
"@whatsNewSmartQueueTip1": {"description": "What's New tip: smart queue auto-fill"},
"whatsNewSmartQueueTip2": "Discover new artists as you listen",
"@whatsNewSmartQueueTip2": {"description": "What's New tip: smart queue artist discovery"},
"whatsNewSmartQueueTip3": "Never run out of music to play",
"@whatsNewSmartQueueTip3": {"description": "What's New tip: smart queue endless"},
"whatsNewDualModeTip1": "Switch modes anytime in Settings",
"@whatsNewDualModeTip1": {"description": "What's New tip: dual mode switch"},
"whatsNewDualModeTip2": "UI buttons adapt to your current mode",
"@whatsNewDualModeTip2": {"description": "What's New tip: dual mode adaptive UI"},
"whatsNewDualModeTip3": "Download for offline, stream for instant play",
"@whatsNewDualModeTip3": {"description": "What's New tip: dual mode use cases"},
"whatsNewLibraryTip1": "Drag and drop to organize playlists",
"@whatsNewLibraryTip1": {"description": "What's New tip: library drag and drop"},
"whatsNewLibraryTip2": "Set custom cover images for playlists",
"@whatsNewLibraryTip2": {"description": "What's New tip: library custom covers"},
"whatsNewLibraryTip3": "Multi-select tracks for batch actions",
"@whatsNewLibraryTip3": {"description": "What's New tip: library multi-select"},
"whatsNewPlayerTip1": "Cover art with parallax scrolling effect",
"@whatsNewPlayerTip1": {"description": "What's New tip: player parallax"},
"whatsNewPlayerTip2": "Playback persists across app restarts",
"@whatsNewPlayerTip2": {"description": "What's New tip: player persistence"},
"whatsNewPlayerTip3": "Synced lyrics while you listen",
"@whatsNewPlayerTip3": {"description": "What's New tip: player lyrics"},
"whatsNewContextMenuTip1": "Add tracks to any playlist instantly",
"@whatsNewContextMenuTip1": {"description": "What's New tip: context menu add to playlist"},
"whatsNewContextMenuTip2": "Share or convert with one tap",
"@whatsNewContextMenuTip2": {"description": "What's New tip: context menu share/convert"},
"whatsNewContextMenuTip3": "Re-enrich metadata when needed",
"@whatsNewContextMenuTip3": {"description": "What's New tip: context menu re-enrich"},
"whatsNewBatchToolsTip1": "Share multiple tracks at once",
"@whatsNewBatchToolsTip1": {"description": "What's New tip: batch share"},
"whatsNewBatchToolsTip2": "Batch convert to MP3 or Opus format",
"@whatsNewBatchToolsTip2": {"description": "What's New tip: batch convert"},
"whatsNewBatchToolsTip3": "Re-enrich metadata across your library",
"@whatsNewBatchToolsTip3": {"description": "What's New tip: batch re-enrich"},
"whatsNewPerformanceTip1": "Faster app startup time",
"@whatsNewPerformanceTip1": {"description": "What's New tip: performance startup"},
"whatsNewPerformanceTip2": "Reduced memory usage during playback",
"@whatsNewPerformanceTip2": {"description": "What's New tip: performance memory"},
"whatsNewPerformanceTip3": "SQLite-backed storage for reliability",
"@whatsNewPerformanceTip3": {"description": "What's New tip: performance SQLite"},
"whatsNewReadyMessage": "You're all set — enjoy the new SpotiFLAC!",
"@whatsNewReadyMessage": {"description": "Ready card message on last What's New page"},
"whatsNewGetStarted": "Let's Go",
"@whatsNewGetStarted": {"description": "Button text to dismiss What's New screen"},
"whatsNewPageIndicator": "{current} of {total}",
"@whatsNewPageIndicator": {
"description": "Page indicator text in What's New screen",
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
}
"@setupModeChangeableLater": {"description": "Hint that mode can be changed later"}
}
+1 -3
View File
@@ -2576,7 +2576,5 @@
"setupModeStreamingFeature1": "Transmite pistas al instante sin descargar",
"setupModeStreamingFeature2": "Smart Queue descubre automáticamente nueva música para ti",
"setupModeStreamingFeature3": "Reproduce cualquier pista bajo demanda con controles de reproducción",
"setupModeChangeableLater": "Puedes cambiar entre modos en cualquier momento en Ajustes.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Descubre y añade automáticamente pistas similares a tu cola de reproducción"
"setupModeChangeableLater": "Puedes cambiar entre modos en cualquier momento en Ajustes."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Transmite pistas al instante sin descargar",
"setupModeStreamingFeature2": "Smart Queue descubre automáticamente nueva música para ti",
"setupModeStreamingFeature3": "Reproduce cualquier pista bajo demanda con controles de reproducción",
"setupModeChangeableLater": "Puedes cambiar entre modos en cualquier momento en Ajustes.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Descubre y añade automáticamente pistas similares a tu cola de reproducción"
"setupModeChangeableLater": "Puedes cambiar entre modos en cualquier momento en Ajustes."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Diffusez des pistes instantanément sans télécharger",
"setupModeStreamingFeature2": "Smart Queue découvre automatiquement de nouvelle musique pour vous",
"setupModeStreamingFeature3": "Écoutez n'importe quelle piste à la demande avec les contrôles de lecture",
"setupModeChangeableLater": "Vous pouvez changer de mode à tout moment dans les Paramètres.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Découvrir et ajouter automatiquement des pistes similaires à votre file d'attente"
"setupModeChangeableLater": "Vous pouvez changer de mode à tout moment dans les Paramètres."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "बिना डाउनलोड किए तुरंत ट्रैक स्ट्रीम करें",
"setupModeStreamingFeature2": "Smart Queue स्वचालित रूप से आपके लिए नया संगीत खोजता है",
"setupModeStreamingFeature3": "प्लेबैक नियंत्रण के साथ किसी भी ट्रैक को मांग पर चलाएं",
"setupModeChangeableLater": "आप सेटिंग्स में कभी भी मोड बदल सकते हैं।",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "स्वचालित रूप से समान ट्रैक खोजें और अपनी कतार में जोड़ें"
"setupModeChangeableLater": "आप सेटिंग्स में कभी भी मोड बदल सकते हैं।"
}
-110
View File
@@ -4201,9 +4201,6 @@
"setupModeStreamingFeature2": "Smart Queue secara otomatis menemukan musik baru untuk Anda",
"setupModeStreamingFeature3": "Putar trek apa pun sesuai permintaan dengan kontrol pemutaran",
"setupModeChangeableLater": "Anda dapat beralih antar mode kapan saja di Pengaturan.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Secara otomatis temukan dan tambahkan trek serupa ke antrean Anda",
"selectionShareCount": "Bagikan {count} {count, plural, =1{trek} other{trek}}",
"@selectionShareCount": {
"description": "Share button text with count in selection mode",
@@ -4249,112 +4246,5 @@
"total": {"type": "int"},
"format": {"type": "String"}
}
},
"whatsNewTitle": "Yang Baru di 4.0",
"@whatsNewTitle": {"description": "Title for the What's New screen"},
"whatsNewSubtitle": "SpotiFLAC telah berevolusi — inilah yang berubah sejak 3.x",
"@whatsNewSubtitle": {"description": "Subtitle for the What's New screen"},
"whatsNewWelcomeTitle": "SpotiFLAC Mobile 4.0",
"@whatsNewWelcomeTitle": {"description": "Welcome page title in What's New screen"},
"whatsNewWelcomeDesc": "Selamat datang kembali! Ini pembaruan besar dengan banyak fitur baru. Geser untuk melihat apa yang berubah.",
"@whatsNewWelcomeDesc": {"description": "Welcome page description in What's New screen"},
"whatsNewWelcomeTip1": "Mode streaming baru dengan pemutaran instan",
"@whatsNewWelcomeTip1": {"description": "Welcome page tip 1"},
"whatsNewWelcomeTip2": "Perpustakaan dan pemutar layar penuh yang didesain ulang",
"@whatsNewWelcomeTip2": {"description": "Welcome page tip 2"},
"whatsNewWelcomeTip3": "Alat massal, peningkatan performa, dan lainnya",
"@whatsNewWelcomeTip3": {"description": "Welcome page tip 3"},
"whatsNewStreamingTitle": "Mode Streaming",
"@whatsNewStreamingTitle": {"description": "What's New feature: Streaming Mode title"},
"whatsNewStreamingDesc": "Ketuk trek apa pun untuk langsung diputar — tanpa perlu mengunduh. Pemutar layar penuh dengan lirik tersinkron dan kontrol media.",
"@whatsNewStreamingDesc": {"description": "What's New feature: Streaming Mode description"},
"whatsNewSmartQueueTitle": "Smart Queue",
"@whatsNewSmartQueueTitle": {"description": "What's New feature: Smart Queue title"},
"whatsNewSmartQueueDesc": "Antrean Anda otomatis mengkurasi trek terkait dan penemuan artis. Tak pernah kehabisan musik.",
"@whatsNewSmartQueueDesc": {"description": "What's New feature: Smart Queue description"},
"whatsNewDualModeTitle": "Mode Ganda",
"@whatsNewDualModeTitle": {"description": "What's New feature: Dual Mode title"},
"whatsNewDualModeDesc": "Beralih antara mode Pengunduh dan Streaming kapan saja. Semua tombol menyesuaikan secara otomatis.",
"@whatsNewDualModeDesc": {"description": "What's New feature: Dual Mode description"},
"whatsNewLibraryTitle": "Perpustakaan Baru",
"@whatsNewLibraryTitle": {"description": "What's New feature: Library redesign title"},
"whatsNewLibraryDesc": "Tata letak berbasis playlist dengan kategorisasi seret-dan-lepas, sampul kustom, dan aksi massal multi-pilih.",
"@whatsNewLibraryDesc": {"description": "What's New feature: Library redesign description"},
"whatsNewPlayerTitle": "Pemutar Layar Penuh",
"@whatsNewPlayerTitle": {"description": "What's New feature: Full-Screen Player title"},
"whatsNewPlayerDesc": "Paralaks seni sampul, lirik tersinkron, pemutaran tetap tersimpan saat restart, dan tombol unduh di pemutar.",
"@whatsNewPlayerDesc": {"description": "What's New feature: Full-Screen Player description"},
"whatsNewContextMenuTitle": "Menu Tekan Lama",
"@whatsNewContextMenuTitle": {"description": "What's New feature: Context Menus title"},
"whatsNewContextMenuDesc": "Tekan lama trek apa pun untuk aksi cepat — tambah ke playlist, bagikan, konversi, atau perbarui metadata.",
"@whatsNewContextMenuDesc": {"description": "What's New feature: Context Menus description"},
"whatsNewPerformanceTitle": "Performa",
"@whatsNewPerformanceTitle": {"description": "What's New feature: Performance title"},
"whatsNewPerformanceDesc": "Startup lebih cepat, penggunaan memori berkurang, penyimpanan berbasis SQLite, dan pembaruan UI yang lebih efisien.",
"@whatsNewPerformanceDesc": {"description": "What's New feature: Performance description"},
"whatsNewBatchToolsTitle": "Alat Massal",
"@whatsNewBatchToolsTitle": {"description": "What's New feature: Batch Tools title"},
"whatsNewBatchToolsDesc": "Berbagi multi-pilih, konversi massal ke MP3/Opus, dan perbarui metadata secara massal di seluruh perpustakaan.",
"@whatsNewBatchToolsDesc": {"description": "What's New feature: Batch Tools description"},
"whatsNewStreamingTip1": "Ketuk trek apa pun untuk langsung memutar",
"@whatsNewStreamingTip1": {"description": "What's New tip: streaming instant play"},
"whatsNewStreamingTip2": "Lirik tersinkron di pemutar layar penuh",
"@whatsNewStreamingTip2": {"description": "What's New tip: streaming synced lyrics"},
"whatsNewStreamingTip3": "Unduh trek langsung dari pemutar",
"@whatsNewStreamingTip3": {"description": "What's New tip: streaming download from player"},
"whatsNewSmartQueueTip1": "Antrean terisi otomatis dengan trek terkait",
"@whatsNewSmartQueueTip1": {"description": "What's New tip: smart queue auto-fill"},
"whatsNewSmartQueueTip2": "Temukan artis baru saat mendengarkan",
"@whatsNewSmartQueueTip2": {"description": "What's New tip: smart queue artist discovery"},
"whatsNewSmartQueueTip3": "Tak pernah kehabisan musik untuk diputar",
"@whatsNewSmartQueueTip3": {"description": "What's New tip: smart queue endless"},
"whatsNewDualModeTip1": "Beralih mode kapan saja di Pengaturan",
"@whatsNewDualModeTip1": {"description": "What's New tip: dual mode switch"},
"whatsNewDualModeTip2": "Tombol UI menyesuaikan dengan mode Anda",
"@whatsNewDualModeTip2": {"description": "What's New tip: dual mode adaptive UI"},
"whatsNewDualModeTip3": "Unduh untuk offline, streaming untuk putar langsung",
"@whatsNewDualModeTip3": {"description": "What's New tip: dual mode use cases"},
"whatsNewLibraryTip1": "Seret dan lepas untuk mengatur playlist",
"@whatsNewLibraryTip1": {"description": "What's New tip: library drag and drop"},
"whatsNewLibraryTip2": "Atur gambar sampul kustom untuk playlist",
"@whatsNewLibraryTip2": {"description": "What's New tip: library custom covers"},
"whatsNewLibraryTip3": "Pilih banyak trek untuk aksi massal",
"@whatsNewLibraryTip3": {"description": "What's New tip: library multi-select"},
"whatsNewPlayerTip1": "Seni sampul dengan efek paralaks",
"@whatsNewPlayerTip1": {"description": "What's New tip: player parallax"},
"whatsNewPlayerTip2": "Pemutaran tetap tersimpan saat restart",
"@whatsNewPlayerTip2": {"description": "What's New tip: player persistence"},
"whatsNewPlayerTip3": "Lirik tersinkron saat mendengarkan",
"@whatsNewPlayerTip3": {"description": "What's New tip: player lyrics"},
"whatsNewContextMenuTip1": "Tambahkan trek ke playlist mana pun langsung",
"@whatsNewContextMenuTip1": {"description": "What's New tip: context menu add to playlist"},
"whatsNewContextMenuTip2": "Bagikan atau konversi dengan satu ketukan",
"@whatsNewContextMenuTip2": {"description": "What's New tip: context menu share/convert"},
"whatsNewContextMenuTip3": "Perbarui metadata saat diperlukan",
"@whatsNewContextMenuTip3": {"description": "What's New tip: context menu re-enrich"},
"whatsNewBatchToolsTip1": "Bagikan banyak trek sekaligus",
"@whatsNewBatchToolsTip1": {"description": "What's New tip: batch share"},
"whatsNewBatchToolsTip2": "Konversi massal ke format MP3 atau Opus",
"@whatsNewBatchToolsTip2": {"description": "What's New tip: batch convert"},
"whatsNewBatchToolsTip3": "Perbarui metadata di seluruh perpustakaan",
"@whatsNewBatchToolsTip3": {"description": "What's New tip: batch re-enrich"},
"whatsNewPerformanceTip1": "Waktu startup aplikasi lebih cepat",
"@whatsNewPerformanceTip1": {"description": "What's New tip: performance startup"},
"whatsNewPerformanceTip2": "Penggunaan memori berkurang saat pemutaran",
"@whatsNewPerformanceTip2": {"description": "What's New tip: performance memory"},
"whatsNewPerformanceTip3": "Penyimpanan berbasis SQLite untuk keandalan",
"@whatsNewPerformanceTip3": {"description": "What's New tip: performance SQLite"},
"whatsNewReadyMessage": "Siap — nikmati SpotiFLAC yang baru!",
"@whatsNewReadyMessage": {"description": "Ready card message on last What's New page"},
"whatsNewGetStarted": "Ayo Mulai",
"@whatsNewGetStarted": {"description": "Button text to dismiss What's New screen"},
"whatsNewPageIndicator": "{current} dari {total}",
"@whatsNewPageIndicator": {
"description": "Page indicator text in What's New screen",
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
}
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "ダウンロードせずにトラックを即座にストリーミング",
"setupModeStreamingFeature2": "Smart Queueが自動的に新しい音楽を見つけます",
"setupModeStreamingFeature3": "再生コントロールで任意のトラックをオンデマンド再生",
"setupModeChangeableLater": "設定からいつでもモードを切り替えられます。",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "類似トラックを自動的に検出してキューに追加"
"setupModeChangeableLater": "設定からいつでもモードを切り替えられます。"
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "다운로드 없이 트랙을 즉시 스트리밍",
"setupModeStreamingFeature2": "Smart Queue가 자동으로 새로운 음악을 발견합니다",
"setupModeStreamingFeature3": "재생 컨트롤로 원하는 트랙을 온디맨드 재생",
"setupModeChangeableLater": "설정에서 언제든지 모드를 전환할 수 있습니다.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "유사한 트랙을 자동으로 검색하여 대기열에 추가"
"setupModeChangeableLater": "설정에서 언제든지 모드를 전환할 수 있습니다."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Stream nummers direct zonder te downloaden",
"setupModeStreamingFeature2": "Smart Queue ontdekt automatisch nieuwe muziek voor je",
"setupModeStreamingFeature3": "Speel elk nummer op aanvraag af met afspeelbediening",
"setupModeChangeableLater": "Je kunt op elk moment wisselen tussen modi in Instellingen.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Ontdek automatisch vergelijkbare nummers en voeg ze toe aan je wachtrij"
"setupModeChangeableLater": "Je kunt op elk moment wisselen tussen modi in Instellingen."
}
+1 -3
View File
@@ -2576,7 +2576,5 @@
"setupModeStreamingFeature1": "Transmita faixas instantaneamente sem baixar",
"setupModeStreamingFeature2": "Smart Queue descobre automaticamente novas músicas para você",
"setupModeStreamingFeature3": "Reproduza qualquer faixa sob demanda com controles de reprodução",
"setupModeChangeableLater": "Você pode alternar entre os modos a qualquer momento nas Configurações.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Descubra e adicione automaticamente faixas semelhantes à sua fila"
"setupModeChangeableLater": "Você pode alternar entre os modos a qualquer momento nas Configurações."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Transmita faixas instantaneamente sem transferir",
"setupModeStreamingFeature2": "Smart Queue descobre automaticamente novas músicas para si",
"setupModeStreamingFeature3": "Reproduza qualquer faixa a pedido com controlos de reprodução",
"setupModeChangeableLater": "Pode alternar entre modos a qualquer momento nas Definições.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Descubra e adicione automaticamente faixas semelhantes à sua fila"
"setupModeChangeableLater": "Pode alternar entre modos a qualquer momento nas Definições."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "Слушайте треки мгновенно без скачивания",
"setupModeStreamingFeature2": "Smart Queue автоматически подбирает новую музыку для вас",
"setupModeStreamingFeature3": "Воспроизводите любой трек по запросу с элементами управления",
"setupModeChangeableLater": "Вы можете переключаться между режимами в любое время в Настройках.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Автоматически находите и добавляйте похожие треки в очередь воспроизведения"
"setupModeChangeableLater": "Вы можете переключаться между режимами в любое время в Настройках."
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "İndirmeden parçaları anında yayınlayın",
"setupModeStreamingFeature2": "Smart Queue sizin için otomatik olarak yeni müzik keşfeder",
"setupModeStreamingFeature3": "İstediğiniz parçayı oynatma kontrolleriyle çalın",
"setupModeChangeableLater": "Ayarlar'dan istediğiniz zaman modlar arasında geçiş yapabilirsiniz.",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "Sıranıza otomatik olarak benzer parçalar keşfedin ve ekleyin"
"setupModeChangeableLater": "Ayarlar'dan istediğiniz zaman modlar arasında geçiş yapabilirsiniz."
}
+1 -3
View File
@@ -2576,7 +2576,5 @@
"setupModeStreamingFeature1": "无需下载即可即时播放曲目",
"setupModeStreamingFeature2": "Smart Queue 自动为您发现新音乐",
"setupModeStreamingFeature3": "通过播放控件随时点播任意曲目",
"setupModeChangeableLater": "您可以随时在设置中切换模式。",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "自动发现并将相似曲目添加到您的队列中"
"setupModeChangeableLater": "您可以随时在设置中切换模式。"
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "无需下载即可即时播放曲目",
"setupModeStreamingFeature2": "Smart Queue 自动为您发现新音乐",
"setupModeStreamingFeature3": "通过播放控件随时点播任意曲目",
"setupModeChangeableLater": "您可以随时在设置中切换模式。",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "自动发现并将相似曲目添加到您的队列中"
"setupModeChangeableLater": "您可以随时在设置中切换模式。"
}
+1 -3
View File
@@ -3879,7 +3879,5 @@
"setupModeStreamingFeature1": "無需下載即可即時串流曲目",
"setupModeStreamingFeature2": "Smart Queue 自動為您探索新音樂",
"setupModeStreamingFeature3": "透過播放控制項隨時點播任意曲目",
"setupModeChangeableLater": "您可以隨時在設定中切換模式。",
"settingsSmartQueueTitle": "Smart Queue",
"settingsSmartQueueSubtitle": "自動探索並將相似曲目新增到您的佇列中"
"setupModeChangeableLater": "您可以隨時在設定中切換模式。"
}
-91
View File
@@ -1,91 +0,0 @@
import 'package:spotiflac_android/models/track.dart';
class PlaybackItem {
final String id;
final String title;
final String artist;
final String album;
final String coverUrl;
final String sourceUri;
final bool isLocal;
final String service;
final int durationMs;
// Stream quality metadata
final String format;
final int bitDepth;
final int sampleRate;
final int bitrate;
// Original track reference for queue operations
final Track? track;
const PlaybackItem({
required this.id,
required this.title,
required this.artist,
this.album = '',
this.coverUrl = '',
required this.sourceUri,
this.isLocal = false,
this.service = '',
this.durationMs = 0,
this.format = '',
this.bitDepth = 0,
this.sampleRate = 0,
this.bitrate = 0,
this.track,
});
PlaybackItem copyWith({
String? sourceUri,
String? service,
String? format,
int? bitDepth,
int? sampleRate,
int? bitrate,
}) {
return PlaybackItem(
id: id,
title: title,
artist: artist,
album: album,
coverUrl: coverUrl,
sourceUri: sourceUri ?? this.sourceUri,
isLocal: isLocal,
service: service ?? this.service,
durationMs: durationMs,
format: format ?? this.format,
bitDepth: bitDepth ?? this.bitDepth,
sampleRate: sampleRate ?? this.sampleRate,
bitrate: bitrate ?? this.bitrate,
track: track,
);
}
/// Human-readable quality label for UI display
String get qualityLabel {
final parts = <String>[];
if (format.isNotEmpty) {
parts.add(format.toUpperCase());
}
if (bitDepth > 0 && sampleRate > 0) {
final srKhz = sampleRate >= 1000
? '${(sampleRate / 1000).toStringAsFixed(sampleRate % 1000 == 0 ? 0 : 1)}kHz'
: '${sampleRate}Hz';
parts.add('$bitDepth-bit / $srKhz');
} else if (bitrate > 0) {
parts.add('${bitrate}kbps');
}
return parts.join(' ');
}
/// Whether this item has cover art that is a local file path
bool get hasLocalCover {
if (coverUrl.isEmpty) return false;
return !coverUrl.startsWith('http://') && !coverUrl.startsWith('https://');
}
}
+1 -14
View File
@@ -11,9 +11,6 @@ class AppSettings {
final String storageMode; // 'app' or 'saf'
final String downloadTreeUri; // SAF persistable tree URI
final bool autoFallback;
final bool autoSkipUnavailableTracks;
final String playerMode; // 'internal' or 'external'
final bool smartQueueEnabled; // Enable smart curated autoplay queue
final bool embedMetadata; // Master switch for metadata/cover/lyrics embedding
final bool embedLyrics;
final bool maxQualityCover;
@@ -92,9 +89,6 @@ class AppSettings {
this.storageMode = 'app',
this.downloadTreeUri = '',
this.autoFallback = true,
this.autoSkipUnavailableTracks = true,
this.playerMode = 'internal',
this.smartQueueEnabled = true,
this.embedMetadata = true,
this.embedLyrics = true,
this.maxQualityCover = true,
@@ -160,10 +154,7 @@ class AppSettings {
String? downloadDirectory,
String? storageMode,
String? downloadTreeUri,
bool? autoFallback,
bool? autoSkipUnavailableTracks,
String? playerMode,
bool? smartQueueEnabled,
bool? autoFallback,
bool? embedMetadata,
bool? embedLyrics,
bool? maxQualityCover,
@@ -223,10 +214,6 @@ class AppSettings {
storageMode: storageMode ?? this.storageMode,
downloadTreeUri: downloadTreeUri ?? this.downloadTreeUri,
autoFallback: autoFallback ?? this.autoFallback,
autoSkipUnavailableTracks:
autoSkipUnavailableTracks ?? this.autoSkipUnavailableTracks,
playerMode: playerMode ?? this.playerMode,
smartQueueEnabled: smartQueueEnabled ?? this.smartQueueEnabled,
embedMetadata: embedMetadata ?? this.embedMetadata,
embedLyrics: embedLyrics ?? this.embedLyrics,
maxQualityCover: maxQualityCover ?? this.maxQualityCover,
-6
View File
@@ -14,9 +14,6 @@ AppSettings _$AppSettingsFromJson(Map<String, dynamic> json) => AppSettings(
storageMode: json['storageMode'] as String? ?? 'app',
downloadTreeUri: json['downloadTreeUri'] as String? ?? '',
autoFallback: json['autoFallback'] as bool? ?? true,
autoSkipUnavailableTracks: json['autoSkipUnavailableTracks'] as bool? ?? true,
playerMode: json['playerMode'] as String? ?? 'internal',
smartQueueEnabled: json['smartQueueEnabled'] as bool? ?? true,
embedMetadata: json['embedMetadata'] as bool? ?? true,
embedLyrics: json['embedLyrics'] as bool? ?? true,
maxQualityCover: json['maxQualityCover'] as bool? ?? true,
@@ -93,9 +90,6 @@ Map<String, dynamic> _$AppSettingsToJson(
'storageMode': instance.storageMode,
'downloadTreeUri': instance.downloadTreeUri,
'autoFallback': instance.autoFallback,
'autoSkipUnavailableTracks': instance.autoSkipUnavailableTracks,
'playerMode': instance.playerMode,
'smartQueueEnabled': instance.smartQueueEnabled,
'embedMetadata': instance.embedMetadata,
'embedLyrics': instance.embedLyrics,
'maxQualityCover': instance.maxQualityCover,
File diff suppressed because it is too large Load Diff
-16
View File
@@ -279,22 +279,6 @@ class SettingsNotifier extends Notifier<AppSettings> {
_saveSettings();
}
void setAutoSkipUnavailableTracks(bool enabled) {
state = state.copyWith(autoSkipUnavailableTracks: enabled);
_saveSettings();
}
void setPlayerMode(String mode) {
final normalized = mode == 'external' ? 'external' : 'internal';
state = state.copyWith(playerMode: normalized);
_saveSettings();
}
void setSmartQueueEnabled(bool enabled) {
state = state.copyWith(smartQueueEnabled: enabled);
_saveSettings();
}
void setEmbedLyrics(bool enabled) {
state = state.copyWith(embedLyrics: enabled);
_saveSettings();
+138 -53
View File
@@ -10,7 +10,6 @@ import 'package:spotiflac_android/models/track.dart';
import 'package:spotiflac_android/providers/download_queue_provider.dart';
import 'package:spotiflac_android/providers/library_collections_provider.dart';
import 'package:spotiflac_android/providers/local_library_provider.dart';
import 'package:spotiflac_android/providers/playback_provider.dart';
import 'package:spotiflac_android/services/library_database.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/services/cover_cache_manager.dart';
@@ -793,12 +792,11 @@ class _LibraryTracksFolderScreenState
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (widget.mode !=
LibraryTracksFolderMode.wishlist) ...[
_buildShuffleButton(entries),
const SizedBox(width: 12),
],
_buildPlayAllCenterButton(entries),
_buildHeaderActionPlaceholder(),
const SizedBox(width: 12),
_buildDownloadAllCenterButton(entries),
const SizedBox(width: 12),
_buildHeaderActionPlaceholder(),
],
),
],
@@ -831,35 +829,16 @@ class _LibraryTracksFolderScreenState
);
}
// ── Shuffle / Play buttons ──
// ── Header actions ──
Widget _buildShuffleButton(List<CollectionTrackEntry> entries) {
return Container(
width: 48,
height: 48,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.white.withValues(alpha: 0.15),
border: Border.all(
color: Colors.white.withValues(alpha: 0.3),
width: 1,
),
),
child: IconButton(
onPressed: entries.isEmpty ? null : () => _shufflePlay(entries),
icon: const Icon(Icons.shuffle_rounded, size: 22, color: Colors.white),
tooltip: 'Shuffle Play',
padding: EdgeInsets.zero,
),
);
}
Widget _buildHeaderActionPlaceholder() => const SizedBox(width: 48, height: 48);
Widget _buildPlayAllCenterButton(List<CollectionTrackEntry> entries) {
Widget _buildDownloadAllCenterButton(List<CollectionTrackEntry> entries) {
final tracks = entries.map((e) => e.track).toList(growable: false);
return FilledButton.icon(
onPressed: tracks.isEmpty ? null : () => _playAll(tracks),
icon: const Icon(Icons.play_arrow_rounded, size: 18),
label: Text(context.l10n.playAllCount(tracks.length)),
onPressed: tracks.isEmpty ? null : () => _confirmDownloadAll(tracks),
icon: const Icon(Icons.download_rounded, size: 18),
label: Text(context.l10n.downloadAllCount(tracks.length)),
style: FilledButton.styleFrom(
backgroundColor: Colors.white,
foregroundColor: Colors.black87,
@@ -869,28 +848,70 @@ class _LibraryTracksFolderScreenState
);
}
void _shufflePlay(List<CollectionTrackEntry> entries) {
final tracks = entries.map((e) => e.track).toList(growable: false);
void _confirmDownloadAll(List<Track> tracks) {
if (tracks.isEmpty) return;
final shuffled = [...tracks]..shuffle();
final messenger = ScaffoldMessenger.of(context);
ref.read(playbackProvider.notifier).playTrackList(shuffled).catchError((e) {
if (!mounted) return;
messenger.showSnackBar(
SnackBar(content: Text('Cannot shuffle play local tracks: $e')),
);
});
showDialog(
context: context,
builder: (dialogContext) {
final colorScheme = Theme.of(dialogContext).colorScheme;
return AlertDialog(
backgroundColor: colorScheme.surfaceContainerHigh,
title: const Text('Download All'),
content: Text('Download ${tracks.length} tracks?'),
actions: [
TextButton(
onPressed: () => Navigator.pop(dialogContext),
child: Text(context.l10n.dialogCancel),
),
FilledButton(
onPressed: () {
Navigator.pop(dialogContext);
_downloadAll(tracks);
},
child: const Text('Download'),
),
],
);
},
);
}
void _playAll(List<Track> tracks) {
void _downloadAll(List<Track> tracks) {
if (tracks.isEmpty) return;
final messenger = ScaffoldMessenger.of(context);
ref.read(playbackProvider.notifier).playTrackList(tracks).catchError((e) {
if (!mounted) return;
messenger.showSnackBar(
SnackBar(content: Text('Cannot play local tracks: $e')),
final settings = ref.read(settingsProvider);
if (settings.askQualityBeforeDownload) {
DownloadServicePicker.show(
context,
trackName: '${tracks.length} tracks',
artistName: switch (widget.mode) {
LibraryTracksFolderMode.wishlist => context.l10n.collectionWishlist,
LibraryTracksFolderMode.loved => context.l10n.collectionLoved,
LibraryTracksFolderMode.playlist => context.l10n.collectionPlaylist,
},
onSelect: (quality, service) {
ref
.read(downloadQueueProvider.notifier)
.addMultipleToQueue(tracks, service, qualityOverride: quality);
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
context.l10n.snackbarAddedTracksToQueue(tracks.length),
),
),
);
},
);
});
} else {
ref
.read(downloadQueueProvider.notifier)
.addMultipleToQueue(tracks, settings.defaultService);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarAddedTracksToQueue(tracks.length)),
),
);
}
}
void _showCoverOptionsSheet(BuildContext context, bool hasCustomCover) {
@@ -1000,6 +1021,32 @@ class _CollectionTrackTile extends ConsumerWidget {
final track = entry.track;
final colorScheme = Theme.of(context).colorScheme;
final effectiveCoverUrl = _resolveCoverUrl(track);
final isInHistory = ref.watch(
downloadHistoryProvider.select((state) {
if (state.isDownloaded(track.id)) return true;
final isrc = track.isrc?.trim();
if (isrc != null && isrc.isNotEmpty && state.getByIsrc(isrc) != null) {
return true;
}
return state.findByTrackAndArtist(track.name, track.artistName) != null;
}),
);
final showLocalLibraryIndicator = ref.watch(
settingsProvider.select(
(s) => s.localLibraryEnabled && s.localLibraryShowDuplicates,
),
);
final isInLocalLibrary = showLocalLibraryIndicator
? ref.watch(
localLibraryProvider.select(
(state) => state.existsInLibrary(
isrc: track.isrc,
trackName: track.name,
artistName: track.artistName,
),
),
)
: false;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
@@ -1059,10 +1106,48 @@ class _CollectionTrackTile extends ConsumerWidget {
],
),
title: Text(track.name, maxLines: 1, overflow: TextOverflow.ellipsis),
subtitle: Text(
track.artistName,
maxLines: 1,
overflow: TextOverflow.ellipsis,
subtitle: Row(
children: [
Flexible(
child: Text(
track.artistName,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
if (isInLocalLibrary || isInHistory) ...[
const SizedBox(width: 6),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 2,
),
decoration: BoxDecoration(
color: colorScheme.tertiaryContainer,
borderRadius: BorderRadius.circular(4),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.folder_outlined,
size: 10,
color: colorScheme.onTertiaryContainer,
),
const SizedBox(width: 3),
Text(
context.l10n.libraryInLibrary,
style: TextStyle(
fontSize: 9,
fontWeight: FontWeight.w500,
color: colorScheme.onTertiaryContainer,
),
),
],
),
),
],
],
),
trailing: isSelectionMode
? null
+9 -21
View File
@@ -20,7 +20,6 @@ import 'package:spotiflac_android/services/shell_navigation_service.dart';
import 'package:spotiflac_android/services/share_intent_service.dart';
import 'package:spotiflac_android/services/update_checker.dart';
import 'package:spotiflac_android/widgets/update_dialog.dart';
import 'package:spotiflac_android/widgets/mini_player_bar.dart';
import 'package:spotiflac_android/utils/logger.dart';
final _log = AppLogger('MainShell');
@@ -375,7 +374,7 @@ class _MainShellState extends ConsumerState<MainShell> {
if (_lastBackPress != null &&
now.difference(_lastBackPress!) < const Duration(seconds: 2)) {
_log.i('Back: step 8 - double-tap exit');
SystemNavigator.pop();
unawaited(PlatformBridge.exitApp());
} else {
_log.i('Back: step 7 - first tap, showing exit snackbar');
_lastBackPress = now;
@@ -487,28 +486,17 @@ class _MainShellState extends ConsumerState<MainShell> {
});
}
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) async {
if (didPop) {
return;
}
return BackButtonListener(
onBackButtonPressed: () async {
_handleBackPress();
return true;
},
child: Scaffold(
body: Column(
children: [
Expanded(
child: PageView(
controller: _pageController,
onPageChanged: _onPageChanged,
physics: const NeverScrollableScrollPhysics(),
children: tabs,
),
),
const MiniPlayerBar(),
],
body: PageView(
controller: _pageController,
onPageChanged: _onPageChanged,
physics: const NeverScrollableScrollPhysics(),
children: tabs,
),
bottomNavigationBar: NavigationBar(
selectedIndex: _currentIndex.clamp(0, maxIndex),
+6
View File
@@ -149,6 +149,12 @@ class AboutPage extends StatelessWidget {
subtitle:
'Partner lyrics proxy for Apple Music and QQ Music sources',
onTap: () => _launchUrl('https://lyrics.paxsenix.org'),
showDivider: true,
),
_ContributorItem(
name: 'Ruubiiiii',
description: 'Provided Qobuz API for the project',
githubUsername: 'Ruubiiiii',
showDivider: false,
),
],
+36 -25
View File
@@ -166,19 +166,7 @@ class _RecentDonorsCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
const donorNames = [
'NinoBrown',
'@nino_sandzak',
'IMJ',
'J',
'Julian',
'matt_3050',
'Daniel',
'283Fabio',
'laflame',
'Elias el Autentico',
'Faylyne',
];
const donorNames = <String>[];
// Match SettingsGroup color logic
final cardColor = isDark
@@ -221,16 +209,39 @@ class _RecentDonorsCard extends StatelessWidget {
),
),
const SizedBox(height: 16),
Wrap(
spacing: 8,
runSpacing: 8,
children: donorNames
.map(
(name) =>
_SupporterChip(name: name, colorScheme: colorScheme),
)
.toList(),
),
if (donorNames.isEmpty)
Center(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Column(
children: [
Icon(
Icons.emoji_events_outlined,
size: 32,
color: colorScheme.onSurfaceVariant.withValues(alpha: 0.4),
),
const SizedBox(height: 8),
Text(
'No supporters yet — be the first!',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: colorScheme.onSurfaceVariant.withValues(alpha: 0.6),
),
),
],
),
),
)
else
Wrap(
spacing: 8,
runSpacing: 8,
children: donorNames
.map(
(name) =>
_SupporterChip(name: name, colorScheme: colorScheme),
)
.toList(),
),
],
),
),
@@ -463,8 +474,8 @@ int _cr(String v) {
for (final c in v.codeUnits) { r = (r * 31 + c) & 0x7FFFFFFF; }
return r;
}
// Highlighted supporters (hashes of names): Julian, J, NinoBrown, @nino_sandzak, IMJ.
const _cv = {1825257268, 1035, 1497948283, 398058782, 996135};
// Highlighted supporters (hashes of names): none for now.
const _cv = <int>{};
class _SupporterChip extends StatelessWidget {
final String name;
@@ -152,40 +152,6 @@ class OptionsSettingsPage extends ConsumerWidget {
onChanged: (v) =>
ref.read(settingsProvider.notifier).setAutoFallback(v),
),
SettingsSwitchItem(
icon: Icons.skip_next_rounded,
title: context.l10n.optionsAutoSkipUnavailableTracks,
subtitle: settings.autoSkipUnavailableTracks
? context
.l10n
.optionsAutoSkipUnavailableTracksSubtitleOn
: context
.l10n
.optionsAutoSkipUnavailableTracksSubtitleOff,
value: settings.autoSkipUnavailableTracks,
onChanged: (v) => ref
.read(settingsProvider.notifier)
.setAutoSkipUnavailableTracks(v),
),
SettingsItem(
icon: Icons.headphones,
title: 'Music Player',
subtitle: _playerModeLabel(settings.playerMode),
onTap: () => _showPlayerModePicker(
context,
ref,
settings.playerMode,
),
),
SettingsSwitchItem(
icon: Icons.queue_music_rounded,
title: context.l10n.settingsSmartQueueTitle,
subtitle: context.l10n.settingsSmartQueueSubtitle,
value: settings.smartQueueEnabled,
onChanged: (v) => ref
.read(settingsProvider.notifier)
.setSmartQueueEnabled(v),
),
if (hasExtensions)
SettingsSwitchItem(
icon: Icons.extension,
@@ -328,74 +294,6 @@ class OptionsSettingsPage extends ConsumerWidget {
);
}
String _playerModeLabel(String mode) {
if (mode == 'external') {
return 'External app (Poweramp, etc.)';
}
return 'Internal player';
}
void _showPlayerModePicker(
BuildContext context,
WidgetRef ref,
String currentMode,
) {
showModalBottomSheet<void>(
context: context,
useRootNavigator: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
),
builder: (sheetContext) {
final colorScheme = Theme.of(sheetContext).colorScheme;
return SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 8),
Container(
width: 40,
height: 4,
decoration: BoxDecoration(
color: colorScheme.outlineVariant,
borderRadius: BorderRadius.circular(999),
),
),
const SizedBox(height: 12),
ListTile(
leading: const Icon(Icons.play_circle_outline),
title: const Text('Internal Player'),
subtitle: const Text('Use built-in app playback and queue'),
trailing: currentMode == 'internal'
? Icon(Icons.check, color: colorScheme.primary)
: null,
onTap: () {
ref.read(settingsProvider.notifier).setPlayerMode('internal');
Navigator.pop(sheetContext);
},
),
ListTile(
leading: const Icon(Icons.open_in_new),
title: const Text('External Player'),
subtitle: const Text(
'Open songs with apps like Poweramp, Musicolet, etc.',
),
trailing: currentMode == 'external'
? Icon(Icons.check, color: colorScheme.primary)
: null,
onTap: () {
ref.read(settingsProvider.notifier).setPlayerMode('external');
Navigator.pop(sheetContext);
},
),
const SizedBox(height: 8),
],
),
);
},
);
}
void _showClearHistoryDialog(
BuildContext context,
WidgetRef ref,
+4
View File
@@ -142,6 +142,10 @@ class PlatformBridge {
});
}
static Future<void> exitApp() async {
await _channel.invokeMethod('exitApp');
}
static Future<void> initItemProgress(String itemId) async {
await _channel.invokeMethod('initItemProgress', {'item_id': itemId});
}
+15
View File
@@ -74,6 +74,13 @@ class UpdateChecker {
return null;
}
// Ignore releases from a different major version (e.g. v4.x when we
// rolled back to v3.x). Only offer updates within the same major line.
if (_majorVersion(latestVersion) != _majorVersion(AppInfo.version)) {
_log.i('Skipping update from different major version (current: ${AppInfo.version}, latest: $latestVersion)');
return null;
}
final body = releaseData['body'] as String? ?? 'No changelog available';
final htmlUrl = releaseData['html_url'] as String? ?? '${AppInfo.githubUrl}/releases';
final publishedAt = DateTime.tryParse(releaseData['published_at'] as String? ?? '') ?? DateTime.now();
@@ -118,6 +125,14 @@ class UpdateChecker {
}
}
static int _majorVersion(String version) {
try {
return int.parse(version.split('-').first.split('.').first);
} catch (_) {
return -1;
}
}
static bool _isNewerVersion(String latest, String current) {
try {
final latestBase = latest.split('-').first;
File diff suppressed because it is too large Load Diff
@@ -1,18 +1,10 @@
import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotiflac_android/l10n/l10n.dart';
import 'package:spotiflac_android/models/track.dart';
import 'package:spotiflac_android/providers/download_queue_provider.dart';
import 'package:spotiflac_android/providers/library_collections_provider.dart';
import 'package:spotiflac_android/providers/local_library_provider.dart';
import 'package:spotiflac_android/providers/playback_provider.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/services/cover_cache_manager.dart';
import 'package:spotiflac_android/utils/file_access.dart';
import 'package:spotiflac_android/widgets/download_service_picker.dart';
import 'package:spotiflac_android/widgets/playlist_picker_sheet.dart';
import 'package:spotiflac_android/utils/clickable_metadata.dart';
@@ -64,9 +56,6 @@ class _TrackOptionsSheet extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final colorScheme = Theme.of(context).colorScheme;
final settings = ref.watch(settingsProvider);
final rootContext = Navigator.of(context, rootNavigator: true).context;
final container = ProviderScope.containerOf(rootContext, listen: false);
final isLoved = ref.watch(
libraryCollectionsProvider.select((state) => state.isLoved(track)),
@@ -174,46 +163,6 @@ class _TrackOptionsSheet extends ConsumerWidget {
),
// Action items (matches _QualityOption style)
_OptionTile(
icon: Icons.download_rounded,
title: 'Download & Play',
onTap: () async {
Navigator.pop(context);
final playedLocal = await _playLocalIfAvailable(
container,
rootContext,
);
if (playedLocal) {
return;
}
if (!rootContext.mounted) {
return;
}
if (settings.askQualityBeforeDownload) {
DownloadServicePicker.show(
rootContext,
trackName: track.name,
artistName: track.artistName,
coverUrl: track.coverUrl,
onSelect: (quality, service) {
_enqueueDownloadAndAutoPlay(
container: container,
context: rootContext,
service: service,
quality: quality,
);
},
);
} else {
_enqueueDownloadAndAutoPlay(
container: container,
context: rootContext,
service: settings.defaultService,
);
}
},
),
_OptionTile(
icon: isLoved ? Icons.favorite : Icons.favorite_border,
iconColor: isLoved ? colorScheme.error : null,
@@ -282,138 +231,6 @@ class _TrackOptionsSheet extends ConsumerWidget {
),
);
}
Future<bool> _playLocalIfAvailable(
ProviderContainer container,
BuildContext context,
) async {
final localState = container.read(localLibraryProvider);
final historyState = container.read(downloadHistoryProvider);
final historyNotifier = container.read(downloadHistoryProvider.notifier);
try {
DownloadHistoryItem? historyItem = historyNotifier.getBySpotifyId(
track.id,
);
final isrc = track.isrc?.trim();
historyItem ??= (isrc != null && isrc.isNotEmpty)
? historyNotifier.getByIsrc(isrc)
: null;
historyItem ??= historyState.findByTrackAndArtist(
track.name,
track.artistName,
);
if (historyItem != null) {
final exists = await fileExists(historyItem.filePath);
if (exists) {
await container
.read(playbackProvider.notifier)
.playLocalPath(
path: historyItem.filePath,
title: track.name,
artist: track.artistName,
album: track.albumName,
coverUrl: track.coverUrl ?? '',
);
return true;
}
historyNotifier.removeFromHistory(historyItem.id);
}
var localItem = (isrc != null && isrc.isNotEmpty)
? localState.getByIsrc(isrc)
: null;
localItem ??= localState.findByTrackAndArtist(
track.name,
track.artistName,
);
if (localItem != null && await fileExists(localItem.filePath)) {
await container
.read(playbackProvider.notifier)
.playLocalPath(
path: localItem.filePath,
title: localItem.trackName,
artist: localItem.artistName,
album: localItem.albumName,
coverUrl: localItem.coverPath ?? track.coverUrl ?? '',
);
return true;
}
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.snackbarCannotOpenFile('$e'))),
);
}
return true;
}
return false;
}
void _enqueueDownloadAndAutoPlay({
required ProviderContainer container,
required BuildContext context,
required String service,
String? quality,
}) {
container
.read(downloadQueueProvider.notifier)
.addToQueue(track, service, qualityOverride: quality);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(context.l10n.snackbarAddedToQueue(track.name))),
);
}
unawaited(_waitForDownloadedFileAndPlay(container, context));
}
Future<void> _waitForDownloadedFileAndPlay(
ProviderContainer container,
BuildContext context,
) async {
const maxAttempts = 180; // up to ~3 minutes
for (var i = 0; i < maxAttempts; i++) {
final item = _findHistoryMatch(container);
if (item != null && await fileExists(item.filePath)) {
try {
await container
.read(playbackProvider.notifier)
.playLocalPath(
path: item.filePath,
title: track.name,
artist: track.artistName,
album: track.albumName,
coverUrl: track.coverUrl ?? '',
);
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(context.l10n.snackbarCannotOpenFile('$e')),
),
);
}
}
return;
}
await Future.delayed(const Duration(seconds: 1));
}
}
DownloadHistoryItem? _findHistoryMatch(ProviderContainer container) {
final historyState = container.read(downloadHistoryProvider);
final historyNotifier = container.read(downloadHistoryProvider.notifier);
final isrc = track.isrc?.trim();
return historyNotifier.getBySpotifyId(track.id) ??
((isrc != null && isrc.isNotEmpty)
? historyNotifier.getByIsrc(isrc)
: null) ??
historyState.findByTrackAndArtist(track.name, track.artistName);
}
}
/// Styled like _QualityOption in download_service_picker.dart