mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 00:25:15 +00:00 
			
		
		
		
	[vevo] Handle videos without video_info (#7802)
This commit is contained in:
		@@ -67,6 +67,17 @@ class VevoIE(InfoExtractor):
 | 
				
			|||||||
        'params': {
 | 
					        'params': {
 | 
				
			||||||
            'skip_download': 'true',
 | 
					            'skip_download': 'true',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }, {
 | 
				
			||||||
 | 
					        'note': 'No video_info',
 | 
				
			||||||
 | 
					        'url': 'http://www.vevo.com/watch/k-camp-1/Till-I-Die/USUV71503000',
 | 
				
			||||||
 | 
					        'md5': '8b83cc492d72fc9cf74a02acee7dc1b0',
 | 
				
			||||||
 | 
					        'info_dict': {
 | 
				
			||||||
 | 
					            'id': 'USUV71503000',
 | 
				
			||||||
 | 
					            'ext': 'mp4',
 | 
				
			||||||
 | 
					            'title': 'Till I Die - K Camp ft. T.I.',
 | 
				
			||||||
 | 
					            'duration': 193,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        'expected_warnings': ['HTTP Error 404'],
 | 
				
			||||||
    }]
 | 
					    }]
 | 
				
			||||||
    _SMIL_BASE_URL = 'http://smil.lvl3.vevo.com/'
 | 
					    _SMIL_BASE_URL = 'http://smil.lvl3.vevo.com/'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -89,6 +100,9 @@ class VevoIE(InfoExtractor):
 | 
				
			|||||||
                webpage, 'access token', fatal=False)
 | 
					                webpage, 'access token', fatal=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _formats_from_json(self, video_info):
 | 
					    def _formats_from_json(self, video_info):
 | 
				
			||||||
 | 
					        if not video_info:
 | 
				
			||||||
 | 
					            return []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        last_version = {'version': -1}
 | 
					        last_version = {'version': -1}
 | 
				
			||||||
        for version in video_info['videoVersions']:
 | 
					        for version in video_info['videoVersions']:
 | 
				
			||||||
            # These are the HTTP downloads, other types are for different manifests
 | 
					            # These are the HTTP downloads, other types are for different manifests
 | 
				
			||||||
@@ -171,15 +185,24 @@ class VevoIE(InfoExtractor):
 | 
				
			|||||||
    def _real_extract(self, url):
 | 
					    def _real_extract(self, url):
 | 
				
			||||||
        video_id = self._match_id(url)
 | 
					        video_id = self._match_id(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        webpage = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        json_url = 'http://videoplayer.vevo.com/VideoService/AuthenticateVideo?isrc=%s' % video_id
 | 
					        json_url = 'http://videoplayer.vevo.com/VideoService/AuthenticateVideo?isrc=%s' % video_id
 | 
				
			||||||
        response = self._download_json(json_url, video_id)
 | 
					        response = self._download_json(json_url, video_id)
 | 
				
			||||||
        video_info = response['video']
 | 
					        video_info = response['video'] or {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not video_info:
 | 
					        if not video_info and response.get('statusCode') != 909:
 | 
				
			||||||
            if 'statusMessage' in response:
 | 
					            if 'statusMessage' in response:
 | 
				
			||||||
                raise ExtractorError('%s said: %s' % (self.IE_NAME, response['statusMessage']), expected=True)
 | 
					                raise ExtractorError('%s said: %s' % (self.IE_NAME, response['statusMessage']), expected=True)
 | 
				
			||||||
            raise ExtractorError('Unable to extract videos')
 | 
					            raise ExtractorError('Unable to extract videos')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not video_info:
 | 
				
			||||||
 | 
					            if url.startswith('vevo:'):
 | 
				
			||||||
 | 
					                raise ExtractorError('Please specify full Vevo URL for downloading', expected=True)
 | 
				
			||||||
 | 
					            webpage = self._download_webpage(url, video_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        title = video_info.get('title') or self._og_search_title(webpage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        formats = self._formats_from_json(video_info)
 | 
					        formats = self._formats_from_json(video_info)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        is_explicit = video_info.get('isExplicit')
 | 
					        is_explicit = video_info.get('isExplicit')
 | 
				
			||||||
@@ -195,7 +218,7 @@ class VevoIE(InfoExtractor):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # Download SMIL
 | 
					        # Download SMIL
 | 
				
			||||||
        smil_blocks = sorted((
 | 
					        smil_blocks = sorted((
 | 
				
			||||||
            f for f in video_info['videoVersions']
 | 
					            f for f in video_info.get('videoVersions', [])
 | 
				
			||||||
            if f['sourceType'] == 13),
 | 
					            if f['sourceType'] == 13),
 | 
				
			||||||
            key=lambda f: f['version'])
 | 
					            key=lambda f: f['version'])
 | 
				
			||||||
        smil_url = '%s/Video/V2/VFILE/%s/%sr.smil' % (
 | 
					        smil_url = '%s/Video/V2/VFILE/%s/%sr.smil' % (
 | 
				
			||||||
@@ -213,17 +236,21 @@ class VevoIE(InfoExtractor):
 | 
				
			|||||||
                formats.extend(self._formats_from_smil(smil_xml))
 | 
					                formats.extend(self._formats_from_smil(smil_xml))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._sort_formats(formats)
 | 
					        self._sort_formats(formats)
 | 
				
			||||||
        timestamp_ms = int_or_none(self._search_regex(
 | 
					        timestamp = int_or_none(self._search_regex(
 | 
				
			||||||
            r'/Date\((\d+)\)/',
 | 
					            r'/Date\((\d+)\)/',
 | 
				
			||||||
            video_info['launchDate'], 'launch date', fatal=False))
 | 
					            video_info['launchDate'], 'launch date', fatal=False),
 | 
				
			||||||
 | 
					            scale=1000) if video_info else None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        duration = video_info.get('duration') or int_or_none(
 | 
				
			||||||
 | 
					            self._html_search_meta('video:duration', webpage))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            'id': video_id,
 | 
					            'id': video_id,
 | 
				
			||||||
            'title': video_info['title'],
 | 
					            'title': title,
 | 
				
			||||||
            'formats': formats,
 | 
					            'formats': formats,
 | 
				
			||||||
            'thumbnail': video_info['imageUrl'],
 | 
					            'thumbnail': video_info.get('imageUrl'),
 | 
				
			||||||
            'timestamp': timestamp_ms // 1000,
 | 
					            'timestamp': timestamp,
 | 
				
			||||||
            'uploader': video_info['mainArtists'][0]['artistName'],
 | 
					            'uploader': video_info['mainArtists'][0]['artistName'] if video_info else None,
 | 
				
			||||||
            'duration': video_info['duration'],
 | 
					            'duration': duration,
 | 
				
			||||||
            'age_limit': age_limit,
 | 
					            'age_limit': age_limit,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user