Album-Ansicht, mitlaufender Songtext, Cover-Cache, Server-Favoriten
Die letzten vier Punkte aus dem Review-Bericht.
G2 — Server-Bereich: Ein Tipp auf ein Album spielte sofort alles ab;
hineinsehen ging nicht. Jetzt Album- und Kuenstler-Ansicht mit Cover,
Kuenstler, Titelzahl, Gesamtdauer, "Abspielen"/"Zufaellig" und der
Titelliste; Antippen startet an dieser Stelle. Dazu "Mehr Alben laden" —
die Liste hoerte bei 50 auf, ohne dass etwas darauf hinwies.
NICHT umgesetzt: den Server-Bereich aus dem Download-Tab loesen (das
widerspricht Commit 34d6d8e, "Auf Wunsch von Dustin") und eine
Server-Suche (die Suche bleibt ausdruecklich rein lokal).
G8 — Songtext: Traegt der Text Zeitmarken, laeuft er mit; die aktive Zeile
ist hervorgehoben, Antippen springt an die Stelle. Ohne Zeitmarken bleibt
es eine Textwand — die App schaut nach, statt zu raten.
G10 — Cover bleiben liegen. Eigener Ordner, einmal geholt. Der Schluessel
haengt an der Album-Kennung, nicht an der Adresse: die traegt bei jedem
App-Start ein neues Token, und der Ordner waere sonst gewachsen, ohne je
einen Treffer zu liefern. Keine neue Abhaengigkeit.
G3 — Das Herz ist bei Server-Titeln nicht mehr ausgegraut, sondern
favorisiert am Server (star/unstar) — dort, wo der Favoriten-Abgleich sie
auch wieder abholt. Offen bleibt der schwere Teil: Wiedergabezaehler,
Historie und Kategorien braeuchten fuer Server-Titel eine Zeile in der
Bibliothek.
Aus dem Code-Review nachgebessert (sieben Punkte): das Herz behielt beim
Titelwechsel seinen Zustand; recycelte Listenzeilen zeigten kurz das Cover
der vorherigen; der neue Songtext bekam bei Server-Titeln die
Abspiel-Adresse statt der Server-Kennung und fand deshalb nie einen Text;
ein einmal fehlgeschlagenes Cover blieb die ganze Sitzung grau; "Server
nicht erreichbar" sah aus wie "Album hat keine Titel", womit der
Wiederholen-Knopf unerreichbar war; die Kuenstler-Ansicht waere immer leer
geblieben, weil getArtist die Titel gar nicht mitliefert; und zwei
gleichzeitige Cover-Abrufe konnten ein zerschnittenes Bild hinterlassen.
Selbst gefunden: das Haekchen "schon geladen" fragte pro Zeile die Platte
ab, bei jedem Positionswechsel neu. Jetzt einmal je Bildschirm.
457 Tests gruen (vorher 433), flutter analyze ohne Befund, Release-APK
gebaut.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xAHJTJM6UUqmjUgk1PUEd
This commit is contained in:
co-authored by
Claude Opus 5
parent
b42e045e67
commit
0d76d8cc58
@@ -0,0 +1,52 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:melo/services/navidrome_service.dart';
|
||||
|
||||
/// Der Kopf der Album-Detailansicht nennt den Künstler. Der stand bisher in
|
||||
/// der Antwort des Servers, wurde aber nicht ausgelesen.
|
||||
void main() {
|
||||
Map<String, dynamic> antwort(List<Map<String, dynamic>> alben) =>
|
||||
NavidromeService.parseSubsonic(jsonEncode({
|
||||
'subsonic-response': {
|
||||
'status': 'ok',
|
||||
'albumList2': {'album': alben},
|
||||
}
|
||||
}));
|
||||
|
||||
test('liest den Album-Künstler mit', () {
|
||||
final alben = NavidromeService.parseAlben(antwort([
|
||||
{'id': '1', 'name': 'Trailerpark', 'artist': 'Neoni', 'songCount': 12},
|
||||
]));
|
||||
|
||||
expect(alben.single.kuenstler, 'Neoni');
|
||||
expect(alben.single.name, 'Trailerpark');
|
||||
expect(alben.single.songCount, 12);
|
||||
});
|
||||
|
||||
test('ein Album ohne Künstler-Feld bleibt lesbar', () {
|
||||
final alben = NavidromeService.parseAlben(antwort([
|
||||
{'id': '1', 'name': 'Ohne'},
|
||||
]));
|
||||
|
||||
expect(alben.single.kuenstler, isNull);
|
||||
expect(alben.single.name, 'Ohne');
|
||||
});
|
||||
|
||||
group('parseSubsonic bei Fehlern', () {
|
||||
test('getSongs und getArtistSongs duerfen nicht "leer" melden', () {
|
||||
// Beide verschluckten Fehler und lieferten []. Damit sah "Server nicht
|
||||
// erreichbar" genauso aus wie "Album hat keine Titel", und der
|
||||
// Wiederholen-Knopf erschien nie.
|
||||
expect(
|
||||
() => NavidromeService.parseSubsonic(jsonEncode({
|
||||
'subsonic-response': {
|
||||
'status': 'failed',
|
||||
'error': {'message': 'Wrong username or password'},
|
||||
}
|
||||
})),
|
||||
throwsA(isA<NavidromeException>()),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user