Code Review Optimierungen: Typsicherheit, Scanner-Performance, DB Upgrade Template, Division Guard
This commit is contained in:
@@ -82,6 +82,9 @@ class DbHelper {
|
||||
)
|
||||
''');
|
||||
},
|
||||
onUpgrade: (db, oldVersion, newVersion) async {
|
||||
// Hier zukünftige DB-Migrationen einpflegen (z.B. if (oldVersion < 2) ...)
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ class DownloadService {
|
||||
await for (final chunk in fileStream) {
|
||||
sink.add(chunk);
|
||||
downloaded += chunk.length;
|
||||
_fortschritt = downloaded / total;
|
||||
_fortschritt = total > 0 ? downloaded / total : 0.0;
|
||||
}
|
||||
await sink.flush();
|
||||
await sink.close();
|
||||
|
||||
@@ -26,6 +26,8 @@ class MusikScanner {
|
||||
final gefunden = <Song>[];
|
||||
final pfade = await _sammleMusikPfade();
|
||||
|
||||
final player = AudioPlayer();
|
||||
|
||||
for (final pfad in pfade) {
|
||||
try {
|
||||
final file = File(pfad);
|
||||
@@ -35,7 +37,7 @@ class MusikScanner {
|
||||
titel: _dateiNameOhneEndung(pfad),
|
||||
kuenstler: 'Unbekannt',
|
||||
album: '',
|
||||
dauerSekunden: await _ermittleDauer(pfad),
|
||||
dauerSekunden: await _ermittleDauer(player, pfad),
|
||||
dateiPfad: pfad,
|
||||
coverPfad: null,
|
||||
groesseBytes: stat.size,
|
||||
@@ -47,6 +49,10 @@ class MusikScanner {
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
await player.dispose();
|
||||
} catch (_) {}
|
||||
|
||||
// In DB speichern
|
||||
final vorhandene = await _db.alleSongs();
|
||||
final vorhandenePfade = vorhandene.map((s) => s.dateiPfad).toSet();
|
||||
@@ -126,12 +132,10 @@ class MusikScanner {
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
Future<int> _ermittleDauer(String pfad) async {
|
||||
Future<int> _ermittleDauer(AudioPlayer player, String pfad) async {
|
||||
try {
|
||||
final player = AudioPlayer();
|
||||
await player.setFilePath(pfad);
|
||||
final dauer = player.duration;
|
||||
await player.dispose();
|
||||
return dauer?.inSeconds ?? 0;
|
||||
} catch (_) {
|
||||
return 0;
|
||||
|
||||
@@ -75,7 +75,6 @@ class MeloHomeViewModel extends ChangeNotifier {
|
||||
|
||||
songs = alle;
|
||||
favoritenIds = await favoriten.favoritenIds();
|
||||
tagCounts = _berechneTagCounts();
|
||||
letzteSongs = await db.letzteWiedergaben();
|
||||
await ladeTags();
|
||||
ladt = false;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../services/navidrome_service.dart';
|
||||
import '../utils/farb_theme.dart';
|
||||
import '../viewmodels/melo_home_viewmodel.dart';
|
||||
|
||||
/// Navidrome-Browser als Bottom-Sheet.
|
||||
/// Manuell in home_screen.dart einbaubar.
|
||||
class NavidromeBrowser extends StatefulWidget {
|
||||
final dynamic vm;
|
||||
final MeloHomeViewModel vm;
|
||||
const NavidromeBrowser({super.key, required this.vm});
|
||||
|
||||
@override
|
||||
|
||||
@@ -2,10 +2,11 @@ import 'package:flutter/material.dart';
|
||||
import '../models/song.dart';
|
||||
import '../models/playlist.dart';
|
||||
import '../utils/farb_theme.dart';
|
||||
import '../viewmodels/melo_home_viewmodel.dart';
|
||||
|
||||
/// Bottom-Sheet zum Durchstöbern von Playlists.
|
||||
class PlaylistSheet extends StatefulWidget {
|
||||
final dynamic vm;
|
||||
final MeloHomeViewModel vm;
|
||||
const PlaylistSheet({super.key, required this.vm});
|
||||
|
||||
@override
|
||||
@@ -174,7 +175,7 @@ class _PlaylistSheetState extends State<PlaylistSheet> {
|
||||
class _PlaylistDetail extends StatelessWidget {
|
||||
final Playlist p;
|
||||
final List<Song> songs;
|
||||
final dynamic vm;
|
||||
final MeloHomeViewModel vm;
|
||||
final VoidCallback onChanged;
|
||||
|
||||
const _PlaylistDetail({
|
||||
|
||||
Reference in New Issue
Block a user