[hitbox] add support for live streams

This commit is contained in:
t0mm0 2014-12-29 20:10:59 +00:00
parent da3f7fb7f8
commit e3947e2b7f
2 changed files with 102 additions and 46 deletions

View file

@ -172,7 +172,7 @@ from .heise import HeiseIE
from .hellporno import HellPornoIE from .hellporno import HellPornoIE
from .helsinki import HelsinkiIE from .helsinki import HelsinkiIE
from .hentaistigma import HentaiStigmaIE from .hentaistigma import HentaiStigmaIE
from .hitbox import HitboxIE from .hitbox import HitboxIE, HitboxLiveIE
from .hornbunny import HornBunnyIE from .hornbunny import HornBunnyIE
from .hostingbulk import HostingBulkIE from .hostingbulk import HostingBulkIE
from .hotnewhiphop import HotNewHipHopIE from .hotnewhiphop import HotNewHipHopIE

View file

@ -1,5 +1,6 @@
# coding: utf-8 # coding: utf-8
from __future__ import unicode_literals from __future__ import unicode_literals
import re
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import ( from ..utils import (
@ -9,33 +10,13 @@ from ..utils import (
class HitboxIE(InfoExtractor): class HitboxIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?hitbox\.tv/video/(?P<id>[0-9]+)' _VALID_URL = r'https?://(?:www\.)?hitbox\.tv/video/(?P<id>[0-9]+)'
_TESTS = [{ _TEST = {
'url': 'http://www.hitbox.tv/video/358062',
'info_dict': {
'id': '358062',
'title': 'Megaman',
'alt_title': 'Megaman',
'description': '',
'ext': 'mp4',
'thumbnail': 're:^https?://.*\.jpg$',
'duration': 3834,
'resolution': 'SD 480p',
'uploader_id': 'supergreatfriend',
'view_count': int,
'upload_date': '20141225',
'categories': [None],
},
'params': {
# m3u8 download
'skip_download': True,
},
}, {
'url': 'http://www.hitbox.tv/video/203213', 'url': 'http://www.hitbox.tv/video/203213',
'info_dict': { 'info_dict': {
'id': '203213', 'id': '203213',
'title': 'hitbox @ gamescom, Sub Button Hype extended, Giveaway - hitbox News Update with Oxy', 'title': 'hitbox @ gamescom, Sub Button Hype extended, Giveaway - hitbox News Update with Oxy',
'alt_title': 'hitboxlive - Aug 9th #6', 'alt_title': 'hitboxlive - Aug 9th #6',
'description': '', 'description': '\n',
'ext': 'mp4', 'ext': 'mp4',
'thumbnail': 're:^https?://.*\.jpg$', 'thumbnail': 're:^https?://.*\.jpg$',
'duration': 215, 'duration': 215,
@ -49,24 +30,28 @@ class HitboxIE(InfoExtractor):
# m3u8 download # m3u8 download
'skip_download': True, 'skip_download': True,
}, },
}] }
def _real_extract(self, url):
video_id = self._match_id(url)
def _extract_metadata(self, url, video_id):
thumb_base = 'https://edge.sf.hitbox.tv' thumb_base = 'https://edge.sf.hitbox.tv'
metadata = self._download_json( metadata = self._download_json(
'https://www.hitbox.tv/api/media/video/%s' % (video_id), video_id '%s/%s' % (url, video_id), video_id
) )
video_meta = metadata.get('video', [])[0] 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') title = video_meta.get('media_status')
alt_title = video_meta.get('media_title') alt_title = video_meta.get('media_title')
description = video_meta.get('media_description') description = video_meta.get('media_description_md')
duration = int(float(video_meta.get('media_duration'))) duration = int(float(video_meta.get('media_duration')))
uploader = video_meta.get('media_user_name') uploader = video_meta.get('media_user_name')
views = int(video_meta.get('media_views')) views = int(video_meta.get('media_views'))
upload_date = unified_strdate(video_meta.get('media_date_added')) upload_date = unified_strdate(video_meta.get(date))
categories = [video_meta.get('category_name')] categories = [video_meta.get('category_name')]
thumbs = [ thumbs = [
{'url': thumb_base + video_meta.get('media_thumbnail'), {'url': thumb_base + video_meta.get('media_thumbnail'),
@ -77,6 +62,28 @@ class HitboxIE(InfoExtractor):
'height': 432}, 'height': 432},
] ]
return {
'id': video_id,
'title': title,
'alt_title': alt_title,
'description': description,
'ext': 'mp4',
'thumbnails': thumbs,
'duration': duration,
'uploader_id': uploader,
'view_count': views,
'upload_date': upload_date,
'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( player_config = self._download_json(
'https://www.hitbox.tv/api/player/config/video/%s' % (video_id), 'https://www.hitbox.tv/api/player/config/video/%s' % (video_id),
video_id video_id
@ -86,19 +93,68 @@ class HitboxIE(InfoExtractor):
video_url = clip.get('url') video_url = clip.get('url')
res = clip.get('bitrates', [])[0].get('label') res = clip.get('bitrates', [])[0].get('label')
return { metadata['resolution'] = res
'id': video_id, metadata['url'] = video_url
'title': title, metadata['protocol'] = 'm3u8'
'alt_title': alt_title,
'description': description, return metadata
'url': video_url,
class HitboxLiveIE(HitboxIE):
_VALID_URL = r'https?://(?:www\.)?hitbox\.tv/(?!video)(?P<id>.+)'
_TEST = {
'url': 'http://www.hitbox.tv/dimak',
'info_dict': {
'id': 'dimak',
'ext': 'mp4', 'ext': 'mp4',
'thumbnails': thumbs, 'description': str,
'duration': duration, 'upload_date': str,
'resolution': res, 'title': str,
'uploader_id': uploader, 'uploader_id': 'Dimak',
'view_count': views, },
'upload_date': upload_date, 'params': {
'categories': categories, # live
'protocol': 'm3u8', '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