Spaces:
Paused
Paused
File size: 2,631 Bytes
37ac66f 0f744ed 1897d91 0f744ed 1897d91 0f744ed 1897d91 0f744ed 1897d91 0f744ed 1897d91 0f744ed 37ac66f 0f744ed 37ac66f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | <?php
require_once __DIR__ . '/config.php';
ensure_dirs();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
fail_json('POST required', 405);
}
// βββ YouTube URL mode (async) βββ
$youtubeUrl = $_POST['youtube_url'] ?? '';
if ($youtubeUrl) {
if (!filter_var($youtubeUrl, FILTER_VALIDATE_URL)) {
fail_json('Invalid URL');
}
if (!preg_match('/(youtube\.com|youtu\.be)/', $youtubeUrl)) {
fail_json('Only YouTube URLs supported');
}
$id = safe_id();
$uploadPath = UPLOAD_DIR . "/$id.mp4";
$job = [
'id' => $id,
'original_name' => 'youtube_video',
'upload_path' => $uploadPath,
'extension' => 'mp4',
'status' => 'downloading',
'created_at' => time(),
'source_video_exposed' => false,
'youtube_url' => $youtubeUrl
];
write_json_file(RECEIPT_DIR . "/$id.job.json", $job);
// Fork background download
$logFile = RECEIPT_DIR . "/$id.download.log";
$cmd = sprintf(
'nohup bash -c %s > %s 2>&1 &',
shell_arg(sprintf(
'cd /app && yt-dlp -f "best[ext=mp4]/best" -o %s %s 2>&1 && ' .
'TITLE=$(yt-dlp --get-title %s 2>/dev/null) && ' .
'echo "DONE|$TITLE" >> %s',
shell_arg($uploadPath),
shell_arg($youtubeUrl),
shell_arg($youtubeUrl),
shell_arg($logFile)
)),
shell_arg($logFile)
);
exec($cmd);
json_response([
'ok' => true,
'id' => $id,
'job' => $job,
'status_url' => "/api/status.php?id=$id"
]);
}
// βββ File upload mode βββ
if (!isset($_FILES['video'])) {
fail_json('No video uploaded or YouTube URL provided');
}
$file = $_FILES['video'];
if ($file['error'] !== UPLOAD_ERR_OK) {
fail_json('Upload failed', 400, ['upload_error' => $file['error']]);
}
$original = basename($file['name']);
$ext = strtolower(pathinfo($original, PATHINFO_EXTENSION));
$allowed = ['mp4', 'mov', 'm4v', 'webm', 'mkv'];
if (!in_array($ext, $allowed, true)) {
fail_json('Unsupported video type', 400, ['extension' => $ext]);
}
$id = safe_id();
$uploadPath = UPLOAD_DIR . "/$id.$ext";
if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
fail_json('Could not save upload');
}
$job = [
'id' => $id,
'original_name' => $original,
'upload_path' => $uploadPath,
'extension' => $ext,
'status' => 'uploaded',
'created_at' => time(),
'source_video_exposed' => false
];
write_json_file(RECEIPT_DIR . "/$id.job.json", $job);
json_response([
'ok' => true,
'id' => $id,
'job' => $job
]);
|