4492eee054
The prior commit kept a pass-through `export { fmtBytes, fmtSpeed, fmtEta }` in
main/lib/formatters.ts purely so existing importers wouldn't have to change —
which re-exported fmtSpeed (zero importers, dead) and left download.ts re-
exporting fmtBytes/fmtEta with no consumer at all, undercutting the "one home"
goal.
Now the real consumers import from the canonical module directly:
- probe.ts and the download.test import from @shared/format.
- formatters.ts keeps only its internal `import { fmtBytes }` (for parseProgress)
and no longer re-exports.
- download.ts re-exports only parseProgress (its own function); the dead
fmtBytes/fmtEta re-export is removed.
No behavior change. typecheck + 248 tests + eslint + prettier green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
import type { DownloadProgress } from '@shared/ipc'
|
|
import { fmtBytes } from '@shared/format'
|
|
|
|
// yt-dlp progress-line parsing. Extracted from download.ts so it can be
|
|
// unit-tested without pulling in the electron import chain (L37). Byte/speed/ETA
|
|
// formatting lives in @shared/format — the one home for both sides of the IPC
|
|
// boundary; consumers import it directly.
|
|
|
|
function num(s?: string): number | undefined {
|
|
if (!s || s === 'NA') return undefined
|
|
const n = Number(s)
|
|
return Number.isFinite(n) ? n : undefined
|
|
}
|
|
|
|
export function parseProgress(rest: string): DownloadProgress | null {
|
|
const parts = rest.split('|')
|
|
if (parts.length < 6) return null
|
|
const [status, dl, total, totalEst, speed, eta] = parts
|
|
const downloaded = num(dl)
|
|
const totalBytes = num(total) ?? num(totalEst)
|
|
let progress = 0
|
|
if (totalBytes && downloaded != null) progress = Math.min(1, downloaded / totalBytes)
|
|
return {
|
|
status: status || 'downloading',
|
|
progress,
|
|
// Carry raw numbers across the IPC boundary; the renderer formats them for
|
|
// display AND aggregates them (combined speed / longest ETA) without having
|
|
// to re-parse a formatted string (H4).
|
|
speedBytesPerSec: num(speed),
|
|
etaSeconds: num(eta),
|
|
sizeLabel: totalBytes ? fmtBytes(totalBytes) : undefined,
|
|
// No (estimated) total → the % can never advance; flag it so the renderer
|
|
// shows an indeterminate bar rather than a stuck 0% (L137).
|
|
sizeUnknown: !totalBytes
|
|
}
|
|
}
|