自动调试
关于这个叉子
这是原始的Youtube-transcript包的叉子,有弹性取出管. 它首先尝试了YouTube的"内通"API,并在需要时倒回HTML刮取,因此一个被屏蔽的单一路由不会断断记录稿检索.
怎么样
- 内立方块先: Android 和 iOS 客户端的签名字幕 URL, 自动旋转
- HTML 刮回倒计时 当内tube返回无标题时
- 可重新使用的客户端 有超时、重试、货币限额和缓存
- 批量获取 包含每集视频结果
- 有力解析器 srv1、 srv3 和 json3 标题格式
- 完成 HTML 实体解码 包括数字和双编码实体
见 变动情况 为完整的历史.
从1.x升级
2.0.0版本改变可观察到的行为. 静态 fetchTranscript API持续工作,但这些点可能需要调整:
- 首选手动字幕 超过自动的,如果没有
lang给出。 没有旗帜可以恢复旧的ASR优先. segment.lang是所选音轨的语言 (单位:千美元)de-DE)而不是所要求的一个(de) (中文(简体) ). 与需要的前缀比较 :const wanted = (segment) => segment.lang?.toLowerCase().startsWith('de');- 无害环境管理切入点重新命名 从
dist/youtube-transcript.esm.js改为dist/youtube-transcript.mjs通过软件包名称导入或更新直接的 CDN 路径. - 启用缓存和重试 (单位:千美元)
5 min, (中文(简体) ),2 retries, (中文(简体) ),20 s暂停). 要模仿 1.x 耐久和新鲜度:const youtube = YoutubeTranscript.create({ cache: false, retries: 0 }); - 新建错误类别数字 :
YoutubeTranscriptNetworkError财务报告和审定财务报表YoutubeTranscriptAbortError现在地面运输失败.
安装
$ npm i @danielxceron/youtube-transcript
使用量
import { YoutubeTranscript } from '@danielxceron/youtube-transcript';
const transcript = await YoutubeTranscript.fetchTranscript('videoId or URL');
console.log(transcript);
每段都有形状 { text, duration, offset, lang }时 duration 财务报告和审定财务报表 offset 几秒钟内.
可重用客户端
对于服务器和长期运行的进程,创建一个客户端并共享:
import { YoutubeTranscript } from '@danielxceron/youtube-transcript';
const youtube = YoutubeTranscript.create({
timeoutMs: 15000,
retries: 2,
concurrency: 8,
cache: { ttlMs: 300000, maxEntries: 500 },
});
const transcript = await youtube.fetchTranscript('videoId', { lang: 'en' });
批量获取
const results = await youtube.fetchTranscripts(['videoIdA', 'videoIdB', 'videoIdC']);
for (const { videoId, transcript, error } of results) {
if (error) console.error(videoId, error.message);
else console.log(videoId, transcript.length);
}
复制的标识符只获取一次 .
选项
| 选项 | 默认 | 说明 |
|---|---|---|
fetch | 全局获取 | 自定义获取执行( 代理、 未编辑、 测试) |
timeoutMs | 20000 | 按 HTTP 请求超时 |
retries | 2 | 对网络错误进行检索, 429 财务报告和审定财务报表 5xx |
concurrency | 6 | 每个客户的最大飞行请求 |
cache | 启用 | false 禁用,或 { ttlMs, maxEntries } |
clients | Android=iOS (英语) | 自定义内tube客户端 |
apiKey | 公钥 | 内部Tube API 密钥 |
userAgent | 颜色 | HTML 策略使用的用户代理 |
htmlFallback | true | 禁用跳过 HTML 刮取 |
按呼选项: lang, (中文(简体) ), timeoutMs, (中文(简体) ), retries, (中文(简体) ), signal, (中文(简体) ), cookie。 。 。 .
支持的 URL 格式
- 标准视频 :
https://www.youtube.com/watch?v=VIDEO_ID - 短的 URL :
https://youtu.be/VIDEO_ID - YouTube 短节目:
https://www.youtube.com/shorts/VIDEO_ID - 现场:
https://www.youtube.com/live/VIDEO_ID - 内嵌视频 :
https://www.youtube.com/embed/VIDEO_ID - 直接视频标识 :
VIDEO_ID
语言匹配使用区域前缀, 所以 lang: 'en' 接受 en, (中文(简体) ), en-US 财务报告和审定财务报表 en-GB。手动字幕优于自动字幕.
处理错误
YoutubeTranscriptTooManyRequestError: 检测到的速率限制YoutubeTranscriptVideoUnavailableError: 视频无法访问YoutubeTranscriptDisabledError: 已禁用录像记录YoutubeTranscriptNotAvailableError: 没有可用的记录YoutubeTranscriptNotAvailableLanguageError: 所请求的语言不可用YoutubeTranscriptEmptyError: 每一个取出策略都未返回YoutubeTranscriptNetworkError: 复试后运输失败YoutubeTranscriptAbortError: 请求中止通过signal
每个错误都会暴露 name, (中文(简体) ), videoId (在适用时)和 cause (被包裹的时候).
发展
需要20个节点或更新(.nvmrc 针头22).
$ npm ci
$ npm run check # format:check + typecheck + tests + build
$ npm test # unit tests, mocked network
$ npm run typecheck
$ npm run format
$ npm run build
$ npm run smoke -- dQw4w9WgXcQ
运行单个文件或监视模式 :
$ npx vitest run tests/transcript.test.ts
$ npm run test:watch
现场测试真的冲击了YouTube
$ YOUTUBE_TRANSCRIPT_LIVE=1 npx vitest run tests/live.test.ts
CI覆盖了节点20,22和24;一个预定的工作流程每周运行一个直播套房. 发布由 GitHub 动作当 a v* 标签被按下,使用 NPM_TOKEN 秘密和npm来源.
环境相容性
| 战略 | 客户端 | 本地服务器 | 生产服务器 |
|---|---|---|---|
| 内部Tube API | ✅ | ✅ | ✅ |
| HTML 拼写 | ✅ | ✅ | ✅ |
许可证
麻省理工学院 2026年 丹尼尔·塞隆·克拉罗斯
依据 自动调试 由卡库鲁克扬所著.