1376c2dee8
Audit-pass over CODE-AUDIT.md (~48 items closed this pass; all verified — typecheck + 234 tests + eslint + prettier green). Correctness / bugs: - B3: match the release checksum to the asset's filename line (no wrong-hash verify) - B4: newline-safe metadata probe (one --print with a unit-separator delimiter) - B5 / L88: guard the meta event against canceled items; progress no longer promotes a queued item outside pump() - B7: cookie-login promise always resolves (handles destroy-without-close) - L146: trim parser rejects >2 colon-group times; M36: Library selection counts only actionable rows - L11 / L50 / L156 / L57 / L159 / L15 / L3: live queue count, empty-cookie message, schedule picker min, dead-code/comment cleanup Type safety: - Enable noUncheckedIndexedAccess + noFallthroughCasesInSwitch (15 real edge cases fixed) Resilience / Windows / metadata: - R5: settings write failure handled (no unhandled IPC rejection; reconciles to truth) - W1 / W5 / W6: min window size, seeded folder picker, parented sign-in window; L147 dead macOS branches removed - CL1: shared stdout markers; package/builder metadata (license, homepage, repository, copyright, tsbuildinfo glob) Copy / docs / tests: - M37 / SR9 dev-jargon cleanup in hints; M8 / M25 / M26 / L66 / L80 / L81 reconciled - New unit tests for L35 (isValidMediaItem) and L36 (compareVersions) This commit also checkpoints the previously-uncommitted feat/tray-background-clipboard work it builds on: background running + auto-download, library clipboard detection, tray, binary management & library scale, credential encryption at rest, the shared jsonStore and ui/ primitives, and the eslint/prettier tooling. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
import { execFile } from 'child_process'
|
|
import { existsSync } from 'fs'
|
|
import { getFfmpegPath, getFfprobePath } from './binaries'
|
|
import type { FfmpegVersionResult } from '@shared/ipc'
|
|
|
|
/**
|
|
* Read the version token from an ffmpeg/ffprobe binary. Both print a first line
|
|
* of the form "<tool> version <VERSION> Copyright ..." (e.g.
|
|
* "ffmpeg version 6.1.1-full_build-www.gyan.dev Copyright ..."), so we return the
|
|
* token after "version". Resolves null if the binary is absent, errors, times
|
|
* out, or the line doesn't parse — Settings then shows "not found" instead of
|
|
* failing. Unlike yt-dlp these are never self-updated, so there's no update path.
|
|
*/
|
|
function readToolVersion(path: string): Promise<string | null> {
|
|
if (!existsSync(path)) return Promise.resolve(null)
|
|
return new Promise((resolve) => {
|
|
execFile(path, ['-version'], { windowsHide: true, timeout: 15_000 }, (err, stdout) => {
|
|
if (err) {
|
|
resolve(null)
|
|
return
|
|
}
|
|
const firstLine = stdout.split('\n', 1)[0] ?? ''
|
|
const m = firstLine.match(/version\s+(\S+)/i)
|
|
resolve(m?.[1] ?? null)
|
|
})
|
|
})
|
|
}
|
|
|
|
/** Versions of the bundled ffmpeg + ffprobe, read in parallel for the Settings panel. */
|
|
export async function getFfmpegVersions(): Promise<FfmpegVersionResult> {
|
|
const [ffmpeg, ffprobe] = await Promise.all([
|
|
readToolVersion(getFfmpegPath()),
|
|
readToolVersion(getFfprobePath())
|
|
])
|
|
return { ffmpeg, ffprobe }
|
|
}
|