一些 YouTube 内容创作者将他们的视频分成章节。他们中的一部分善意地提供了描述视频中的章节标题列表及其开始时间戳。有时他们决定不展示它们。
如何获取章节标题列表?
答案1
使用单行代码来完成此操作yt-dlp
(更好的替代方案youtube-dl
) 和jq
JSON 处理器:
yt-dlp --dump-json videoIDorURL | jq --raw-output ".chapters[].title"
要获取开始时间戳:
| jq --raw-output ".chapters[].start_time" | awk '{printf("%d:%02d:%02d\n",($1/60/60%24),($1/60%60),($1%60))}'
和paste
和流程替代
你可以将两者结合起来。这是一个可以添加到.bashrc
/ 的函数.zshrc
:
function get_chapters_times() {
paste <(yt-dlp --dump-json $1 | jq --raw-output ".chapters[].start_time" | awk '{printf("%d:%02d:%02d\n",($1/60/60%24),($1/60%60),($1%60))}') <(yt-dlp --dump-json $1 | jq --raw-output ".chapters[].title")
}
将返回:
$ get_chapters_times https://youtu.be/DxL2HoqLbyA
0:00:00 Intro
0:02:15 History
0:04:16 Ideal Engine
0:09:48 Entropy
0:11:03 Energy Spread
0:14:49 Air Conditioning
0:17:26 Life on Earth
0:19:35 The Past Hypothesis
0:21:43 Hawking Radiation
0:23:31 Heat Death of the Universe
0:24:52 Conclusion
使用yt-dlp --split-chapters
下载每一章。
答案2
这是受 Pablo 的答案启发的一句更有趣的俏皮话,它消除了进程替换和必须定义函数的情况:
yt-dlp videoURL --dump-json | jq -r ".chapters[] | {start_time, title}" | awk -v count="2" '++count==4{$0=sprintf(" \"start\":%d:%02d:%02d",($2/60/60%24),($2/60%60),($2%60));count=0} 1' | awk -F '":' '{print $2}' | gsed -r -e '/^\s*$/d' -e 's/^ "|"$//g' | paste -d " " - -
awks 和 gsed 可能可以相互合并,但代价是更加复杂。
如果使用yt-dlp
,您还可以从--embed-chapters
(alias:
--add-chapters
) 参数中受益。