6 điểm bởi GN⁺ 2024-07-30 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ngừng build ARM 32-bit

    • Các phiên bản Node mới không hỗ trợ ARM 32-bit
    • Cần di chuyển sang HĐH 64-bit do các vấn đề về cập nhật bảo mật và phụ thuộc
  • Giới thiệu về MeTube

    • GUI web của youtube-dl (sử dụng nhánh fork yt-dlp)
    • Hỗ trợ tải video từ YouTube và nhiều trang web khác

Chạy bằng Docker

  • Lệnh Docker

    docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
    
  • Ví dụ docker-compose

    version: "3"
    services:
      metube:
        image: ghcr.io/alexta69/metube
        container_name: metube
        restart: unless-stopped
        ports:
          - "8081:8081"
        volumes:
          - /path/to/downloads:/downloads
    

Cấu hình bằng biến môi trường

  • UID: ID người dùng chạy MeTube (mặc định: 1000)
  • GID: ID nhóm chạy MeTube (mặc định: 1000)
  • UMASK: giá trị umask (mặc định: 022)
  • DEFAULT_THEME: giao diện mặc định (light, dark, auto, mặc định: auto)
  • DOWNLOAD_DIR: đường dẫn lưu tải xuống (mặc định: /downloads)
  • AUDIO_DOWNLOAD_DIR: đường dẫn lưu tải xuống chỉ âm thanh (mặc định: DOWNLOAD_DIR)
  • DOWNLOAD_DIRS_INDEXABLE: có cho phép lập chỉ mục thư mục tải xuống hay không (mặc định: false)
  • CUSTOM_DIRS: có bật tải xuống vào thư mục tùy chỉnh hay không (mặc định: true)
  • CREATE_CUSTOM_DIRS: có hỗ trợ tự động tạo thư mục hay không (mặc định: true)
  • STATE_DIR: đường dẫn lưu tệp duy trì hàng đợi (mặc định: /downloads/.metube)
  • TEMP_DIR: đường dẫn lưu tệp tải xuống tạm thời (mặc định: /downloads)
  • DELETE_FILE_ON_TRASHCAN: có xóa tệp trên máy chủ khi xóa trong UI hay không (mặc định: false)
  • URL_PREFIX: đường dẫn cơ sở của máy chủ web (mặc định: /)
  • PUBLIC_HOST_URL: URL cơ sở của liên kết tải xuống hiển thị trong UI
  • PUBLIC_HOST_AUDIO_URL: URL cơ sở của liên kết tải xuống âm thanh
  • OUTPUT_TEMPLATE: mẫu tên tệp tải xuống (mặc định: %(title)s.%(ext)s)
  • OUTPUT_TEMPLATE_CHAPTER: mẫu tên tệp video được chia theo chương (mặc định: %(title)s - %(section_number)s %(section_title)s.%(ext)s)
  • YTDL_OPTIONS: các tùy chọn bổ sung truyền cho youtube-dl (định dạng JSON)
  • YTDL_OPTIONS_FILE: đường dẫn tệp JSON dùng để điền YTDL_OPTIONS

Sử dụng cookie trình duyệt

  • Thêm vào docker-compose.yml

    volumes:
      - /path/to/cookies:/cookies
    environment:
      - YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}
    
  • Cài tiện ích trích xuất cookie

    • Firefox
    • Chrome

Tiện ích mở rộng trình duyệt

  • Chrome: có thể cài từ Google Chrome Webstore
  • Firefox: có thể cài từ Firefox Addons

Phím tắt iOS

  • Phím tắt iOS: gửi URL từ Safari sang MeTube
  • Cần nhập địa chỉ máy chủ và cổng

Tương thích iOS

  • Yêu cầu đối với tệp video trên iOS: cần codec video h264 hoặc h265 và codec âm thanh aac
  • Khi tải định dạng MP4 có thể chọn tùy chọn "Best (iOS)"

Bookmarklet

  • Bookmarklet cho Chrome: gửi trang web đang mở hiện tại sang MeTube
  • Khi dùng trên trang HTTPS cần reverse proxy HTTPS

Chạy phía sau reverse proxy

  • Ví dụ cấu hình NGINX

    location /metube/ {
      proxy_pass http://metube:8081;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
    }
    
  • Ví dụ cấu hình Apache

    <Location /metube/>
      ProxyPass http://localhost:8081/ retry=0 timeout=30
      ProxyPassReverse http://localhost:8081/
    </Location>
    <Location /metube/socket.io>
      RewriteEngine On
      RewriteCond %{QUERY_STRING} transport=websocket [NC]
      RewriteRule /(.*) ws://localhost:8081/socket.io/$1 [P,L]
      ProxyPass http://localhost:8081/socket.io retry=0 timeout=30
      ProxyPassReverse http://localhost:8081/socket.io
    </Location>
    
  • Ví dụ cấu hình Caddy

    example.com {
      route /metube/* {
        uri strip_prefix metube
        reverse_proxy metube:8081
      }
    }
    

Cập nhật yt-dlp

  • Bản build nightly tự động: nếu có phiên bản yt-dlp mới thì sẽ tự động build và cập nhật image Docker
  • Khuyến nghị cài và cấu hình watchtower

Khắc phục sự cố và gửi issue

  • MeTube là UI của yt-dlp: không gửi các vấn đề liên quan đến yt-dlp vào dự án MeTube
  • Khuyến nghị dùng trực tiếp lệnh yt-dlp: kiểm tra tùy chọn trước rồi áp dụng vào YTDL_OPTIONS

Build và chạy cục bộ

  • Công cụ cần thiết: node.js và Python 3.11

    cd metube/ui
    npm install
    node_modules/.bin/ng build
    cd ..
    pip3 install pipenv
    pipenv install
    pipenv run python3 app/main.py
    
  • Build image Docker cục bộ

    docker build -t metube .
    

Ghi chú phát triển

  • Hoạt động trên Windows, macOS, Linux
  • Khi chạy máy chủ trong VSCode, thư mục tải xuống là thư mục Downloads của người dùng

Tóm tắt của GN⁺

  • MeTube là GUI web của youtube-dl, cung cấp khả năng tải video từ nhiều trang web
  • Có thể triển khai và cấu hình dễ dàng bằng Docker, đồng thời hỗ trợ tùy biến qua nhiều biến môi trường
  • Có thể tải video thuận tiện thông qua tiện ích mở rộng trình duyệt và phím tắt iOS
  • Tự động cập nhật phiên bản yt-dlp mới nhất để luôn duy trì trạng thái cập nhật
  • Các dự án có chức năng tương tự gồm có JDownloader, Video DownloadHelper, v.v.

1 bình luận

 
GN⁺ 2024-07-30
Ý kiến trên Hacker News
  • Tube Archivist hữu ích để lưu trữ và lập chỉ mục các kênh công nghệ

    • Cung cấp khả năng tìm kiếm toàn văn và siêu dữ liệu nâng cao
    • Mang lại chức năng tìm kiếm tốt hơn Alphabet rất nhiều
  • Muốn có tính năng kiểu YouTube TiVo

    • Không muốn bỏ lỡ 100 kênh mình hay xem
    • Cần một nguồn cấp dữ liệu ưu tiên
    • Sẽ còn tốt hơn nếu có thể tải về và xem qua DLNA
    • YouTube không quan tâm đến việc giúp người dùng không bỏ lỡ nội dung họ yêu thích
  • Đang nghĩ đến việc làm một ứng dụng đơn giản bằng yt-dlp

    • Nghĩ rằng không cần phải host trên server
    • Tò mò không biết có lựa chọn thay thế nào không
  • Sẽ rất hay nếu có một giao diện tích hợp với Jellyfin

    • Có thể tìm kiếm YouTube, tải về bằng yt-dlp, rồi stream qua Jellyfin mà không có quảng cáo
  • Thấy lạ khi có rất nhiều công cụ mirror YouTube

    • Tò mò vì sao mọi người lại tải về/lưu trữ video
    • Lưu trữ để phòng khi video bị xóa thì tốt, nhưng cá nhân thấy chuyện đó hiếm khi xảy ra
    • Nghĩ rằng sau khi xem xong thì không cần xem lại video nữa
  • Nếu một server dựa trên yt-dlp được đóng gói như PiHole với image đơn giản và ứng dụng client frontend, có lẽ nó sẽ trở nên phổ biến

    • Mua một Raspberry Pi, ghi image vào thẻ microSD, chọn các kênh YT yêu thích rồi cài ứng dụng client là có thể dùng nội dung YT cục bộ mà không có quảng cáo
  • Đang dùng TubeSync

    • Dù tính năng đơn giản và có nhiều lỗi, nó vẫn hoạt động đủ tốt
    • Có thể đăng ký kênh hoặc danh sách phát, tải video về một đường dẫn và mỗi ngày kiểm tra nội dung mới một lần
    • Chỉ cần UX để cấu hình kênh
    • Lưu file và để Plex xử lý phần còn lại
    • Tò mò không biết có lựa chọn nào tốt hơn không
  • Đang dùng Cobalt.tools

    • Hài lòng với nó
  • Tải các video đã thêm vào playlist và lưu vào server Plex dùng chung

    • Chủ yếu lưu trữ video hòa nhạc và các phần trượt ván
  • Một công cụ liên quan là Yark: YouTube Archiver with Offline UI