[niconico] Fix extraction and update tests (closes #5511)

This commit is contained in:
Yen Chi Hsuan 2015-04-30 00:24:24 +08:00
parent 9ee53a49f0
commit bb865f3a5e

View file

@ -14,7 +14,9 @@
ExtractorError, ExtractorError,
int_or_none, int_or_none,
parse_duration, parse_duration,
unified_strdate, parse_iso8601,
xpath_text,
determine_ext,
) )
@ -32,6 +34,7 @@ class NiconicoIE(InfoExtractor):
'uploader': 'takuya0301', 'uploader': 'takuya0301',
'uploader_id': '2698420', 'uploader_id': '2698420',
'upload_date': '20131123', 'upload_date': '20131123',
'timestamp': 1385182762,
'description': '(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org', 'description': '(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org',
'duration': 33, 'duration': 33,
}, },
@ -46,16 +49,31 @@ class NiconicoIE(InfoExtractor):
'id': 'nm14296458', 'id': 'nm14296458',
'ext': 'swf', 'ext': 'swf',
'title': '【鏡音リン】Dance on media【オリジナル】take2!', 'title': '【鏡音リン】Dance on media【オリジナル】take2!',
'description': 'md5:', 'description': 'md5:689f066d74610b3b22e0f1739add0f58',
'uploader': 'りょうた', 'uploader': 'りょうた',
'uploader_id': '18822557', 'uploader_id': '18822557',
'upload_date': '20110429', 'upload_date': '20110429',
'timestamp': 1304065916,
'duration': 209, 'duration': 209,
}, },
'params': { 'params': {
'username': 'ydl.niconico@gmail.com', 'username': 'ydl.niconico@gmail.com',
'password': 'youtube-dl', 'password': 'youtube-dl',
}, },
}, {
# 'video exists but is marked as "deleted"
'url': 'http://www.nicovideo.jp/watch/sm10000',
'md5': '38e53c9aad548f3ecf01ca7680b59b08',
'info_dict': {
'id': 'sm10000',
'ext': 'unknown_video',
'description': 'deleted',
'title': 'ドラえもんエターナル第3話「決戦第3新東京市」前編',
},
'params': {
'username': 'ydl.niconico@gmail.com',
'password': 'youtube-dl',
}
}] }]
_VALID_URL = r'https?://(?:www\.|secure\.)?nicovideo\.jp/watch/(?P<id>(?:[a-z]{2})?[0-9]+)' _VALID_URL = r'https?://(?:www\.|secure\.)?nicovideo\.jp/watch/(?P<id>(?:[a-z]{2})?[0-9]+)'
@ -95,9 +113,10 @@ def _login(self):
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
# Get video webpage. We are not actually interested in it, but need # Get video webpage. We are not actually interested in it for normal
# the cookies in order to be able to download the info webpage # cases, but need the cookies in order to be able to download the
self._download_webpage('http://www.nicovideo.jp/watch/' + video_id, video_id) # info webpage
webpage = self._download_webpage('http://www.nicovideo.jp/watch/' + video_id, video_id)
video_info = self._download_xml( video_info = self._download_xml(
'http://ext.nicovideo.jp/api/getthumbinfo/' + video_id, video_id, 'http://ext.nicovideo.jp/api/getthumbinfo/' + video_id, video_id,
@ -127,22 +146,34 @@ def _real_extract(self, url):
flv_info_request, video_id, flv_info_request, video_id,
note='Downloading flv info', errnote='Unable to download flv info') note='Downloading flv info', errnote='Unable to download flv info')
if 'deleted=' in flv_info_webpage: flv_info = compat_urlparse.parse_qs(flv_info_webpage)
raise ExtractorError('The video has been deleted.', if 'url' not in flv_info:
expected=True) if 'deleted' in flv_info:
video_real_url = compat_urlparse.parse_qs(flv_info_webpage)['url'][0] raise ExtractorError('The video has been deleted.',
expected=True)
else:
raise ExtractorError('Unable to find video URL')
video_real_url = flv_info['url'][0]
# Start extracting information # Start extracting information
title = video_info.find('.//title').text title = xpath_text(video_info, './/title')
extension = video_info.find('.//movie_type').text if not title:
title = self._html_search_regex(
r'<span[^>]+class="videoHeaderTitle"[^>]*>([^<]+)</span>',
webpage, 'video title')
extension = xpath_text(video_info, './/movie_type')
if not extension:
extension = determine_ext(video_real_url)
video_format = extension.upper() video_format = extension.upper()
thumbnail = video_info.find('.//thumbnail_url').text thumbnail = xpath_text(video_info, './/thumbnail_url')
description = video_info.find('.//description').text description = xpath_text(video_info, './/description')
upload_date = unified_strdate(video_info.find('.//first_retrieve').text.split('+')[0]) timestamp = parse_iso8601(xpath_text(video_info, './/first_retrieve'))
view_count = int_or_none(video_info.find('.//view_counter').text) view_count = int_or_none(xpath_text(video_info, './/view_counter'))
comment_count = int_or_none(video_info.find('.//comment_num').text) comment_count = int_or_none(xpath_text(video_info, './/comment_num'))
duration = parse_duration(video_info.find('.//length').text) duration = parse_duration(xpath_text(video_info, './/length'))
webpage_url = video_info.find('.//watch_url').text webpage_url = xpath_text(video_info, './/watch_url')
if video_info.find('.//ch_id') is not None: if video_info.find('.//ch_id') is not None:
uploader_id = video_info.find('.//ch_id').text uploader_id = video_info.find('.//ch_id').text
@ -153,7 +184,7 @@ def _real_extract(self, url):
else: else:
uploader_id = uploader = None uploader_id = uploader = None
return { ret = {
'id': video_id, 'id': video_id,
'url': video_real_url, 'url': video_real_url,
'title': title, 'title': title,
@ -162,13 +193,14 @@ def _real_extract(self, url):
'thumbnail': thumbnail, 'thumbnail': thumbnail,
'description': description, 'description': description,
'uploader': uploader, 'uploader': uploader,
'upload_date': upload_date, 'timestamp': timestamp,
'uploader_id': uploader_id, 'uploader_id': uploader_id,
'view_count': view_count, 'view_count': view_count,
'comment_count': comment_count, 'comment_count': comment_count,
'duration': duration, 'duration': duration,
'webpage_url': webpage_url, 'webpage_url': webpage_url,
} }
return dict((k, v) for k, v in ret.items() if v is not None)
class NiconicoPlaylistIE(InfoExtractor): class NiconicoPlaylistIE(InfoExtractor):