|
|
@ -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() |
|
|
|