6 điểm bởi GN⁺ 2024-10-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • You-Get là một tiện ích dòng lệnh nhỏ để tải nội dung media như video, âm thanh, hình ảnh từ web; đây là công cụ dùng khi không có cách đơn giản nào khác
  • Có thể tải video, hình ảnh, âm thanh từ nhiều trang như YouTube, Youku, niconico, Tumblr, SoundCloud, Instagram, bilibili, TikTok, hoặc stream video trực tuyến bằng trình phát media
  • Có thể dùng --info để xem chất lượng và định dạng khả dụng rồi chọn bằng --itag, nhưng chọn định dạng nhìn chung chưa được triển khai trên hầu hết các trang được hỗ trợ; mặc định là chất lượng cao nhất
  • Có thể cài đặt qua pip, tải xuống/clone từ GitHub, Homebrew, pkg của FreeBSD, Flox, v.v.; các phụ thuộc khuyến nghị là Python 3.7.4 trở lên, FFmpeg 1.0 trở lên, và RTMPDump là tùy chọn
  • Cung cấp tải xuống URL trực tiếp, scraping trang web, tải xuống dựa trên tìm kiếm Google Videos, tạm dừng/tiếp tục, proxy, nạp cookie, xuất URL trích xuất/JSON, nhưng một số tính năng vẫn mang tính thử nghiệm hoặc chưa ổn định

You-Get làm gì

  • You-Get là một tiện ích dòng lệnh nhỏ để tải nội dung media từ web
    • Nội dung mục tiêu gồm video, âm thanh và hình ảnh
    • Dùng trong trường hợp không có cách tải xuống đơn giản nào khác trên web
  • Các lý do sử dụng được nêu gồm tải xuống để thưởng thức cá nhân, giành quyền kiểm soát với video trực tuyến bị chặn lưu, né tránh công nghệ đóng hoặc JavaScript/Flash độc quyền, cũng như định hướng văn hóa hacker và phần mềm tự do
  • Các chức năng chính gồm
    • Tải video/âm thanh từ các trang phổ biến như YouTube, Youku, Niconico
    • Stream video trực tuyến trong trình phát media mà không cần trình duyệt web
    • Thu thập trang web để tải các hình ảnh quan tâm
    • Tải nội dung không phải HTML tùy ý, chẳng hạn file nhị phân

Cài đặt và môi trường chạy

  • Các phụ thuộc khuyến nghị là Python 3.7.4 trở lên, FFmpeg 1.0 trở lên, và tùy chọn RTMPDump
  • Theo thông báo ngày 30/5/2022, hỗ trợ Python 3.5, 3.6, 3.7 cuối cùng sẽ bị ngừng
  • Có nhiều cách cài đặt
    • Từ PyPI: pip install you-get
    • Người dùng Zsh có thể dùng Antigen: antigen bundle soimort/you-get
    • Tải nhánh ổn định master hoặc nhánh develop từ GitHub
    • git clone git://github.com/soimort/you-get.git, được khuyến nghị cho nhà phát triển
    • macOS: brew install you-get
    • FreeBSD: pkg install you-get
    • Mac, Linux, Windows WSL: flox install you-get
  • Định nghĩa tự động hoàn thành shell cho Bash, Fish, Zsh nằm trong contrib/completion
  • Có thể nâng cấp tùy theo cách cài đặt bằng pip install --upgrade you-get, tải bản phát hành mới nhất, hoặc buộc cài đặt lại nhánh develop

Luồng tải xuống cơ bản

  • Khi tải video, trước tiên có thể dùng you-get -i URL hoặc --info để xem chất lượng và định dạng khả dụng
    • Kết quả xuất ra gồm trang, tiêu đề, stream, container, chất lượng, kích thước và ví dụ --itag dùng để tải
    • Tải xuống mặc định dùng mục đầu tiên trong danh sách
  • Nếu muốn định dạng khác, dùng giá trị --itag hiển thị trong kết quả
    • Ví dụ, với video Me at the zoo trên YouTube, có thể chọn mp4 bằng --itag=18
  • Nếu video YouTube có phụ đề, chúng sẽ được tải xuống cùng file video ở định dạng phụ đề SubRip
  • Chọn định dạng vẫn chưa được triển khai như một chức năng phổ biến trên hầu hết các trang được hỗ trợ
    • Trong trường hợp này, định dạng tải xuống mặc định là chất lượng cao nhất
  • FFmpeg cần thiết để tải xuống/hợp nhất video được stream thành nhiều mảnh và cho video YouTube độ phân giải cao từ 1080p trở lên
    • Nếu không muốn hợp nhất các mảnh sau khi tải, dùng --no-merge hoặc -n

Tải xuống theo URL, trang web và tìm kiếm

  • Nếu có URL tài nguyên chính xác, có thể tải trực tiếp bằng you-get URL
    • Ví dụ, khi nhập URL ảnh JPEG, công cụ sẽ hiển thị trang, tiêu đề, loại, kích thước và lưu file
  • Nếu đưa vào URL trang web thay vì URL tài nguyên chính xác, công cụ sẽ cố thu thập trang để tìm các mục quan tâm
    • Tính năng này mang tính thử nghiệm và chưa hoàn hảo
    • Hoạt động tốt nhất khi scraping ảnh lớn trên các trang phổ biến như Tumblr, Blogger
    • Không có mẫu phổ quát áp dụng cho mọi trang trên Internet
  • Nếu truyền vào một chuỗi không phải URL, công cụ sẽ tìm kiếm trên Google Videos và tải video liên quan nhất
    • Kết quả có thể không chính xác là thứ mong muốn, nhưng được mô tả là có khả năng rất hợp lý

Kiểm soát tải xuống và tùy chọn chạy

  • Có thể ngắt trong lúc tải bằng Ctrl+C, và file tạm .download sẽ còn lại trong thư mục đầu ra
    • Chạy lại với cùng đối số sẽ tiếp tục từ phiên trước
    • Nếu đã có file hoàn chỉnh không còn phần mở rộng tạm, tải xuống sẽ được bỏ qua
    • --force hoặc -f buộc tải lại, ghi đè file hiện có hoặc file tạm cùng tên
  • Có thể chỉ định đường dẫn lưu bằng --output-dir hoặc -o, và chỉ định tên file bằng --output-filename hoặc -O
    • Hữu ích khi tiêu đề video mặc định chứa ký tự đặc biệt không tương thích với shell, hệ điều hành hoặc hệ thống file hiện tại
    • Cũng hữu ích khi lưu bằng thư mục và tên chỉ định trong script tải xuống hàng loạt
  • Có thể chỉ định HTTP proxy bằng --http-proxy hoặc -x
    • Mặc định áp dụng biến môi trường http_proxy, tức thiết lập proxy của hệ thống
    • Dùng --no-proxy để tắt proxy
    • Với một số trang như Youku, có thể dùng --extractor-proxy hoặc -y khi trích xuất thông tin video chỉ truy cập được từ Trung Quốc đại lục
  • --player hoặc -p chuyển video cho trình phát media như mpv, vlc thay vì tải xuống
    • Nếu chỉ định trình duyệt làm trình phát, có thể xem trong trình duyệt mà không có quảng cáo hay phần bình luận
    • Cũng có thể dùng để khởi động trình quản lý tải xuống khác, nhưng có thể không thật phù hợp

Xác thực, dữ liệu trích xuất, trang được hỗ trợ

  • Với nội dung cần đăng nhập tài khoản như video không công khai, phải truyền cookie trình duyệt bằng --cookies hoặc -c
    • Các định dạng cookie hiện được hỗ trợ là Mozilla cookies.sqlite và Netscape cookies.txt
  • --url hoặc -u xuất danh sách URL tài nguyên có thể tải xuống được trích xuất từ trang
  • --json xuất tóm tắt dữ liệu trích xuất ở định dạng JSON
    • Tính năng này chưa ổn định và schema JSON có thể có thay đổi phá vỡ tương thích trong tương lai
  • Danh sách trang được hỗ trợ gồm YouTube, X(Twitter), VK, Vimeo, Tumblr, SoundCloud, Pinterest, Internet Archive, Instagram, Facebook, Dailymotion, Bandcamp, niconico, bilibili, Youku, Naver, TikTok, Zhihu, v.v.
    • Mỗi trang có mức hỗ trợ video, hình ảnh, âm thanh khác nhau
  • Với các trang không có trong danh sách, trình trích xuất đa dụng sẽ tìm các tài nguyên quan tâm trên trang và tải xuống

Báo cáo vấn đề và giấy phép

  • Khi không tải được nội dung mong muốn, trước tiên hãy kiểm tra Known Bugs
  • Trước khi báo cáo vấn đề mới hoặc đóng góp, cần đọc hướng dẫn đóng góp
  • Có thể đặt câu hỏi nhanh tại kênh Gitter #soimort/you-get
  • Phần mềm được phân phối theo MIT license
    • Phần mềm được cung cấp “nguyên trạng”, không có bảo đảm
    • Tác giả không chịu trách nhiệm đối với hành vi vi phạm bản quyền hoặc sử dụng cho mục đích bất hợp pháp khác
    • Kho lưu trữ chỉ cung cấp mã nguồn, còn cách sử dụng là tùy quyết định của người dùng

1 bình luận

 
GN⁺ 2024-10-28
Ý kiến trên Hacker News
  • Có một thời gian internet đắt đỏ và băng thông thấp, nhưng tôi rất thích nghe nhạc và bài giảng trên YouTube. Đến một lúc nào đó tôi nhận ra rằng chỉ cần lấy luồng âm thanh thì có thể giảm 90% chi phí băng thông
    youtube-dlyt-dlp có cờ -G để in ra URL của định dạng/chất lượng được yêu cầu, và trên máy tính tôi lấy URL bằng dòng lệnh rồi đưa vào VLC để dùng
    Trên điện thoại, ban đầu tôi dùng một cách vòng vo khá rắc rối là SSH vào VPS để tải tệp trước rồi lại tải xuống điện thoại, nhưng sau đó biết được rằng trình duyệt trên điện thoại có thể phát trực tiếp URL nên tôi đã làm một frontend PHP cho youtube-dl -G -f bestaudio {url}
    Giờ nó không còn online nữa và tôi cũng làm mất mã nguồn, nhưng thực ra gần như chỉ là một dòng. Có vẻ you-get cũng hỗ trợ cùng mục đích đó với --url / -u, nên tôi muốn nói rằng tính năng này hữu ích đến mức nào
    Nếu tắt màn hình khi phát thì còn tiết kiệm 80% pin. Có vẻ YouTube cũng biết điều này, nên đã biến phát nền chỉ lấy luồng âm thanh thành tính năng trả phí

    • Trình duyệt Brave Mobile có thể bật phát âm thanh video nền, nên không cần đăng ký như YouTube Premium
    • Có vẻ youtube-dl không còn hoạt động tốt nữa, và tôi phải dùng bản fork là yt-dlp. Việc chuyển dự án như thế này lúc nào cũng khiến tôi thấy bất an, nhưng ít nhất có vẻ nó được dùng khá rộng rãi
    • Mẹ tôi rất thích audiobook, nên tôi đã làm một bot Telegram bằng node-red để xử lý khi bà chia sẻ liên kết YouTube
      Liên kết được đưa vào FIFO, rồi một daemon nhỏ tải lần lượt và lưu vào thư mục incoming chuyên dụng. Bot có thể lấy chỉ âm thanh hoặc cả video đầy đủ, nhưng với Telegram ID của mẹ tôi thì tôi cấu hình chỉ nhận âm thanh
      Thư mục này được Jellyfin theo dõi, nên mẹ tôi có thể tải xuống hoặc nghe ngay. Trong 2 năm bà đã nhận hơn 1TB audiobook và rất thích
      Mã daemon: https://gist.github.com/entropie/d265e94136b9777cc6b3190189b...
    • Trong tình huống băng thông thấp, tôi thường chọn 144p. Dung lượng gần như tương đương với luồng chỉ âm thanh chất lượng tốt, nhưng có lợi thế là thỉnh thoảng, có thể 45 phút một lần, vẫn nhìn thấy người nói. Pin cũng được tiết kiệm tương tự
      Video 144p có gì đó kỳ lạ mà yên bình và dễ chịu. Không bị những màu sắc lấp lánh hay chi tiết phức tạp làm xao nhãng, nên có thể chỉ tập trung vào việc nghe
    • Trên iOS Safari, nếu sau khi rời ứng dụng Safari mà bạn nhanh tay bấm nút phát video trong giao diện đang phát, có thể khiến âm thanh video YouTube phát nền theo kiểu lỗi
      Tôi chủ yếu dùng cách này để phát các video chỉ dành cho thành viên mà kể cả có YouTube Premium thì vẫn không phát nền được. Mỗi lần iOS cập nhật tôi đều cầu mong họ đừng vá “lỗi” này
  • Có vẻ dự án này không muốn nhận issue chỉ để báo lỗi mà không kèm PR sửa
    Theo kiểu “để báo vấn đề phát hiện khi dùng you-get, bạn cần mở Pull Request...”, và tôi chưa từng thấy cách làm như vậy trước đây

    • Như người khác đã nói, có vẻ ý họ không phải là bắt buộc phải sửa mà là muốn có test bị lỗi
      Yêu cầu là mô tả chi tiết vấn đề và ít nhất một commit xử lý vấn đề đó dưới dạng unit test. Từ “addressing” ở đây không hay lắm, có lẽ “demonstrating” sẽ phù hợp hơn
    • Trong bản tiếng Trung có thêm một tiêu đề, dịch ra là “để ngăn việc lạm dụng GitHub Issues, chúng tôi không nhận issue thông thường”. Bản tiếng Anh cũ từng viết như sau
      you-get hiện đang thử nghiệm một cách tiếp cận quyết liệt trong xử lý issue, theo đó báo lỗi phải được xử lý bằng mã thông qua pull request
      https://github.com/soimort/you-get/commit/75b44b83826b3c2d9a...
      Chắc là họ đã bị spam quá nhiều. Nhân tiện, tests/test.py có vẻ chạy trực tiếp extractor với nhiều website, và tôi không tìm thấy chỗ nào họ mock request hay response mạng. Có thể họ muốn đơn giản hóa quy trình cho người gửi PR
    • Có vẻ ý là hãy gửi PR có kèm test để cho thấy vấn đề đã được xử lý hay chưa
    • Ý tưởng khuyến khích mọi người thử viết test hay thậm chí sửa hoàn chỉnh thì khá thú vị, nhưng việc chỉ nhận như vậy có vẻ hơi quá. Dù sao tôi cũng không phải người bảo trì you-get, nên không biết họ đã phải trải qua những gì
      Đây có thể là cách hiệu quả để lọc bớt làn sóng issue lặp đi lặp lại từ những người thậm chí không biết chạy chương trình dòng lệnh cho đúng
    • Viết một test bị lỗi thì tương đối dễ, và giúp giảm rất nhiều công việc phân loại issue. Nó cũng giảm nguy cơ GitHub Issues biến thành diễn đàn hỗ trợ
      Nếu nhờ vậy mà việc bảo trì dự án dễ hơn và tồn tại lâu hơn, thì tôi thấy cũng ổn
  • Chỉ nhìn tiêu đề và phần đầu mô tả, tôi đã tưởng đây là một công cụ dựa trên heuristic để mò ra bất cứ thứ gì trên trang. Kiểu công cụ hữu ích khi không có bộ hỗ trợ riêng cho một site cụ thể, tức là trong đa số trường hợp là “khi yt-dlp không hỗ trợ”
    Nhưng thực tế nó là cấu trúc dựa trên extractor, có extractor riêng cho từng nguồn tương đối phổ biến. Rốt cuộc có lẽ nó gần với một bản sao yt-dlp đơn giản hơn hơn là thứ khác

  • Không rõ có ai khác vẫn gặp lỗi này hay không
    Bắt đầu với you-get: [error] oops, something went wrong., rồi hướng dẫn kiểm tra sự cố mạng, xác nhận đang dùng phiên bản mới nhất, kiểm tra các lỗi đã biết và chạy với tùy chọn --debug
    Cờ debug cũng không giúp được bao nhiêu, và tại pattern = str(pattern, 'latin1') đã xuất hiện TypeError: decoding to str: need a bytes-like object, NoneType found
    Tôi định xem có thể vượt qua giới hạn độ tuổi hay không, nhưng cùng lỗi đó cũng xảy ra với cả video không có giới hạn độ tuổi

    • Nên kiểm tra phiên bản Python
      Có thể chuyển sang Python mới nhất bằng công cụ như Pyenv, hoặc chạy một image Docker kiểu docker run -it -v $(pwd):/mnt python:3.13 bash rồi dùng tiện ích bên trong đó
  • Có ai giải thích được vì sao cái này tốt hơn yt-dlp không?

    • Câu hỏi thú vị đấy. Phần phụ thuộc chỉ có một thư viện, nhưng tôi tò mò thực tế có bao nhiêu mã được tự viết trực tiếp
      Ví dụ, việc có một trình nối mp4 chuyên dụng khá lạ. Nếu đã có ffmpeg rồi thì gần như không thể tự làm tốt hơn được
      https://github.com/soimort/you-get/blob/develop/src/you_get/...
    • Tôi cũng tò mò người ta suy ra nó tốt hơn yt-dlp bằng cách nào. Trong những lĩnh vực mà Google liên tục tìm cách chặn, tôi nghĩ càng nhiều lựa chọn càng tốt
  • Khó mà gọi chính xác một trình tải media kiểu ytdl, có thư viện trích xuất theo từng trang và bộ chuyển đổi, là một công cụ thực sự “ngu ngốc”, nhưng việc có thêm các dự án như ytdl vẫn là điều tốt

  • Tôi không thực sự hiểu vì sao danh sách site được hỗ trợ lại có Bandcamp. Bandcamp cho phép bạn просто tải file về nếu trả tiền cho nghệ sĩ trước
    Thứ có thể tải bằng công cụ này là do nghệ sĩ cho phép nghe thử miễn phí trước khi mua. Tải xuống bằng công cụ này có vẻ hoàn toàn không cần thiết và hơi bất lịch sự. Bandcamp chủ yếu là các nghệ sĩ và hãng đĩa indie quy mô nhỏ

    • Danh sách site được hỗ trợ không phải là tuyên ngôn đạo đức về nơi nên dùng công cụ này. Nó chỉ đơn giản là danh sách các site phổ biến mà công cụ này hoạt động được
    • Tôi nghĩ vẫn có thể dùng công cụ này sau khi đã đăng ký hoặc mua. Người ta tải cả những nội dung họ đã trả tiền bằng các công cụ tự động như vậy để đỡ phải đăng nhập vào 5 ứng dụng của các hệ sinh thái đóng khác nhau
    • Không phải ai cũng sống ở quốc gia có thể thanh toán cho Bandcamp
      Cá nhân tôi đôi khi muốn, hoặc buộc phải, tiêu thụ media ngoại tuyến vì mạng không ổn định hay chậm, hoặc vì nhà mạng quá đắt. Điều đó không có nghĩa là nếu thích thì sau này tôi sẽ không trả tiền
    • Những người sao chép lậu cho rằng từ mức thu nhập nào thì việc lấy cắp loại nội dung nào là đạo đức hay phi đạo đức?
    • Không phải ai cũng đồng ý rằng nghệ sĩ nên được trả tiền cho tác phẩm của mình
  • Có vẻ được làm khá tốt. Nhưng từ góc nhìn người dùng, tôi vẫn tò mò vì sao nên dùng you-get thay vì yt-dlp
    Nó có điểm mạnh nào so với yt-dlp, vốn hoạt động khá tốt trên một lượng lớn site?
    [1] https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites....

  • Trong phần mô tả có câu “Tìm kiếm và tải xuống từ Google Videos: $ you-get "Richard Stallman eats"
    Tôi không hay đọc tài liệu hướng dẫn, nhưng lần này có đọc và phát hiện ra một easter egg khá kinh tởm

  • Tôi thích nó. Tôi hình dung sẽ hay nếu có tiện ích mở rộng đi kèm cho Chrome/Firefox, dùng you-get làm backend và được triển khai mượt mà
    Đi xa hơn nữa, có thể nghĩ tới một tiện ích you-get bỏ qua trình phát YouTube và phát trực tiếp nội dung không quảng cáo khi bạn vào YouTube. Không chỉ YouTube mà còn có thể áp dụng cho các nền tảng khác