about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2021-05-30 01:46:49 +0700
committerSergey M․ <dstftw@gmail.com>2021-05-30 01:49:51 +0700
commitf3cd1d9cec91943a459a0662cbcffe3b2e1f6675 (patch)
tree5b42592be329e8c1545e2e5e2c4dbb3cdd6ae634
parente13a01061d149f4fac7db1a50124c4745a11c16e (diff)
downloadyoutube-dl-f3cd1d9cec91943a459a0662cbcffe3b2e1f6675.tar.gz
youtube-dl-f3cd1d9cec91943a459a0662cbcffe3b2e1f6675.tar.xz
youtube-dl-f3cd1d9cec91943a459a0662cbcffe3b2e1f6675.zip
[twitch:clips] Improve extraction (closes #29149)
-rw-r--r--youtube_dl/extractor/twitch.py48
1 files changed, 23 insertions, 25 deletions
diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py
index 7f9738d43..a378bd6dc 100644
--- a/youtube_dl/extractor/twitch.py
+++ b/youtube_dl/extractor/twitch.py
@@ -894,7 +894,25 @@ class TwitchClipsIE(TwitchBaseIE):
     def _real_extract(self, url):
         video_id = self._match_id(url)
 
-        clip = self._download_base_gql(
+        clip = self._download_gql(
+            video_id, [{
+                'operationName': 'VideoAccessToken_Clip',
+                'variables': {
+                    'slug': video_id,
+                },
+            }],
+            'Downloading clip access token GraphQL')[0]['data']['clip']
+
+        if not clip:
+            raise ExtractorError(
+                'This clip is no longer available', expected=True)
+
+        access_query = {
+            'sig': clip['playbackAccessToken']['signature'],
+            'token': clip['playbackAccessToken']['value'],
+        }
+
+        data = self._download_base_gql(
             video_id, {
                 'query': '''{
   clip(slug: "%s") {
@@ -919,22 +937,10 @@ class TwitchClipsIE(TwitchBaseIE):
     }
     viewCount
   }
-}''' % video_id}, 'Downloading clip GraphQL')['data']['clip']
-
-        if not clip:
-            raise ExtractorError(
-                'This clip is no longer available', expected=True)
+}''' % video_id}, 'Downloading clip GraphQL', fatal=False)
 
-        access_token = self._download_gql(
-            video_id, [{
-                'operationName': 'VideoAccessToken_Clip',
-                'variables': {
-                    'slug': video_id,
-                },
-            }],
-            'Downloading access token GraphQL')
-        access_token = try_get(
-            access_token, lambda x: x[0]['data']['clip']['playbackAccessToken'])
+        if data:
+            clip = try_get(data, lambda x: x['data']['clip'], dict) or clip
 
         formats = []
         for option in clip.get('videoQualities', []):
@@ -943,16 +949,8 @@ class TwitchClipsIE(TwitchBaseIE):
             source = url_or_none(option.get('sourceURL'))
             if not source:
                 continue
-            if access_token:
-                source = "%s%s%s" % (
-                    source,
-                    "&" if "?" in source else "?",
-                    compat_urllib_parse_urlencode({
-                        "sig": access_token.get('signature'),
-                        "token": access_token.get('value'),
-                    }))
             formats.append({
-                'url': source,
+                'url': update_url_query(source, access_query),
                 'format_id': option.get('quality'),
                 'height': int_or_none(option.get('quality')),
                 'fps': int_or_none(option.get('frameRate')),