- yt-dlp là công cụ tải xuống dòng lệnh có thể tải audio·video từ hàng nghìn website, là phiên bản fork của youtube-dl
- Để giải mã n/sig của YouTube, cần runtime JavaScript bên ngoài (ví dụ: Deno, Node.js, Bun, QuickJS) cùng với mô-đun yt-dlp-ejs mới được bổ sung
- Deno được đặt làm runtime mặc định, và người dùng có thể chỉ định runtime khác bằng tùy chọn
--js-runtimes
- Với thay đổi này, để sử dụng đầy đủ các tính năng liên quan đến YouTube thì bắt buộc phải cài yt-dlp-ejs và runtime JS
- Việc bổ sung phụ thuộc vào runtime bên ngoài là biện pháp bắt buộc để ứng phó với những thay đổi trong cấu trúc mã hóa của YouTube, và sẽ đóng vai trò là yếu tố cốt lõi trong bảo trì về sau
Tổng quan về yt-dlp
- yt-dlp là một nhánh fork của youtube-dl, được phát triển dựa trên youtube-dlc hiện không còn được bảo trì
- Công cụ này có thể tải audio và video từ hàng nghìn website, đồng thời hỗ trợ nhiều tính năng như chọn định dạng·hậu xử lý·phụ đề·plugin
Thay đổi liên quan đến hỗ trợ YouTube
- Cần gói yt-dlp-ejs để giải mã giá trị n/sig của YouTube
- Gói này được phát hành theo Unlicense, và bao gồm các thành phần giấy phép MIT và ISC
- Để chạy yt-dlp-ejs thì runtime JavaScript là bắt buộc
- Các runtime được hỗ trợ: deno (khuyến nghị), node.js, bun, QuickJS
- Có thể chỉ định cấu hình liên quan bằng tùy chọn
--js-runtimes
- Có thể dùng tùy chọn
--no-js-runtimes để khởi tạo lại cấu hình runtime mặc định
Cài đặt và phụ thuộc
- yt-dlp hỗ trợ Python 3.10+ (CPython) và 3.11+ (PyPy)
- Các phụ thuộc được khuyến nghị mạnh mẽ:
- ffmpeg / ffprobe: dùng để ghép audio·video và hậu xử lý
- yt-dlp-ejs: dùng để gỡ mã hóa YouTube
- runtime JavaScript: dùng để chạy yt-dlp-ejs
- Các phụ thuộc mạng tùy chọn gồm certifi, brotli, requests, curl_cffi v.v.
Các tùy chọn lệnh chính
--js-runtimes RUNTIME[:PATH]: chỉ định runtime JS sẽ sử dụng
--no-js-runtimes: vô hiệu hóa mọi runtime JS
--remote-components COMPONENT: tùy chọn cho phép các thành phần JS bên ngoài
--no-remote-components: chặn tải các thành phần từ xa
Tầm quan trọng
- Với thay đổi này, yt-dlp nay bắt buộc phải yêu cầu runtime JS bên ngoài để hỗ trợ đầy đủ cấu trúc mã hóa mới nhất của YouTube
- Đây là một bước chuyển đổi mang tính cấu trúc để ứng phó với các bản cập nhật bảo mật·mã hóa liên tục của YouTube, đồng thời là thay đổi then chốt cho việc bảo trì và mở rộng tính năng trong tương lai
2 bình luận
Wow... chặn được như vậy cũng thật ghê, mà vượt qua được như thế cũng thật ghê. Không biết họ phân tích và vượt qua bằng cách nào nhỉ
Ý kiến trên Hacker News
Đã có sẵn trong repo Arch nên chạy được ngay
Chỉ cần thêm cờ vào lệnh
yt-dlp --cookies-from-browser firefox --remote-components ejs:github ...Khi chạy, solver sẽ được tải về lúc runtime và chỉ mất khoảng 0,5 giây. Cảm giác tốc độ bắt đầu tải nhanh hơn hẳn
Tuy vậy, nếu chạy trong môi trường bị hạn chế thì sẽ tốt hơn nếu có thể tải trước solver bằng một lệnh riêng. Hiện tại cũng đã ổn, nhưng nếu có tự động hóa đóng gói thì sẽ tiện hơn nữa
Nếu lo về bảo mật thì miễn là dùng Deno, sandbox vẫn được xử lý khá tốt
Nếu là hệ điều hành không hỗ trợ Deno hay Node thì cũng có thể cân nhắc QuickJS viết bằng C. Nó chậm hơn nhưng chạy được gần như mọi nơi
Chỉ là trong trường hợp đó sẽ mất sandboxing. Dù vậy, nếu là mã được cung cấp từ các domain YouTube chính thức thì tôi vẫn nghĩ là có thể tin tưởng được
/home/username/.cache) là đượcHoặc có thể thử tự động hóa đóng gói bằng
make yt-dlp-extraGần đây YouTube bắt đầu ép header referrer cho video nhúng
Nếu truy cập trực tiếp
youtube.com/embed/<videoid>thì sẽ báo lỗi, và trong FAQ cũng ghi rõ đây là chính sách có chủ đíchTheo tài liệu chính thức, bên nhúng phải cung cấp HTTP Referer, nếu không sẽ hiện màn hình “error 153”
Khi QuickTime ra mắt năm 1991, tôi từng nghĩ chuyện video có thể sao chép, dán và lưu lại là điều hiển nhiên
Giờ thì ngay cả video không có DRM mà trải nghiệm người dùng cũng tệ đến mức khó tin
Giờ chỉ cần trình phát mặc định của OS hoặc VLC là giải quyết được hầu hết
Từ năm 2010 đến nay tôi đã dùng yt-dlp (kể cả thời còn là youtube-dl) để lưu trữ toàn bộ video tôi đã thích
Giờ tôi đã lưu hàng chục nghìn video, và trong số đó có không ít cái đã biến mất khỏi trang
Tôi cũng lưu cả những video chỉ được công khai trong thời gian ngắn như highlight sumo của NHK
Giữa cuộc đối đầu không hồi kết giữa chặn quảng cáo và chèn quảng cáo, tôi còn nghĩ có khi AGI/ASI cuối cùng sẽ xuất hiện từ đó.
Cả hai phía rồi cũng sẽ dùng LLM, còn con người ở giữa thì bị móc túi và hút cạn sự chú ý
10 năm nữa có khi YouTube sẽ hoàn toàn không thể truy cập qua trình duyệt
Khi thế hệ quen với app trên tablet trở thành chủ đạo, có lẽ Google sẽ đủ tự tin để bỏ web
Trong issue #14404 của yt-dlp từng có đề xuất dùng Selenium hoặc trình duyệt headless, nhưng
đội ngũ bảo trì đã trả lời rằng “đó là tuyên bố đầu hàng và đi ngược lại tinh thần của dự án”
Scraping thật sự là công việc cực nhọc. API thường xuyên hỏng, mà còn phải duy trì trong tình trạng bên cung cấp ghét mình, đúng là rất đáng nể
Có thể cảm nhận được YouTube ngày càng tỏ ra mang tính đối đầu với người dùng
Chặn trình chặn quảng cáo, thu thập nội dung để huấn luyện AI, giới hạn API... như thể đang tận dụng việc không có cạnh tranh
Họ rất nhạy với sự hài lòng của nhà quảng cáo, nhưng lại xem người dùng hay nhà sáng tạo như đồ tiêu hao
Việc khởi đầu miễn phí để triệt đối thủ rồi tạo ra cấu trúc độc quyền là một kiểu chiến lược nhử mồi.
Giờ cần có lựa chọn thay thế mới. Nếu là dịch vụ trả phí nhưng minh bạch thì cũng tốt
Theo wiki EJS của yt-dlp, lý do Deno được khuyến nghị là
nó cho phép thực thi mã với quyền bị hạn chế và có thể nhận từ xa các dependency EJS từ npm
nên an toàn hơn là dùng cô lập ở mức OS/VM như Firecracker