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 错误)

youtube-dl 仅提取播放列表信息

从 Youtube 视频中获取视频元数据

如何使用 youtube-dl 从播放列表中的 Youtube 视频中提取上传日期、标题、URL 和持续时间?

元数据库 - 从 json 字段创建过滤器

Grep 命令问题 - 来自程序输出的 Grep 文本?