Chuyển đến nội dung chính
Giảm 50% tất cả các gói, có thời hạn. Khởi điểm từ $2.48/mo
11 min left
Gaming và Media

Chạy yt-dlp trên VPS để lưu trữ cá nhân không cần giao diện

S Bởi Sajjad 11 phút đọc
yt-dlp running headless on a VPS, feeding scheduled downloads into an organized video library that a media server can scan

Chạy yt-dlp trên VPS cho những lượt tải dài một cỗ máy vẫn online sau khi bạn gập laptop lại. Nó cũng tạo ra đường đi gọn gàng từ một lượt kéo kênh theo lịch tới thư viện media mà Jellyfin có thể quét.

Máy chủ thay đổi ba phần của quy trình: việc cài đặt cần các phụ thuộc YouTube hiện hành, video yêu cầu tài khoản cần một cách chuyển cookie an toàn, và tự động hóa cần nhịp gửi yêu cầu có chủ đích. Thiết lập bên dưới xử lý cả ba mà không mặc định rằng mọi lượt tải đều cần cookie, giao diện web hay một nhà cung cấp PO Token.

Tóm tắt nhanh

  • Cài yt-dlp trong một môi trường ảo Python cùng ffmpeg, ffprobe, yt-dlp-ejs và một runtime JavaScript được hỗ trợ. Deno là runtime mà dự án đang khuyến nghị.
  • Hãy bắt đầu mà không dùng cookie tài khoản. Chỉ thêm chúng cho playlist riêng tư, video giới hạn độ tuổi, nội dung dành riêng cho thành viên, hoặc trường hợp khác đòi hỏi tài khoản.
  • Hãy giữ hành vi mặc định một phân mảnh của yt-dlp cho tới khi bạn có lý do đo đạc được để thay đổi. Dùng các tùy chọn nghỉ và lịch chạy lệch nhau để giảm áp lực yêu cầu.
  • CLI thuần cộng systemd là thiết lập đáng tin cậy đơn giản nhất. Chọn Pinchflat cho các quy tắc kênh chạy tự động, MeTube cho hàng đợi trên trình duyệt, hoặc Tube Archivist cho giao diện xem có tìm kiếm.
  • Hãy xem dung lượng lưu trữ là biến số chính khi tính toán quy mô. Thử với một mẫu đại diện trước khi mua dung lượng đĩa cho cả kho lưu trữ.

Dùng yt-dlp một cách có trách nhiệm

Chỉ lưu trữ nội dung khi bạn có quyền và việc sử dụng của bạn tuân thủ điều khoản của nền tảng cùng pháp luật hiện hành.

  • Những trường hợp phù hợp gồm video do chính bạn đăng, nội dung thuộc phạm vi công cộng, và tài liệu mà chủ sở hữu quyền đã cho phép tải về.
  • Bản thân gói đăng ký YouTube Premium không cấp quyền sao chép video ngoài những tính năng mà YouTube cung cấp.
  • Các quyền và hạn chế của YouTube hạn chế việc tải xuống và truy cập tự động, trừ khi dịch vụ hoặc chủ sở hữu quyền liên quan cho phép.
  • Hướng dẫn này không đề cập tới việc vượt DRM, phân phối lại vì mục đích thương mại, hay cách né tránh biện pháp thực thi của nền tảng.

Những gì bạn cần trước khi bắt đầu

Bản cài đặt cơ bản thì nhỏ, còn các tệp media thì không. Hãy chuẩn bị máy chủ và đường dẫn lưu trữ trước khi tải cả một kênh.

  • Một VPS chạy Ubuntu 22.04 trở lên, hoặc một bản Debian hiện hành, có truy cập SSH
  • Python 3.10 trở lên
  • Đủ dung lượng cho một mẫu đại diện, cộng thêm chỗ trống cho tệp tải dở và khâu hậu xử lý
  • Một trình duyệt cục bộ riêng, chỉ khi bạn cần cookie tài khoản
  • Tùy chọn: Jellyfin, Emby hoặc một media server khác có thể đọc thư mục lưu trữ

Vì sao nên đặt yt-dlp trên VPS?

VPS hữu ích khi công việc phải tiếp tục chạy độc lập với máy tính bạn dùng hằng ngày. Nó cho trình tải một tiến trình bền bỉ, một hệ thống tệp dễ đoán, và một bộ lập lịch không dừng lại khi laptop ngủ hay đổi mạng.

Những đánh đổi này quan trọng. Hạn mức truyền tải hàng tháng của máy chủ có thể trở thành giới hạn khi bạn phát kho lưu trữ đó ra ngoài, và IP của VPS có thể chạm giới hạn yêu cầu sớm hơn đường mạng ở nhà. Bạn cũng tự lo cập nhật, quản lý thông tin đăng nhập, sao lưu, dọn dẹp dung lượng và bảo mật cho media server. Nếu chỉ tải một lần, laptop đơn giản hơn. Nếu tải lặp lại hoặc có thư viện dùng chung, VPS dễ vận hành hơn.

Chọn cấu hình VPS dựa trên dung lượng lưu trữ và khả năng phát

yt-dlp VPS sizing guide: starting allocations of 2 vCPU and 2 GB RAM for raw yt-dlp with systemd, 2 vCPU and 4 GB RAM for MeTube or Pinchflat, and 4 vCPU and 8 GB RAM for Tube Archivist, beside a method for projecting storage from a sample download

yt-dlp tải về và remux nội dung; thường thì nó không transcode mọi tệp. Nhờ vậy nhu cầu CPU và bộ nhớ thường trực của trình tải khá khiêm tốn, còn dung lượng đĩa thì thay đổi theo thời lượng video, độ phân giải, codec và định dạng bạn chọn.

Hãy xem các mức này là điểm khởi đầu thận trọng, không phải cấu hình tối thiểu chính thức:

Cài đặtCấu hình khởi điểmCách tiếp cận lưu trữPhù hợp nhất
yt-dlp thuần với systemd2 vCPU, 2 GB RAMTính theo mẫu thửTải theo lịch, không cần giao diện
MeTube hoặc Pinchflat2 vCPU, 4 GB RAMTính theo mẫu thửHàng đợi trên trình duyệt hoặc theo dõi kênh
Tube Archivist4 vCPU, 8 GB RAMỔ đĩa cục bộ có chừa chỗ để mở rộngKho lưu trữ có tìm kiếm và phát tích hợp

Một bản thử nhỏ cần khoảng 2 GB bộ nhớ khả dụng, còn bản cài trung bình đến lớn cần khoảng 4 GB, theo hướng dẫn triển khai Tube Archivist. Bắt đầu cao hơn mức sàn đó sẽ chừa chỗ cho hệ điều hành, Docker, hoạt động của Elasticsearch và một dịch vụ khác như Jellyfin.

Trước khi tính dung lượng cho cả kho, hãy mô phỏng hoặc tải một nhóm đại diện ở độ phân giải bạn chọn. Kiểm tra thư mục kết quả bằng du, chia cho số video đã tải xong, và tính cả những video dài bất thường.

du -sh ~/archive
find ~/archive -type f \( -name '*.mp4' -o -name '*.mkv' \) | wc -l
df -h ~/archive

Mẫu thử hữu ích hơn một ước lượng chung chung kiểu bao nhiêu gigabyte mỗi video, vì nó phản ánh đúng thời lượng và tổ hợp định dạng thực tế của kênh đó.

Cài yt-dlp và các phụ thuộc hiện hành

Dự án yt-dlp hỗ trợ Python 3.10 trở lên. Danh sách phụ thuộc của yt-dlp khuyến nghị mạnh mẽ dùng ffmpeg, ffprobe, yt-dlp-ejs và một runtime JavaScript được hỗ trợ để có hỗ trợ YouTube đầy đủ.

Bắt đầu với các gói hệ thống và một môi trường Python tách biệt:

sudo apt update
sudo apt install -y python3 python3-venv ffmpeg curl nano
python3 -m venv ~/yt-dlp-venv
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

Deno được bật mặc định trong yt-dlp và là runtime mà hướng dẫn EJS hướng dẫn EJS của dự án hiện khuyến nghị. Hãy cài nó, thêm vào PATH của shell, rồi kiểm tra từng thành phần:

curl -fsSL https://deno.land/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
yt-dlp --version
ffmpeg -version | head -1
deno --version
yt-dlp --simulate --verbose "https://www.youtube.com/watch?v=VIDEO_ID"

Đầu ra verbose liệt kê những phụ thuộc mà yt-dlp nhìn thấy. Nếu thiếu ffmpeg, yt-dlp sẽ cảnh báo và không thể ghép luồng video với âm thanh chất lượng cao nhất vốn tách rời, cũng không chạy được một số bước hậu xử lý.

Nếu cài bằng pip, hãy cập nhật bằng cách chạy lại pip bên trong môi trường ảo. Lệnh yt-dlp -U tích hợp sẵn dành cho bản nhị phân phát hành, không phải cho gói pip.

source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

Các kênh cập nhật được nói tới trong ghi chú cập nhật của yt-dlp. Cả ba kênh stable, nightly và master đều có sẵn, và nightly là kênh dự án khuyến nghị cho người dùng thông thường, vì các bản sửa extractor về đó trước bản phát hành ổn định kế tiếp.

Chỉ thêm cookie cho nội dung đòi hỏi tài khoản

Trước tiên hãy thử URL đích mà không dùng cookie. Hướng dẫn về YouTube của yt-dlp nói rằng cookie chỉ cần cho nội dung đòi hỏi tài khoản, gồm playlist riêng tư, video giới hạn độ tuổi và nội dung dành cho thành viên. Đăng nhập bằng OAuth không còn hoạt động với yt-dlp nữa.

Khi thật sự cần cookie, hãy xuất một phiên YouTube riêng trên máy tính cá nhân của bạn. Quy trình xuất cookie của dự án dùng một cửa sổ duyệt web riêng tư, để YouTube không xoay vòng phiên đã xuất trong một tab thường đang mở:

  1. Mở đúng một cửa sổ riêng tư hoặc ẩn danh rồi đăng nhập YouTube.
  2. Trong cùng tab đó, mở tệp robots.txt của YouTube.
  3. Chỉ xuất cookie của youtube.com ở định dạng Netscape, dùng một trong các tiện ích mở rộng được liệt kê trong FAQ của yt-dlp.
  4. Đóng cửa sổ riêng tư đó và đừng mở lại phiên ấy nữa.
  5. Chép tệp sang VPS và siết chặt quyền truy cập của nó.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'

Kiểm thử tệp bằng một URL đòi hỏi tài khoản:

~/yt-dlp-venv/bin/yt-dlp \
  --cookies ~/cookies.txt \
  --simulate \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Tệp cookie chính là thông tin đăng nhập của phiên, và tiện ích mở rộng trình duyệt cần được chọn cẩn thận, theo FAQ về cookie của yt-dlp. Hướng dẫn về extractor của YouTube cũng cảnh báo rằng dùng tài khoản với yt-dlp có thể dẫn tới việc bị cấm tạm thời hoặc vĩnh viễn. Chỉ dùng cookie khi mục tiêu thật sự đòi hỏi, giữ kín tệp đó, và dùng một tài khoản riêng thay vì tài khoản Google chính của bạn.

Đừng đặt --cookies trong cấu hình chung khi phần lớn mục tiêu là nội dung công khai. Hãy dùng một tệp cấu hình thứ hai, hoặc chỉ thêm cờ này vào những tác vụ thật sự cần.

Hãy xem PO Token là biện pháp khắc phục sự cố có điều kiện

yt-dlp access troubleshooting flow: simulate the URL first, then branch to no cookies needed for a working public video, a cookie export for account-gated content, or a dependency update and PO Token check when failures continue

Proof of Origin Token không phải là yêu cầu bắt buộc chung khi cài đặt. Hiện YouTube chỉ áp dụng các token này cho một số tổ hợp client và loại yêu cầu, và ma trận cụ thể thì luôn thay đổi.

Khi các client mặc định thất bại, một plugin nhà cung cấp cho client mweb được khuyến nghị, theo hướng dẫn về PO Token của yt-dlp. Tài liệu này nêu bgutil-ytdlp-pot-provider như một lựa chọn nổi bật, nhưng plugin đó cần cả một nhà cung cấp token lẫn một plugin cho yt-dlp. Chỉ cài gói Python thôi thì chưa phải là thiết lập hoàn chỉnh.

Khi một lượt tải từ YouTube thất bại, hãy theo thứ tự này:

  1. Cập nhật yt-dlp, yt-dlp-ejs và runtime JavaScript.
  2. Tái hiện lỗi với --verbose và không chỉ định client thay thế nào thêm.
  3. Chỉ thêm cookie nếu video đó đòi hỏi tài khoản.
  4. Nếu lỗi cho thấy PO Token đang bị bắt buộc, hãy làm theo hướng dẫn hiện hành của nhà cung cấp được liên kết từ tài liệu chính thức.

Cách này giữ cho một mẹo chữa cháy hay thay đổi không lọt vào bản cài cơ bản vốn đang ổn định.

Chọn giao diện theo quy trình làm việc

Quyết định chính không nằm ở chỗ giao diện nào có danh sách tính năng dài hơn. Hãy xác định bạn cần hàng đợi trên trình duyệt, đăng ký theo quy tắc, hay một thư viện cục bộ đầy đủ kiểu YouTube.

Tùy chọnTriển khaiĐiểm mạnhĐánh đổi chính
CLI thuầnKhông có giao diệnScript, tệp cấu hình, systemd, kiểm soát chính xác từng tùy chọnKhông có giao diện trên trình duyệt
MeTubeMột container DockerTải qua trình duyệt cùng với theo dõi kênh và playlistQuản lý thư viện sau khi tải khá hạn chế
PinchflatMột container DockerQuy tắc cho kênh và playlist, RSS, thời hạn lưu, đầu ra hợp với media centerĐược làm để quản lý tải xuống, không phải để xem ngay trong ứng dụng
Tube ArchivistContainer cho ứng dụng, Redis và ElasticsearchTìm kiếm, siêu dữ liệu, hàng đợi, trang kênh và phát videoTốn bộ nhớ và công vận hành nhiều nhất

Với quy trình nhẹ nhàng trên trình duyệt, MeTube hỗ trợ theo dõi kênh và playlist, định kỳ kiểm tra mục mới rồi tự động đưa vào hàng đợi. Nó vẫn là lựa chọn đơn giản nhất khi bạn chủ yếu cần một biểu mẫu web và một hàng đợi tải.

Pinchflat hợp nhất với việc lưu trữ kênh liên tục để sau đó xem qua Jellyfin, Plex, Kodi hoặc một trình đọc RSS. Nó độc lập, định kỳ kiểm tra nguồn, hỗ trợ quy tắc lưu giữ, và cố ý nhường phần phát lại cho ứng dụng khác.

Tube Archivist xứng đáng với những dịch vụ phụ mà nó kéo theo khi bạn muốn bản thân kho lưu trữ hành xử như một trang video có tìm kiếm. Nếu Jellyfin đã lo phần giao diện xem, hãy bắt đầu bằng CLI thuần hoặc Pinchflat, và chỉ thêm Tube Archivist khi mô hình tìm kiếm cùng siêu dữ liệu của nó thật sự giải quyết vấn đề bạn đang gặp.

Dựng một cấu hình lưu trữ có thể lặp lại

Hãy giữ các tùy chọn ít đổi trong một tệp, còn URL kênh thì truyền vào từ dòng lệnh hoặc bộ lập lịch. Ví dụ này giới hạn đầu ra ở 1080p, ghi lại ID những video đã tải xong, giãn nhẹ nhịp gửi yêu cầu, và ghi kèm siêu dữ liệu vẫn dùng được bên ngoài yt-dlp.

Tạo các thư mục và tệp cấu hình:

mkdir -p ~/.config/yt-dlp ~/archive
nano ~/.config/yt-dlp/archive.conf

Thêm các tùy chọn sau:

-P "~/archive"
-o "%(channel)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"
-f "bv*[height<=1080]+ba/b[height<=1080]"
--merge-output-format mp4
--download-archive ~/archive/downloaded.txt
--sleep-requests 1
--sleep-interval 5
--max-sleep-interval 10
--write-info-json
--write-thumbnail
--write-subs
--write-auto-subs
--sub-langs en.*
--embed-subs
--embed-thumbnail
--embed-metadata
--sponsorblock-mark all

Hãy chạy thử với một video trước khi giao cả kênh cho yt-dlp:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/watch?v=VIDEO_ID"

Sau đó chạy URL của một kênh hoặc playlist với cùng cấu hình đó:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/@CHANNEL/videos"

Tệp --download-archive ghi lại ID của những video đã tải thành công, nên các lần chạy sau sẽ bỏ qua chúng. Ban đầu hãy giữ giá trị mặc định --concurrent-fragments 1. Hướng dẫn về YouTube của yt-dlp khuyên nên chờ giữa các video khi một phiên chạm giới hạn yêu cầu; tài liệu này không công bố một ngưỡng song song phân mảnh an toàn chung cho IP của VPS.

Lên lịch tải bằng systemd

Một timer systemd ở cấp người dùng cho tác vụ lịch chạy bền vững cùng nhật ký, mà không phải nhét một câu lệnh dài vào cron. Độ trễ ngẫu nhiên còn ngăn mọi nguồn đã lên lịch cùng khởi động vào đúng một giây. Để khỏi phụ thuộc vào PATH của trình quản lý người dùng, service trỏ yt-dlp thẳng tới vị trí cài đặt mặc định của Deno.

Tạo service:

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/yt-dlp-archive.service
[Unit]
Description=Archive a YouTube channel with yt-dlp

[Service]
Type=oneshot
ExecStart=%h/yt-dlp-venv/bin/yt-dlp --js-runtimes deno:%h/.deno/bin/deno --config-location %h/.config/yt-dlp/archive.conf https://www.youtube.com/@CHANNEL/videos

Tạo timer:

nano ~/.config/systemd/user/yt-dlp-archive.timer
[Unit]
Description=Run the yt-dlp archive daily

[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

Bật timer và cho phép service người dùng chạy ngay cả khi bạn không đăng nhập:

systemctl --user daemon-reload
systemctl --user enable --now yt-dlp-archive.timer
sudo loginctl enable-linger "$USER"
systemctl --user list-timers
journalctl --user -u yt-dlp-archive.service -n 100 --no-pager

Với nhiều kênh, hãy tạo mỗi kênh một instance service riêng hoặc dùng các timer tách biệt. Nên xếp lệch giờ thay vì khởi chạy nhiều lượt kéo lớn cùng lúc.

Kết nối kho lưu trữ với Jellyfin

Hãy gắn hoặc mở chính thư mục ~/archive đó cho Jellyfin, rồi thêm nó làm một thư viện. Với bố cục thô theo kênh/ngày, thư viện Music Videos của Jellyfin chấp nhận thư mục lồng nhau và tên tệp tùy ý, không cần khớp siêu dữ liệu trực tuyến. Nhãn này không thật khớp với kho phi âm nhạc, nhưng lại hợp với cấu trúc tệp hơn kiểu "Shows", vốn mong đợi thư mục series và mùa cùng tên tập dạng SxxEyy. Hãy tránh Mixed Content, trừ khi bạn chấp nhận cảnh báo của Jellyfin rằng kết quả siêu dữ liệu có thể không đáng tin.

Các tùy chọn về siêu dữ liệu, ảnh thu nhỏ và phụ đề trong cấu hình yt-dlp giữ lại thông tin hữu ích bên cạnh hoặc bên trong từng tệp. Dù vậy, Jellyfin vẫn có thể cần bạn chỉnh siêu dữ liệu bằng tay, vì một kênh YouTube không ánh xạ gọn gàng sang cơ sở dữ liệu phim truyền hình.

Nếu bạn muốn tên tệp và siêu dữ liệu hợp với Jellyfin mà đỡ phải làm tay, Pinchflat có sẵn preset cho media center theo hướng đó. Còn để chọn giữa các media server ở góc rộng hơn, hãy xem bài so sánh Jellyfin và Plex của chúng tôi bàn về những đánh đổi trong phát lại, truy cập từ xa và transcoding.

Đưa cả bộ lên một máy chủ chạy liên tục

Khi quy trình đã chạy tốt trên một nhóm thử nhỏ, hãy chuyển nó sang Linux VPS của Cloudzy , để các lượt tải theo lịch và thư viện media của bạn luôn online mà không chiếm dụng máy tính dùng hằng ngày. Bạn cũng có thể triển khai Jellyfin dưới dạng ứng dụng cài một cú nhấp và trỏ thư viện của nó tới thư mục đầu ra của yt-dlp.

Xem các gói Linux

Xây dựng trên VPS Linux với quyền root, NVMe và sức mạnh AMD EPYC.

Xem các gói Linux

Câu hỏi thường gặp

yt-dlp có cần GPU trên VPS không?

Không. yt-dlp có thể tải và remux nội dung mà không cần GPU. GPU chỉ trở nên quan trọng khi Jellyfin hoặc một media server khác phải transcode video cho những client không tương thích hay các kết nối băng thông thấp; phát trực tiếp thì không cần bước chuyển đổi đó.

yt-dlp có tiếp tục được lượt tải bị gián đoạn không?

Có. yt-dlp bật sẵn tệp tải dở và khả năng tải tiếp, nên lần chạy sau thường nối tiếp các phân mảnh đã tải thay vì làm lại từ đầu. Đừng thêm --no-continue, --no-part hay --force-overwrites nếu bạn muốn giữ hành vi đó.

yt-dlp và Jellyfin có nên dùng chung một VPS?

Chúng có thể dùng chung một VPS khi dung lượng, CPU và băng thông đi ra đủ cho cả hai việc. Hãy tách ra khi việc phát hoặc transcode tranh tài nguyên với các lượt tải lớn, khi bạn cần khung bảo trì độc lập, hoặc khi kho lưu trữ nên nằm trên loại lưu trữ rẻ hơn so với máy chủ phát.

Chia sẻ

Thêm bài viết từ blog

Tiếp tục đọc.

Sẵn sàng triển khai? Từ $2.48/tháng.

Cloud độc lập, từ 2008. AMD EPYC, NVMe, 40 Gbps. Hoàn tiền trong 14 ngày.