[vlive:playlist] Add extractor
authorcoreynicholson <coreynicholson@users.noreply.github.com>
Sun, 9 Jul 2017 21:24:04 +0000 (22:24 +0100)
committerSergey M <dstftw@gmail.com>
Sun, 9 Jul 2017 21:24:04 +0000 (04:24 +0700)
youtube_dl/extractor/extractors.py
youtube_dl/extractor/vlive.py

index 9ee080895071c1ccd5a56b2b0cdb764061a2ac50..eb1541729d1e31c76d39a3002cc947f90079d1d2 100644 (file)
@@ -1206,7 +1206,8 @@ from .vk import (
 )
 from .vlive import (
     VLiveIE,
-    VLiveChannelIE
+    VLiveChannelIE,
+    VLivePlaylistIE
 )
 from .vodlocker import VodlockerIE
 from .vodpl import VODPlIE
index e58940607a491581bb6e263ca2ffd3dd9741feac..f3825db5cc208d0fe8ae248b68198213e6ce82e1 100644 (file)
@@ -49,6 +49,10 @@ class VLiveIE(InfoExtractor):
         },
     }]
 
+    @classmethod
+    def suitable(cls, url):
+        return False if VLivePlaylistIE.suitable(url) else super(VLiveIE, cls).suitable(url)
+
     def _real_extract(self, url):
         video_id = self._match_id(url)
 
@@ -261,3 +265,55 @@ class VLiveChannelIE(InfoExtractor):
 
         return self.playlist_result(
             entries, channel_code, channel_name)
+
+
+class VLivePlaylistIE(InfoExtractor):
+    IE_NAME = 'vlive:playlist'
+    _VALID_URL = r'https?://(?:(?:www|m)\.)?vlive\.tv/video/(?P<video_id>[0-9]+)/playlist/(?P<id>[0-9]+)'
+    _TEST = {
+        'url': 'http://www.vlive.tv/video/22867/playlist/22912',
+        'info_dict': {
+            'id': '22912',
+            'title': 'Valentine Day Message from TWICE'
+        },
+        'playlist_mincount': 9
+    }
+
+    def _real_extract(self, url):
+        playlist_id = self._match_id(url)
+        video_id_match = re.match(self._VALID_URL, url)
+        assert video_id_match
+        video_id = compat_str(video_id_match.group('video_id'))
+
+        VIDEO_URL_TEMPLATE = 'http://www.vlive.tv/video/%s'
+        if self._downloader.params.get('noplaylist'):
+            self.to_screen(
+                'Downloading just video %s because of --no-playlist' % video_id)
+            return self.url_result(
+                VIDEO_URL_TEMPLATE % video_id,
+                ie=VLiveIE.ie_key(), video_id=video_id)
+
+        self.to_screen(
+            'Downloading playlist %s - add --no-playlist to just download video' % playlist_id)
+
+        webpage = self._download_webpage(
+            'http://www.vlive.tv/video/%s/playlist/%s' % (video_id, playlist_id), video_id)
+
+        playlist_name = self._html_search_regex(
+            r'<div[^>]+class="[^"]*multicam_playlist[^>]*>\s*<h3[^>]+>([^<]+)',
+            webpage, 'playlist name', fatal=False)
+
+        item_ids = self._search_regex(
+            r'\bvar\s+playlistVideoSeqs\s*=\s*(\[[^]]+\])',
+            webpage, 'playlist item ids')
+
+        entries = []
+        for item_id in self._parse_json(item_ids, playlist_id):
+            item_id = compat_str(item_id)
+            entries.append(
+                self.url_result(
+                    VIDEO_URL_TEMPLATE % item_id,
+                    ie=VLiveIE.ie_key(), video_id=item_id))
+
+        return self.playlist_result(
+            entries, playlist_id, playlist_name)