from .common import InfoExtractor
from .subtitles import SubtitlesInfoExtractor
from ..utils import (
+ compat_HTTPError,
compat_urllib_parse,
compat_urllib_request,
clean_html,
_TESTS = [
{
'url': 'http://vimeo.com/56015672#at=0',
- 'file': '56015672.mp4',
'md5': '8879b6cc097e987f02484baf890129e5',
'info_dict': {
- "upload_date": "20121220",
- "description": "This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550",
- "uploader_id": "user7108434",
- "uploader": "Filippo Valsorda",
+ 'id': '56015672',
+ 'ext': 'mp4',
+ "upload_date": "20121220",
+ "description": "This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550",
+ "uploader_id": "user7108434",
+ "uploader": "Filippo Valsorda",
"title": "youtube-dl test video - \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550",
},
},
},
]
+ @classmethod
+ def suitable(cls, url):
+ if VimeoChannelIE.suitable(url):
+ # Otherwise channel urls like http://vimeo.com/channels/31259 would
+ # match
+ return False
+ else:
+ return super(VimeoIE, cls).suitable(url)
+
def _login(self):
(username, password) = self._get_login_info()
if username is None:
# Retrieve video webpage to extract further information
request = compat_urllib_request.Request(url, None, headers)
- webpage = self._download_webpage(request, video_id)
+ try:
+ webpage = self._download_webpage(request, video_id)
+ except ExtractorError as ee:
+ if isinstance(ee.cause, compat_HTTPError) and ee.cause.code == 403:
+ errmsg = ee.cause.read()
+ if b'Because of its privacy settings, this video cannot be played here' in errmsg:
+ raise ExtractorError(
+ 'Cannot download embed-only video without embedding '
+ 'URL. Please call youtube-dl with the URL of the page '
+ 'that embeds this video.',
+ expected=True)
+ raise
# Now we begin extracting as much information as we can from what we
# retrieved. First we extract the information common to all extractors,
# Extract video thumbnail
video_thumbnail = config["video"].get("thumbnail")
if video_thumbnail is None:
- _, video_thumbnail = sorted((int(width), t_url) for (width, t_url) in config["video"]["thumbs"].items())[-1]
+ video_thumbs = config["video"].get("thumbs")
+ if video_thumbs and isinstance(video_thumbs, dict):
+ _, video_thumbnail = sorted((int(width), t_url) for (width, t_url) in video_thumbs.items())[-1]
# Extract video description
video_description = None
class VimeoChannelIE(InfoExtractor):
IE_NAME = 'vimeo:channel'
- _VALID_URL = r'(?:https?://)?vimeo\.com/channels/(?P<id>[^/]+)'
+ _VALID_URL = r'(?:https?://)?vimeo\.com/channels/(?P<id>[^/]+)/?(\?.*)?$'
_MORE_PAGES_INDICATOR = r'<a.+?rel="next"'
_TITLE_RE = r'<link rel="alternate"[^>]+?title="(.*?)"'