6 คะแนน โดย GN⁺ 2024-07-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • MeTube เป็นเว็บ UI แบบโฮสต์เองสำหรับ yt-dlp ช่วยให้ดาวน์โหลดสื่อจาก YouTube และเว็บไซต์ที่รองรับอีกหลายสิบแห่งผ่านเบราว์เซอร์ได้
  • รองรับการดาวน์โหลดวิดีโอ เสียง คำบรรยาย และภาพขนาดย่อ รวมถึงดาวน์โหลด เพลย์ลิสต์และช่อง ได้โดยปรับรูปแบบผลลัพธ์และตัวเลือกการดาวน์โหลด
  • สามารถ สมัครติดตาม ช่องและเพลย์ลิสต์เพื่อตรวจสอบรายการใหม่เป็นระยะ และเพิ่มอัปโหลดใหม่เข้าคิวโดยอัตโนมัติ
  • รันด้วย Docker หรือ docker-compose และตั้งค่าจำนวนการดาวน์โหลดพร้อมกัน พาธจัดเก็บ เทมเพลตชื่อไฟล์ HTTPS, CORS, ธีม ระดับล็อก ฯลฯ ผ่าน ตัวแปรสภาพแวดล้อม
  • ตัวเลือก yt-dlp จะถูกรวมตามลำดับ: ตัวเลือกส่วนกลาง, พรีเซ็ต, และการ override ต่อรายการดาวน์โหลด โดยการ override ต่อรายการดาวน์โหลดอนุญาตให้ป้อนตัวเลือกใดก็ได้ จึงควรเปิดใช้เฉพาะใน สภาพแวดล้อมที่เชื่อถือได้ เท่านั้น

MeTube ทำอะไรได้บ้าง

  • MeTube เป็นเว็บ UI แบบโฮสต์เองที่ใช้ yt-dlp
  • ดาวน์โหลดสื่อจาก YouTube และเว็บไซต์อีกหลายสิบแห่งที่ yt-dlp รองรับได้
  • ฟีเจอร์หลักมีดังนี้
    • ดาวน์โหลด วิดีโอ เสียง คำบรรยาย และภาพขนาดย่อ จาก UI บนเบราว์เซอร์
    • ดาวน์โหลด เพลย์ลิสต์และช่อง
    • กำหนดพาธผลลัพธ์และตัวเลือกการดาวน์โหลด
    • สมัครติดตามช่อง·เพลย์ลิสต์ แล้วตรวจสอบรายการใหม่เป็นระยะ
    • เพิ่มอัปโหลดใหม่เข้า queue ดาวน์โหลดโดยอัตโนมัติ

วิธีรัน

  • รันได้ทันทีด้วย Docker
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
  • ตัวอย่าง docker-compose ใช้อิมเมจ ghcr.io/alexta69/metube และ mount /downloads ของคอนเทนเนอร์ไปยังไดเรกทอรีดาวน์โหลดบนโฮสต์
services:
  metube:
    image: ghcr.io/alexta69/metube
    container_name: metube
    restart: unless-stopped
    ports:
      - "8081:8081"
    volumes:
      - /path/to/downloads:/downloads

การตั้งค่าดาวน์โหลดและพื้นที่จัดเก็บ

  • MAX_CONCURRENT_DOWNLOADS จำกัดจำนวนดาวน์โหลดที่รันพร้อมกันได้ ค่าเริ่มต้นคือ 3
  • หาก DELETE_FILE_ON_TRASHCAN เป็น true เมื่อส่งรายการไปถังขยะจากส่วน “Completed” ใน UI ไฟล์ดาวน์โหลดบนเซิร์ฟเวอร์จะถูกลบด้วย
  • DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT กำหนดจำนวนรายการสูงสุดที่ดาวน์โหลดได้จากเพลย์ลิสต์ โดยค่าเริ่มต้น 0 หมายถึงไม่จำกัด
  • ค่าเริ่มต้นที่เกี่ยวกับการสมัครติดตามก็ปรับได้ด้วยตัวแปรสภาพแวดล้อม
    • SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: ช่วงเวลาตรวจสอบอัตโนมัติต่อการสมัครติดตาม ค่าเริ่มต้น 60 นาที
    • SUBSCRIPTION_SCAN_PLAYLIST_END: จำนวนรายการเพลย์ลิสต์·ช่องสูงสุดที่จะดึงมาตอนตรวจสอบการสมัครติดตาม ค่าเริ่มต้น 50
    • SUBSCRIPTION_MAX_SEEN_IDS: เพดานจำนวน ID วิดีโอที่จะเก็บต่อการสมัครติดตาม ค่าเริ่มต้น 50000
  • DOWNLOAD_DIR คือพาธจัดเก็บดาวน์โหลด และในอิมเมจ Docker ค่าเริ่มต้นคือ /downloads
  • การดาวน์โหลดเฉพาะเสียงสามารถมีพาธจัดเก็บแยกต่างหากได้ด้วย AUDIO_DOWNLOAD_DIR
  • ผ่าน CUSTOM_DIRS และ CREATE_CUSTOM_DIRS สามารถเลือกไดเรกทอรีย่อยสำหรับดาวน์โหลดใน UI หรือสร้างโดยอัตโนมัติได้
  • STATE_DIR เก็บไฟล์สถานะถาวร เช่น queue.json, pending.json, completed.json, subscriptions.json
  • TEMP_DIR คือพาธไฟล์ดาวน์โหลดชั่วคราว การใช้ SSD หรือ RAM filesystem อาจช่วยด้านประสิทธิภาพได้ แต่ RAM filesystem อาจทำให้ไม่สามารถ resume ดาวน์โหลดได้

ชื่อไฟล์และตัวเลือก yt-dlp

  • OUTPUT_TEMPLATE คือเทมเพลตชื่อไฟล์ดาวน์โหลด ค่าเริ่มต้นคือ %(title)s.%(ext)s
  • สามารถตั้งค่าเทมเพลตสำหรับการดาวน์โหลด chapter, เพลย์ลิสต์ และช่อง แยกกันได้
    • OUTPUT_TEMPLATE_CHAPTER

    • OUTPUT_TEMPLATE_PLAYLIST

      • OUTPUT_TEMPLATE_CHANNEL
      • ตัวเลือก yt-dlp ระบุเป็นอ็อบเจ็กต์ JSON
      • ลำดับชั้นของตัวเลือกจะถูกใช้จากขอบเขตกว้างไปแคบ
      1. ตัวเลือกส่วนกลาง: ค่าเริ่มต้นสำหรับทุกดาวน์โหลด
      2. พรีเซ็ต: ชุดตัวเลือกที่มีชื่อ ซึ่งเลือกต่อรายการดาวน์โหลดใน UI
      3. override ต่อรายการดาวน์โหลด: ตัวเลือกแบบป้อนอิสระที่ใช้เฉพาะกับดาวน์โหลดใดดาวน์โหลดหนึ่ง
      • หากมี key ที่ชนกัน การตั้งค่าที่เฉพาะเจาะจงกว่าจะมีลำดับความสำคัญสูงกว่า
      • override ต่อรายการดาวน์โหลดมีลำดับความสำคัญสูงกว่าพรีเซ็ต
      • พรีเซ็ตมีลำดับความสำคัญสูงกว่าตัวเลือกส่วนกลาง
      • หากตั้งค่าตัวเลือกใน JSON เป็น null ตัวเลือกนั้นจะถูกลบออกจากดาวน์โหลดนั้น
      • YTDL_OPTIONS_FILE และ YTDL_OPTIONS_PRESETS_FILE จะคอยตรวจการเปลี่ยนแปลงไฟล์และโหลดใหม่อัตโนมัติ จึงไม่ต้องรีสตาร์ตคอนเทนเนอร์
      • หากใช้ไฟล์และตัวแปรสภาพแวดล้อมร่วมกัน แล้วกำหนด key เดียวกันหรือชื่อพรีเซ็ตเดียวกัน การตั้งค่าจากไฟล์ จะมีลำดับความสำคัญสูงกว่า

พรีเซ็ตและ override

  • พรีเซ็ตจะแสดงเป็น “Option Presets” ใต้ Advanced Options ใน UI
  • พรีเซ็ตตัวอย่างทำงานดังนี้
    • sponsorblock: ลบเซกเมนต์ sponsor, selfpromo, interaction
    • embed-subs: ดาวน์โหลดคำบรรยายภาษาอังกฤษและเยอรมัน แล้วฝังลงในไฟล์วิดีโอ
    • limit-rate: จำกัดความเร็วดาวน์โหลดไว้ประมาณ 5 MB/s
  • หากเลือกหลายพรีเซ็ต ระบบจะใช้ตามลำดับ และตัวเลือกเดียวกันจะถูกพรีเซ็ตที่อยู่หลัง override พรีเซ็ตก่อนหน้า
  • หากตั้ง ALLOW_YTDL_OPTIONS_OVERRIDES เป็น true ใน UI จะมีช่อง JSON แบบป้อนอิสระ “Custom yt-dlp Options” ปรากฏขึ้น
  • override ต่อรายการดาวน์โหลดถูกปิดใช้งานโดยค่าเริ่มต้น
  • หากเปิดฟีเจอร์นี้ ผู้ที่เข้าถึง UI จะสามารถส่งตัวเลือก API ของ yt-dlp ใดก็ได้ และบางตัวเลือกอาจทำให้รันคำสั่งใดก็ได้ภายในคอนเทนเนอร์ ดังนั้นควรเปิดใช้เฉพาะใน สภาพแวดล้อมที่เชื่อถือได้ เท่านั้น
  • MeTube บังคับการทำงาน extract_flat, noplaylist ของตัวเองในขั้นตอนดึง metadata เริ่มต้น และพรีเซ็ตไม่สามารถ override key ในขั้นตอนนี้ได้

คุกกี้ การเชื่อมต่อเบราว์เซอร์ และทางลัด

  • เมื่อต้องดาวน์โหลดวิดีโอที่ถูกจำกัดหรือเป็นส่วนตัว สามารถใช้คุกกี้ของเบราว์เซอร์ได้
    • ส่งออกคุกกี้เป็น cookies.txt ด้วยส่วนขยาย Firefox หรือ Chrome
    • อัปโหลดผ่าน Upload Cookies ใน Advanced Options ของ MeTube
    • ลบคุกกี้ที่อัปโหลดด้วย Delete Cookies ในส่วนเดียวกัน
  • ส่วนขยายเบราว์เซอร์ช่วยให้คลิกขวาที่วิดีโอแล้วส่งไปยัง MeTube ได้โดยตรง
    • หากต้องใช้จากหน้า HTTPS อินสแตนซ์ MeTube ต้องอยู่หลัง HTTPS reverse proxy
    • ส่วนขยายจะส่งคำขอจาก origin chrome-extension://... หรือ moz-extension://... จึงจำเป็นต้องตั้งค่า CORS_ALLOWED_ORIGINS=*
  • ส่วนขยาย Chrome ติดตั้งได้จาก Google Chrome Webstore หรือจาก ซอร์ส
  • ส่วนขยาย Firefox ติดตั้งได้จาก Firefox Addons หรือใช้ ซอร์ส
  • iOS Shortcut สามารถส่ง URL จากเมนูแชร์ของ Safari ไปยัง MeTube ได้
  • Bookmarklet จะส่งเว็บเพจที่เปิดอยู่ไปยัง MeTube และบนหน้า HTTPS ต้องตั้งค่า MeTube เป็น HTTPS หรืออยู่หลัง HTTPS reverse proxy
  • Bookmarklet จะส่งคำขอข้าม origin จาก origin ของหน้าปัจจุบันไปยัง MeTube ดังนั้นต้องเพิ่ม origin ของไซต์ที่จะใช้เข้าไปใน CORS_ALLOWED_ORIGINS
  • MeTube extension สำหรับ Raycast ช่วยให้เพิ่มวิดีโอได้โดยตรงจาก Raycast

เว็บเซิร์ฟเวอร์, HTTPS, reverse proxy

  • การตั้งค่าเกี่ยวกับเว็บเซิร์ฟเวอร์ปรับด้วยตัวแปรสภาพแวดล้อม
    • HOST ค่าเริ่มต้นคือ 0.0.0.0
    • PORT ค่าเริ่มต้นคือ 8081
    • URL_PREFIX ใช้สำหรับ deploy ใต้ subpath หลัง reverse proxy
    • PUBLIC_HOST_URL และ PUBLIC_HOST_AUDIO_URL เปลี่ยน URL ฐานของลิงก์ดาวน์โหลดไฟล์ที่เสร็จแล้ว
  • หากตั้ง HTTPS เป็น true และระบุ CERTFILE, KEYFILE MeTube จะรันในโหมด HTTPS
  • reverse proxy ใช้สำหรับ HTTPS termination หรือการยืนยันตัวตนได้
  • อิมเมจ linuxserver/swag มีชิ้นส่วนการตั้งค่า subfolder, subdomain สำหรับ MeTube และการตั้งค่า authentication ของ Authelia รวมอยู่ด้วย
  • ตัวอย่าง NGINX proxy พาธ /metube/ ไปยัง http://metube:8081 และตั้ง header Upgrade กับ Connection เพื่อให้ WebSocket ทำงานได้
  • ยังมีตัวอย่าง reverse proxy สำหรับ Apache และ Caddy ด้วย

การอัปเดต การแก้ปัญหา และการพัฒนาในเครื่อง

  • MeTube พึ่งพา yt-dlp และเนื่องจากเลย์เอาต์ของเว็บไซต์วิดีโอเปลี่ยนแปลงบ่อย yt-dlp จึงต้องอัปเดตบ่อย
  • เมื่อมี stable release ใหม่ของ yt-dlp อิมเมจ Docker ใหม่ของ MeTube จะถูกเผยแพร่อัตโนมัติ
  • สามารถใช้ watchtower เป็นวิธีทำให้คอนเทนเนอร์เป็นเวอร์ชันล่าสุดอยู่เสมอได้
  • หากต้องการติดตาม nightly channel ของ yt-dlp ให้ตั้งเวลาในรูปแบบ HH:MM ที่จะอัปเกรดทุกวันและรีสตาร์ต MeTube ไว้ใน YTDL_NIGHTLY_UPDATE_TIME
  • สำหรับปัญหา authentication, post-processing, permission และ YTDL_OPTIONS แนะนำให้ debug โดยตรงกับ yt-dlp ก่อน แล้วจึงนำตัวเลือกที่ใช้งานได้มาใช้กับ MeTube
  • การ build และรันในเครื่องต้องใช้ Node.js 22+ และ Python 3.13
  • UI build ด้วย pnpm ติดตั้ง dependency ของ Python ด้วย uv sync แล้วรันด้วย uv run python3 app/main.py
  • อิมเมจ Docker build ในเครื่องได้ด้วย docker build -t metube . และในกระบวนการนี้ UI จะถูก build ไปพร้อมกัน

1 ความคิดเห็น

 
GN⁺ 2024-07-30
ความคิดเห็นจาก Hacker News
  • Tube Archivist ก็น่าพิจารณาเหมือนกัน ถ้าแค่ต้องการดาวน์โหลดวิดีโอไม่กี่รายการก็อาจจะเกินความจำเป็น แต่ผมใช้มันเก็บถาวรและทำดัชนีช่องเทคโนโลยีที่ชอบอยู่
    นอกจากทรานสคริปต์/ซับไตเติลแล้ว ยังสามารถ ค้นหาข้อความทั้งหมดและเมทาดาทา ได้ทั้งความคิดเห็น ชื่อเรื่อง และคำอธิบายด้วย ซึ่งน่าหงุดหงิดตรงที่มันดีกว่าสิ่งที่ Alphabet ให้มาเสียอีก
    https://www.tubearchivist.com/

    • ผมเคยดู TubeArchivist แล้วไม่ชอบตรงที่ต้องใช้ คอนเทนเนอร์ 3 ตัว จากนั้นไปเจอ Pinchflat ในซับเรดดิต selfhosted ซึ่งทำงานด้วยคอนเทนเนอร์ตัวเดียว ทำให้ deploy ง่าย และจนถึงตอนนี้ก็ยังทำงานได้ดี
      https://github.com/kieraneglin/pinchflat
    • อันนี้ผมอยากเลี่ยง การตั้งชื่อไฟล์ของมันพึ่งพาสมมติฐานว่า มีฐานข้อมูลอยู่
      ถ้าเป็นที่เก็บชั่วคราวก็พอเข้าใจได้ แต่ถ้าเครื่องมือที่เรียกตัวเองว่าเป็นซอฟต์แวร์ “เก็บถาวร” ก็ควรสมมติไว้ด้วยว่าตัวมันเองอาจอยู่ไม่ยืนยาวกว่าข้อมูลที่พยายามจะเก็บรักษา
      ตอนแรกคาดหวังเพราะดูเหมือน PeerTube clone ที่มีฟังก์ชันดาวน์โหลด แต่พอเห็นผลลัพธ์แล้วก็หมดสนใจ ใช้ yt-dlp พร้อมคอนฟิกและสคริปต์ฉลาด ๆ ยังทำงานเก็บถาวรได้ถูกต้องกว่า
    • Google ไม่มีทางทำให้ผลิตภัณฑ์ของตัวเองใช้งานได้สะดวกในแบบที่มีโครงสร้างและขั้นสูงหรอก เพราะวิธีแบบนั้นเป็นประโยชน์ต่อผู้ใช้มากเกินไป และมอบ การควบคุม ให้ผู้ใช้มากเกินไป Google ไม่ชอบอะไรแบบนั้น
    • วันนี้ก่อนหน้านี้มีอีกตัวเลือกหนึ่งขึ้นหน้าแรก: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • ผมคิดมานานแล้วว่าอยากย้ายไป Tube Archivist แต่มีวิดีโอ YouTube ที่สะสมไว้ด้วย TubeSync อยู่หลาย TB เลยไม่อยากดาวน์โหลดใหม่
      โชคดีที่ยังมีสตริงรูปแบบที่ใช้ตอนบันทึกชื่อไฟล์อยู่ และ TubeSync ใช้ Django กับ PostgreSQL เป็นแบ็กเอนด์ จึงอาจเชื่อมโยงกับ YouTube ID ได้ แต่ถึงอย่างนั้นการย้ายระบบก็ดูเป็นฝันร้ายพอสมควร
  • สิ่งที่อยากได้จริง ๆ คือ YouTube TiVo
    มีช่องราว 100 ช่องที่ติดตามดูแทบจะเป็นพิธีกรรม แต่ไม่ค่อยอัปโหลดบ่อย และผมไม่อยากพลาดวิดีโอจากช่องเหล่านี้เด็ดขาด
    ผมก็ไม่อยากไล่ค้นหาวิดีโอใหม่เป็นร้อย ๆ รายการจากช่องที่อัปวันละสี่ครั้งบน YouTube เพื่อหา 1–2 รายการที่อยากดูจริง ๆ สุดท้ายก็พลาดอยู่ดี
    อยากได้ ฟีดลำดับความสำคัญ ที่รวมเฉพาะสิ่งที่อยากดูหรือควรดูจริง ๆ และจะยิ่งดีถ้าดาวน์โหลดทั้งหมดมาดูผ่าน DLNA ได้
    การทำให้เราไม่พลาดสิ่งที่เราชอบไม่ใช่วิธีดำเนินงานของ YouTube วิธีของ YouTube คือทำให้เราดูวิดีโอที่ยืดจาก 3 นาทีเป็น 18–22 นาที พร้อมตรึงฟีดแบ็กไว้กับใบหน้าเรา

    • นั่นแก้ได้ด้วย การติดตาม YouTube ไม่ใช่หรือ? แค่ subscribe ช่องทั้ง 100 ช่องนั้นแล้วบุ๊กมาร์กหน้าการติดตาม ก็จะได้ฟีดลำดับความสำคัญที่มีแต่สิ่งที่อยากดู
      ถ้าไม่อยากสร้างบัญชีก็เข้าใจได้ และ NewPipe ก็น่าจะเหมาะ แต่ในเมื่อมีหน้าเฉพาะที่แสดงวิดีโอจากช่องที่เลือกเองตามลำดับเวลาอยู่แล้ว การบอกว่า “การทำให้เราไม่พลาดสิ่งที่เราชอบไม่ใช่วิธีของ YouTube” ก็ดูแปลกนิดหน่อย
    • NewPipe เหมาะกับงานนี้มาก เอาคอลัมน์ “Default Kiosk” ออกจากคอนเทนต์หน้าแรกแล้วเหลือไว้แค่ “What's New” ก็จะเห็นเฉพาะวิดีโอจากช่องที่ติดตาม การติดตามของ NewPipe ไม่ได้เชื่อมกับบัญชี Google เลย
    • เท่าที่รู้ YouTube ยังใช้ RSS อยู่ ลองใช้วิธีนั้นได้
    • ผมใช้ Invidious เพื่อจุดประสงค์นี้อยู่ ชอบตรงที่มีฟีดลำดับความสำคัญเฉพาะรายการที่ subscribe
      การค้นพบคอนเทนต์ใหม่ ๆ ไม่ค่อยดีนัก แต่ถ้านั่นไม่ใช่กรณีใช้งานที่ต้องการ ก็น่าลองดู
    • มีส่วนขยาย fraidycat ที่ผมใช้เพื่อทำสิ่งนั้นโดยเฉพาะ
      https://fraidyc.at/
  • มีอย่างหนึ่งที่ไม่เข้าใจ ทำไมต้องโฮสต์ไว้บนเซิร์ฟเวอร์ด้วย? ทำเป็น แอปแบบสแตนด์อโลน ที่รันบน Windows/Linux/mac ก็ได้ไม่ใช่หรือ
    ช่วงนี้เพิ่งเริ่มใช้ yt-dlp และกำลังคิดว่าจะลองทำแอปง่าย ๆ ดู น่าลองไหม? มีทางเลือกแนวนี้อยู่แล้วหรือเปล่า?

    • ถ้าต้องการ อุปกรณ์ Windows/Linux/OSX หรือเครื่องเสมือน/คอนเทนเนอร์บนเครื่องนั้นก็เป็นเซิร์ฟเวอร์ได้ วิธีนี้ทำให้ฝั่งผู้สร้างไม่จำเป็นต้องทำ UX สำหรับเว็บและ UX แบบเนทีฟ แยกกัน
      หลายคนรันแอปแบบ self-hosting บนเซิร์ฟเวอร์ภายนอก โฮมแล็บ หรือผสมกัน แล้วตั้งค่าทรัพยากรเหล่านั้นให้เป็นเหมือนโครงสร้างพื้นฐานที่มีแบ็กอัป ฯลฯ ส่วน PC/โน้ตบุ๊ก/แท็บเล็ต/โทรศัพท์ปล่อยให้เป็นไคลเอนต์หรือแคชที่ค่อนข้างเรียบง่าย ถ้าหายหรือเสียหายก็เปลี่ยนเครื่องได้ง่าย เพราะแค่ดึงคอนเทนต์ในเครื่องที่ซิงก์กับเซิร์ฟเวอร์กลับมาใหม่ นี่เป็นหนึ่งในเหตุผลที่ self-hosting แบบนี้ได้รับความนิยม
      เคยเห็นแอปเดสก์ท็อปที่ครอบ yt-dlp อยู่บ้าง ไม่เคยลองเองเลยพูดเรื่องเสถียรภาพหรือความน่าเชื่อถือได้ยาก แต่ถ้าไม่ได้อยากทำใหม่เพื่อความสนุก ก็ควรค้นหาก่อน อาจมีสิ่งที่ต้องการอยู่แล้ว
    • Celluloid ถ้าสั่งให้เปิด URL ที่รองรับ จะใช้ yt-dlp เพื่อสตรีมโดยอัตโนมัติ ส่วน Parabolic เป็นเครื่องมือดาวน์โหลดเฉพาะทางที่ใช้ yt-dlp
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • ถ้าดาวน์โหลดแค่วิดีโอ YouTube ก็ไม่จำเป็นต้องใช้ถึง yt-dlp ด้วยซ้ำ ทำได้ด้วยโค้ดและความซับซ้อนน้อยกว่านั้นมาก และผมใช้เป็นโปรแกรม C ขนาดเล็กมากอยู่ สคริปต์เชลล์เล็ก ๆ ก็ทำงานได้ดีพอ
      สิ่งที่ไม่มีใครพูดถึงคือ ตอนนี้ yt-dlp ดาวน์โหลด itag 22 ไม่ได้แล้ว และ itag 18 ถูกจำกัดความเร็ว ดังนั้น yt-dlp จึงต้องดาวน์โหลดไฟล์เสียงกับไฟล์วิดีโอแยกกัน แล้วค่อยรวมด้วย ffmpeg
      รายได้โฆษณาของ YouTube เพิ่งพลาดประมาณการตามฉันทามติไป การเข้าถึงวิดีโอ YouTube อาจแย่ลงอีกในอนาคต
      ถ้าไม่ได้มีนิสัยเลือกฟอร์แมตเฉพาะ ก็คงมีโอกาสสูงที่จะไม่ค่อยรู้สึกถึงเรื่องนี้ ตัวอย่างเช่น บางคนใช้แต่ itag 18 กับ 22 มาหลายปี
    • ยังมี Freetube ด้วย
      https://freetubeapp.io/
    • อาจอยากดาวน์โหลดและเก็บวิดีโอไว้บน NAS หรือโฮมเซิร์ฟเวอร์ ไม่ใช่บนอุปกรณ์ที่ใช้อยู่ตอนนี้
      เว็บแอปที่ทำเป็น Docker ทำและดูแลรักษาง่ายกว่าการทำไคลเอนต์เดสก์ท็อป/มือถือแยกสำหรับ Windows, macOS, Android, iOS, Linux มาก
  • ถ้ามีอินเทอร์เฟซที่ทำงานร่วมกับ Jellyfin ได้ก็คงดี อยากให้ค้นหา YouTube แล้วดาวน์โหลดด้วย yt-dlp จากนั้นสตรีมผ่าน Jellyfin แบบไม่มีโฆษณา

    • ผมใช้งานเกือบแบบนั้นอยู่แล้ว เพียงแต่ขั้นตอน yt-dlp ยังทำเอง ถ้ามี ปลั๊กอิน Jellyfin ก็คงยอดเยี่ยม
  • ค่อนข้างเจ๋ง ตอนนี้ใช้ https://cobalt.tools อยู่ ซึ่งอันนี้ก็ใช้ได้ดีเหมือนกัน

    • สมบูรณ์แบบ มีตัวเลือกให้ดาวน์โหลดรูปแบบเสียงต้นฉบับของ YouTube โดยไม่ทรานส์โค้ดเป็น mp3
  • เพิ่งรู้ว่า Brave บน iOS มีปุ่มเพลย์ลิสต์สำหรับดาวน์โหลดวิดีโอ YouTube มาเก็บไว้ในเครื่องได้ ใช้ PiP และเล่นออฟไลน์ได้ แถมไม่มีโฆษณา
    ใช้ไลเซนส์แบบเปิดบนแบ็กเอนด์ Mozilla iOS เลยสงสัยว่าทำไมแอปอื่น ๆ ไม่ทำแบบนี้มากกว่านี้ พวกเขาหาวิธีให้ Apple ยอมรับได้ และ CEO ก็เคยโพสต์ปกป้องเทคนิคนี้ที่นี่ว่าเหมาะสม
    โดยแก่นแล้วมันจะทำงานก็ต่อเมื่อโหลดวิดีโอภายในเว็บไซต์ YouTube ปกติก่อน และเป็นเหมือนปุ่มโหมดอ่านที่ใช้ได้กับคอนเทนต์วิดีโอใด ๆ ไม่ใช่แค่ YouTube

  • แปลกใจนิดหน่อยที่มีเครื่องมือมิเรอร์ YouTube มากขนาดนี้ ถ้าใช้เครื่องมือแบบนี้ เหตุผลที่ต้อง ดาวน์โหลด/เก็บถาวร วิดีโอ แทนที่จะสตรีมจาก YouTube โดยตรงคืออะไร?
    เข้าใจว่าบางครั้งการเก็บไว้เผื่อกรณีถูกลบจาก YouTube ก็เป็นเรื่องดี แต่สำหรับผมมันเกิดขึ้นน้อยมาก ดูวิดีโอจบแล้วก็จบ ต่อให้กลับไปดูไม่ได้ก็ไม่ค่อยเป็นไร

    • มีหลายเหตุผลที่ไม่สตรีมจาก YouTube แต่ดาวน์โหลดหรือเก็บถาวรแทน
      อย่างแรก การกำจัดโฆษณา เป็นเหตุผลใหญ่ทีเดียวสำหรับหลายคน
      อย่างที่สอง ตามที่เขียนไว้แล้ว ถ้าวิดีโอหรือทั้งช่องถูกถอดลงเพราะการร้องเรียนลิขสิทธิ์หรือรายงานอื่น ๆ ก็สตรีมอีกไม่ได้แล้ว ขึ้นอยู่กับคอนเทนต์ที่ดู เรื่องนี้อาจสำคัญกับบางคนมากกว่าคุณมาก
      อย่างที่สาม ดาวน์โหลดไว้เพื่อเล่นออฟไลน์ได้ แอป YouTube ทางการก็ทำได้ แต่ต้องจ่าย Premium ซึ่งราคาดูสูงเกินไป และยังได้รับผลกระทบจากปัญหาการลบอยู่ดี
      อย่างที่สี่คือ การทำดัชนีในเครื่อง ถ้าจะอ้างอิงวิดีโอเพื่อกลับมาดูหรือแชร์ในภายหลัง การจัดเก็บตามโครงสร้างของตัวเองอาจสะดวกกว่าการเก็บบุ๊กมาร์กไปยังสำเนาบน YouTube หรือค้นหาใหม่ทุกครั้ง
      เหตุผลข้างต้นอาจผสมกัน และน่าจะมีเหตุผลอื่นที่ผมไม่ได้พิจารณาหรือจำไม่ได้ด้วย
    • สำหรับผมก็เหตุผลเดียวกับที่คนเคยใช้ VCR นั่นแหละ ไม่ใช่ “การละเมิดลิขสิทธิ์” แต่เป็นการบันทึกไว้ดูภายหลัง หรือดูตอนที่ไม่มีอินเทอร์เน็ตหรือเน็ตช้า
      ส่วนใหญ่ที่ผมดาวน์โหลด ดูครั้งเดียวแล้วก็ลบ
    • ในเครือข่ายบ้านของเด็ก ๆ ผมบล็อก YouTube แล้วให้เข้าถึง DadTube ที่ผมคัดเลือกเองแทน
    • คุณบอกว่าสงสัยว่าทำไมเครื่องมือถึงมีอยู่ แต่ก็ยกเหตุผลสำคัญที่สุดที่เครื่องมือนั้นควรมีอยู่ขึ้นมาเองแล้ว
      แถมยังมีเวลาที่สตรีม YouTube ไม่ได้ด้วย เช่น อินเทอร์เน็ตล่ม ใช้แพ็กเกจมือถือในต่างประเทศที่ค่าใช้จ่ายหนัก หรือแค่อยากกำจัดโฆษณาห่วย ๆ
    • เพราะ ข้อจำกัดปริมาณการใช้แบนด์วิดท์ ถ้าอยากเปิดเพลย์ลิสต์มิวสิกวิดีโอเดิม ๆ ซ้ำ ๆ ก็จะกินโควตาไปพอสมควร
  • ที่เกี่ยวข้อง: Yark: YouTube Archiver with Offline UI
    https://news.ycombinator.com/item?id=41100820

  • หากนำเซิร์ฟเวอร์ตัวใดตัวหนึ่งที่ใช้ yt-dlp มาครอบด้วย เครื่องมือสร้างอิมเมจแบบง่าย ๆ คล้าย Pi-hole และแอปไคลเอนต์ฟรอนต์เอนด์สำหรับเล่นที่พอใช้ได้ ผมคิดว่ามันอาจดังขึ้นมาได้มากเหมือนที่ Pi-hole แพร่หลายในหมู่ผู้ใช้ที่ไม่ค่อยถนัดเทคนิค
    แนวทางคือซื้อ Raspberry Pi, เขียนอิมเมจลงการ์ด microSD, เลือกช่อง YouTube ที่ชอบ แล้วติดตั้งแอปไคลเอนต์ จากนั้นคอนเทนต์ YouTube ที่ชอบทั้งหมดก็จะพร้อมใช้งานแบบโลคัลโดยไม่มีโฆษณา

  • ตอนนี้ผมใช้ TubeSync อยู่ ฟังก์ชันเรียบง่ายและมีบั๊กเยอะ แต่สำหรับผมมันทำงานได้ดีพอ
    สิ่งที่ต้องทำก็แค่สมัครติดตามช่องหรือเพลย์ลิสต์, ดาวน์โหลดวิดีโอลงพาธที่กำหนด และตรวจสอบคอนเทนต์ใหม่วันละครั้ง
    UX ที่จำเป็นมีแค่การตั้งค่าช่อง จากนั้นก็แค่เก็บไฟล์ไว้แล้วปล่อยให้ Plex จัดการเอง มีใครรู้ตัวเลือกที่ดีกว่านี้ไหม?