diff options
| author | Sergey M․ <dstftw@gmail.com> | 2014-12-30 03:22:25 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2014-12-30 03:22:25 +0600 | 
| commit | 5435d7af910d6363214e377166112aed83cfde1f (patch) | |
| tree | 1c3591d97a0782c534861800cf8424d5e3bb3482 | |
| parent | 429ddfd38dfb53aa05f0e2a77aeeb4ac5d20a17d (diff) | |
| parent | 0c0a70f4c6839903b326d7d9074e93235defaa5b (diff) | |
Merge branch 't0mm0-hitbox'
| -rw-r--r-- | youtube_dl/extractor/__init__.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/hitbox.py | 166 | 
2 files changed, 167 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index ea4faf2a6..4f5a1ce18 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -172,6 +172,7 @@ from .heise import HeiseIE  from .hellporno import HellPornoIE  from .helsinki import HelsinkiIE  from .hentaistigma import HentaiStigmaIE +from .hitbox import HitboxIE, HitboxLiveIE  from .hornbunny import HornBunnyIE  from .hostingbulk import HostingBulkIE  from .hotnewhiphop import HotNewHipHopIE diff --git a/youtube_dl/extractor/hitbox.py b/youtube_dl/extractor/hitbox.py new file mode 100644 index 000000000..84bd7c080 --- /dev/null +++ b/youtube_dl/extractor/hitbox.py @@ -0,0 +1,166 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( +    clean_html, +    parse_iso8601, +    float_or_none, +    int_or_none, +    compat_str, +) + + +class HitboxIE(InfoExtractor): +    IE_NAME = 'hitbox' +    _VALID_URL = r'https?://(?:www\.)?hitbox\.tv/video/(?P<id>[0-9]+)' +    _TEST = { +        'url': 'http://www.hitbox.tv/video/203213', +        'info_dict': { +            'id': '203213', +            'title': 'hitbox @ gamescom, Sub Button Hype extended, Giveaway - hitbox News Update with Oxy', +            'alt_title': 'hitboxlive - Aug 9th #6', +            'description': '', +            'ext': 'mp4', +            'thumbnail': 're:^https?://.*\.jpg$', +            'duration': 215.1666, +            'resolution': 'HD 720p', +            'uploader': 'hitboxlive', +            'view_count': int, +            'timestamp': 1407576133, +            'upload_date': '20140809', +            'categories': ['Live Show'], +        }, +        'params': { +            # m3u8 download +            'skip_download': True, +        }, +    } + +    def _extract_metadata(self, url, video_id): +        thumb_base = 'https://edge.sf.hitbox.tv' +        metadata = self._download_json( +            '%s/%s' % (url, video_id), video_id) + +        date = 'media_live_since' +        media_type = 'livestream' +        if metadata.get('media_type') == 'video': +            media_type = 'video' +            date = 'media_date_added' + +        video_meta = metadata.get(media_type, [])[0] +        title = video_meta.get('media_status') +        alt_title = video_meta.get('media_title') +        description = clean_html( +            video_meta.get('media_description') or +            video_meta.get('media_description_md')) +        duration = float_or_none(video_meta.get('media_duration')) +        uploader = video_meta.get('media_user_name') +        views = int_or_none(video_meta.get('media_views')) +        timestamp = parse_iso8601(video_meta.get(date), ' ') +        categories = [video_meta.get('category_name')] +        thumbs = [ +            {'url': thumb_base + video_meta.get('media_thumbnail'), +             'width': 320, +             'height': 180}, +            {'url': thumb_base + video_meta.get('media_thumbnail_large'), +             'width': 768, +             'height': 432}, +        ] + +        return { +            'id': video_id, +            'title': title, +            'alt_title': alt_title, +            'description': description, +            'ext': 'mp4', +            'thumbnails': thumbs, +            'duration': duration, +            'uploader': uploader, +            'view_count': views, +            'timestamp': timestamp, +            'categories': categories, +        } + +    def _real_extract(self, url): +        video_id = self._match_id(url) + +        metadata = self._extract_metadata( +            'https://www.hitbox.tv/api/media/video', +            video_id) + +        player_config = self._download_json( +            'https://www.hitbox.tv/api/player/config/video/%s' % video_id, +            video_id) + +        clip = player_config.get('clip') +        video_url = clip.get('url') +        res = clip.get('bitrates', [])[0].get('label') + +        metadata['resolution'] = res +        metadata['url'] = video_url +        metadata['protocol'] = 'm3u8' + +        return metadata + + +class HitboxLiveIE(HitboxIE): +    IE_NAME = 'hitbox:live' +    _VALID_URL = r'https?://(?:www\.)?hitbox\.tv/(?!video)(?P<id>.+)' +    _TEST = { +        'url': 'http://www.hitbox.tv/dimak', +        'info_dict': { +            'id': 'dimak', +            'ext': 'mp4', +            'description': 'md5:c9f80fa4410bc588d7faa40003fc7d0e', +            'timestamp': int, +            'upload_date': compat_str, +            'title': compat_str, +            'uploader': 'Dimak', +        }, +        'params': { +            # live +            'skip_download': True, +        }, +    } + +    def _real_extract(self, url): +        video_id = self._match_id(url) + +        metadata = self._extract_metadata( +            'https://www.hitbox.tv/api/media/live', +            video_id) + +        player_config = self._download_json( +            'https://www.hitbox.tv/api/player/config/live/%s' % video_id, +            video_id) + +        formats = [] +        cdns = player_config.get('cdns') +        servers = [] +        for cdn in cdns: +            base_url = cdn.get('netConnectionUrl') +            host = re.search('.+\.([^\.]+\.[^\./]+)/.+', base_url).group(1) +            if base_url not in servers: +                servers.append(base_url) +                for stream in cdn.get('bitrates'): +                    label = stream.get('label') +                    if label != 'Auto': +                        formats.append({ +                            'url': '%s/%s' % (base_url, stream.get('url')), +                            'ext': 'mp4', +                            'vbr': stream.get('bitrate'), +                            'resolution': label, +                            'rtmp_live': True, +                            'format_note': host, +                            'page_url': url, +                            'player_url': 'http://www.hitbox.tv/static/player/flowplayer/flowplayer.commercial-3.2.16.swf', +                        }) + +        self._sort_formats(formats) +        metadata['formats'] = formats +        metadata['is_live'] = True +        metadata['title'] = self._live_title(metadata.get('title')) +        return metadata | 
