aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemita Amine <remitamine@gmail.com>2017-01-25 07:38:17 +0100
committerRemita Amine <remitamine@gmail.com>2017-01-25 07:39:41 +0100
commitc60089c0222433775dcc1305d85b42fc6158c8df (patch)
tree8af6482db73896ab0ffc4b3ccd14a5de69dd5efb
parentaf59bddc4e4a6c260e7966fe75d9d687c3b13b32 (diff)
downloadyoutube-dl-c60089c0222433775dcc1305d85b42fc6158c8df.tar.xz
[afreecatv:global] Add new extractor(closes #11807)
-rw-r--r--youtube_dl/extractor/afreecatv.py92
-rw-r--r--youtube_dl/extractor/extractors.py5
2 files changed, 96 insertions, 1 deletions
diff --git a/youtube_dl/extractor/afreecatv.py b/youtube_dl/extractor/afreecatv.py
index 75b366993..4f6cdb8a2 100644
--- a/youtube_dl/extractor/afreecatv.py
+++ b/youtube_dl/extractor/afreecatv.py
@@ -18,6 +18,7 @@ from ..utils import (
class AfreecaTVIE(InfoExtractor):
+ IE_NAME = 'afreecatv'
IE_DESC = 'afreecatv.com'
_VALID_URL = r'''(?x)
https?://
@@ -143,3 +144,94 @@ class AfreecaTVIE(InfoExtractor):
expected=True)
return info
+
+
+class AfreecaTVGlobalIE(AfreecaTVIE):
+ IE_NAME = 'afreecatv:global'
+ _VALID_URL = r'https?://(?:www\.)?afreeca\.tv/(?P<channel_id>\d+)(?:/v/(?P<video_id>\d+))?'
+ _TESTS = [{
+ 'url': 'http://afreeca.tv/36853014/v/58301',
+ 'info_dict': {
+ 'id': '58301',
+ 'title': 'tryhard top100',
+ 'uploader_id': '36853014',
+ 'uploader': 'makgi Hearthstone Live!',
+ },
+ 'playlist_count': 3,
+ }]
+
+ def _real_extract(self, url):
+ channel_id, video_id = re.match(self._VALID_URL, url).groups()
+ video_type = 'video' if video_id else 'live'
+ query = {
+ 'pt': 'view',
+ 'bid': channel_id,
+ }
+ if video_id:
+ query['vno'] = video_id
+ video_data = self._download_json(
+ 'http://api.afreeca.tv/%s/view_%s.php' % (video_type, video_type),
+ video_id or channel_id, query=query)['channel']
+
+ if video_data.get('result') != 1:
+ raise ExtractorError('%s said: %s' % (self.IE_NAME, video_data['remsg']))
+
+ title = video_data['title']
+
+ info = {
+ 'thumbnail': video_data.get('thumb'),
+ 'view_count': int_or_none(video_data.get('vcnt')),
+ 'age_limit': int_or_none(video_data.get('grade')),
+ 'uploader_id': channel_id,
+ 'uploader': video_data.get('cname'),
+ }
+
+ if video_id:
+ entries = []
+ for i, f in enumerate(video_data.get('flist', [])):
+ video_key = self.parse_video_key(f.get('key', ''))
+ f_url = f.get('file')
+ if not video_key or not f_url:
+ continue
+ entries.append({
+ 'id': '%s_%s' % (video_id, video_key.get('part', i + 1)),
+ 'title': title,
+ 'upload_date': video_key.get('upload_date'),
+ 'duration': int_or_none(f.get('length')),
+ 'url': f_url,
+ 'protocol': 'm3u8_native',
+ 'ext': 'mp4',
+ })
+
+ info.update({
+ 'id': video_id,
+ 'title': title,
+ 'duration': int_or_none(video_data.get('length')),
+ })
+ if len(entries) > 1:
+ info['_type'] = 'multi_video'
+ info['entries'] = entries
+ elif len(entries) == 1:
+ i = entries[0].copy()
+ i.update(info)
+ info = i
+ else:
+ formats = []
+ for s in video_data.get('strm', []):
+ s_url = s.get('purl')
+ if not s_url:
+ continue
+ # TODO: extract rtmp formats
+ if s.get('stype') == 'HLS':
+ formats.extend(self._extract_m3u8_formats(
+ s_url, channel_id, 'mp4', fatal=False))
+ self._sort_formats(formats)
+
+ info.update({
+ 'id': channel_id,
+ 'title': self._live_title(title),
+ 'is_live': True,
+ 'formats': formats,
+ })
+
+ return info
diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py
index e23b5d0f6..f09b4cf2c 100644
--- a/youtube_dl/extractor/extractors.py
+++ b/youtube_dl/extractor/extractors.py
@@ -30,7 +30,10 @@ from .aenetworks import (
AENetworksIE,
HistoryTopicIE,
)
-from .afreecatv import AfreecaTVIE
+from .afreecatv import (
+ AfreecaTVIE,
+ AfreecaTVGlobalIE,
+)
from .airmozilla import AirMozillaIE
from .aljazeera import AlJazeeraIE
from .alphaporno import AlphaPornoIE