yt-dlp downloads

This commit is contained in:
2026-02-20 05:28:26 +00:00
parent 2a7485add2
commit 8a637c7788
3 changed files with 110 additions and 0 deletions
+24
View File
@@ -690,6 +690,30 @@ router.post('/move', async (ctx) => {
return ctx.json({ ok: true, results });
});
// Download video via yt-dlp
router.post('/download-video', async (ctx) => {
const user = ctx.get('user');
const rootDir = getRootDir(user, ctx.req.query('root') ?? undefined);
const { url, path, audioOnly } = ctx.get('body') as { url: string; path: string; audioOnly?: boolean };
if (!url) throw errors.BAD_REQUEST('url is required');
if (!path) throw errors.BAD_REQUEST('path is required');
const absPath = resolveUserPath(rootDir, path);
const args = ['yt-dlp', '-o', '%(title)s.%(ext)s'];
if (audioOnly) args.push('-x', '--audio-format', 'mp3');
args.push(url);
const proc = Bun.spawn(args, { cwd: absPath, stdout: 'pipe', stderr: 'pipe' });
const exitCode = await proc.exited;
if (exitCode !== 0) {
const stderr = await new Response(proc.stderr).text();
throw errors.BAD_REQUEST(stderr.trim() || 'yt-dlp download failed');
}
return ctx.json({ ok: true });
});
// Git clone a repository into a directory
router.post('/git-clone', async (ctx) => {
const user = ctx.get('user');