X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=youtube_dl%2Fextractor%2Fvlive.py;h=f79531e6f3a2e922b0369706cc0d76a22feb2499;hb=HEAD;hp=78436c45cb9f4a301f416107274a2f3eabc92cf7;hpb=01b517a20a2645a05b44d3ae65b587fef3fda788;p=youtube-dl diff --git a/youtube_dl/extractor/vlive.py b/youtube_dl/extractor/vlive.py index 78436c45c..f79531e6f 100644 --- a/youtube_dl/extractor/vlive.py +++ b/youtube_dl/extractor/vlive.py @@ -6,22 +6,18 @@ import time import itertools from .common import InfoExtractor -from ..compat import ( - compat_urllib_parse_urlencode, - compat_str, -) +from .naver import NaverBaseIE +from ..compat import compat_str from ..utils import ( - dict_get, ExtractorError, - float_or_none, - int_or_none, + merge_dicts, remove_start, try_get, urlencode_postdata, ) -class VLiveIE(InfoExtractor): +class VLiveIE(NaverBaseIE): IE_NAME = 'vlive' _VALID_URL = r'https?://(?:(?:www|m)\.)?vlive\.tv/video/(?P[0-9]+)' _NETRC_MACHINE = 'vlive' @@ -34,6 +30,7 @@ class VLiveIE(InfoExtractor): 'title': "[V LIVE] Girl's Day's Broadcast", 'creator': "Girl's Day", 'view_count': int, + 'uploader_id': 'muploader_a', }, }, { 'url': 'http://www.vlive.tv/video/16937', @@ -44,6 +41,7 @@ class VLiveIE(InfoExtractor): 'creator': 'EXO', 'view_count': int, 'subtitles': 'mincount:12', + 'uploader_id': 'muploader_j', }, 'params': { 'skip_download': True, @@ -54,8 +52,8 @@ class VLiveIE(InfoExtractor): 'info_dict': { 'id': '129100', 'ext': 'mp4', - 'title': "[V LIVE] [BTS+] Run BTS! 2019 - EP.71 :: Behind the scene", - 'creator': "BTS+", + 'title': '[V LIVE] [BTS+] Run BTS! 2019 - EP.71 :: Behind the scene', + 'creator': 'BTS+', 'view_count': int, 'subtitles': 'mincount:10', }, @@ -79,16 +77,12 @@ class VLiveIE(InfoExtractor): 'https://www.vlive.tv/auth/loginInfo', None, note='Downloading login info', headers={'Referer': 'https://www.vlive.tv/home'}) - - return try_get(login_info, - lambda x: x['message']['login'], bool) or False - - if is_logged_in(): - return + return try_get( + login_info, lambda x: x['message']['login'], bool) or False LOGIN_URL = 'https://www.vlive.tv/auth/email/login' - self._request_webpage(LOGIN_URL, None, - note='Downloading login cookies') + self._request_webpage( + LOGIN_URL, None, note='Downloading login cookies') self._download_webpage( LOGIN_URL, None, note='Logging in', @@ -144,7 +138,7 @@ class VLiveIE(InfoExtractor): def _get_common_fields(self, webpage): title = self._og_search_title(webpage) creator = self._html_search_regex( - r']+class="info_area"[^>]*>\s*(?:]*>.*\s*)?]*>([^<]+)', + r']+class="info_area"[^>]*>\s*(?:]*>.*?\s*)?]*>([^<]+)', webpage, 'creator', fatal=False) thumbnail = self._og_search_thumbnail(webpage) return { @@ -183,52 +177,17 @@ class VLiveIE(InfoExtractor): if '' in (long_video_id, key): init_page = self._download_init_page(video_id) video_info = self._parse_json(self._search_regex( - r'(?s)oVideoStatus\s*=\s*({.*})', init_page, 'video info'), + (r'(?s)oVideoStatus\s*=\s*({.+?})\s*[0-9]+)/playlist/(?P[0-9]+)' - _TEST = { + _VIDEO_URL_TEMPLATE = 'http://www.vlive.tv/video/%s' + _TESTS = [{ + # regular working playlist + 'url': 'https://www.vlive.tv/video/117956/playlist/117963', + 'info_dict': { + 'id': '117963', + 'title': '아이돌룸(IDOL ROOM) 41회 - (여자)아이들' + }, + 'playlist_mincount': 10 + }, { + # playlist with no playlistVideoSeqs 'url': 'http://www.vlive.tv/video/22867/playlist/22912', 'info_dict': { - 'id': '22912', - 'title': 'Valentine Day Message from TWICE' + 'id': '22867', + 'ext': 'mp4', + 'title': '[V LIVE] Valentine Day Message from MINA', + 'creator': 'TWICE', + 'view_count': int }, - 'playlist_mincount': 9 - } + 'params': { + 'skip_download': True, + } + }] + + def _build_video_result(self, video_id, message): + self.to_screen(message) + return self.url_result( + self._VIDEO_URL_TEMPLATE % video_id, + ie=VLiveIE.ie_key(), video_id=video_id) def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id, playlist_id = mobj.group('video_id', '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) + return self._build_video_result( + video_id, + 'Downloading just video %s because of --no-playlist' + % video_id) self.to_screen( 'Downloading playlist %s - add --no-playlist to just download video' @@ -364,15 +342,21 @@ class VLivePlaylistIE(InfoExtractor): 'http://www.vlive.tv/video/%s/playlist/%s' % (video_id, playlist_id), playlist_id) - item_ids = self._parse_json( - self._search_regex( - r'playlistVideoSeqs\s*=\s*(\[[^]]+\])', webpage, - 'playlist video seqs'), - playlist_id) + raw_item_ids = self._search_regex( + r'playlistVideoSeqs\s*=\s*(\[[^]]+\])', webpage, + 'playlist video seqs', default=None, fatal=False) + + if not raw_item_ids: + return self._build_video_result( + video_id, + 'Downloading just video %s because no playlist was found' + % video_id) + + item_ids = self._parse_json(raw_item_ids, playlist_id) entries = [ self.url_result( - VIDEO_URL_TEMPLATE % item_id, ie=VLiveIE.ie_key(), + self._VIDEO_URL_TEMPLATE % item_id, ie=VLiveIE.ie_key(), video_id=compat_str(item_id)) for item_id in item_ids]