]> jfr.im git - yt-dlp.git/commitdiff
[ok.ru] add mobile fallback (#1972)
authorThe Hatsune Daishi <redacted>
Tue, 14 Dec 2021 18:09:57 +0000 (03:09 +0900)
committerGitHub <redacted>
Tue, 14 Dec 2021 18:09:57 +0000 (23:39 +0530)
Authored by: nao20010128nao

yt_dlp/extractor/odnoklassniki.py

index 9cacd381587984242ef02b1d92e523a827925b9d..eeb57f2fed5869884cae80e6baa37d9616915023 100644 (file)
@@ -12,6 +12,7 @@
 )
 from ..utils import (
     ExtractorError,
+    float_or_none,
     unified_strdate,
     int_or_none,
     qualities,
@@ -96,6 +97,14 @@ class OdnoklassnikiIE(InfoExtractor):
             'skip_download': True,
         },
         'skip': 'Video has not been found',
+    }, {
+        'note': 'Only available in mobile webpage',
+        'url': 'https://m.ok.ru/video/2361249957145',
+        'info_dict': {
+            'id': '2361249957145',
+            'title': 'Быковское крещение',
+            'duration': 3038.181,
+        },
     }, {
         'url': 'http://ok.ru/web-api/video/moviePlayer/20079905452',
         'only_matching': True,
@@ -131,13 +140,24 @@ def _extract_url(webpage):
             return mobj.group('url')
 
     def _real_extract(self, url):
+        try:
+            return self._extract_desktop(url)
+        except ExtractorError as e:
+            try:
+                return self._extract_mobile(url)
+            except ExtractorError:
+                # error message of desktop webpage is in English
+                raise e
+
+    def _extract_desktop(self, url):
         start_time = int_or_none(compat_parse_qs(
             compat_urllib_parse_urlparse(url).query).get('fromTime', [None])[0])
 
         video_id = self._match_id(url)
 
         webpage = self._download_webpage(
-            'http://ok.ru/video/%s' % video_id, video_id)
+            'http://ok.ru/video/%s' % video_id, video_id,
+            note='Downloading desktop webpage')
 
         error = self._search_regex(
             r'[^>]+class="vp_video_stub_txt"[^>]*>([^<]+)<',
@@ -265,3 +285,32 @@ def _real_extract(self, url):
 
         info['formats'] = formats
         return info
+
+    def _extract_mobile(self, url):
+        video_id = self._match_id(url)
+
+        webpage = self._download_webpage(
+            'http://m.ok.ru/video/%s' % video_id, video_id,
+            note='Downloading mobile webpage')
+
+        error = self._search_regex(
+            r'видео</a>\s*<div\s+class="empty">(.+?)</div>',
+            webpage, 'error', default=None)
+        if error:
+            raise ExtractorError(error, expected=True)
+
+        json_data = self._search_regex(
+            r'data-video="(.+?)"', webpage, 'json data')
+        json_data = self._parse_json(unescapeHTML(json_data), video_id) or {}
+
+        return {
+            'id': video_id,
+            'title': json_data.get('videoName'),
+            'duration': float_or_none(json_data.get('videoDuration'), scale=1000),
+            'thumbnail': json_data.get('videoPosterSrc'),
+            'formats': [{
+                'format_id': 'mobile',
+                'url': json_data.get('videoSrc'),
+                'ext': 'mp4',
+            }]
+        }