如何用jq从yt-dlp的JSON输出中仅提取存在的章节字段
解决jq遍历null报错的问题
原命令执行时出现jq: error (at :1): Cannot iterate over null (null),原因很直接:当视频没有章节时,.chapters字段的值是null,直接用.chapters[]遍历会触发jq的空值遍历错误。
下面给两种修正方案,按需选择:
方案1:无章节时Chaps字段为空字符串
不管视频有没有章节,都会保留Chaps字段,无章节时该字段值为空字符串。
完整命令:
yt-dlp --dump-json https://www.youtube.com/watch?v=nochapters | jq -cr '{ Date: .upload_date | (.[0:4] + "-" + .[4:6] + "-" + .[6:8]), ID: .id, Title: .fulltitle, Chaps: (.chapters // []) | map(.title) | join(", ") }'
关键改动:
- 用
(.chapters // [])替代直接调用.chapters://是jq的空值合并运算符,当.chapters为null时,自动替换成空数组[],避免遍历报错 - 用
map(.title)提取所有章节标题,再通过join(", ")拼接成字符串
方案2:无章节时不显示Chaps字段
仅在视频有章节时输出Chaps字段,无章节时直接省略该字段。
完整命令:
yt-dlp --dump-json https://www.youtube.com/watch?v=nochapters | jq -cr '{ Date: .upload_date | (.[0:4] + "-" + .[4:6] + "-" + .[6:8]), ID: .id, Title: .fulltitle } + (if .chapters then { Chaps: .chapters | map(.title) | join(", ") } else {} end)'
关键改动:
- 先构造包含Date、ID、Title的基础JSON对象
- 通过
+运算符结合条件判断:如果.chapters存在(非null),就追加带Chaps字段的对象;否则追加空对象,相当于不添加任何额外字段
效果验证
针对你提供的含章节输入,两种方案都会输出符合预期的结果:
{"Date":"2020-06-17","ID":"pvkTC2xIbeY","Title":"How to Add Chapters to YouTube Videos | Chapters Explained","Chaps":"Intro, YouTube Chapters, What are YouTube chapters?, How to add chapter markers?, When are changes updated?, How to disable chapters?, Are chapters available in my country?"}
当视频无章节时,方案1输出示例:
{"Date":"2024-01-01","ID":"nochapters","Title":"无章节视频标题","Chaps":""}
方案2输出示例:
{"Date":"2024-01-01","ID":"nochapters","Title":"无章节视频标题"}
内容的提问来源于stack exchange,提问作者Mat90
相关产品推荐
相关产品推荐

