Options (quality, subtitles) are now derived from a yt-dlp -J probe of the submitted URL instead of a static list, so users can't pick combinations the source video doesn't actually support. Submission is blocked until the probe succeeds. - New /api/probe endpoint + src/lib/ytdlp-probe.ts, with its own rate limiter (rate-limit.ts refactored into a createRateLimiter factory). - New options: subtitle language selection, clip start/end trim, MP3 audio quality. - Fixed buildYtdlpArgs: format=mp3 never triggered audio extraction (-x/--audio-format), and quality=best never applied --merge-output-format, so the chosen container had no real effect. - Cross-platform yt-dlp invocation: the bundled bin/yt-dlp is a Python zipapp relying on a shebang, which Windows' spawn() can't run directly. buildYtdlpCommand() runs it through `python` on Windows and execs it directly on Linux/o2switch, where the shebang works natively. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
15 lines
419 B
TypeScript
15 lines
419 B
TypeScript
import path from 'path'
|
|
|
|
export const config = {
|
|
DOWNLOAD_LINK_TTL_HOURS: 24,
|
|
WORKER_CONCURRENCY: 3,
|
|
WORKER_POLL_INTERVAL_MS: 10_000,
|
|
STORAGE_PATH: process.env.STORAGE_PATH ?? '',
|
|
RATE_LIMIT_MAX: 5,
|
|
RATE_LIMIT_WINDOW_MS: 3_600_000,
|
|
PROBE_RATE_LIMIT_MAX: 20,
|
|
PROBE_RATE_LIMIT_WINDOW_MS: 3_600_000,
|
|
PROBE_TIMEOUT_MS: 20_000,
|
|
BIN_DIR: process.env.BIN_DIR ?? path.join(process.cwd(), 'bin'),
|
|
} as const
|