mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +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 re | ||||||
| import socket | import socket | ||||||
| import sys | import sys | ||||||
|  | import netrc | ||||||
|  |  | ||||||
| from ..utils import ( | from ..utils import ( | ||||||
|     compat_http_client, |     compat_http_client, | ||||||
| @@ -161,6 +162,10 @@ class InfoExtractor(object): | |||||||
|         """Report attempt to confirm age.""" |         """Report attempt to confirm age.""" | ||||||
|         self.to_screen(u'Confirming 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 |     #Methods for following #608 | ||||||
|     #They set the correct value of the '_type' key |     #They set the correct value of the '_type' key | ||||||
|     def video_result(self, video_info): |     def video_result(self, video_info): | ||||||
| @@ -225,6 +230,36 @@ class InfoExtractor(object): | |||||||
|         else: |         else: | ||||||
|             return res |             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): | class SearchInfoExtractor(InfoExtractor): | ||||||
|     """ |     """ | ||||||
|     Base class for paged search queries extractors. |     Base class for paged search queries extractors. | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ class VimeoIE(InfoExtractor): | |||||||
|  |  | ||||||
|     # _VALID_URL matches Vimeo URLs |     # _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]+)(?:[?].*)?$' |     _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' |     IE_NAME = u'vimeo' | ||||||
|     _TEST = { |     _TEST = { | ||||||
|         u'url': u'http://vimeo.com/56015672', |         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): |     def _verify_video_password(self, url, video_id, webpage): | ||||||
|         password = self._downloader.params.get('videopassword', None) |         password = self._downloader.params.get('videopassword', None) | ||||||
|         if password is None: |         if password is None: | ||||||
| @@ -50,6 +70,9 @@ class VimeoIE(InfoExtractor): | |||||||
|                                u'Verifying the password', |                                u'Verifying the password', | ||||||
|                                u'Wrong password') |                                u'Wrong password') | ||||||
|  |  | ||||||
|  |     def _real_initialize(self): | ||||||
|  |         self._login() | ||||||
|  |  | ||||||
|     def _real_extract(self, url, new_video=True): |     def _real_extract(self, url, new_video=True): | ||||||
|         # Extract ID from URL |         # Extract ID from URL | ||||||
|         mobj = re.match(self._VALID_URL, 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