diff options
author | remitamine <remitamine@gmail.com> | 2015-12-21 03:05:34 +0100 |
---|---|---|
committer | remitamine <remitamine@gmail.com> | 2015-12-21 03:05:34 +0100 |
commit | 5b251628e9f45c89c1becb3f62c4212874eb74ea (patch) | |
tree | 2752034920c7821b22f893de8f7f354c3be85cf2 /youtube_dl/extractor/googledrive.py | |
parent | 8e92d21ebf6f17e14c9e916f22e49f27529556af (diff) |
[googledrive] Modernize
Diffstat (limited to 'youtube_dl/extractor/googledrive.py')
-rw-r--r-- | youtube_dl/extractor/googledrive.py | 144 |
1 files changed, 50 insertions, 94 deletions
diff --git a/youtube_dl/extractor/googledrive.py b/youtube_dl/extractor/googledrive.py index 7bc7b7a0d..f354c9c7a 100644 --- a/youtube_dl/extractor/googledrive.py +++ b/youtube_dl/extractor/googledrive.py @@ -1,132 +1,88 @@ +from __future__ import unicode_literals + import re from .common import InfoExtractor from ..utils import ( - RegexNotFoundError, ExtractorError, + int_or_none, ) -class GoogleDriveEmbedIE(InfoExtractor): - _VALID_URL = r'https?://(?:video\.google\.com/get_player\?.*?docid=|(?:docs|drive)\.google\.com/file/d/)(?P<id>[a-zA-Z0-9_-]{28})' + +class GoogleDriveIE(InfoExtractor): + _VALID_URL = r'https?://(?:(?:docs|drive)\.google\.com/(?:uc\?.*?id=|file/d/)|video\.google\.com/get_player\?.*?docid=)(?P<id>[a-zA-Z0-9_-]{28})' _TEST = { - 'url': 'https://docs.google.com/file/d/0B8KB9DRosYGKMXNoeWxqa3JYclE/preview', + 'url': 'https://drive.google.com/file/d/0ByeS4oOUV-49Zzh4R1J6R09zazQ/edit?pli=1', + 'md5': '881f7700aec4f538571fa1e0eed4a7b6', 'info_dict': { - 'id': '0B8KB9DRosYGKMXNoeWxqa3JYclE', + 'id': '0ByeS4oOUV-49Zzh4R1J6R09zazQ', 'ext': 'mp4', - 'title': 'Jimmy Fallon Sings Since You\'ve Been Gone.wmv', + 'title': 'Big Buck Bunny.mp4', + 'duration': 46, } } + _FORMATS_EXT = { + '5': 'flv', + '6': 'flv', + '13': '3gp', + '17': '3gp', + '18': 'mp4', + '22': 'mp4', + '34': 'flv', + '35': 'flv', + '36': '3gp', + '37': 'mp4', + '38': 'mp4', + '43': 'webm', + '44': 'webm', + '45': 'webm', + '46': 'webm', + '59': 'mp4', + } @staticmethod def _extract_url(webpage): mobj = re.search( - r'<iframe src="https?://(?:video\.google\.com/get_player\?.*?docid=|(?:docs|drive)\.google\.com/file/d/)(?P<id>[a-zA-Z0-9_-]{28})', + r'<iframe[^>]+src="https?://(?:video\.google\.com/get_player\?.*?docid=|(?:docs|drive)\.google\.com/file/d/)(?P<id>[a-zA-Z0-9_-]{28})', webpage) if mobj: return 'https://drive.google.com/file/d/%s' % mobj.group('id') def _real_extract(self, url): video_id = self._match_id(url) - return { - '_type': 'url', - 'ie_key': 'GoogleDrive', - 'url': 'https://drive.google.com/file/d/%s' % video_id - } + webpage = self._download_webpage( + 'http://docs.google.com/file/d/%s' % video_id, video_id, encoding='unicode_escape') -class GoogleDriveIE(InfoExtractor): - _VALID_URL = r'https?://(?:docs|drive)\.google\.com/(?:uc\?.*?id=|file/d/)(?P<id>[a-zA-Z0-9_-]{28})' - _TEST = { - 'url': 'https://drive.google.com/file/d/0ByeS4oOUV-49Zzh4R1J6R09zazQ/edit?pli=1', - 'info_dict': { - 'id': '0ByeS4oOUV-49Zzh4R1J6R09zazQ', - 'ext': 'mp4', - 'title': 'Big Buck Bunny.mp4', - } - } - _formats = { - '5': {'ext': 'flv'}, - '6': {'ext': 'flv'}, - '13': {'ext': '3gp'}, - '17': {'ext': '3gp'}, - '18': {'ext': 'mp4'}, - '22': {'ext': 'mp4'}, - '34': {'ext': 'flv'}, - '35': {'ext': 'flv'}, - '36': {'ext': '3gp'}, - '37': {'ext': 'mp4'}, - '38': {'ext': 'mp4'}, - '43': {'ext': 'webm'}, - '44': {'ext': 'webm'}, - '45': {'ext': 'webm'}, - '46': {'ext': 'webm'}, - '59': {'ext': 'mp4'} - } + reason = self._search_regex(r'"reason"\s*,\s*"([^"]+)', webpage, 'reason', default=None) + if reason: + raise ExtractorError(reason) - def _real_extract(self, url): - video_id = self._match_id(url) - webpage = self._download_webpage( - 'http://docs.google.com/file/d/' + video_id, video_id, encoding='unicode_escape' - ) - try: - title = self._html_search_regex( - r'"title"\s*,\s*"([^"]+)', - webpage, - 'title' - ) - fmt_stream_map = self._html_search_regex( - r'"fmt_stream_map"\s*,\s*"([^"]+)', - webpage, - 'fmt_stream_map' - ) - fmt_list = self._html_search_regex( - r'"fmt_list"\s*,\s*"([^"]+)', - webpage, - 'fmt_list' - ) -# timestamp = self._html_search_regex( -# r'"timestamp"\s*,\s*"([^"]+)', -# webpage, -# 'timestamp' -# ) - length_seconds = self._html_search_regex( - r'"length_seconds"\s*,\s*"([^"]+)', - webpage, - 'length_seconds' - ) - except RegexNotFoundError: - try: - reason = self._html_search_regex( - r'"reason","([^"]+)', - webpage, - 'reason' - ) - raise ExtractorError(reason) - return - except RegexNotFoundError: - raise ExtractorError('not a video') - return + title = self._search_regex(r'"title"\s*,\s*"([^"]+)', webpage, 'title') + duration = int_or_none(self._search_regex( + r'"length_seconds"\s*,\s*"([^"]+)', webpage, 'length seconds', default=None)) + fmt_stream_map = self._search_regex( + r'"fmt_stream_map"\s*,\s*"([^"]+)', webpage, 'fmt stream map').split(',') + fmt_list = self._search_regex(r'"fmt_list"\s*,\s*"([^"]+)', webpage, 'fmt_list').split(',') - fmt_stream_map = fmt_stream_map.split(',') - fmt_list = fmt_list.split(',') formats = [] - for i in range(len(fmt_stream_map)): - fmt_id, fmt_url = fmt_stream_map[i].split('|') - resolution = fmt_list[i].split('/')[1] + for fmt, fmt_stream in zip(fmt_list, fmt_stream_map): + fmt_id, fmt_url = fmt_stream.split('|') + resolution = fmt.split('/')[1] width, height = resolution.split('x') formats.append({ 'url': fmt_url, 'format_id': fmt_id, 'resolution': resolution, - 'width': int(width), - 'height': int(height), - 'ext': self._formats[fmt_id]['ext'] + 'width': int_or_none(width), + 'height': int_or_none(height), + 'ext': self._FORMATS_EXT[fmt_id], }) self._sort_formats(formats) return { 'id': video_id, 'title': title, -# 'timestamp': int(timestamp), - 'duration': int(length_seconds), - 'formats': formats + 'thumbnail': self._og_search_thumbnail(webpage), + 'duration': duration, + 'formats': formats, } |