Cách lưu video YouTube thành kho cá nhân có phụ đề và metadata
Lưu một video rồi quên nó nằm ở đâu là chuyện xảy ra khá thường xuyên. Sau vài tháng, thư mục tải xuống có thể đầy những tên file khó đọc, vài bản trùng nhau, một video không còn phụ đề và chẳng ai nhớ nó lấy từ đâu. Nếu bạn muốn giữ video lâu hơn một lần xem, cách làm nên giống một kho lưu trữ nhỏ: có file media, thông tin đi kèm và quy tắc để lần sau chạy lại mà không tải trùng.
Bài này dựa trên hướng dẫn yt-dlp cheat sheet của Ditig, đã được cập nhật ngày 27/10/2025. Mình viết lại theo nhu cầu lưu video cá nhân, không khuyến khích tải nội dung bạn không có quyền sử dụng.
Đừng chỉ giữ một file MP4
yt-dlp là công cụ dòng lệnh có thể lấy video và âm thanh từ nhiều website. Khi cần ghép luồng video riêng với luồng âm thanh riêng, công cụ này dùng FFmpeg. Nếu chỉ gõ lệnh cơ bản, bạn thường nhận được bản video tốt nhất mà công cụ tìm thấy, nhưng chưa chắc có phụ đề, ảnh thumbnail, mô tả hay dữ liệu giúp tìm lại sau này.
Một gói lưu trữ thực tế nên gồm ít nhất bốn phần:
- Video hoặc audio chính để xem lại.
- Phụ đề, nếu video có phụ đề thủ công hoặc phụ đề tự động.
- Thumbnail và mô tả, giúp nhận diện nội dung khi duyệt thư mục.
- Metadata như tiêu đề, ngày đăng, mã video và kênh tải lên.
Hãy hình dung bạn lưu một video dài 45 phút có sáu chương. File video giữ hình và tiếng; phụ đề giúp tìm từ khóa; thumbnail giúp nhìn ra video giữa hàng trăm file; còn metadata giữ lại ngữ cảnh. Thiếu một trong các phần đó, kho của bạn vẫn dùng được, nhưng việc tìm lại sẽ khó hơn.
Trước khi tải hàng loạt, bạn có thể xem các định dạng bằng lệnh sau:
yt-dlp -F "URL_VIDEO"
Nếu cần chọn luồng hình và tiếng tốt nhất, dùng:
yt-dlp -f "bv*+ba" "URL_VIDEO"
Ký hiệu bv là video tốt nhất, còn ba là audio tốt nhất. Khi hai luồng tách riêng, FFmpeg sẽ ghép chúng. Nếu mục tiêu là thiết bị dễ phát, bạn có thể ưu tiên MP4 bằng bộ lọc phù hợp, nhưng đừng mặc định rằng MP4 luôn nét hơn. Container chỉ là cái hộp; chất lượng còn phụ thuộc codec, độ phân giải và bitrate.
Mẫu lệnh cho một video có tổ chức
Với một video bạn muốn giữ lâu, mình sẽ bắt đầu bằng mẫu lệnh đơn giản sau:
yt-dlp \
--write-subs --write-auto-subs \
--write-description --write-info-json \
--write-thumbnail \
--embed-metadata --embed-thumbnail \
-o "%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
"URL_VIDEO"
--write-subs lưu phụ đề có sẵn, còn --write-auto-subs lấy thêm phụ đề tự động nếu nền tảng cung cấp. Bạn có thể giới hạn ngôn ngữ, chẳng hạn --sub-langs en,vi, sau khi kiểm tra danh sách bằng:
yt-dlp --list-subs "URL_VIDEO"
--write-description tạo file mô tả riêng; --write-info-json tạo sidecar JSON chứa nhiều trường metadata. Tệp JSON này có thể chứa thông tin cá nhân hoặc dữ liệu bạn không muốn chia sẻ, nên hãy xem lại trước khi đưa cả thư mục lên nơi công cộng. --write-thumbnail giữ ảnh đại diện, còn hai tùy chọn embed đưa metadata và thumbnail vào file media khi định dạng hỗ trợ.
Ví dụ, video đăng ngày 2024-03-09 có mã abc123 có thể được đặt tên gần giống 2024-03-09 - Cách sửa lỗi mạng [abc123].mkv. Ngày giúp sắp xếp theo thời gian, tiêu đề giúp đọc bằng mắt, còn mã video giúp phân biệt hai video trùng tên. Nếu tiêu đề chứa ký tự gây lỗi trên Windows, dùng tùy chọn tên file tương thích hoặc rút gọn template.
Playlist và kênh: chống tải trùng ngay từ đầu
Playlist lớn không nên tải lại toàn bộ mỗi lần có video mới. Hãy dùng một file archive để yt-dlp ghi lại mã những video đã xử lý:
yt-dlp \
--download-archive archive.txt \
--no-overwrites \
-o "%(playlist_index)s - %(title)s [%(id)s].%(ext)s" \
"PLAYLIST_URL"
Lần chạy đầu tải các mục hiện có và ghi ID vào archive.txt. Lần chạy sau, yt-dlp bỏ qua ID đã nằm trong danh sách. Ví dụ playlist có 120 video, lần đầu ghi 120 ID; sau đó thêm 3 video mới, lần chạy tiếp theo chỉ xử lý 3 mục chưa có trong archive. Cách này giảm thời gian, băng thông và nguy cơ tạo bản sao.
Nếu bạn có nhiều liên kết riêng lẻ, đặt mỗi URL trên một dòng trong urls.txt rồi chạy:
yt-dlp -a urls.txt
Với Shorts hoặc clip có thể bị nhận nhầm là một phần của playlist, thêm --no-playlist. Còn nếu tải livestream HLS và lo file hỏng khi kết nối bị ngắt, nguồn Ditig gợi ý --hls-use-mpegts. Hãy thử trên một video nhỏ trước khi áp dụng cho cả kênh.
Phụ đề, chương và audio cần xử lý thế nào?
Phụ đề có hai cách lưu: để thành file cạnh video hoặc nhúng vào container. File riêng như SRT dễ mở, sửa và lập chỉ mục. Nhúng vào video thì thư viện gọn hơn khi xem bằng trình phát hỗ trợ track phụ đề. Bạn có thể chuyển định dạng sang SRT bằng:
yt-dlp --write-subs --convert-subs srt "URL_VIDEO"
Nếu video có chapter, lệnh dưới đây tách mỗi chương thành một file:
yt-dlp --split-chapters \
-o "%(title)s - %(chapter)s.%(ext)s" \
"URL_VIDEO"
Ví dụ một video có các chương “Mở đầu”, “Cài đặt” và “Xử lý lỗi” sẽ tạo ba file theo tên chương. Đây là cách tiện khi bạn chỉ muốn đưa một phần vào trình chỉnh sửa, nhưng nó cũng làm tăng số file. Với video cần giữ nguyên, chỉ dùng --embed-chapters để đặt mốc chương trong file thay vì tách file.
Muốn lấy riêng âm thanh và chuyển thành MP3, dùng:
yt-dlp -x --audio-format mp3 "URL_VIDEO"
Thao tác này cần FFmpeg và có thể chuyển mã, nên chất lượng không nên đánh giá chỉ qua đuôi MP3. Nếu muốn giữ nguyên định dạng audio tốt nhất mà không mã hóa lại, nguồn có nêu tùy chọn --audio-format best --no-keep-video. Trước khi xóa video gốc, hãy mở file audio thử một đoạn.
Quy trình kiểm tra sau khi tải
Một lệnh chạy xong chưa có nghĩa là bản lưu đã ổn. Mình thường kiểm tra theo thứ tự này:
- Mở video từ đầu, tua đến giữa và gần cuối để phát hiện file bị cụt.
- Kiểm tra tiếng trái phải, phụ đề và các mốc chapter nếu đã nhúng.
- Đối chiếu tên file với tiêu đề, ngày đăng và ID trong JSON.
- Xem thư mục có file tạm, bản trùng hoặc thumbnail bị tải thiếu không.
- Sao lưu sang ổ khác trước khi xóa file tạm.
Nếu mạng chập chờn, yt-dlp thường có thể tiếp tục khi máy chủ hỗ trợ byte range. Đừng dùng --no-part một cách máy móc trong các lượt tải lớn: tùy chọn này tắt file tạm và tắt khả năng tiếp tục theo mẫu lệnh của nguồn. Khi cần tìm lỗi, chạy --verbose để xem log chi tiết. Với lỗi chứng chỉ, tùy chọn --no-check-certificate làm giảm an toàn và chỉ nên xem là cách xử lý bất đắc dĩ, không phải thiết lập mặc định.
Nếu bạn chỉ cần tải nhanh một video để xem lại, có thể dùng công cụ tải video YouTube. Còn với playlist hoặc kho dài hạn, hãy giữ file archive và metadata ở cùng một thư mục quản lý riêng. Khi lưu nhiều nền tảng, bạn cũng có thể tham khảo trang tải video đa nền tảng, nhưng vẫn nên kiểm tra quyền sử dụng và file đầu ra trước khi chia sẻ.
Câu hỏi thường gặp
yt-dlp có tải được video riêng tư không?
Có thể cần cookie hợp lệ, chẳng hạn file cookie truyền bằng --cookies hoặc cookie từ trình duyệt. Chỉ dùng cách này cho tài khoản và nội dung bạn được phép truy cập; không gửi file cookie cho người khác.
Có bắt buộc phải cài FFmpeg không?
FFmpeg cần cho việc ghép video với audio, trích xuất audio, chuyển mã và một số thao tác hậu kỳ. Nếu chỉ tải một luồng đã ghép sẵn, nhu cầu có thể ít hơn, nhưng cài sẵn sẽ tránh nhiều lỗi khó hiểu.
Nên lưu JSON cạnh video hay chỉ nhúng metadata?
Nên giữ JSON cạnh video nếu bạn quan tâm đến việc tìm kiếm, phân tích hoặc đối chiếu sau này. Metadata nhúng thuận tiện khi mở bằng trình phát, còn sidecar JSON giữ được nhiều trường hơn và dễ sao lưu độc lập.
Kết luận
Kho video bền hơn khi bạn lưu cả nội dung lẫn ngữ cảnh: tên có ngày và ID, phụ đề, thumbnail, mô tả, metadata và danh sách đã tải. Hãy thử quy trình trên với một playlist nhỏ, mở lại từng file và xem archive có ghi đúng không. Khi mọi thứ ổn, bạn mới mở rộng sang kênh lớn. Và trước khi tải hoặc chia sẻ, hãy kiểm tra quyền bản quyền của video thay vì coi mọi nội dung công khai là tự do sử dụng.
Nếu bạn đang dọn lại thư viện, bắt đầu bằng một thư mục thử nghiệm và một file archive.txt nhỏ. Cách này dễ sửa hơn nhiều so với việc để hàng nghìn file lẫn lộn rồi mới tìm cách cứu.
