18e1d9a24d
A live smoke test of buildArgs' argv against the bundled yt-dlp + ffmpeg found that ffprobe.exe was never bundled (resources/bin/ shipped only ffmpeg.exe). yt-dlp resolves both from --ffmpeg-location, so duration-aware post-processing failed at runtime for every user with "ffprobe not found": --sponsorblock-remove, --force-keyframes-at-cuts, and --split-chapters (CODE-AUDIT C1). - Bundle ffprobe.exe (matching n8.1.2 LGPL build, sha256-verified against the already-bundled ffmpeg.exe) and document it in resources/bin/README.md as a required binary; correct the stale "not committed to git" note. - Guard startDownload against a missing ffmpeg.exe/ffprobe.exe up front so the failure is a clear AeroFetch error, not a cryptic yt-dlp postprocessing one (new getFfprobePath() in binaries.ts). - Expand test/real-download.integration.test.ts from 2 to 8 live cases: crop, sponsorblock-remove, audio opus re-encode, mkv+vp9 merge, subtitle+chapter embed, restrict-filenames, download-archive skip, and Phase C extra-args. All 8 pass against live yt-dlp + ffmpeg. - ROADMAP: mark the Phase A/B/C smoke-test caveats done. CODE-AUDIT: add C1. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import { app } from 'electron'
|
|
import { join } from 'path'
|
|
import { is } from '@electron-toolkit/utils'
|
|
|
|
/**
|
|
* Resolves the directory holding the bundled binaries (yt-dlp.exe, ffmpeg.exe).
|
|
*
|
|
* In dev they live in the repo at resources/bin/.
|
|
* In a packaged build, electron-builder's extraResources copies them to
|
|
* <resources>/bin (see electron-builder.yml), reachable via process.resourcesPath.
|
|
*/
|
|
export function getBinDir(): string {
|
|
return is.dev ? join(app.getAppPath(), 'resources', 'bin') : join(process.resourcesPath, 'bin')
|
|
}
|
|
|
|
export function getYtdlpPath(): string {
|
|
return join(getBinDir(), 'yt-dlp.exe')
|
|
}
|
|
|
|
export function getFfmpegPath(): string {
|
|
return join(getBinDir(), 'ffmpeg.exe')
|
|
}
|
|
|
|
/**
|
|
* yt-dlp finds ffprobe via --ffmpeg-location (the bin dir), so the app never
|
|
* spawns it directly — but it must be present, or duration-aware post-processing
|
|
* (SponsorBlock-remove, --force-keyframes-at-cuts, --split-chapters) fails. This
|
|
* accessor exists so startDownload can assert its presence up front.
|
|
*/
|
|
export function getFfprobePath(): string {
|
|
return join(getBinDir(), 'ffprobe.exe')
|
|
}
|
|
|
|
/** Optional bundled external downloader; absent unless dropped into resources/bin. */
|
|
export function getAria2cPath(): string {
|
|
return join(getBinDir(), 'aria2c.exe')
|
|
}
|