LINUX.ORG.RU

Фикс yt-dlp dzen.ru 2024-11-04

 , ,


0

2

Оно опять сломалось.

Сам патч https://firk.cantconnect.ru/yt-dlp/yt-dlp-fix-dzen-20241104.patch

Пропатченая версия yt-dlp если кому лень: https://firk.cantconnect.ru/yt-dlp/yt-dlp-2024.10.22-patched

Как патчить вручную:

Кладём yt-dlp в текущую директорию

7z x yt-dlp # unzip ругается на шебанг, поэтому 7z
patch -p0 < yt-dlp-fix-dzen-20241104.patch
zip -r yt-dlp.patched.zip __main__.py yt_dlp
echo '#!/usr/bin/env python3' > yt-dlp.patched
cat yt-dlp.patched.zip >> yt-dlp.patched 
chmod +x yt-dlp.patched

Если кто-то отправит им его в этот баг https://github.com/yt-dlp/yt-dlp/issues/11385 я не против

В ходе патчинга обнаружил неудобство: dzen спамит ссылками на якобы разные форматы, из-за чего список раздувается в несколько раз. Убрал форматы «AudioMute» оттуда (для mpd они вообще полностью дублируют обычные т.к. аудиострим там отдельный и так, для m3u8 - не дублируют, если кому надо можете раскомментить нужную строку в патче там комментарий указан об этом). И ещё он каждый m3u8 формат репортит 4 раза не знаю зачем - как это убрать я не знаю, по факту надо добавить в игнор урлы с GET-параметром redundant в мастер-файле m3u8 (его парсинг за пределами парсинга дзена, я его не трогал).

★★★★★
Ответ на: комментарий от krasnh

Есть подозрение что без пуллреквеста никто шевелиться не будет. Там висят «patch available» ещё с давних времён большое количество, ну и описание этого тега такое: «есть патч, теперь ждём когда кто-то заинтересованный PR по нему сделает».

firkax ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

а у тебя например нет

Я вообще о существовании какого-то дзена узнал только из треда про патч, исправляющий работу с ним.

Зачем чинить то, о чём не знаешь?

Зашёл, посмотрел, лучше бы и не знал. (%

mord0d ★★★★★
()

Ощущение, что ситуация на гитхабе подвисла надолго с российскими площадками. Тут или ждать, когда кто-то форкнет и будет отслеживать и патчить именно наши сайты.

Или класть в /usr/local/bin самопальный скрипт yt-dlp.sh, в который внести код из шапки темы, и который, каждый раз при обновлении, будет вносить изменения для дзен. Туда же можно добавить рабочий патч для plvideo, которому, такими темпами, скоро полгода будет, как не берут в master.
Лютый костыль, конечно.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

А я повторю что на мой взгляд ты ищещь политику там где её нет. Они просто ждут pr. Ну а только что появишиеся сайты без аудитории тоже понятно почему не добавляют, таких можно тысячи наспамить.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

там где её нет

Хз, вышел недавно yt-dlp 2024.11.18, там в изменениях строка - «rutube : Переработанные экстракторы ( #11480 ) от seproDev». Что-то делается, что-то нет.


Кстати, заметил, что у меня в браузере ссылки поменялись с vk.com/video на vkvideo.ru и естественно yt-dlp отвалился. Кинул на гитхаб упоминание об этом в одну из тем.

krasnh ★★★★
()
Ответ на: комментарий от krasnh

Потому что seproDev заинтересовался этой проблемой, написал фикс и оформил его в виде пуллреквеста. А к дзену пуллреквест никто не сделал, никто из заинтересовавшихся его делать не может или не хочет, и как итог - оно так и останется висеть, пока кто-то из разработчиков не начнёт со скуки оформлять чужие патчи.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

Написал в профильной теме гитхаба несерьезно-серьезный пост о необходимости нового форка. ) Получил отклик от обоих оставшихся разрабов после ухода pukkandan.
Суть посыла, как я понял, создавайте PR и они будут рассматриваться и продвигаться в master. Так что, патч это замечательно, конечно, и возможно при старом начальстве этого было достаточно, но сейчас вот так.


В общем, будет народ со знаниями и умениями подтягиваться и подключаться к работе, и оформлять код по установленным правилам, будет и жить yt-dlp, а нет, значит нет, ‘завянет’ как youtube-dl. Имхо.

Да, у @pukkandan сейчас меньше времени на проект, но есть еще другие сопровождающие (в основном @bashonly и @seproDev), которые активно просматривают PR и объединяют их. За последний месяц было объединено более 60 PR.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 3)
Ответ на: комментарий от firkax

Я тебе про это в самом начале писал.

Ахаха, да разрабы забили на дзен, [ZenYandex] Refactored ZenYandexIE to parse metadata from var _params #11908.

Тс прям напрямую уже обращается, «@pukkandan pls approve pull request». Ну, может конечно 3 дня не срок.


Подождем мою маму? Подождем твою мать. (c)

krasnh ★★★★
()
Ответ на: комментарий от krasnh

Классика же…

  • Сообщаешь об ошибке
  • В ответ получаешь сообщение «Присылайте PR!».
  • Тратишь кучу времени на его написание/тестирование и все же отправляешь им PR.
  • Твой PR не принимают и не отвечают.
anonymous
()
Ответ на: комментарий от krasnh

Ну, может конечно 3 дня не срок.

Ну вообще-то не срок. Особенно когда отправляешь PR в рождественские праздники. Всё же у людей обычно бывают и другие дела и интересы помимо их опенсорс-проектов.

CrX ★★★★★
()

!!! обновление !!!

Оно опять сломалось (по крайней мере на некоторых видео так).

Новый патч https://firk.cantconnect.ru/yt-dlp/yt-dlp-fix-dzen-20250104.patch

Новый пропатченый ytdlp: https://firk.cantconnect.ru/yt-dlp/yt-dlp-2024.12.23-patched

С mpv не работает - видимо там надо какие-то куки слать или подобное, mpv это не умеет, он только урл видеопотока тупо забирает с помощью ffmpeg. Сам yt-dlp всё качает нормально.

Заметил что он теперь видеопотоки берёт с okcdn - кажется это однокласники. Реньше было cdn.dzen.ru.

krasnh вероятно тебе это интересно

firkax ★★★★★
() автор топика
Ответ на: комментарий от krasnh

со «знаниями и умениями» ты здесь единственный похоже

А в чём проблема потратить 15 минут на гуглёж и оформление? Это вообще ни разу не рокет саенс

anonymous
()
Ответ на: комментарий от firkax

Все-таки сделал отдельным скриптом, чтоб при обновлении сразу и патч накатывался, как предполагал и ранее:

Или класть в /usr/local/bin самопальный скрипт yt-dlp.sh, в который внести код из шапки темы, и который, каждый раз при обновлении, будет вносить изменения для дзен.

Кто считает, что незачем так ужасно костылить, велком в обсуждения выше.

С mpv не работает

У меня работает. Не знаю, может от ссылки зависит, а может влияет --cookies-from-browser=firefox в ~/.config/yt-dlp/config.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 2)
Ответ на: комментарий от firkax

Обнаружил что опять не работает. Информацию о урлах видеопотоков нашёл в другом месте, на старом стоит null. Не знаю, будет ли ещё использоваться старое - сделал чтобы искало в обоих. Возможно, старое совсем уберут и тогда оно опять сломается (надо будет тогда убрать строчки streams = и последующий цикл перебора урлов из него.

Новый патч https://firk.cantconnect.ru/yt-dlp/yt-dlp-fix-dzen-20250126.patch

Новый пропатченый ytdlp: https://firk.cantconnect.ru/yt-dlp/yt-dlp-2025.01.15-patched

С mpv по прежнему не работает.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

С mpv по прежнему не работает.

Как и писал выше, у меня как работало, так и сейчас, с новым патчем, работает с mpv:

$ mpv 'http://dzen.ru/video/watch/6749a9f27ce4e467e303a5ac'

[ffmpeg] mime type is not rfc8216 compliant
 (+) Video --vid=1 (h264 1280x720)
 (+) Audio --aid=1 (aac 2ch 44100Hz)
File tags:
 Uploader: RADIO TAPOK

AO: [pipewire] 44100Hz stereo 2ch double
VO: [gpu] 1280x720 yuv420p

AV: 00:00:07 / 00:04:30 (3%) A-V:  0.000 ct: -0.088 Cache: 108s/17MB
Exiting... (Quit)


Попробуй mpv тестово запустить с --no-config. Может что мешает в твоих конфигах, как вариант.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

Не работает, okcdn отдаёт http 400 на попытку скачать видеопоток без нужных заголовков. Возможно это из-за того у меня более старый mpv (0.32.0 из debian 11) или ffmpeg, может быть новые версии уже научились заголовки (куки или ещё что-то) из ytdl пробрасывать.

Можешь проверить у себя: открой исходник дзеновской страницы (в браузере, или его можно скачать wget-ом если сохранить куки и повторить запрос с их подгрузкой), найти в нём поиском по слову okcdn урл видеопотока (там всего два урла, один повторяется два раза, второй три, всего 5 вхождений получается) и попробуй этот урл или скачать wget-ом или открыть в плеере. У меня от этого получается http 400, а mpv делает то же самое и получает такой же результат.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

okcdn

Да, с прямой ссылкой не взаимодействет ни wget, ни сам mpv, (yt-dlp качает без вопросов). Причем, в выхлопе mpv -v видно [ffmpeg] https: Opening 'https://vd410.okcdn.ru/expires/... и там нет ошибок.

Возможно это из-за того у меня более старый mpv (0.32.0 из debian 11) или ffmpeg

Это можно проверить с 0.39.0*.AppImage, при желании.

krasnh ★★★★
()
26 февраля 2025 г.

У меня опять ERROR: [ZenYandex] ******: Unable to extract metadata;.

Раньше это ютуба в основном касалось, постоянно код менял и требовалось часто обновлять yt-dlp. Теперь дзен такой же дорожкой решил пойти, хз, что они там улучшают постоянно.

krasnh ★★★★
()
Ответ на: комментарий от firkax

Понял в чем дело, у тебя ссылка побилась https://firk.cantconnect.ru/yt-dlp/yt-dlp-fix-dzen-20250126.patch, а у меня скрипт обновления завязан на нее.

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

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от firkax

Наверно спустя какое-то время заработает, там временные проблемы с инетом.

Патч вот

--- yt_dlp/extractor/yandexvideo.py.b	2000-01-01 04:01:00.000000000 +0300
+++ yt_dlp/extractor/yandexvideo.py	2025-01-26 01:11:32.374406912 +0300
@@ -257,18 +257,39 @@
         if redirect:
             video_id = self._match_id(redirect)
             webpage = self._download_webpage(redirect, video_id, note='Redirecting')
+###        print('GETTING DATA\n')
         data_json = self._search_json(
-            r'("data"\s*:|data\s*=)', webpage, 'metadata', video_id, contains_pattern=r'{["\']_*serverState_*video.+}')
-        serverstate = self._search_regex(r'(_+serverState_+video-site_[^_]+_+)', webpage, 'server state')
+            r'var _params=\(', webpage, 'metadata', video_id, contains_pattern=r'{.+streamsResponse.+}')
+###        print('DATA = [[[[[[[[[', data_json, ']]]]]]]]]')
         uploader = self._search_regex(r'(<a\s*class=["\']card-channel-link[^"\']+["\'][^>]+>)',
                                       webpage, 'uploader', default='<a>')
         uploader_name = extract_attributes(uploader).get('aria-label')
-        item_id = traverse_obj(data_json, (serverstate, 'videoViewer', 'openedItemId', {str}))
-        video_json = traverse_obj(data_json, (serverstate, 'videoViewer', 'items', item_id, {dict})) or {}
+        video_meta = traverse_obj(data_json, ('ssrData', 'videoMetaResponse', {dict}))
+        video_meta2 = traverse_obj(video_meta, ('video', {dict}))
+###        m3u8_url = traverse_obj(video_meta2, ('id', {str}))
+###        print("m3u8 url = ", m3u8_url)
+        streams = traverse_obj(data_json, ('ssrData', 'streamsResponse', 'SingleStream', 0, {dict}))
+###        print('streams=',streams)
 
         formats, subtitles = [], {}
-        for s_url in traverse_obj(video_json, ('video', 'streams', ..., {url_or_none})):
-            ext = determine_ext(s_url)
+#        for s_url in traverse_obj(streams, ('StreamInfo', ..., ..., {url_or_none})):
+#  there is also "OutputStreamWithAudioMute" streams, don't know if they even needed
+#  for MPD, audio stream is separate anyway so the're redundant
+        for s_url in traverse_obj(streams, ('StreamInfo', ..., "OutputStream", {url_or_none})):
+###            print('found URL = ',s_url)
+            ext = determine_ext(s_url,'mpd')
+###            print('found ext = ',ext)
+            if ext == 'mpd':
+                fmts, subs = self._extract_mpd_formats_and_subtitles(s_url, video_id, mpd_id='dash')
+            elif ext == 'm3u8':
+                fmts, subs = self._extract_m3u8_formats_and_subtitles(s_url, video_id, 'mp4')
+            formats.extend(fmts)
+            subtitles = self._merge_subtitles(subtitles, subs)
+# 2024-01-25 now streams found here, don't know if older ^ location still used for some videos
+        for s_url in traverse_obj(video_meta2, ('streams', ..., {url_or_none})):
+###            print('found URL = ',s_url)
+            ext = determine_ext(s_url,'mpd')
+###            print('found ext = ',ext)
             if ext == 'mpd':
                 fmts, subs = self._extract_mpd_formats_and_subtitles(s_url, video_id, mpd_id='dash')
             elif ext == 'm3u8':
@@ -277,15 +298,15 @@
             subtitles = self._merge_subtitles(subtitles, subs)
         return {
             'id': video_id,
-            'title': video_json.get('title') or self._og_search_title(webpage),
+            'title': video_meta.get('title') or self._og_search_title(webpage),
             'formats': formats,
             'subtitles': subtitles,
-            'duration': int_or_none(video_json.get('duration')),
-            'view_count': int_or_none(video_json.get('views')),
-            'timestamp': int_or_none(video_json.get('publicationDate')),
-            'uploader': uploader_name or data_json.get('authorName') or try_get(data_json, lambda x: x['publisher']['name']),
-            'description': video_json.get('description') or self._og_search_description(webpage),
-            'thumbnail': self._og_search_thumbnail(webpage) or try_get(data_json, lambda x: x['og']['imageUrl']),
+            'duration': int_or_none(video_meta2.get('duration')),
+            'view_count': int_or_none(video_meta2.get('views')),
+            'timestamp': int_or_none(video_meta.get('publicationDate')),
+            'uploader': uploader_name or try_get(video_meta, lambda x: x['source']['title']),
+            'description': video_meta.get('description') or self._og_search_description(webpage),
+            'thumbnail': self._og_search_thumbnail(webpage) or video_meta.get('image'),
         }
 
 

firkax ★★★★★
() автор топика