mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 00:25:15 +00:00 
			
		
		
		
	[YouTube] Avoid crash if uploader_id extraction fails
2dd6c6edd8
Except:
    * 295736c9cba714fb5de7d1c3dd31d86e50091cf8 [jsinterp] Improve parsing
    * 384f632e8a9b61e864a26678d85b2b39933b9bae [ITV] Overhaul ITV extractor
    * 33db85c571304bbd6863e3407ad8d08764c9e53b [feat]: Add support to external downloader aria2p
		
	
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from .common import InfoExtractor
 | 
						|
from ..utils import int_or_none, url_or_none
 | 
						|
 | 
						|
 | 
						|
class CamModelsIE(InfoExtractor):
 | 
						|
    _VALID_URL = r'https?://(?:www\.)?cammodels\.com/cam/(?P<id>[^/?#&]+)'
 | 
						|
    _TESTS = [{
 | 
						|
        'url': 'https://www.cammodels.com/cam/AutumnKnight/',
 | 
						|
        'only_matching': True,
 | 
						|
        'age_limit': 18
 | 
						|
    }]
 | 
						|
 | 
						|
    def _real_extract(self, url):
 | 
						|
        user_id = self._match_id(url)
 | 
						|
 | 
						|
        manifest = self._download_json(
 | 
						|
            'https://manifest-server.naiadsystems.com/live/s:%s.json' % user_id, user_id)
 | 
						|
 | 
						|
        formats = []
 | 
						|
        thumbnails = []
 | 
						|
        for format_id, format_dict in manifest['formats'].items():
 | 
						|
            if not isinstance(format_dict, dict):
 | 
						|
                continue
 | 
						|
            encodings = format_dict.get('encodings')
 | 
						|
            if not isinstance(encodings, list):
 | 
						|
                continue
 | 
						|
            vcodec = format_dict.get('videoCodec')
 | 
						|
            acodec = format_dict.get('audioCodec')
 | 
						|
            for media in encodings:
 | 
						|
                if not isinstance(media, dict):
 | 
						|
                    continue
 | 
						|
                media_url = url_or_none(media.get('location'))
 | 
						|
                if not media_url:
 | 
						|
                    continue
 | 
						|
 | 
						|
                format_id_list = [format_id]
 | 
						|
                height = int_or_none(media.get('videoHeight'))
 | 
						|
                if height is not None:
 | 
						|
                    format_id_list.append('%dp' % height)
 | 
						|
                f = {
 | 
						|
                    'url': media_url,
 | 
						|
                    'format_id': '-'.join(format_id_list),
 | 
						|
                    'width': int_or_none(media.get('videoWidth')),
 | 
						|
                    'height': height,
 | 
						|
                    'vbr': int_or_none(media.get('videoKbps')),
 | 
						|
                    'abr': int_or_none(media.get('audioKbps')),
 | 
						|
                    'fps': int_or_none(media.get('fps')),
 | 
						|
                    'vcodec': vcodec,
 | 
						|
                    'acodec': acodec,
 | 
						|
                }
 | 
						|
                if 'rtmp' in format_id:
 | 
						|
                    f['ext'] = 'flv'
 | 
						|
                elif 'hls' in format_id:
 | 
						|
                    f.update({
 | 
						|
                        'ext': 'mp4',
 | 
						|
                        # hls skips fragments, preferring rtmp
 | 
						|
                        'quality': -10,
 | 
						|
                    })
 | 
						|
                else:
 | 
						|
                    if format_id == 'jpeg':
 | 
						|
                        thumbnails.append({
 | 
						|
                            'url': f['url'],
 | 
						|
                            'width': f['width'],
 | 
						|
                            'height': f['height'],
 | 
						|
                            'format_id': f['format_id'],
 | 
						|
                        })
 | 
						|
                    continue
 | 
						|
                formats.append(f)
 | 
						|
 | 
						|
        return {
 | 
						|
            'id': user_id,
 | 
						|
            'title': user_id,
 | 
						|
            'thumbnails': thumbnails,
 | 
						|
            'is_live': True,
 | 
						|
            'formats': formats,
 | 
						|
            'age_limit': 18
 | 
						|
        }
 |