youtube-dl: не удалось проанализировать JSON

#json #discord.py #youtube-dl #ytdl

#json #discord.py #youtube-dl #ytdl

Вопрос:

Вчера я отправил вопрос по этому вопросу на страницу поддержки 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)
  

Я изменил параметры, попробовал другие параметры, которые, как говорят, сработали, и, похоже, ничего не изменилось. Некоторые будут работать, затем нет, затем они будут снова.

Ответ №1:

Я думаю, что это ошибка 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 или подождать, пока кто-нибудь это исправит.