diff options
Diffstat (limited to 'youtube_dl/extractor/pandoratv.py')
| -rw-r--r-- | youtube_dl/extractor/pandoratv.py | 78 | 
1 files changed, 67 insertions, 11 deletions
diff --git a/youtube_dl/extractor/pandoratv.py b/youtube_dl/extractor/pandoratv.py index 8d49f5c4a..538738c09 100644 --- a/youtube_dl/extractor/pandoratv.py +++ b/youtube_dl/extractor/pandoratv.py @@ -1,6 +1,8 @@ -# encoding: utf-8 +# coding: utf-8  from __future__ import unicode_literals +import re +  from .common import InfoExtractor  from ..compat import (      compat_str, @@ -11,21 +13,29 @@ from ..utils import (      float_or_none,      parse_duration,      str_to_int, +    urlencode_postdata,  )  class PandoraTVIE(InfoExtractor):      IE_NAME = 'pandora.tv'      IE_DESC = '판도라TV' -    _VALID_URL = r'https?://(?:.+?\.)?channel\.pandora\.tv/channel/video\.ptv\?' -    _TEST = { +    _VALID_URL = r'''(?x) +                        https?:// +                            (?: +                                (?:www\.)?pandora\.tv/view/(?P<user_id>[^/]+)/(?P<id>\d+)|  # new format +                                (?:.+?\.)?channel\.pandora\.tv/channel/video\.ptv\?|        # old format +                                m\.pandora\.tv/?\?                                          # mobile +                            ) +                    ''' +    _TESTS = [{          'url': 'http://jp.channel.pandora.tv/channel/video.ptv?c1=&prgid=53294230&ch_userid=mikakim&ref=main&lot=cate_01_2',          'info_dict': {              'id': '53294230',              'ext': 'flv',              'title': '頭を撫でてくれる?',              'description': '頭を撫でてくれる?', -            'thumbnail': 're:^https?://.*\.jpg$', +            'thumbnail': r're:^https?://.*\.jpg$',              'duration': 39,              'upload_date': '20151218',              'uploader': 'カワイイ動物まとめ', @@ -33,14 +43,44 @@ class PandoraTVIE(InfoExtractor):              'view_count': int,              'like_count': int,          } -    } +    }, { +        'url': 'http://channel.pandora.tv/channel/video.ptv?ch_userid=gogoucc&prgid=54721744', +        'info_dict': { +            'id': '54721744', +            'ext': 'flv', +            'title': '[HD] JAPAN COUNTDOWN 170423', +            'description': '[HD] JAPAN COUNTDOWN 170423', +            'thumbnail': r're:^https?://.*\.jpg$', +            'duration': 1704.9, +            'upload_date': '20170423', +            'uploader': 'GOGO_UCC', +            'uploader_id': 'gogoucc', +            'view_count': int, +            'like_count': int, +        }, +        'params': { +            # Test metadata only +            'skip_download': True, +        }, +    }, { +        'url': 'http://www.pandora.tv/view/mikakim/53294230#36797454_new', +        'only_matching': True, +    }, { +        'url': 'http://m.pandora.tv/?c=view&ch_userid=mikakim&prgid=54600346', +        'only_matching': True, +    }]      def _real_extract(self, url): -        qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) -        video_id = qs.get('prgid', [None])[0] -        user_id = qs.get('ch_userid', [None])[0] -        if any(not f for f in (video_id, user_id,)): -            raise ExtractorError('Invalid URL', expected=True) +        mobj = re.match(self._VALID_URL, url) +        user_id = mobj.group('user_id') +        video_id = mobj.group('id') + +        if not user_id or not video_id: +            qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) +            video_id = qs.get('prgid', [None])[0] +            user_id = qs.get('ch_userid', [None])[0] +            if any(not f for f in (video_id, user_id,)): +                raise ExtractorError('Invalid URL', expected=True)          data = self._download_json(              'http://m.pandora.tv/?c=view&m=viewJsonApi&ch_userid=%s&prgid=%s' @@ -56,6 +96,22 @@ class PandoraTVIE(InfoExtractor):                  r'^v(\d+)[Uu]rl$', format_id, 'height', default=None)              if not height:                  continue + +            play_url = self._download_json( +                'http://m.pandora.tv/?c=api&m=play_url', video_id, +                data=urlencode_postdata({ +                    'prgid': video_id, +                    'runtime': info.get('runtime'), +                    'vod_url': format_url, +                }), +                headers={ +                    'Origin': url, +                    'Content-Type': 'application/x-www-form-urlencoded', +                }) +            format_url = play_url.get('url') +            if not format_url: +                continue +              formats.append({                  'format_id': '%sp' % height,                  'url': format_url, @@ -69,7 +125,7 @@ class PandoraTVIE(InfoExtractor):              'description': info.get('body'),              'thumbnail': info.get('thumbnail') or info.get('poster'),              'duration': float_or_none(info.get('runtime'), 1000) or parse_duration(info.get('time')), -            'upload_date': info['fid'][:8] if isinstance(info.get('fid'), compat_str) else None, +            'upload_date': info['fid'].split('/')[-1][:8] if isinstance(info.get('fid'), compat_str) else None,              'uploader': info.get('nickname'),              'uploader_id': info.get('upload_userid'),              'view_count': str_to_int(info.get('hit')),  | 
