mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	VimeoIE: authentication support (closes #885) and add a method in the base InfoExtractor to get the login info
This commit is contained in:
		| @@ -3,6 +3,7 @@ import os | ||||
| import re | ||||
| import socket | ||||
| import sys | ||||
| import netrc | ||||
|  | ||||
| from ..utils import ( | ||||
|     compat_http_client, | ||||
| @@ -161,6 +162,10 @@ class InfoExtractor(object): | ||||
|         """Report attempt to confirm age.""" | ||||
|         self.to_screen(u'Confirming age') | ||||
|  | ||||
|     def report_login(self): | ||||
|         """Report attempt to log in.""" | ||||
|         self.to_screen(u'Logging in') | ||||
|  | ||||
|     #Methods for following #608 | ||||
|     #They set the correct value of the '_type' key | ||||
|     def video_result(self, video_info): | ||||
| @@ -225,6 +230,36 @@ class InfoExtractor(object): | ||||
|         else: | ||||
|             return res | ||||
|  | ||||
|     def _get_login_info(self): | ||||
|         """ | ||||
|         Get the the login info as (username, password) | ||||
|         It will look in the netrc file using the _NETRC_MACHINE value | ||||
|         If there's no info available, return (None, None) | ||||
|         """ | ||||
|         if self._downloader is None: | ||||
|             return (None, None) | ||||
|  | ||||
|         username = None | ||||
|         password = None | ||||
|         downloader_params = self._downloader.params | ||||
|  | ||||
|         # Attempt to use provided username and password or .netrc data | ||||
|         if downloader_params.get('username', None) is not None: | ||||
|             username = downloader_params['username'] | ||||
|             password = downloader_params['password'] | ||||
|         elif downloader_params.get('usenetrc', False): | ||||
|             try: | ||||
|                 info = netrc.netrc().authenticators(self._NETRC_MACHINE) | ||||
|                 if info is not None: | ||||
|                     username = info[0] | ||||
|                     password = info[2] | ||||
|                 else: | ||||
|                     raise netrc.NetrcParseError('No authenticators for %s' % self._NETRC_MACHINE) | ||||
|             except (IOError, netrc.NetrcParseError) as err: | ||||
|                 self._downloader.report_warning(u'parsing .netrc: %s' % compat_str(err)) | ||||
|          | ||||
|         return (username, password) | ||||
|  | ||||
| class SearchInfoExtractor(InfoExtractor): | ||||
|     """ | ||||
|     Base class for paged search queries extractors. | ||||
|   | ||||
| @@ -17,6 +17,7 @@ class VimeoIE(InfoExtractor): | ||||
|  | ||||
|     # _VALID_URL matches Vimeo URLs | ||||
|     _VALID_URL = r'(?P<proto>https?://)?(?:(?:www|player)\.)?vimeo(?P<pro>pro)?\.com/(?:(?:(?:groups|album)/[^/]+)|(?:.*?)/)?(?P<direct_link>play_redirect_hls\?clip_id=)?(?:videos?/)?(?P<id>[0-9]+)(?:[?].*)?$' | ||||
|     _NETRC_MACHINE = 'vimeo' | ||||
|     IE_NAME = u'vimeo' | ||||
|     _TEST = { | ||||
|         u'url': u'http://vimeo.com/56015672', | ||||
| @@ -31,6 +32,25 @@ class VimeoIE(InfoExtractor): | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     def _login(self): | ||||
|         (username, password) = self._get_login_info() | ||||
|         if username is None: | ||||
|             return | ||||
|         self.report_login() | ||||
|         login_url = 'https://vimeo.com/log_in' | ||||
|         webpage = self._download_webpage(login_url, None, False) | ||||
|         token = re.search(r'xsrft: \'(.*?)\'', webpage).group(1) | ||||
|         data = compat_urllib_parse.urlencode({'email': username, | ||||
|                                               'password': password, | ||||
|                                               'action': 'login', | ||||
|                                               'service': 'vimeo', | ||||
|                                               'token': token, | ||||
|                                               }) | ||||
|         login_request = compat_urllib_request.Request(login_url, data) | ||||
|         login_request.add_header('Content-Type', 'application/x-www-form-urlencoded') | ||||
|         login_request.add_header('Cookie', 'xsrft=%s' % token) | ||||
|         self._download_webpage(login_request, None, False, u'Wrong login info') | ||||
|  | ||||
|     def _verify_video_password(self, url, video_id, webpage): | ||||
|         password = self._downloader.params.get('videopassword', None) | ||||
|         if password is None: | ||||
| @@ -50,6 +70,9 @@ class VimeoIE(InfoExtractor): | ||||
|                                u'Verifying the password', | ||||
|                                u'Wrong password') | ||||
|  | ||||
|     def _real_initialize(self): | ||||
|         self._login() | ||||
|  | ||||
|     def _real_extract(self, url, new_video=True): | ||||
|         # Extract ID from URL | ||||
|         mobj = re.match(self._VALID_URL, url) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz