/** * Duration formatting utilities. * * Durations are milliseconds — the app's neutral time unit. The backend has * already converted any provider unit (e.g. Jellyfin ticks) before it reaches * the frontend, so no tick arithmetic lives here. */ /** * Convert a millisecond duration to a formatted string. * @param ms Duration in milliseconds * @param format Format type: "mm:ss" (default) or "hh:mm:ss" * @returns Formatted duration string or empty string if no duration */ export function formatDuration(ms?: number | null, format: "mm:ss" | "hh:mm:ss" = "mm:ss"): string { if (!ms) return ""; const totalSeconds = Math.floor(ms / 1000); if (format === "hh:mm:ss") { const hours = Math.floor(totalSeconds / 3600); const minutes = Math.floor((totalSeconds % 3600) / 60); const seconds = totalSeconds % 60; return `${hours}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; } // Default "mm:ss" format const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; return `${minutes}:${seconds.toString().padStart(2, "0")}`; } /** * Convert seconds to formatted duration string * @param seconds Duration in seconds * @param format Format type: "mm:ss" (default) or "hh:mm:ss" * @returns Formatted duration string */ export function formatSecondsDuration(seconds: number, format: "mm:ss" | "hh:mm:ss" = "mm:ss"): string { if (format === "hh:mm:ss") { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`; } // Default "mm:ss" format const minutes = Math.floor(seconds / 60); const secs = seconds % 60; return `${minutes}:${secs.toString().padStart(2, "0")}`; }