Youtube-dl - 提取元数据/json 信息到文本文件
Posted
技术标签:
【中文标题】Youtube-dl - 提取元数据/json 信息到文本文件【英文标题】:Youtube-dl - Extract metadata/json information to text file 【发布时间】:2021-04-15 07:05:35 【问题描述】:我正在尝试使用 jq 通过 youtube-dl 从 Youtube json 信息中提取信息,并将输出格式化为看起来不错。
输出示例
youtube-dl -j https://www.youtube.com/watch?v=TWeRJdrpxEU | jq ".title, .uploader, .webpage_url"
"Cruising – Vendredi (No Copyright Music)"
"Audio Library — Music for content creators"
"https://www.youtube.com/watch?v=TWeRJdrpxEU"
我不喜欢输出中的 " 但如果我忽略它们并尝试使用 echo 添加额外的行,它将不起作用并在下面给出错误。Youtube-dl 在我的其他用例中工作正常。
youtube-dl -j https://www.youtube.com/watch?v=TWeRJdrpxEU | echo TITLE | jq ".title" | echo CHANNEL | jq ".uploader"
parse error: Invalid numeric literal at line 2, column 0
parse error: Invalid numeric literal at line 2, column 0
Traceback (most recent call last):
File "/usr/local/bin/youtube-dl", line 33, in <module>
sys.exit(load_entry_point('youtube-dl==2021.1.8', 'console_scripts', 'youtube-dl')())
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/__init__.py", line 474, in main
_real_main(argv)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/__init__.py", line 464, in _real_main
retcode = ydl.download(all_urls)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 2028, in download
res = self.extract_info(
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 796, in extract_info
return self.__extract_info(url, ie, download, extra_info, process)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 803, in wrapper
return func(self, *args, **kwargs)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 835, in __extract_info
return self.process_ie_result(ie_result, download, extra_info)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 869, in process_ie_result
return self.process_video_result(ie_result, download=download)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 1654, in process_video_result
self.process_info(new_info)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 1764, in process_info
self.__forced_printings(info_dict, filename, incomplete=False)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 1736, in __forced_printings
self.to_stdout(json.dumps(info_dict))
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 517, in to_stdout
self._write_string(output, self._screen_file)
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py", line 506, in _write_string
write_string(s, out=out, encoding=self.params.get('encoding'))
File "/usr/local/Cellar/youtube-dl/2021.1.8/libexec/lib/python3.9/site-packages/youtube_dl/utils.py", line 3180, in write_string
out.buffer.write(byt)
BrokenPipeError: [Errno 32] Broken pipe
这是我追求的输出风格。
- TITLE -
Cruising – Vendredi (No Copyright Music)
- CHANNEL -
Audio Library — Music for content creators
- CHANNEL URL -
https://www.youtube.com/watch?v=TWeRJdrpxEU
【问题讨论】:
【参考方案1】:要发出不带引号的字符串,只需使用-r
命令行选项。
要添加标题,您可以按如下方式修改过滤器:
"- TITLE -", .title,
"- CHANNEL -", .uploader,
"- CHANNEL URL -", .webpage_url
(将它放在一个文件中可能会比在命令行上尝试压缩它(使用所有必要的转义符)更简单。)
【讨论】:
非常感谢您的回答。已经尝试过它并且无法使标题正常工作。这些作品``` youtube-dl -j youtube.com/watch?v=TWeRJdrpxEU | jq -r .title youtube-dl -j youtube.com/watch?v=TWeRJdrpxEU | jq -r ".title, .uploader" ``` 但是添加标题并不像你展示的那样工作。 ``` youtube-dl -j youtube.com/watch?v=TWeRJdrpxEU | jq -r "- TITLE -", .title, "- CHANNEL -", .uploader youtube-dl -j youtube.com/watch?v=TWeRJdrpxEU | jq -r ""- TITLE -", .title, "- CHANNEL -", .uploader" ``` @peak 请重新阅读我在括号中写的内容。否则,您将不得不引用 jq 命令,并带有适当的转义符。 这是我已经能够创建的一个非常简单的脚本的一部分,但我不知道如何(并且我已经搜索过答案)创建您所说的内容然后尝试将其作为一行命令行。 如果你使用 bash,你可以简单地使用“单引号”来引用 jq 程序。 谢谢!一切正常。youtube-dl -j https://www.youtube.com/watch?v=TWeRJdrpxEU | jq -r '"- TITLE -", .title, "", "- CHANNEL -", .uploader'
以上是关于Youtube-dl - 提取元数据/json 信息到文本文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 youtube-dl 将元数据(艺术家姓名、歌曲名称、年份、专辑、时长、流派)写入 mp3/m4a 音频文件(随后的 AtomicParsely 错误)