請參考 1.Ubuntu 24.04 安裝 laravel 12 的過程記錄,完成Ubuntu 24.04 + Apache2 + PHP 8.4 + Mariadb + Laravel 12 的相關設定。
一、在 Ubuntu 24.04 安裝 yt-dlp:
由於Ubuntu 24.04 內建套件通常偏舊,建議用官方 binary。
1.指令如下:
sudo apt update
sudo apt install ffmpeg -y
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
2.測試是否安裝成功,指令:
yt-dlp --version
二、Laravel 設定
1.建立 YouTubeController.php
指令:php artisan make:controller YouTubeController
內容:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Illuminate\Support\Str;
class YouTubeController extends Controller
{
public function showForm()
{
return view('youtube.form');
}
public function download(Request $request){
$request->validate([
'url' => 'required|url'
]);
$url = $request->input('url');
// 產生安全檔名
$filename = Str::uuid() . '.mp4';
$filePath = storage_path('app/downloads/' . $filename);
try {
$process = new Process([
'/usr/local/bin/yt-dlp', // 改成你實際路徑
'-f', 'mp4',
'-o', $filePath,
$url
]);
$process->setTimeout(300); // 最多跑 5 分鐘
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
return response()->download($filePath)->deleteFileAfterSend(true);
} catch (\Exception $e) {
return back()->with('error', '下載影片失敗: ' . $e->getMessage());
}
}
}
2.建立 form.blade.php
路徑:resources/views/youtube/form.blade.php
內容:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>YouTube 影片下載</title>
</head>
<body>
<h1>下載 YouTube 影片</h1>
@if(session('error'))
<p style="color: red;">{{ session('error') }}</p>
@endif
<form action="{{ route('youtube.download') }}" method="POST">
@csrf
<label for="url">YouTube 影片網址:</label>
<input type="text" id="url" name="url" required>
<button type="submit">下載</button>
</form>
</body>
</html>
3.寫入 web.php
路徑:routes/web.php
內容:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\YouTubeController;
Route::get('/', function () {
return view('welcome');
});
Route::get('/youtube', [YouTubeController::class, 'showForm']);
Route::post('/youtube/download', [YouTubeController::class, 'download'])->name('youtube.download');
4.測試:http://Server IP/youtube