重要的
自 2023 年 7 月 14 日起,該儲存庫的積極開發已暫停。雖然它可能仍然適用於某些場景,但請注意,支援現在僅由社區處理,且 PR 目前未合併到儲存庫中。對於持續更新,我們鼓勵您探索 @distube/ytdl-core 等分支。未來我們可能會重新審視發展。感謝您的關注和長期以來的支持!
謹致問候 TFAN, 2024-08-13
另一個 YouTube 下載模組。僅使用 Javascript 和節點友善的流介面編寫。
您可以聯絡我們以取得聊天伺服器上的支持
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: import ytdl from 'ytdl-core'; with --esModuleInterop// TypeScript: import * as ytdl from 'ytdl-core'; with --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core');沒有上述ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
嘗試從給定的 URL 下載影片。傳回一個可讀的串流。除了任何getInfo()
選項和chooseFormat()
選項之外, options
還可以具有以下內容。
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
。
對於直播視頻,這也接受 unix 時間戳或 Date 對象,預設為Date.now()
。
對於非直播視頻,此選項不太可靠,請參閱#129 和#219。
liveBuffer
- 用於即時視訊的時間緩衝區(以毫秒為單位)。預設值為20000
。
highWaterMark
- 下載緩衝到記憶體中的影片量。有關更多信息,請參閱節點的文檔。預設為 512KB。
dlChunkSize
- 當選擇的格式僅是視訊或僅音訊時,下載將被分成多個區塊以避免限制。此選項指定每個區塊的大小(以位元組為單位)。將其設為 0 將禁用分塊。預設為 10MB。
IPv6Block
- 輪流通過的 IPv6 區塊,是使用代理的替代方法。閱讀更多。預設為undefined
。
ytdl.videoInfo
- 資訊。
ytdl.videoFormat
- 影片格式。
取得視訊info
以及選擇的下載格式時發出。
number
- 以位元組為單位的區塊長度或段號。
number
- 下載的總位元組或段。
number
- 總位元組或段。
每當收到新塊時發出。傳遞描述下載進度的值。
所有 miniget 事件都會被轉發,並且可以從返回的流中偵聽。
呼叫中止並停止下載影片。
如果您只想從影片中獲取元訊息,請使用此選項。
從影片中獲取元資訊。包括其他格式,並準備下載解密的 URL。這就是ytdl()
函數內部所使用的內容。
options
可以有以下內容
requestOptions
- 任何要合併到呼叫 miniget 的請求選項中的內容,例如headers
。
requestCallback
- 提供一個回呼函數,用於接收在取得元資訊時使用的 miniget 請求流物件。
lang
- 語言的 2 個字元符號。預設為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
將首先選擇 360p 的格式 18,因為它是視訊和音訊品質最高的格式。如果您想要更高品質的視訊和音訊格式,請參閱有關處理單獨串流的部分。
filter
- 用於過濾可供選擇的格式清單。可以是audioandvideo
或videoandaudio
來過濾同時包含視訊和音訊的格式, video
來過濾包含視訊的格式,或videoonly
來過濾包含視訊且沒有附加音軌的格式。也可以是audio
或audioonly
。您可以提供一個過濾函數,該函數會在每種可用格式下被呼叫。此函數將format
物件作為其第一個參數,如果格式更合適,則應傳回 true。
// 自訂函數範例.ytdl(url, { filter: format => format.container === 'mp4' })
format
- 主要用於下載特定的視訊或音訊串流。這可以是從getInfo
傳回的特定format
物件。
提供此選項將忽略filter
和quality
選項,因為格式已明確提供。
// 選擇影片格式的範例。 );
如果您只想使用某些格式,可以使用上面的filter
選項。
// 將格式過濾為僅有音訊的範例。音頻格式.長度);
如果給定字串滿足 YouTube 的 ID 格式,則傳回 true。
如果能夠解析出有效的視訊 ID,則傳回 true。
從 YouTube URL 返回影片 ID。如果無法解析 ID,則拋出錯誤。
與上面的ytdl.getURLVideoID()
相同,但可以直接使用視訊 ID 調用,在這種情況下它會返回它。這是 ytdl 內部使用的。如果無法解析 ID,則拋出錯誤。
直接從 package.json 取得的版本字串。
ytdl 無法下載屬於以下類型的視頻
區域限制(需要代理)
私人(如果您有權訪問,則需要 cookie)
租賃(如果您有權訪問,則需要 cookie)
YouTube Premium 內容(如果您有權訪問,則需要 Cookie)
目前僅支援 HLS 直播。其他格式將在 ytdl.chooseFormats 中過濾掉
產生的下載連結有效期為 6 小時,且只能從相同 IP 位址下載。
當請求過多時,YouTube 可能會阻止。這將導致您的請求被拒絕,並顯示 HTTP 狀態代碼 429。
將 ytdl-core 更新到最新版本
使用代理(您可以在此處找到範例)
透過輪換 (IPv6-) 位址擴展代理理念
閱讀此內容以獲取有關此內容的更多信息
使用 cookie(您可以在此處找到範例)
若要使其生效,您必須先等待當前速率限製到期
等待它(它通常會在幾天內消失)
對於請求密集型任務,將請求分散到多個來源 IP 位址可能會很有用。更改您使用的來源 IP 與使用代理類似,只不過不繞過區域鎖定等限制。 IP 位址越多,每個 IP 的請求就越少,從而提高速率限制。由於 IPv4 位址是有限資源,我們建議使用 IPv6。
使用 IPv6 區塊本質上是根據您的請求擁有數百萬個 IPv6 位址。在 /64 IPv6 區塊(通常是分配給單一家庭的區塊)中,有 18,446,744,073,709,551,616 個唯一的 IPv6 位址。這將允許您使用不同的 IPv6 位址發出每個請求。
儘管使用 IP 區塊確實有助於克服速率限制,但它要求您將主機系統設定為接受來自 IP 區塊中每個訊息的 http 流量。我們無法幫助您設定任何特定的主機/託管供應商,但搜尋互聯網很可能可以。
通常 1080p 或更好的視訊沒有編碼音訊。音訊必須單獨下載並透過編碼庫合併。 ffmpeg
是使用最廣泛的工具,有許多可用的 Node.js 模組。使用從ytdl.getInfo
傳回的format
物件下載特定的串流以進行組合以滿足您的需求。有關執行此操作的範例,請參閱 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 。
查看他們的儲存庫,看看他們是否已經有更新 ytdl-core 的活動拉取請求。如果他們不這樣做,請打開一個問題,要求他們更新 ytdl-core,或者更好的是,分叉該項目並提交包含更新版本的拉取請求。
當您等待拉取請求合併時,您可以在package.json
中指向其分支
“ytdl-core-discord”:“amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1”
使用過時版本 ytdl-core 的問題變得如此普遍,以至於 ytdl-core 現在在運行時每 12 小時檢查一次更新。如果發現更新,它會在控制台上列印警告,建議您進行更新。由於該庫的性質,隨著 YouTube 不斷更新,始終使用最新版本非常重要。
如果您想要停用此更新檢查,可以透過提供YTDL_NO_UPDATE
環境變數來實現。
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - 一個 cli 包裝器。
pully - 另一個針對高品質格式的 cli 包裝器。
ytsr - YouTube 影片搜尋結果。
ytpl - YouTube 播放清單和頻道解析器。
測試是用 mocha 寫的
npm測試