from __future__ import unicode_literals from .common import InfoExtractor from ..compat import ( compat_str, compat_urlparse, ) from ..utils import ( int_or_none, unified_timestamp, ) class BeegIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?beeg\.(?:com|porn(?:/video)?)/(?P\d+)' _TESTS = [{ # api/v6 v1 'url': 'http://beeg.com/5416503', 'md5': 'a1a1b1a8bc70a89e49ccfd113aed0820', 'info_dict': { 'id': '5416503', 'ext': 'mp4', 'title': 'Sultry Striptease', 'description': 'md5:d22219c09da287c14bed3d6c37ce4bc2', 'timestamp': 1391813355, 'upload_date': '20140207', 'duration': 383, 'tags': list, 'age_limit': 18, } }, { # api/v6 v2 'url': 'https://beeg.com/1941093077?t=911-1391', 'only_matching': True, }, { # api/v6 v2 w/o t 'url': 'https://beeg.com/1277207756', 'only_matching': True, }, { 'url': 'https://beeg.porn/video/5416503', 'only_matching': True, }, { 'url': 'https://beeg.porn/5416503', 'only_matching': True, }] def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) beeg_version = self._search_regex( r'beeg_version\s*=\s*([\da-zA-Z_-]+)', webpage, 'beeg version', default='1546225636701') if len(video_id) >= 10: query = { 'v': 2, } qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) t = qs.get('t', [''])[0].split('-') if len(t) > 1: query.update({ 's': t[0], 'e': t[1], }) else: query = {'v': 1} for api_path in ('', 'api.'): video = self._download_json( 'https://%sbeeg.com/api/v6/%s/video/%s' % (api_path, beeg_version, video_id), video_id, fatal=api_path == 'api.', query=query) if video: break formats = [] for format_id, video_url in video.items(): if not video_url: continue height = self._search_regex( r'^(\d+)[pP]$', format_id, 'height', default=None) if not height: continue formats.append({ 'url': self._proto_relative_url( video_url.replace('{DATA_MARKERS}', 'data=pc_XX__%s_0' % beeg_version), 'https:'), 'format_id': format_id, 'height': int(height), }) self._sort_formats(formats) title = video['title'] video_id = compat_str(video.get('id') or video_id) display_id = video.get('code') description = video.get('desc') series = video.get('ps_name') timestamp = unified_timestamp(video.get('date')) duration = int_or_none(video.get('duration')) tags = [tag.strip() for tag in video['tags'].split(',')] if video.get('tags') else None return { 'id': video_id, 'display_id': display_id, 'title': title, 'description': description, 'series': series, 'timestamp': timestamp, 'duration': duration, 'tags': tags, 'formats': formats, 'age_limit': self._rta_search(webpage), }