diff options
| author | Sergey M․ <dstftw@gmail.com> | 2016-06-14 00:06:31 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2016-06-14 00:06:31 +0700 | 
| commit | 778f96944785f814a97964be1d6fb3bb78bc13f0 (patch) | |
| tree | fadfcf0f230db3c4864256a0066d2d8f1b75e97c | |
| parent | 79cd8b3d8acee7845260d5bd60698155a0d81d33 (diff) | |
[twitch:clips] Add extractor (Closes #9767)
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/twitch.py | 43 | 
2 files changed, 44 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 36ddc1f73..d2db4d803 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -862,6 +862,7 @@ from .twitch import (      TwitchProfileIE,      TwitchPastBroadcastsIE,      TwitchStreamIE, +    TwitchClipsIE,  )  from .twitter import (      TwitterCardIE, diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py index d898f14c3..20919774d 100644 --- a/youtube_dl/extractor/twitch.py +++ b/youtube_dl/extractor/twitch.py @@ -16,6 +16,7 @@ from ..compat import (  from ..utils import (      ExtractorError,      int_or_none, +    js_to_json,      orderedSet,      parse_duration,      parse_iso8601, @@ -454,3 +455,45 @@ class TwitchStreamIE(TwitchBaseIE):              'formats': formats,              'is_live': True,          } + + +class TwitchClipsIE(InfoExtractor): +    IE_NAME = 'twitch:clips' +    _VALID_URL = r'https?://clips\.twitch\.tv/(?:[^/]+/)*(?P<id>[^/?#&]+)' + +    _TEST = { +        'url': 'https://clips.twitch.tv/ea/AggressiveCobraPoooound', +        'md5': '761769e1eafce0ffebfb4089cb3847cd', +        'info_dict': { +            'id': 'AggressiveCobraPoooound', +            'ext': 'mp4', +            'title': 'EA Play 2016 Live from the Novo Theatre', +            'thumbnail': 're:^https?://.*\.jpg', +            'creator': 'EA', +            'uploader': 'stereotype_', +            'uploader_id': 'stereotype_', +        }, +    } + +    def _real_extract(self, url): +        video_id = self._match_id(url) + +        webpage = self._download_webpage(url, video_id) + +        clip = self._parse_json( +            self._search_regex( +                r'(?s)clipInfo\s*=\s*({.+?});', webpage, 'clip info'), +            video_id, transform_source=js_to_json) + +        video_url = clip['clip_video_url'] +        title = clip['channel_title'] + +        return { +            'id': video_id, +            'url': video_url, +            'title': title, +            'thumbnail': self._og_search_thumbnail(webpage), +            'creator': clip.get('broadcaster_display_name') or clip.get('broadcaster_login'), +            'uploader': clip.get('curator_login'), +            'uploader_id': clip.get('curator_display_name'), +        } | 
