diff options
| author | Sergey M․ <dstftw@gmail.com> | 2021-01-15 12:38:15 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2021-01-15 12:39:21 +0700 | 
| commit | ab9001dab50db90f6470fcaf2189bcd2cfc0c370 (patch) | |
| tree | c0c2712deb0e201c7f4a680203b2855803352c48 | |
| parent | 879866a2304c3b0bbbb048feb4253431f0219aa3 (diff) | |
[twitter] Add support for unified cards (closes #27826)
| -rw-r--r-- | youtube_dl/extractor/twitter.py | 28 | 
1 files changed, 26 insertions, 2 deletions
diff --git a/youtube_dl/extractor/twitter.py b/youtube_dl/extractor/twitter.py index 1190d721e..ec99dfccd 100644 --- a/youtube_dl/extractor/twitter.py +++ b/youtube_dl/extractor/twitter.py @@ -374,6 +374,24 @@ class TwitterIE(TwitterBaseIE):          },          'add_ie': ['TwitterBroadcast'],      }, { +        # unified card +        'url': 'https://twitter.com/BrooklynNets/status/1349794411333394432?s=20', +        'info_dict': { +            'id': '1349794411333394432', +            'ext': 'mp4', +            'title': 'md5:d1c4941658e4caaa6cb579260d85dcba', +            'thumbnail': r're:^https?://.*\.jpg', +            'description': 'md5:71ead15ec44cee55071547d6447c6a3e', +            'uploader': 'Brooklyn Nets', +            'uploader_id': 'BrooklynNets', +            'duration': 324.484, +            'timestamp': 1610651040, +            'upload_date': '20210114', +        }, +        'params': { +            'skip_download': True, +        }, +    }, {          # Twitch Clip Embed          'url': 'https://twitter.com/GunB1g/status/1163218564784017422',          'only_matching': True, @@ -433,8 +451,7 @@ class TwitterIE(TwitterBaseIE):              'tags': tags,          } -        media = try_get(status, lambda x: x['extended_entities']['media'][0]) -        if media and media.get('type') != 'photo': +        def extract_from_video_info(media):              video_info = media.get('video_info') or {}              formats = [] @@ -461,6 +478,10 @@ class TwitterIE(TwitterBaseIE):                  'thumbnails': thumbnails,                  'duration': float_or_none(video_info.get('duration_millis'), 1000),              }) + +        media = try_get(status, lambda x: x['extended_entities']['media'][0]) +        if media and media.get('type') != 'photo': +            extract_from_video_info(media)          else:              card = status.get('card')              if card: @@ -493,6 +514,9 @@ class TwitterIE(TwitterBaseIE):                          '_type': 'url',                          'url': get_binding_value('card_url'),                      }) +                elif card_name == 'unified_card': +                    media_entities = self._parse_json(get_binding_value('unified_card'), twid)['media_entities'] +                    extract_from_video_info(next(iter(media_entities.values())))                  # amplify, promo_video_website, promo_video_convo, appplayer, ...                  else:                      is_amplify = card_name == 'amplify'  | 
