diff options
| author | ping <liping.ong@gmail.com> | 2017-01-24 13:52:17 +0800 | 
|---|---|---|
| committer | Sergey M <dstftw@gmail.com> | 2017-01-28 18:50:38 +0700 | 
| commit | b92d3c5343536eb0a865afa79e3787fc384ec0ec (patch) | |
| tree | 46f7df07ab8ff8cee4c2b5dbc335e065d30a7981 | |
| parent | ab6f6aee78fc4757fcb65bd8f4699aaf9feac3a6 (diff) | |
[vlive] Add support for channels
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 5 | ||||
| -rw-r--r-- | youtube_dl/extractor/vlive.py | 68 | 
2 files changed, 72 insertions, 1 deletions
diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 81366f933..c781c9b87 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1129,7 +1129,10 @@ from .vk import (      VKUserVideosIE,      VKWallPostIE,  ) -from .vlive import VLiveIE +from .vlive import ( +    VLiveIE, +    VLiveChannelIE +)  from .vodlocker import VodlockerIE  from .vodplatform import VODPlatformIE  from .voicerepublic import VoiceRepublicIE diff --git a/youtube_dl/extractor/vlive.py b/youtube_dl/extractor/vlive.py index 540246c79..70bab1f04 100644 --- a/youtube_dl/extractor/vlive.py +++ b/youtube_dl/extractor/vlive.py @@ -2,6 +2,8 @@  from __future__ import unicode_literals  import re +import time +import itertools  from .common import InfoExtractor  from ..utils import ( @@ -169,3 +171,69 @@ class VLiveIE(InfoExtractor):              'subtitles': subtitles,          })          return info + + +class VLiveChannelIE(InfoExtractor): +    IE_NAME = 'vlive:channel' +    _VALID_URL = r'https?://channels\.vlive\.tv/(?P<id>[0-9A-Z]+)/video' +    _TEST = { +        'url': 'http://channels.vlive.tv/FCD4B/video', +        'info_dict': { +            'id': 'FCD4B', +            'title': 'MAMAMOO', +        }, +        'playlist_mincount': 110 +    } +    _APP_ID = '8c6cc7b45d2568fb668be6e05b6e5a3b' + +    def _real_extract(self, url): +        channel_code = self._match_id(url) + +        webpage = self._download_webpage( +            'http://channels.vlive.tv/%s/video' % channel_code, channel_code) +        app_js_url = self._search_regex( +            r'(http[^\'\"\s]+app\.js)', webpage, 'app js', default='') + +        if app_js_url: +            app_js = self._download_webpage(app_js_url, channel_code, 'app js') +            app_id = self._search_regex( +                r'Global\.VFAN_APP_ID\s*=\s*[\'"]([^\'"]+)[\'"]', +                app_js, 'app id', default=self._APP_ID) +        else: +            app_id = self._APP_ID + +        channel_info = self._download_json( +            'http://api.vfan.vlive.tv/vproxy/channelplus/decodeChannelCode', +            channel_code, note='decode channel code', +            query={'app_id': app_id, 'channelCode': channel_code, '_': int(time.time())}) + +        channel_seq = channel_info['result']['channelSeq'] +        channel_name = None +        entries = [] + +        for page_num in itertools.count(1): +            video_list = self._download_json( +                'http://api.vfan.vlive.tv/vproxy/channelplus/getChannelVideoList', +                channel_code, note='channel list %d' % page_num, +                query={ +                    'app_id': app_id, +                    'channelSeq': channel_seq, +                    'maxNumOfRows': 1000, +                    '_': int(time.time()), +                    'pageNo': page_num +                } +            ) +            if not channel_name: +                channel_name = video_list['result']['channelInfo']['channelName'] + +            if not video_list['result'].get('videoList'): +                break + +            for video in video_list['result']['videoList']: +                video_id = str(video['videoSeq']) +                entries.append( +                    self.url_result( +                        'http://www.vlive.tv/video/%s' % video_id, 'Vlive', video_id)) + +        return self.playlist_result( +            entries, channel_code, channel_name)  | 
