问题描述
我昨天在GitHub支持页面上对此发布了一个问题,并将其标记为重复-原始答案为here。此问题不会像针对该用户那样自动修复。取而代之的是,它似乎来来往往没有模式,因此我没有很好的方法来复制它。有些歌曲会在某个时间点播放,然后几分钟后它们就会消失。
错误:
[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提交拉取请求,或者等待其他人对其进行修复。