diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 588eac10..64eee3fb 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -2902,6 +2902,18 @@ abstract class AppLocalizations { /// **'Artist/Album/ and Artist/Singles/'** String get albumFolderArtistAlbumSinglesSubtitle; + /// Album folder option with singles directly in artist folder + /// + /// In en, this message translates to: + /// **'Artist / Album (Singles flat)'** + String get albumFolderArtistAlbumFlat; + + /// Folder structure example for flat singles + /// + /// In en, this message translates to: + /// **'Artist/Album/ and Artist/song.flac'** + String get albumFolderArtistAlbumFlatSubtitle; + /// Button - delete selected tracks /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index f6e211bc..15888ae5 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -1578,6 +1578,13 @@ class AppLocalizationsDe extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Künstler/Album/ und Künstler/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Ausgewählte löschen'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 2a51e017..210342d2 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsEn extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 0442fc0e..f39ba881 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsEs extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 9f27a85a..f0e783a5 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -1554,6 +1554,13 @@ class AppLocalizationsFr extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 9999389b..d36edd4b 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsHi extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index ac0980df..45d363fa 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -1561,6 +1561,13 @@ class AppLocalizationsId extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artis/Album/ dan Artis/Single/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Hapus yang Dipilih'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 2d6606ce..3d64d7d0 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -1539,6 +1539,13 @@ class AppLocalizationsJa extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => '選択済みを削除'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 4a6244d6..69036d66 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -1532,6 +1532,13 @@ class AppLocalizationsKo extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index b0e709d9..1ee2d0b9 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsNl extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index e22c9ed1..444a91e0 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsPt extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 1875d49f..fcd6c96b 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -1581,6 +1581,13 @@ class AppLocalizationsRu extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Исполнитель/Альбом и Исполнитель/Сингл/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Удалить выбранные'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 9ca79ab1..42e95073 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -1558,6 +1558,13 @@ class AppLocalizationsTr extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index cb4ee004..9b379784 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -1552,6 +1552,13 @@ class AppLocalizationsZh extends AppLocalizations { String get albumFolderArtistAlbumSinglesSubtitle => 'Artist/Album/ and Artist/Singles/'; + @override + String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)'; + + @override + String get albumFolderArtistAlbumFlatSubtitle => + 'Artist/Album/ and Artist/song.flac'; + @override String get downloadedAlbumDeleteSelected => 'Delete Selected'; diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 465cefc6..4107d8b9 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -2029,6 +2029,14 @@ "@albumFolderArtistAlbumSinglesSubtitle": { "description": "Folder structure example" }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, "downloadedAlbumDeleteSelected": "Delete Selected", "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" diff --git a/lib/providers/download_queue_provider.dart b/lib/providers/download_queue_provider.dart index 14693e35..e99151ff 100644 --- a/lib/providers/download_queue_provider.dart +++ b/lib/providers/download_queue_provider.dart @@ -1908,6 +1908,20 @@ class DownloadQueueNotifier extends Notifier { } } + if (albumFolderStructure == 'artist_album_flat') { + if (isSingle) { + final artistPath = '$baseDir${Platform.pathSeparator}$artistName'; + await _ensureDirExists(artistPath, label: 'Artist folder'); + return artistPath; + } else { + final albumName = _sanitizeFolderName(track.albumName); + final albumPath = + '$baseDir${Platform.pathSeparator}$artistName${Platform.pathSeparator}$albumName'; + await _ensureDirExists(albumPath, label: 'Artist Album folder'); + return albumPath; + } + } + if (isSingle) { final singlesPath = '$baseDir${Platform.pathSeparator}Singles'; await _ensureDirExists(singlesPath, label: 'Singles folder'); diff --git a/lib/screens/settings/download_settings_page.dart b/lib/screens/settings/download_settings_page.dart index b7c34cae..6b60e332 100644 --- a/lib/screens/settings/download_settings_page.dart +++ b/lib/screens/settings/download_settings_page.dart @@ -841,6 +841,8 @@ class _DownloadSettingsPageState extends ConsumerState { return 'Albums/[Year] Album/'; case 'artist_album_singles': return 'Artist/Album/ + Artist/Singles/'; + case 'artist_album_flat': + return 'Artist/Album/ + Artist/song.flac'; default: return 'Albums/Artist/Album Name/'; } @@ -930,6 +932,20 @@ class _DownloadSettingsPageState extends ConsumerState { Navigator.pop(context); }, ), + ListTile( + leading: const Icon(Icons.person_outline_outlined), + title: Text(context.l10n.albumFolderArtistAlbumFlat), + subtitle: Text(context.l10n.albumFolderArtistAlbumFlatSubtitle), + trailing: current == 'artist_album_flat' + ? const Icon(Icons.check) + : null, + onTap: () { + ref + .read(settingsProvider.notifier) + .setAlbumFolderStructure('artist_album_flat'); + Navigator.pop(context); + }, + ), ], ), ),