UI Next.js để nhập URL, lấy metadata/định dạng từ API yt-dlp và stream tải xuống. Tập trung trải nghiệm đơn giản, có reCAPTCHA và hỗ trợ theme.
- Form dán URL, gọi API
/video/formatsđể lấy metadata + danh sách định dạng, hiển thị preview và filter theo loại stream (all/audio/video/audio+video). - Tải xuống bằng
/video/downloadqua rewrite/api/**đến backend (config trongnext.config.ts), tự kèm tiêu đề và format đã chọn. - reCAPTCHA (client) bắt buộc trước khi tải, toast thông báo thành công/thất bại.
- Dark/light mode với
next-themes, phông chữ Chewy, giao diện Tailwind + Radix UI. - Fancybox xem ảnh thumbnail, progress giả lập khi đang tải để giữ tương tác người dùng.
src/
app/ # layout, page chính
components/ # search form, info media, danh sách format, UI nhỏ
hooks/ # useFancybox
lib/ # axios helper, utils
types/ # định nghĩa ListFormats/FormatOption
public/images/ # ảnh fallback cho thumbnail
next.config.ts # cấu hình images + rewrites tới backend
- Node.js 18+.
- Backend API đang chạy và truy cập được (điểm vào
/video/formats,/video/download). - reCAPTCHA site key (client).
Sao chép file mẫu và điền giá trị:
cp .env.local.exmaple .env.localNEXT_PUBLIC_URL: URL gốc của backend (ví dụ https://api.example.com). Được dùng chorewritestrong Next để proxy/api/*sang backend.NEXT_PUBLIC_RECAPTCHA_KEY: reCAPTCHA site key dùng trên client.RECAPCHAR_SECRET: Secret key (hiện chỉ khai báo, chưa dùng trong mã).
Lưu ý: file mẫu tên
.env.local.exmaple(có typo “exmaple”), giữ nguyên hoặc đổi nếu muốn.
npm install
npm run dev # dev + TurbopackỨng dụng chạy tại http://localhost:3000.
npm run build
npm start- Người dùng dán URL →
listFormatsgọi/api/formats?url=...(rewrite sang backend). - Hiển thị tiêu đề/uploader/duration, thumbnail (Fancybox). Filter danh sách theo loại stream.
- Người dùng chọn format, vượt qua reCAPTCHA →
downloaded()chuyển hướng đến/api/download?...(backend stream file). - Toast hiển thị trạng thái; progress thanh giả lập cho cảm giác phản hồi.
- Rewrites cho
/api/:path*đặt trongnext.config.ts; cầnNEXT_PUBLIC_URLhợp lệ. - Nếu backend yêu cầu CORS, đảm bảo đã bật (backend Nest có CORS bật sẵn).
images.remotePatternsmở cho mọi host, đủ để hiển thị thumbnail từ CDN/yt.
MIT (xem LICENSE nếu có). If missing, hãy thêm để rõ ràng khi phân phối.