Feature: Tonspur-Ergebnis sichtbar am Paket (audioStripSummary)
Die Antwort auf "warum hat Paket X noch .DL.?" steht bisher nur in den Rename-/Item-Logs — "kein Deutsch-Tag" ist INFO-Level und taucht nirgends im UI auf. Jetzt speichert keepGermanAudioOnlyImpl pro Paket eine Zusammenfassung (remuxed/kept-single/ohne-DE-Tag/ffmpeg-fehlt/Fehler + bis zu 100 Datei-Details mit Aktion, Grund und erkannten Sprachen) direkt am PackageEntry: - Status-Spalte zeigt "Tonspur: 5 OK / 1 ohne DE-Tag / ffmpeg fehlt" (rot bei Auffaelligkeiten, flacher Stil), Datei-Details als Tooltip. - Auch der ffmpeg-nicht-gefunden-Fruehausstieg schreibt die Summary. - pkg.updatedAt wird gesetzt + Feld im Paket-Delta-Hash, damit der Snapshot die Aenderung pusht; normalizeLoadedSession whitelistet das Feld mit Shape-Validierung, sonst waere es nach jedem App-Neustart weg. - 2 neue Integrationstests (Summary-Zaehler + ffmpeg-fehlt-Pfad).
This commit is contained in:
+24
-3
@@ -5,6 +5,7 @@ import type {
|
||||
AllDebridHostInfo,
|
||||
AppSettings,
|
||||
AppTheme,
|
||||
AudioStripSummary,
|
||||
BandwidthScheduleEntry,
|
||||
DebugSetupCheckResult,
|
||||
DebridFallbackProvider,
|
||||
@@ -984,6 +985,23 @@ function extractHoster(url: string): string {
|
||||
} catch { return ""; }
|
||||
}
|
||||
|
||||
function formatAudioStripSummary(summary: AudioStripSummary): { text: string; tooltip: string; attention: boolean } {
|
||||
const parts: string[] = [];
|
||||
const ok = summary.remuxed + summary.keptSingle;
|
||||
if (ok > 0) parts.push(`${ok} OK`);
|
||||
if (summary.skippedNoGerman > 0) parts.push(`${summary.skippedNoGerman} ohne DE-Tag`);
|
||||
if (summary.skippedNoTool > 0) parts.push("ffmpeg fehlt");
|
||||
if (summary.failed > 0) parts.push(`${summary.failed} Fehler`);
|
||||
const tooltip = summary.files
|
||||
.map((f) => `${f.name}: ${f.action} (${f.reason}${f.languages ? `, Spuren: ${f.languages}` : ""})`)
|
||||
.join("\n");
|
||||
return {
|
||||
text: `Tonspur: ${parts.join(" · ") || "—"}`,
|
||||
tooltip,
|
||||
attention: summary.skippedNoGerman > 0 || summary.skippedNoTool > 0 || summary.failed > 0
|
||||
};
|
||||
}
|
||||
|
||||
const settingsSubTabs: { key: SettingsSubTab; label: string }[] = [
|
||||
{ key: "allgemein", label: "Allgemein" },
|
||||
{ key: "accounts", label: "Accounts" },
|
||||
@@ -6594,9 +6612,12 @@ const PackageCard = memo(function PackageCard({ pkg, items, packageSpeed, stripe
|
||||
case "prio": return (
|
||||
<span key={col} className={`pkg-col pkg-col-prio${pkg.priority === "high" ? " prio-high" : pkg.priority === "low" ? " prio-low" : ""}`}>{pkg.priority === "high" ? "Hoch" : pkg.priority === "low" ? "Niedrig" : ""}</span>
|
||||
);
|
||||
case "status": return (
|
||||
<span key={col} className="pkg-col pkg-col-status">[{done}/{total}{done === total && total > 0 ? " - Done" : ""}{failed > 0 ? ` | ${failed} Fehler` : ""}{cancelled > 0 ? ` | ${cancelled} abgebr.` : ""}]{pkg.postProcessLabel ? ` - ${pkg.postProcessLabel}` : ""}</span>
|
||||
);
|
||||
case "status": {
|
||||
const audioStrip = pkg.audioStripSummary ? formatAudioStripSummary(pkg.audioStripSummary) : null;
|
||||
return (
|
||||
<span key={col} className="pkg-col pkg-col-status">[{done}/{total}{done === total && total > 0 ? " - Done" : ""}{failed > 0 ? ` | ${failed} Fehler` : ""}{cancelled > 0 ? ` | ${cancelled} abgebr.` : ""}]{pkg.postProcessLabel ? ` - ${pkg.postProcessLabel}` : ""}{audioStrip ? <span className={`pkg-audio-strip${audioStrip.attention ? " pkg-audio-strip-warn" : ""}`} title={audioStrip.tooltip}>{` · ${audioStrip.text}`}</span> : null}</span>
|
||||
);
|
||||
}
|
||||
case "speed": return (
|
||||
<span key={col} className="pkg-col pkg-col-speed">{packageSpeed > 0 ? formatSpeedMbps(packageSpeed) : ""}</span>
|
||||
);
|
||||
|
||||
@@ -736,6 +736,14 @@ body,
|
||||
padding-right: 12px;
|
||||
}
|
||||
|
||||
.pkg-audio-strip {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.pkg-audio-strip-warn {
|
||||
color: var(--danger);
|
||||
}
|
||||
|
||||
.progress-size {
|
||||
display: block;
|
||||
position: relative;
|
||||
|
||||
Reference in New Issue
Block a user