|
|
|
@ -57,6 +57,7 @@ class VimeoIE(VimeoBaseInfoExtractor, SubtitlesInfoExtractor):
|
|
|
|
|
(?P<proto>(?:https?:)?//)?
|
|
|
|
|
(?:(?:www|(?P<player>player))\.)?
|
|
|
|
|
vimeo(?P<pro>pro)?\.com/
|
|
|
|
|
(?!channels/[^/?#]+/?(?:$|[?#])|album/)
|
|
|
|
|
(?:.*?/)?
|
|
|
|
|
(?:(?:play_redirect_hls|moogaloop\.swf)\?clip_id=)?
|
|
|
|
|
(?:videos?/)?
|
|
|
|
@ -153,15 +154,6 @@ class VimeoIE(VimeoBaseInfoExtractor, SubtitlesInfoExtractor):
|
|
|
|
|
},
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@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 _verify_video_password(self, url, video_id, webpage):
|
|
|
|
|
password = self._downloader.params.get('videopassword', None)
|
|
|
|
|
if password is None:
|
|
|
|
@ -380,9 +372,16 @@ class VimeoIE(VimeoBaseInfoExtractor, SubtitlesInfoExtractor):
|
|
|
|
|
|
|
|
|
|
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="(.*?)"'
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://vimeo.com/channels/tributes',
|
|
|
|
|
'info_dict': {
|
|
|
|
|
'title': 'Vimeo Tributes',
|
|
|
|
|
},
|
|
|
|
|
'playlist_mincount': 25,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _page_url(self, base_url, pagenum):
|
|
|
|
|
return '%s/videos/page:%d/' % (base_url, pagenum)
|
|
|
|
@ -416,14 +415,15 @@ class VimeoChannelIE(InfoExtractor):
|
|
|
|
|
|
|
|
|
|
class VimeoUserIE(VimeoChannelIE):
|
|
|
|
|
IE_NAME = 'vimeo:user'
|
|
|
|
|
_VALID_URL = r'(?:https?://)?vimeo\.com/(?P<name>[^/]+)(?:/videos|[#?]|$)'
|
|
|
|
|
_VALID_URL = r'https?://vimeo\.com/(?![0-9]+(?:$|[?#/]))(?P<name>[^/]+)(?:/videos|[#?]|$)'
|
|
|
|
|
_TITLE_RE = r'<a[^>]+?class="user">([^<>]+?)</a>'
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def suitable(cls, url):
|
|
|
|
|
if VimeoChannelIE.suitable(url) or VimeoIE.suitable(url) or VimeoAlbumIE.suitable(url) or VimeoGroupsIE.suitable(url):
|
|
|
|
|
return False
|
|
|
|
|
return super(VimeoUserIE, cls).suitable(url)
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://vimeo.com/nkistudio/videos',
|
|
|
|
|
'info_dict': {
|
|
|
|
|
'title': 'Nki',
|
|
|
|
|
},
|
|
|
|
|
'playlist_mincount': 66,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
|
mobj = re.match(self._VALID_URL, url)
|
|
|
|
@ -433,8 +433,15 @@ class VimeoUserIE(VimeoChannelIE):
|
|
|
|
|
|
|
|
|
|
class VimeoAlbumIE(VimeoChannelIE):
|
|
|
|
|
IE_NAME = 'vimeo:album'
|
|
|
|
|
_VALID_URL = r'(?:https?://)?vimeo\.com/album/(?P<id>\d+)'
|
|
|
|
|
_VALID_URL = r'https?://vimeo\.com/album/(?P<id>\d+)'
|
|
|
|
|
_TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>'
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://vimeo.com/album/2632481',
|
|
|
|
|
'info_dict': {
|
|
|
|
|
'title': 'Staff Favorites: November 2013',
|
|
|
|
|
},
|
|
|
|
|
'playlist_mincount': 13,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _page_url(self, base_url, pagenum):
|
|
|
|
|
return '%s/page:%d/' % (base_url, pagenum)
|
|
|
|
@ -448,6 +455,13 @@ class VimeoAlbumIE(VimeoChannelIE):
|
|
|
|
|
class VimeoGroupsIE(VimeoAlbumIE):
|
|
|
|
|
IE_NAME = 'vimeo:group'
|
|
|
|
|
_VALID_URL = r'(?:https?://)?vimeo\.com/groups/(?P<name>[^/]+)'
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://vimeo.com/groups/rolexawards',
|
|
|
|
|
'info_dict': {
|
|
|
|
|
'title': 'Rolex Awards for Enterprise',
|
|
|
|
|
},
|
|
|
|
|
'playlist_mincount': 73,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _extract_list_title(self, webpage):
|
|
|
|
|
return self._og_search_title(webpage)
|
|
|
|
@ -497,6 +511,10 @@ class VimeoWatchLaterIE(VimeoBaseInfoExtractor, VimeoChannelIE):
|
|
|
|
|
_VALID_URL = r'https?://vimeo\.com/home/watchlater|:vimeowatchlater'
|
|
|
|
|
_LOGIN_REQUIRED = True
|
|
|
|
|
_TITLE_RE = r'href="/home/watchlater".*?>(.*?)<'
|
|
|
|
|
_TESTS = [{
|
|
|
|
|
'url': 'http://vimeo.com/home/watchlater',
|
|
|
|
|
'only_matching': True,
|
|
|
|
|
}]
|
|
|
|
|
|
|
|
|
|
def _real_initialize(self):
|
|
|
|
|
self._login()
|
|
|
|
|