[youtube] Improve extraction in 429 error conditions (closes #24283)
This commit is contained in:
		
							parent
							
								
									0ec9d4e565
								
							
						
					
					
						commit
						f93abcf1da
					
				
					 1 changed files with 17 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -1790,11 +1790,19 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
 | 
			
		|||
                        query['el'] = el
 | 
			
		||||
                    if sts:
 | 
			
		||||
                        query['sts'] = sts
 | 
			
		||||
                    try:
 | 
			
		||||
                        video_info_webpage = self._download_webpage(
 | 
			
		||||
                            '%s://www.youtube.com/get_video_info' % proto,
 | 
			
		||||
                            video_id, note=False,
 | 
			
		||||
                            errnote='unable to download video info webpage',
 | 
			
		||||
                        fatal=False, query=query)
 | 
			
		||||
                            query=query)
 | 
			
		||||
                    except ExtractorError as e:
 | 
			
		||||
                        # Skip further retries if we get 429 since solving
 | 
			
		||||
                        # captcha only unblocks access to website but
 | 
			
		||||
                        # not get_video_info end point
 | 
			
		||||
                        if isinstance(e.cause, compat_HTTPError) and e.cause.code == 429:
 | 
			
		||||
                            break
 | 
			
		||||
                        continue
 | 
			
		||||
                    if not video_info_webpage:
 | 
			
		||||
                        continue
 | 
			
		||||
                    get_video_info = compat_parse_qs(video_info_webpage)
 | 
			
		||||
| 
						 | 
				
			
			@ -1833,13 +1841,16 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
 | 
			
		|||
            if messages:
 | 
			
		||||
                return '\n'.join(messages)
 | 
			
		||||
 | 
			
		||||
        if not video_info:
 | 
			
		||||
        if not video_info and not player_response:
 | 
			
		||||
            unavailable_message = extract_unavailable_message()
 | 
			
		||||
            if not unavailable_message:
 | 
			
		||||
                unavailable_message = 'Unable to extract video data'
 | 
			
		||||
            raise ExtractorError(
 | 
			
		||||
                'YouTube said: %s' % unavailable_message, expected=True, video_id=video_id)
 | 
			
		||||
 | 
			
		||||
        if not isinstance(video_info, dict):
 | 
			
		||||
            video_info = {}
 | 
			
		||||
 | 
			
		||||
        video_details = try_get(
 | 
			
		||||
            player_response, lambda x: x['videoDetails'], dict) or {}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue