[afreecatv:global] Add new extractor(closes #11807)
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user