from __future__ import unicode_literals import re from .common import InfoExtractor from ..utils import ( determine_ext, int_or_none, parse_duration, url_or_none, ) class YouJizzIE(InfoExtractor): _VALID_URL = r'https?://(?:\w+\.)?youjizz\.com/videos/(?:[^/#?]*-(?P\d+)\.html|embed/(?P\d+))' _TESTS = [{ 'url': 'http://www.youjizz.com/videos/zeichentrick-1-2189178.html', 'md5': 'b1e1dfaa8bb9537d8b84eeda9cf4acf4', 'info_dict': { 'id': '2189178', 'ext': 'mp4', 'title': 'Zeichentrick 1', 'age_limit': 18, 'duration': 2874, } }, { 'url': 'http://www.youjizz.com/videos/-2189178.html', 'only_matching': True, }, { 'url': 'https://www.youjizz.com/videos/embed/31991001', 'only_matching': True, }] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('id') or mobj.group('embed_id') webpage = self._download_webpage(url, video_id) title = self._html_search_regex( r'(.+?)', webpage, 'title') formats = [] encodings = self._parse_json( self._search_regex( r'[Ee]ncodings\s*=\s*(\[.+?\]);\n', webpage, 'encodings', default='[]'), video_id, fatal=False) for encoding in encodings: if not isinstance(encoding, dict): continue format_url = url_or_none(encoding.get('filename')) if not format_url: continue if determine_ext(format_url) == 'm3u8': formats.extend(self._extract_m3u8_formats( format_url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)) else: format_id = encoding.get('name') or encoding.get('quality') height = int_or_none(self._search_regex( r'^(\d+)[pP]', format_id, 'height', default=None)) formats.append({ 'url': format_url, 'format_id': format_id, 'height': height, }) if formats: info_dict = { 'formats': formats, } else: # YouJizz's HTML5 player has invalid HTML webpage = webpage.replace('"controls', '" controls') info_dict = self._parse_html5_media_entries( url, webpage, video_id)[0] duration = parse_duration(self._search_regex( r'Runtime:([^<]+)', webpage, 'duration', default=None)) uploader = self._search_regex( r'Uploaded By:.*?]*>([^<]+)', webpage, 'uploader', default=None) info_dict.update({ 'id': video_id, 'title': title, 'age_limit': self._rta_search(webpage), 'duration': duration, 'uploader': uploader, }) return info_dict