สำคัญ
การพัฒนาที่ดำเนินการอยู่ในพื้นที่เก็บข้อมูลนี้ถูกหยุดชั่วคราวตั้งแต่ 14-07-2023 แม้ว่ามันอาจจะยังคงใช้งานได้ในบางสถานการณ์ โปรดทราบว่าขณะนี้การสนับสนุนได้รับการจัดการโดยชุมชนแต่เพียงผู้เดียว และขณะนี้ PR ไม่ได้ถูกรวมเข้ากับ Repo สำหรับการอัปเดตอย่างต่อเนื่อง เราขอแนะนำให้คุณสำรวจ Forks เช่น @distube/ytdl-core เราอาจทบทวนการพัฒนาอีกครั้งในอนาคต ขอบคุณสำหรับความสนใจและการสนับสนุนที่ยาวนานของคุณ!
ขอแสดงความนับถือ TFAN, 13-08-2024
อีกโมดูลการดาวน์โหลด YouTube เขียนด้วย Javascript เท่านั้นและอินเทอร์เฟซการสตรีมที่เป็นมิตรกับโหนด
คุณสามารถติดต่อเราเพื่อรับการสนับสนุนบนเซิร์ฟเวอร์แชทของเรา
const fs = need('fs');const ytdl = need('ytdl-core');// TypeScript: นำเข้า ytdl จาก 'ytdl-core'; ด้วย --esModuleInterop// TypeScript: import * as ytdl จาก 'ytdl-core'; ด้วย --allowSyntheticDefaultImports// TypeScript: import ytdl = need('ytdl-core'); โดยไม่มีทั้งข้างบน ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
พยายามดาวน์โหลดวิดีโอจาก URL ที่กำหนด ส่งคืนสตรีมที่อ่านได้ options
สามารถมีดังต่อไปนี้ นอกเหนือจากตัวเลือก getInfo()
และ chooseFormat()
range
- ช่วงไบต์ในรูปแบบ {start: INT, end: INT}
ที่ระบุส่วนของไฟล์ที่จะดาวน์โหลด เช่น {start: 10355705, end: 12452856} ไม่รองรับรูปแบบแบบแบ่งส่วน (DASH MPD, m3u8)
การดำเนินการนี้จะดาวน์โหลดไฟล์บางส่วน ไม่ใช่วิดีโอที่แยกส่วนกัน
begin
- เวลาใดในวิดีโอที่จะเริ่ม รองรับรูปแบบ 00:00:00.000
, 0ms, 0s, 0m, 0h
หรือจำนวนมิลลิวินาที ตัวอย่าง: 1:30
, 05:10.123
, 10m30s
สำหรับวิดีโอถ่ายทอดสด สิ่งนี้ยังยอมรับการประทับเวลาแบบยูนิกซ์หรืออ็อบเจ็กต์ Date และมีค่าเริ่มต้นเป็น Date.now()
ตัวเลือกนี้ไม่น่าเชื่อถือสำหรับวิดีโอที่ไม่ได้ถ่ายทอดสด ดู #129 และ #219
liveBuffer
- ระยะเวลาบัฟเฟอร์ที่จะใช้สำหรับวิดีโอสดในหน่วยมิลลิวินาที ค่าเริ่มต้นคือ 20000
highWaterMark
- จำนวนการดาวน์โหลดวิดีโอที่จะบัฟเฟอร์ลงในหน่วยความจำ ดูเอกสารของโหนดสำหรับข้อมูลเพิ่มเติม ค่าเริ่มต้นคือ 512KB
dlChunkSize
- เมื่อรูปแบบที่เลือกเป็นวิดีโอเท่านั้นหรือเสียงเท่านั้น การดาวน์โหลดจะถูกแยกออกเป็นหลายส่วนเพื่อหลีกเลี่ยงการควบคุมปริมาณ ตัวเลือกนี้ระบุขนาดของแต่ละก้อนเป็นไบต์ การตั้งค่าเป็น 0 จะปิดใช้งานการแบ่งส่วน ค่าเริ่มต้นคือ 10MB
IPv6Block
- บล็อก IPv6 ที่จะหมุนเวียน ทางเลือกแทนการใช้พรอกซี อ่านเพิ่มเติม ค่าเริ่มต้นเป็น undefined
ytdl.videoInfo
- ข้อมูล
ytdl.videoFormat
- รูปแบบวิดีโอ
เผยแพร่เมื่อมีการเรียก info
วิดีโอ พร้อมด้วยรูปแบบที่เลือกเพื่อดาวน์โหลด
number
- ความยาวชิ้นเป็นไบต์หรือหมายเลขเซ็กเมนต์
number
- จำนวนไบต์หรือเซ็กเมนต์ทั้งหมดที่ดาวน์โหลด
number
- จำนวนไบต์หรือเซ็กเมนต์ทั้งหมด
ปล่อยออกมาทุกครั้งที่ได้รับชิ้นใหม่ ส่งผ่านค่าที่อธิบายความคืบหน้าในการดาวน์โหลด
กิจกรรมมินิเก็ตทั้งหมดจะถูกส่งต่อและสามารถฟังได้จากสตรีมที่ส่งคืน
โทรเพื่อยกเลิกและหยุดการดาวน์โหลดวิดีโอ
ใช้สิ่งนี้หากคุณต้องการรับข้อมูลเมตาจากวิดีโอเท่านั้น
รับข้อมูลเมตาจากวิดีโอ รวมรูปแบบเพิ่มเติม และพร้อมดาวน์โหลด URL ที่ถอดรหัสแล้ว นี่คือสิ่งที่ฟังก์ชัน ytdl()
ใช้เป็นการภายใน
options
สามารถมีดังต่อไปนี้
requestOptions
- สิ่งใดก็ตามที่จะรวมเข้ากับตัวเลือกคำขอที่เรียก miniget ด้วย เช่น headers
requestCallback
- จัดเตรียมฟังก์ชันการโทรกลับที่ได้รับออบเจ็กต์สตรีมคำขอ miniget ที่ใช้ขณะดึงข้อมูลเมตา
lang
- สัญลักษณ์อักขระ 2 ตัวของภาษา ค่าเริ่ม en
คือ en
เมื่อคุณได้รับข้อมูลเมตาจากวิดีโอที่มีฟังก์ชัน ytdl.getInfo
แล้ว คุณสามารถส่งข้อมูลนั้นพร้อมกับตัวเลือกอื่นๆ ไปยังฟังก์ชันนี้ได้
สามารถใช้ได้หากคุณต้องการเลือกรูปแบบด้วยตัวเอง ส่งข้อผิดพลาดหากไม่พบรูปแบบที่ตรงกัน
options
สามารถมีดังต่อไปนี้
quality
- คุณภาพวิดีโอที่จะดาวน์โหลด อาจเป็นค่า Itag รายการค่า Itag หรือหนึ่งในสตริงเหล่านี้: highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
highestaudio
/ lowestaudio
พยายามลดบิตเรตของวิดีโอให้เหลือน้อยที่สุดเพื่อให้ได้รูปแบบเสียงที่ดีพอ ๆ กัน ในขณะที่ highestvideo
/ lowestvideo
พยายามย่อขนาดเสียงตามลำดับ ค่าเริ่มต้นคือ highest
ซึ่งชอบรูปแบบที่มีทั้งวิดีโอและเสียง
รูปแบบของวิดีโอโดยทั่วไปจะถูกจัดเรียงในลักษณะต่อไปนี้โดยใช้ quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
ระบบจะเลือกรูปแบบ 18 ที่ 360p ก่อน เนื่องจากเป็นรูปแบบคุณภาพสูงสุดที่มีทั้งวิดีโอและเสียง หากคุณต้องการรูปแบบคุณภาพสูงขึ้นพร้อมทั้งวิดีโอและเสียง โปรดดูส่วนการจัดการสตรีมแยกกัน
filter
- ใช้เพื่อกรองรายการรูปแบบให้เลือก อาจเป็น audioandvideo
หรือ videoandaudio
เพื่อกรองรูปแบบที่มีทั้งวิดีโอและเสียง video
เพื่อกรองรูปแบบที่มีวิดีโอ หรือ videoonly
สำหรับรูปแบบที่มีวิดีโอและไม่มีแทร็กเสียงเพิ่มเติม อาจเป็น audio
หรือ audioonly
ก็ได้ คุณสามารถกำหนดฟังก์ชันการกรองที่ถูกเรียกในแต่ละรูปแบบได้ ฟังก์ชันนี้กำหนดให้วัตถุ format
เป็นอาร์กิวเมนต์แรก และควรคืนค่าเป็นจริงหากรูปแบบนั้นดีกว่า
// ตัวอย่างด้วย function.ytdl ที่กำหนดเอง (url, { filter: format => format.container === 'mp4' })
format
- ใช้เพื่อดาวน์โหลดสตรีมวิดีโอหรือเสียงโดยเฉพาะ นี่อาจเป็นออบเจ็กต์ format
เฉพาะที่ส่งคืนจาก getInfo
การระบุตัวเลือกนี้จะไม่สนใจตัวเลือก filter
และ quality
เนื่องจากมีการระบุรูปแบบไว้อย่างชัดเจน
// ตัวอย่างการเลือกรูปแบบวิดีโอ.let info = await ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { quality: '134' });console.log('Format found!', รูปแบบ);
หากคุณต้องการใช้งานเฉพาะบางรูปแบบ คุณสามารถใช้ตัวเลือก filter
ด้านบนได้
// ตัวอย่างการกรองรูปแบบเป็นเสียงเท่านั้น Let info = await ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formats with only audio: ' + audioFormats.ความยาว);
คืนค่าเป็นจริงหากสตริงที่กำหนดสอดคล้องกับรูปแบบ ID ของ YouTube
คืนค่าเป็นจริงหากสามารถแยกวิเคราะห์รหัสวิดีโอที่ถูกต้องได้
ส่งกลับรหัสวิดีโอจาก URL ของ YouTube ส่งข้อผิดพลาดหากล้มเหลวในการแยกวิเคราะห์ ID
เช่นเดียวกับ ytdl.getURLVideoID()
ข้างต้น แต่สามารถเรียกด้วยรหัสวิดีโอได้โดยตรง ซึ่งในกรณีนี้จะส่งคืนรหัสนั้น นี่คือสิ่งที่ ytdl ใช้เป็นการภายใน ส่งข้อผิดพลาดหากล้มเหลวในการแยกวิเคราะห์ ID
สตริงเวอร์ชันที่นำมาจาก package.json โดยตรง
ytdl ไม่สามารถดาวน์โหลดวิดีโอที่อยู่ในรายการต่อไปนี้
จำกัดภูมิภาค (ต้องใช้พร็อกซี)
ส่วนตัว (หากคุณมีสิทธิ์เข้าถึง ต้องใช้คุกกี้)
การเช่า (หากคุณมีสิทธิ์เข้าถึง ต้องใช้คุกกี้)
เนื้อหา YouTube Premium (หากคุณเข้าถึงได้ ต้องใช้คุกกี้)
ขณะนี้รองรับเฉพาะ HLS Livestreams เท่านั้น รูปแบบอื่นๆ จะถูกกรองออกใน ytdl.chooseFormats
ลิงค์ดาวน์โหลดที่สร้างขึ้นมีอายุ 6 ชั่วโมง และสามารถดาวน์โหลดได้จากที่อยู่ IP เดียวกันเท่านั้น
เมื่อทำการร้องขอมากเกินไป YouTube อาจบล็อก ซึ่งจะส่งผลให้คำขอของคุณถูกปฏิเสธด้วย HTTP-StatusCode 429 ขั้นตอนต่อไปนี้อาจช่วยคุณได้:
อัปเดต ytdl-core เป็นเวอร์ชันล่าสุด
ใช้พรอกซี (คุณสามารถดูตัวอย่างได้ที่นี่)
ขยายแนวคิด Proxy โดยการหมุน (IPv6-) ที่อยู่
อ่านสิ่งนี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้
ใช้คุกกี้ (คุณสามารถดูตัวอย่างได้ที่นี่)
เพื่อให้สิ่งนี้มีผล คุณต้องรอให้อัตราปัจจุบันหมดอายุก่อน
รอสักครู่ (โดยปกติจะหายไปภายในไม่กี่วัน)
สำหรับงานที่มีการร้องขอสูง อาจเป็นประโยชน์ในการกระจายคำขอของคุณไปยังที่อยู่ IP ของแหล่งที่มาหลายแห่ง การเปลี่ยน IP ต้นทางที่คุณใช้จะคล้ายกับการใช้พร็อกซี ยกเว้นว่าไม่มีการข้ามข้อจำกัด เช่น การล็อกภูมิภาค ที่อยู่ IP ที่มากขึ้นส่งผลให้คำขอต่อ IP น้อยลง และทำให้อัตราจำกัดของคุณเพิ่มขึ้น เนื่องจากที่อยู่ IPv4 เป็นทรัพยากรที่จำกัด เราจึงแนะนำให้ใช้ IPv6
การใช้บล็อก IPv6 คือการมีที่อยู่ IPv6 หลายล้านรายการตามคำขอของคุณ ในบล็อก /64 IPv6 (ซึ่งโดยปกติจะเป็นบล็อกที่มอบให้กับครัวเรือนเดียว) มีที่อยู่ IPv6 ที่ไม่ซ้ำกัน 18,446,744,073,709,551,616 รายการ สิ่งนี้จะช่วยให้คุณสามารถส่งคำขอแต่ละรายการด้วยที่อยู่ IPv6 ที่แตกต่างกัน
แม้ว่าการใช้ IP-Block จะช่วยป้องกันขีดจำกัดอัตรา แต่คุณก็ต้องตั้งค่าระบบโฮสต์ให้ยอมรับการรับส่งข้อมูล http จากทุกข้อความใน IP-Block เราไม่สามารถช่วยเหลือคุณในการตั้งค่าสำหรับโฮสต์ / ผู้ให้บริการโฮสติ้งรายใดรายหนึ่งได้ แต่การค้นหาทางอินเทอร์เน็ตน่าจะสามารถทำได้
โดยทั่วไปแล้ว วิดีโอที่มีความละเอียด 1080p หรือดีกว่าจะไม่มีการเข้ารหัสเสียงด้วย ต้องดาวน์โหลดเสียงแยกต่างหากและรวมเข้าด้วยกันผ่านไลบรารีการเข้ารหัส ffmpeg
เป็นเครื่องมือที่ใช้กันอย่างแพร่หลาย โดยมีโมดูล Node.js มากมายให้เลือกใช้ ใช้ออบเจ็กต์ format
ที่ส่งคืนจาก ytdl.getInfo
เพื่อดาวน์โหลดสตรีมที่ต้องการเพื่อรวมเข้าด้วยกันเพื่อให้เหมาะกับความต้องการของคุณ ดู example/ffmpeg.js เพื่อดูตัวอย่างในการดำเนินการนี้
YouTube อัปเดตเว็บไซต์ของตนตลอดเวลา ซึ่งไม่ใช่เรื่องยากที่สิ่งนี้จะหยุดทำงาน หากไม่ได้ผลสำหรับคุณและคุณกำลังใช้เวอร์ชันล่าสุด อย่าลังเลที่จะเปิดประเด็นขึ้นมา ตรวจสอบให้แน่ใจว่าไม่มีข้อผิดพลาดเดียวกันนี้อยู่หรือไม่
ทำการทดสอบที่ test/irl-test.js
เพื่อให้แน่ใจว่านี่เป็นปัญหาของ ytdl-core จริงๆ
npm run test:irl
การทดสอบเหล่านี้ไม่ได้ล้อเลียน แต่จะพยายามดาวน์โหลดวิดีโอบางรายการ หากสิ่งเหล่านี้ล้มเหลว ก็ถึงเวลาแก้ไขจุดบกพร่อง หากข้อผิดพลาดที่คุณได้รับคือการถอดรหัสลายเซ็น ให้ตรวจสอบ lib/sig.js
มิฉะนั้น อาจเกิดข้อผิดพลาดภายใน lib/info.js
npm ติดตั้ง ytdl-core@latest
หรือสำหรับผู้ใช้ Yarn:
เส้นด้ายเพิ่ม ytdl-core@latest
ตรวจสอบให้แน่ใจว่าคุณกำลังติดตั้ง ytdl-core เวอร์ชันล่าสุดเพื่อติดตามการแก้ไขล่าสุด
หากคุณใช้บอทหรือแอปที่ใช้ ytdl-core เช่น ytdl-core-discord หรือ discord-player อาจขึ้นอยู่กับเวอร์ชันเก่ากว่า หากต้องการอัปเดตเวอร์ชัน ytdl-core ไลบรารีนั้นจะต้องอัปเดตไฟล์ package.json
คุณไม่สามารถเปลี่ยนเวอร์ชันบน package.json
ของโปรเจ็กต์ของคุณได้ แอปจะยังคงใช้ ytdl-core เวอร์ชันเก่ากว่าของตัวเอง
ดูใน repo เพื่อดูว่าพวกเขามีคำขอดึงที่ใช้งานอยู่ซึ่งอัปเดต ytdl-core อยู่แล้วหรือไม่ หากไม่เป็นเช่นนั้น ให้เปิดปัญหาเพื่อขอให้อัปเดต ytdl-core หรือดีกว่านั้น ให้แยกโปรเจ็กต์และส่งคำขอ Pull ด้วยเวอร์ชันที่อัปเดต
ขณะที่คุณรอการดึงคำขอรวม คุณสามารถชี้ไปที่สาขาใน package.json
ของคุณได้
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
ปัญหาการใช้ ytdl-core เวอร์ชันเก่าเริ่มแพร่หลายมาก จนตอนนี้ ytdl-core ตรวจสอบการอัปเดต ณ รันไทม์ และทุกๆ 12 ชั่วโมง หากพบการอัปเดต ระบบจะพิมพ์คำเตือนไปยังคอนโซลเพื่อแนะนำให้คุณอัปเดต เนื่องจากลักษณะของไลบรารีนี้ การใช้เวอร์ชันล่าสุดเสมอจึงเป็นสิ่งสำคัญเนื่องจาก YouTube อัปเดตอย่างต่อเนื่อง
หากคุณต้องการปิดใช้งานการตรวจสอบการอัปเดตนี้ คุณสามารถทำได้โดยระบุตัวแปร env YTDL_NO_UPDATE
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - wrapper cli ของสิ่งนี้
pully - wrapper cli อีกอันหนึ่งของสิ่งนี้มุ่งเป้าไปที่รูปแบบคุณภาพสูง
ytsr - ผลการค้นหาวิดีโอ YouTube
ytpl - เพลย์ลิสต์ YouTube และตัวแก้ไขช่อง
การทดสอบเขียนด้วยมอคค่า
การทดสอบเวลาต่อนาที