namespace Moonlight.Frontend; public static class Formatter { public static string FormatSize(long bytes, double conversionStep = 1024) { if (bytes == 0) return "0 B"; string[] units = ["B", "KB", "MB", "GB", "TB", "PB", "EB"]; var unitIndex = 0; double size = bytes; while (size >= conversionStep && unitIndex < units.Length - 1) { size /= conversionStep; unitIndex++; } var decimals = unitIndex == 0 ? 0 : 2; return $"{Math.Round(size, decimals)} {units[unitIndex]}"; } public static string FormatDuration(TimeSpan timeSpan) { var abs = timeSpan.Duration(); // Handle negative timespans if (abs.TotalSeconds < 1) return $"{abs.TotalMilliseconds:F0}ms"; if (abs.TotalMinutes < 1) return $"{abs.TotalSeconds:F1}s"; if (abs.TotalHours < 1) return $"{abs.Minutes}m {abs.Seconds}s"; if (abs.TotalDays < 1) return $"{abs.Hours}h {abs.Minutes}m"; if (abs.TotalDays < 365) return $"{abs.Days}d {abs.Hours}h"; var years = (int)(abs.TotalDays / 365); var days = abs.Days % 365; return days > 0 ? $"{years}y {days}d" : $"{years}y"; } }