UI: Alben sind Kategorien — Reiter Lieder/Kategorie/Kuenstler
Auf Wunsch von Dustin: seine beste Freundin sortiert ihre Sammlung ueber das Album-Feld. In Melo ist der Album-Titel deshalb ab jetzt die Kategorie — sie muss nichts neu machen. 1) Album = Kategorie - kategorienAusTags(): Album-Titel steht VORN in der Kategorienliste (die erste Kategorie bestimmt das Coverbild), Genres dahinter. - Beide Scans (android_scan + scan_service) tragen ihn ein; von Hand gepflegte Kategorien (categoriesEdited) bleiben unberuehrt. - DB-Schema 9: einmalige Nachruestung bestehender Bibliotheken, damit das nicht erst beim naechsten vollstaendigen Scan sichtbar wird (der auf Android nur laeuft, wenn sich die Dateianzahl aendert). 2) Reiter: 'Songs/Kuenstler/Alben' -> 'Lieder/Kategorie/Kuenstler' - Neu: library/category_list.dart mit groupByCategory(); Lieder ohne Kategorie sammeln sich am Ende unter "Ohne Kategorie". - Entfernt: library/album_list.dart, groupByAlbum(), albumArtistLabel() — mit dem Alben-Reiter tot geworden. Das Album-FELD bleibt erhalten. 3) YouTube-Downloads ohne Original-Album - Feld "Kategorie (optional)" im YouTube-Bereich, mit Vorschlaegen aus der Bibliothek und freier Eingabe. - ordneDownloadEin() verwirft nach dem Scan das Album-Tag (yt-dlp leitet es aus Kanal/Playlist ab — als Kategorie waere das Unsinn) und setzt stattdessen die gewaehlte Kategorie. Beides als "von Hand gesetzt" markiert, damit der naechste Scan es nicht zurueckholt. - MeloDb.songByPath() und MeloDb.verwirfAlbum() neu. - CategoryService.alleNamen: Kategorienamen ohne zusaetzliche Abfrage — ohne das flackerte die Vorschlagsliste und im Widget-Test blieb ein Aufraeum-Timer von drift haengen. 295 Tests gruen (19 neue, 1 uebersprungen), flutter analyze ohne Befund. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FpPu4nuKjKKeX1RpdDeX81
This commit is contained in:
co-authored by
Claude Opus 5
parent
cd79213bb3
commit
c7a7a7c458
@@ -8,7 +8,7 @@ import '../shared/sort_store.dart';
|
||||
import '../shared/sub_tabs.dart';
|
||||
import '../shared/sortable_song_list.dart';
|
||||
import '../shared/theme.dart';
|
||||
import 'album_list.dart';
|
||||
import 'category_list.dart';
|
||||
import 'artist_list.dart';
|
||||
import 'database.dart';
|
||||
import 'library_service.dart';
|
||||
@@ -17,7 +17,7 @@ import 'permissions.dart';
|
||||
import 'song_list.dart';
|
||||
|
||||
/// Startbildschirm: Kopfzeile mit Einstellungen/Suche/Musikerkennung,
|
||||
/// Schnellzugriffe, Unterreiter (Songs/Künstler/Alben) und darunter der
|
||||
/// Schnellzugriffe, Unterreiter (Lieder/Kategorie/Künstler) und darunter der
|
||||
/// jeweilige Inhalt. Bewusst ohne AppBar — die Kopfzeile ist Teil des Inhalts.
|
||||
class MyMusicScreen extends StatefulWidget {
|
||||
const MyMusicScreen({super.key, this.onSearchTap, this.onFavoritesTap});
|
||||
@@ -33,7 +33,7 @@ class MyMusicScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _MyMusicScreenState extends State<MyMusicScreen> {
|
||||
/// 0 = Songs, 1 = Künstler, 2 = Alben.
|
||||
/// 0 = Lieder, 1 = Kategorie, 2 = Künstler.
|
||||
int _subTab = 0;
|
||||
|
||||
@override
|
||||
@@ -85,14 +85,14 @@ class _MyMusicScreenState extends State<MyMusicScreen> {
|
||||
),
|
||||
_QuickAccessRow(onFavoritesTap: widget.onFavoritesTap),
|
||||
SubTabs(
|
||||
labels: const ['Songs', 'Künstler', 'Alben'],
|
||||
labels: const ['Lieder', 'Kategorie', 'Künstler'],
|
||||
index: _subTab,
|
||||
onChanged: (i) => setState(() => _subTab = i),
|
||||
),
|
||||
Expanded(
|
||||
child: switch (_subTab) {
|
||||
1 => const ArtistListScreen(),
|
||||
2 => const AlbumListScreen(),
|
||||
1 => const CategoryListScreen(),
|
||||
2 => const ArtistListScreen(),
|
||||
_ => StreamBuilder<List<Song>>(
|
||||
stream: db.watchSongs(),
|
||||
builder: (context, snapshot) {
|
||||
|
||||
Reference in New Issue
Block a user