json - youtube-dl:解析 JSON 失败
问题描述
我昨天在 GitHub 支持页面上发布了一个关于此的问题,它被标记为重复 - 原始答案在这里。此问题不会像该用户那样自动修复。相反,它似乎来来去去没有模式,所以我没有复制它的好方法。有些歌曲会在某个时间点播放,但几分钟后就不会播放了。
错误:
[debug] Encodings: locale cp1252, fs utf-8, out UTF-8, pref cp1252
[debug] youtube-dl version 2020.09.20
[debug] Python version 3.7.8 (CPython) - Windows-10-10.0.19041-SP0
[youtube:search] query "iron man 3 song": Downloading page 1
[debug] exe versions: none
[debug] Proxy map: {}
ERROR: query "song name": Failed to parse JSON caused by JSONDecodeError('Expecting value: line 1 column 1 (char 0)')); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
尝试从视频中提取数据时遇到问题。这是我正在使用的代码片段:
ydlOps = {
'format': 'bestaudio/best',
'outtmpl': './%(title)s.webm',
'noplaylist': True,
'extractaudio': True,
'audioformat': 'webm',
'default_search': 'ytsearch1',
'quite': True,
'verbose':True,
'version': True
}
with youtube_dl.YoutubeDL(ydlOps) as downloader:
songData = downloader.extract_info(url, download=download)
我已经更改了选项,尝试了其他据说有效的选项,但似乎没有任何改变。有些会起作用,然后不会,然后它们会再次起作用。
解决方案
我认为这是一个 youtube-dl 错误。我为 youtube 搜索写了一个解析器,它也坏了。之前查看 youtube 的响应时,所有 JSON 数据的存储方式如下:
window["ytInitialData"] = {...}
因此,您只需在服务器的响应中搜索字符串 'window["ytInitialData"]' 即可找到相关的 JSON 并提取它。但是现在,youtube 将这样的 JSON 存储在服务器发送的 html 文件中
var ytInitialData = {...}
在解析结果时,需要在 youtube-dl 方面进行更改。
奇怪的是,有时 youtube 使用以前的版本,有时它使用当前版本。我认为这是因为 javascript 的变化正在逐步在所有 youtube 服务器上推出。
另请注意,现在包含所有 JSON 的行以 '; 结尾。' 而不仅仅是 ';'。这可能还需要从 youtube-dl 进行更改。
您需要向 youtube-dl 提交拉取请求或等待有人修复它。
推荐阅读
- sql - 如何创建一个新变量来计算包含 SAS 中多个观察值的特定变量(按 ID)的总和?
- actionscript-3 - 我不能得到 MovieClip(parent).play():void; 正常运作
- php - 带货币符号的数字格式
- curl - k8s svc 在其他工作节点中找不到 pod
- tensorflow-serving - 操作类型未在二进制中注册“SentencepieceEncodeSparse”
- php - 仅删除数组中的空格,但不删除 0(零)数字
- sql - SQL 为每个组生成公共序列
- python - django.db.utils.ProgrammingError:关系“APP_profile”的列“角色”不存在
- python - 图像数据无法转换为浮点数
- spring-integration - spring 集成 dsl 错误处理并继续