重要的
自 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
选项,因为格式已明确提供。
// 选择视频格式的示例。let info = wait ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, {quality: '134' });console.log('找到格式!',格式);
如果您只想使用某些格式,可以使用上面的filter
选项。
// 将格式过滤为仅音频的示例。let info = wait ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formats with only audio: ' +音频格式.长度);
如果给定字符串满足 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-StatusCode 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测试