Songtext aus Datei-Tags, Warteschlangen-Aktionen, Kategorie-Cover im
Sperrbildschirm und ReplayGain - DB-Schema 6: lyrics + gain_db - Songtext bevorzugt lokalen Tag, Server nur als Rueckfall; Song-ID-Bug beim Lyrics-Aufruf behoben - "Als Naechstes spielen" / "Zur Warteschlange hinzufuegen" ohne Eingriff in Favoriten oder Wiedergabelisten - songToMediaItem nimmt eine Cover-Vorgabe: Sperrbildschirm zeigt das Kategorie-Cover - ReplayGain: Tags werden gelesen, laute Titel abgesenkt, abschaltbar Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../library/category_service.dart';
|
||||
import '../library/database.dart';
|
||||
import '../library/playlist_service.dart';
|
||||
import '../library/song_media.dart';
|
||||
import '../player/audio_handler.dart';
|
||||
import '../settings/app_settings.dart';
|
||||
import '../shared/cover.dart';
|
||||
|
||||
/// Playlist-Detailansicht: Songs anzeigen, per Drag & Drop umsortieren, entfernen.
|
||||
@@ -17,6 +19,8 @@ class PlaylistDetailScreen extends StatelessWidget {
|
||||
final db = context.read<MeloDb>();
|
||||
final handler = context.read<MeloAudioHandler>();
|
||||
final service = context.read<PlaylistService>();
|
||||
final categories = context.watch<CategoryService>();
|
||||
final settings = context.watch<AppSettings>();
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text(playlist.name)),
|
||||
body: StreamBuilder<List<Song>>(
|
||||
@@ -47,11 +51,15 @@ class PlaylistDetailScreen extends StatelessWidget {
|
||||
final s = songs[i];
|
||||
return ListTile(
|
||||
key: ValueKey(s.id),
|
||||
leading: CoverImage(
|
||||
artUri: s.coverPath != null ? Uri.file(s.coverPath!) : null,
|
||||
size: 48,
|
||||
radius: 6,
|
||||
),
|
||||
leading: Builder(builder: (context) {
|
||||
final cover = categories.coverFor(s,
|
||||
groupByCategory: settings.groupCoversByCategory);
|
||||
return CoverImage(
|
||||
artUri: cover != null ? Uri.file(cover) : null,
|
||||
size: 48,
|
||||
radius: 6,
|
||||
);
|
||||
}),
|
||||
title: Text(s.title, maxLines: 1, overflow: TextOverflow.ellipsis),
|
||||
subtitle: Text(s.artist ?? 'Unbekannt',
|
||||
maxLines: 1, overflow: TextOverflow.ellipsis),
|
||||
@@ -62,7 +70,13 @@ class PlaylistDetailScreen extends StatelessWidget {
|
||||
),
|
||||
onTap: () async {
|
||||
try {
|
||||
await playSongs(handler, songs, i);
|
||||
await playSongs(
|
||||
handler,
|
||||
songs,
|
||||
i,
|
||||
coverOf: (song) => categories.coverFor(song,
|
||||
groupByCategory: settings.groupCoversByCategory),
|
||||
);
|
||||
} catch (e) {
|
||||
if (context.mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
|
||||
Reference in New Issue
Block a user