[pandatv] Extract m3u8, document reverse source and PEP 8
This commit is contained in:
		
							parent
							
								
									2e7c8cab55
								
							
						
					
					
						commit
						d2e96a8ed4
					
				
					 1 changed files with 29 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -2,16 +2,16 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from .common import InfoExtractor
 | 
			
		||||
from ..compat import compat_str
 | 
			
		||||
from ..utils import (
 | 
			
		||||
    ExtractorError,
 | 
			
		||||
    qualities
 | 
			
		||||
    qualities,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PandaTVIE(InfoExtractor):
 | 
			
		||||
    IE_DESC = '熊猫TV'
 | 
			
		||||
    _VALID_URL = r'http://(?:www\.)?panda\.tv/(?P<id>[0-9]+)'
 | 
			
		||||
    _TESTS = [{
 | 
			
		||||
    _TEST = {
 | 
			
		||||
        'url': 'http://www.panda.tv/10091',
 | 
			
		||||
        'info_dict': {
 | 
			
		||||
            'id': '10091',
 | 
			
		||||
| 
						 | 
				
			
			@ -23,25 +23,23 @@ class PandaTVIE(InfoExtractor):
 | 
			
		|||
        'params': {
 | 
			
		||||
            'skip_download': True,
 | 
			
		||||
        },
 | 
			
		||||
    }]
 | 
			
		||||
        'skip': 'Live stream is offline',
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def _real_extract(self, url):
 | 
			
		||||
        video_id = self._match_id(url)
 | 
			
		||||
 | 
			
		||||
        config = self._download_json(
 | 
			
		||||
            'http://www.panda.tv/api_room?roomid=%s' % video_id,
 | 
			
		||||
            video_id
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        data = config['data']
 | 
			
		||||
            'http://www.panda.tv/api_room?roomid=%s' % video_id, video_id)
 | 
			
		||||
 | 
			
		||||
        error_code = config.get('errno', 0)
 | 
			
		||||
        if error_code is not 0:
 | 
			
		||||
            error_desc = 'Server reported error %i' % error_code
 | 
			
		||||
            if isinstance(data, compat_str):
 | 
			
		||||
                error_desc += ': ' + data
 | 
			
		||||
            raise ExtractorError(error_desc, expected=True)
 | 
			
		||||
            raise ExtractorError(
 | 
			
		||||
                '%s returned error %s: %s'
 | 
			
		||||
                % (self.IE_NAME, error_code, config['errmsg']),
 | 
			
		||||
                expected=True)
 | 
			
		||||
 | 
			
		||||
        data = config['data']
 | 
			
		||||
        video_info = data['videoinfo']
 | 
			
		||||
 | 
			
		||||
        # 2 = live, 3 = offline
 | 
			
		||||
| 
						 | 
				
			
			@ -52,8 +50,12 @@ class PandaTVIE(InfoExtractor):
 | 
			
		|||
        title = data['roominfo']['name']
 | 
			
		||||
        uploader = data.get('hostinfo', {}).get('name')
 | 
			
		||||
        room_key = video_info['room_key']
 | 
			
		||||
        stream_addr = video_info.get('stream_addr', {'OD': '1', 'HD': '1', 'SD': '1'})
 | 
			
		||||
        stream_addr = video_info.get(
 | 
			
		||||
            'stream_addr', {'OD': '1', 'HD': '1', 'SD': '1'})
 | 
			
		||||
 | 
			
		||||
        # Reverse engineered from web player swf
 | 
			
		||||
        # (http://s6.pdim.gs/static/07153e425f581151.swf at the moment of
 | 
			
		||||
        # writing).
 | 
			
		||||
        plflag0, plflag1 = video_info['plflag'].split('_')
 | 
			
		||||
        plflag0 = int(plflag0) - 1
 | 
			
		||||
        if plflag1 == '21':
 | 
			
		||||
| 
						 | 
				
			
			@ -65,14 +67,19 @@ class PandaTVIE(InfoExtractor):
 | 
			
		|||
        suffix = ['_small', '_mid', '']
 | 
			
		||||
        formats = []
 | 
			
		||||
        for k, v in stream_addr.items():
 | 
			
		||||
            if v == '1':
 | 
			
		||||
                quality = quality_key(k)
 | 
			
		||||
                if quality >= 0:
 | 
			
		||||
                    formats.append({
 | 
			
		||||
                        'url': 'http://pl%s.live.panda.tv/live_panda/%s%s%s.flv' % (plflag1, room_key, live_panda, suffix[quality]),
 | 
			
		||||
                        'format_id': k,
 | 
			
		||||
                        'quality': quality,
 | 
			
		||||
                    })
 | 
			
		||||
            if v != '1':
 | 
			
		||||
                continue
 | 
			
		||||
            quality = quality_key(k)
 | 
			
		||||
            if quality <= 0:
 | 
			
		||||
                continue
 | 
			
		||||
            for pref, (ext, pl) in enumerate((('m3u8', '-hls'), ('flv', ''))):
 | 
			
		||||
                formats.append({
 | 
			
		||||
                    'url': 'http://pl%s%s.live.panda.tv/live_panda/%s%s%s.%s'
 | 
			
		||||
                    % (pl, plflag1, room_key, live_panda, suffix[quality], ext),
 | 
			
		||||
                    'format_id': '%s-%s' % (k, ext),
 | 
			
		||||
                    'quality': quality,
 | 
			
		||||
                    'source_preference': pref,
 | 
			
		||||
                })
 | 
			
		||||
        self._sort_formats(formats)
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue