Code Review Optimierungen: Typsicherheit, Scanner-Performance, DB Upgrade Template, Division Guard

This commit is contained in:
Hermes (Server)
2026-07-24 08:33:30 +02:00
parent c7828b851c
commit b43ccd4c0d
8 changed files with 225 additions and 525 deletions
+3
View File
@@ -82,6 +82,9 @@ class DbHelper {
)
''');
},
onUpgrade: (db, oldVersion, newVersion) async {
// Hier zukünftige DB-Migrationen einpflegen (z.B. if (oldVersion < 2) ...)
},
);
}
+1 -1
View File
@@ -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();
+8 -4
View File
@@ -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;
-1
View File
@@ -75,7 +75,6 @@ class MeloHomeViewModel extends ChangeNotifier {
songs = alle;
favoritenIds = await favoriten.favoritenIds();
tagCounts = _berechneTagCounts();
letzteSongs = await db.letzteWiedergaben();
await ladeTags();
ladt = false;
+2 -1
View File
@@ -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
+3 -2
View File
@@ -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({