diff options
| author | Zhong Jianxin <azuwis@gmail.com> | 2016-03-09 23:43:27 +0800 | 
|---|---|---|
| committer | Sergey M <dstftw@gmail.com> | 2016-10-25 01:46:02 +0700 | 
| commit | 2e7c8cab55e8b29dea5443aa45451b524799a12a (patch) | |
| tree | 8e84f0fb3467d0edb8b7d0c1b6adf838e9825171 | |
| parent | d7d4481c6a8a914a436006b244b9fd781d322b71 (diff) | |
[pandatv] Add new extractor
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/pandatv.py | 84 | 
2 files changed, 85 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 6f7d9b65b..108d7ca69 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -667,6 +667,7 @@ from .orf import (      ORFFM4IE,      ORFIPTVIE,  ) +from .pandatv import PandaTVIE  from .pandoratv import PandoraTVIE  from .parliamentliveuk import ParliamentLiveUKIE  from .patreon import PatreonIE diff --git a/youtube_dl/extractor/pandatv.py b/youtube_dl/extractor/pandatv.py new file mode 100644 index 000000000..84014f3c5 --- /dev/null +++ b/youtube_dl/extractor/pandatv.py @@ -0,0 +1,84 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( +    ExtractorError, +    qualities +) + +class PandaTVIE(InfoExtractor): +    IE_DESC = '熊猫TV' +    _VALID_URL = r'http://(?:www\.)?panda\.tv/(?P<id>[0-9]+)' +    _TESTS = [{ +        'url': 'http://www.panda.tv/10091', +        'info_dict': { +            'id': '10091', +            'title': 're:.+', +            'uploader': '囚徒', +            'ext': 'flv', +            'is_live': True, +        }, +        'params': { +            'skip_download': True, +        }, +    }] + +    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'] + +        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) + +        video_info = data['videoinfo'] + +        # 2 = live, 3 = offline +        if video_info.get('status') != '2': +            raise ExtractorError( +                'Live stream is offline', expected=True) + +        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'}) + +        plflag0, plflag1 = video_info['plflag'].split('_') +        plflag0 = int(plflag0) - 1 +        if plflag1 == '21': +            plflag0 = 10 +            plflag1 = '4' +        live_panda = 'live_panda' if plflag0 < 1 else '' + +        quality_key = qualities(['OD', 'HD', 'SD']) +        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, +                    }) +        self._sort_formats(formats) + +        return { +            'id': video_id, +            'title': self._live_title(title), +            'uploader': uploader, +            'formats': formats, +            'is_live': True, +        } | 
