about summary refs log tree commit diff
path: root/youtube_dl/extractor/vlive.py
diff options
context:
space:
mode:
authorping <liping.ong@gmail.com>2017-01-24 13:52:17 +0800
committerSergey M <dstftw@gmail.com>2017-01-28 18:50:38 +0700
commitb92d3c5343536eb0a865afa79e3787fc384ec0ec (patch)
tree46f7df07ab8ff8cee4c2b5dbc335e065d30a7981 /youtube_dl/extractor/vlive.py
parentab6f6aee78fc4757fcb65bd8f4699aaf9feac3a6 (diff)
downloadyoutube-dl-b92d3c5343536eb0a865afa79e3787fc384ec0ec.tar.gz
youtube-dl-b92d3c5343536eb0a865afa79e3787fc384ec0ec.tar.xz
youtube-dl-b92d3c5343536eb0a865afa79e3787fc384ec0ec.zip
[vlive] Add support for channels
Diffstat (limited to 'youtube_dl/extractor/vlive.py')
-rw-r--r--youtube_dl/extractor/vlive.py68
1 files changed, 68 insertions, 0 deletions
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)