&1'; $output = []; $code = 0; exec($cmd, $output, $code); $receiptPath = "$outDir/receipt.json"; $receipt = read_json_file($receiptPath); // Inject videoId and videoName into receipt if ($receipt) { $receipt['videoId'] = $id; $receipt['videoName'] = $job['original_name']; write_json_file($receiptPath, $receipt); } $job['status'] = $code === 0 ? 'extracted' : 'extract_failed'; $job['extract_exit_code'] = $code; $job['extract_log'] = implode("\n", array_slice($output, -80)); $job['receipt_path'] = $receiptPath; $job['updated_at'] = time(); write_json_file($jobPath, $job); if ($code !== 0 || !$receipt) { fail_json('Extraction failed', 500, [ 'exit_code' => $code, 'log' => $job['extract_log'] ]); } json_response([ 'ok' => true, 'id' => $id, 'receipt' => $receipt, 'log' => $job['extract_log'] ]);