/** Bytes so, wie ein Mensch sie liest. 1024er-Stufen, weil der Rest der * Werkzeugkette (du, ls, Explorer) das auch tut. */ export function bytes(n: number): string { if (n < 1024) return `${n} B` const stufen = ['KB', 'MB', 'GB', 'TB'] let wert = n / 1024 let i = 0 while (wert >= 1024 && i < stufen.length - 1) { wert /= 1024 i++ } return `${wert.toFixed(wert < 10 ? 1 : 0)} ${stufen[i]}` } /** Zeitstempel des Dienstes sind Millisekunden aus Date.now(). */ export function zeit(ms: number | null): string { if (!ms) return '—' return new Date(ms).toLocaleString('de-DE', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }) } export const istBild = (mime: string) => mime.startsWith('image/') /** Sekunden als 1:07 oder 1:02:03. * * Stunden nur, wenn es welche gibt: "0:01:07" auf einer Kachel ist drei * Zeichen Laerm fuer eine Auskunft, die niemand gestellt hat. */ export function dauerText(sekunden: number): string { const ganz = Math.round(sekunden) const s = ganz % 60 const m = Math.floor(ganz / 60) % 60 const h = Math.floor(ganz / 3600) const zwei = (n: number) => String(n).padStart(2, '0') return h > 0 ? `${h}:${zwei(m)}:${zwei(s)}` : `${m}:${zwei(s)}` }