1
0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2025-07-20 09:16:20 +00:00

Compare commits

..

No commits in common. "efb6d21eb980b3d475b9659b0269c5d5bde3a095" and "5f38e78a96d7eaa410cf2b31742686223816b23e" have entirely different histories.

View File

@ -1,4 +1,3 @@
# coding: utf-8
from __future__ import unicode_literals from __future__ import unicode_literals
import itertools import itertools
@ -7,15 +6,14 @@ from time import sleep
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import ( from ..utils import (
clean_html, traverse_obj,
T,
url_or_none,
parse_iso8601,
get_element_by_class, get_element_by_class,
get_element_by_id, get_element_by_id,
int_or_none, int_or_none,
parse_qs, parse_qs,
strip_or_none,
T,
traverse_obj,
url_or_none,
urljoin, urljoin,
) )
@ -31,34 +29,29 @@ class Tube8IE(InfoExtractor):
'title': 'Found dildo. She let it cum in her tight ass to keep the secret', 'title': 'Found dildo. She let it cum in her tight ass to keep the secret',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'uploader': 'MaryKrylova', 'uploader': 'MaryKrylova',
'age_limit': 18, 'timestamp': 1718961736,
'upload_date': '20240621',
} }
}] }]
_EMBED_REGEX = r'<iframe [^>]*\bsrc=["\'](?P<url>(?:https?:)?//(?:www\.)?tube8\.com/embed/(?:[^/]+/)*\d+)'
@classmethod
def _extract_urls(cls, webpage):
return [m.group('url') for m in re.finditer(cls._EMBED_REGEX, webpage)]
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_valid_url(url).group('id')
webpage = self._download_webpage(url, video_id) webpage = self._download_webpage(url, video_id)
age_verify_msg = self._search_regex(
r'(your elected officials in \w+(?:\s+\w+){,2} are requiring us to verify your age before allowing you access to our website)',
webpage, 'age verification message', default=None)
if age_verify_msg:
self.raise_geo_restricted('%s said: "%s"' % (self.IE_NAME, age_verify_msg))
playervars = self._search_json( playervars = self._search_json(
r'\bplayervars\s*:', webpage, 'playervars', video_id) r'\bplayervars\s*:', webpage, 'playervars', video_id)
info = self._search_json_ld(webpage, video_id, expected_type='VideoObject', default={}) extra_info = self._search_json(
for k in ('url', 'description'): r'application/ld\+json[\"\']?>\s?', webpage, 'extra_info', video_id)
info.pop(k, None)
info['uploader'] = clean_html(get_element_by_class('submitByLink', webpage)) uploader = traverse_obj(extra_info, (
'@graph', lambda _, v: v.get('author'), 'author'))[0]
thumbnail = traverse_obj(extra_info, (
'@graph', lambda _, v: v.get('thumbnail'), 'thumbnail'))[0]
timestamp = parse_iso8601(traverse_obj(extra_info, (
'@graph', lambda _, v: v.get('datePublished'), 'datePublished'))[0])
# Borrowed from youporn extractor # Borrowed from youporn extractor
def get_fmt(x): def get_fmt(x):
@ -70,9 +63,9 @@ class Tube8IE(InfoExtractor):
defs_by_format = dict(traverse_obj(playervars, ( defs_by_format = dict(traverse_obj(playervars, (
'mediaDefinitions', lambda _, v: v.get('format'), T(get_fmt)))) 'mediaDefinitions', lambda _, v: v.get('format'), T(get_fmt))))
info['title'] = strip_or_none(playervars.get('video_title')) or info.get('title') or playervars['video_title'] title = traverse_obj(playervars, 'video_title')
if not info.get('thumbnail'): if not thumbnail:
info['thumbnail'] = traverse_obj(playervars, ('image_url', T(url_or_none))) thumbnail = traverse_obj(playervars, 'image_url')
# Borrowed from youporn extractor # Borrowed from youporn extractor
def get_format_data(f): def get_format_data(f):
@ -85,26 +78,29 @@ class Tube8IE(InfoExtractor):
for mp4_url in traverse_obj( for mp4_url in traverse_obj(
get_format_data('mp4'), get_format_data('mp4'),
(lambda _, v: not isinstance(v['defaultQuality'], bool), 'videoUrl'), (lambda _, v: not isinstance(v['defaultQuality'], bool), 'videoUrl'),
(Ellipsis, 'videoUrl'), (Ellipsis, 'videoUrl')):
expected_type=url_or_none): mobj = re.search(r'(?P<height>\d{3,4})[pP]_(?P<bitrate>\d+)[kK]_\d+', mp4_url)
height, tbr = map(int_or_none, self._search_regex(r'(?i)(?P<height>\d{3,4})p_(?P<bitrate>\d+)k_\d+', mp4_url, 'media details', group=('height', 'bitrate'), fatal=False)) if mobj:
fmt_id = '%dp' % height if height else 'mp4' height = int(mobj.group('height'))
tbr = int(mobj.group('bitrate'))
formats.append({ formats.append({
'format_id': fmt_id, 'format_id': '%dp-%dk' % (height, tbr),
'url': mp4_url, 'url': mp4_url,
'ext': 'mp4', 'ext': 'mp4',
'height': height,
'tbr': tbr, 'tbr': tbr,
'height': height,
}) })
self._sort_formats(formats) self._sort_formats(formats)
info.update({ return {
'id': video_id, 'id': video_id,
'title': title,
'thumbnail': thumbnail,
'formats': formats, 'formats': formats,
'age_limit': 18, 'uploader': uploader,
}) 'timestamp': timestamp,
return info }
# Currently only user channels # Currently only user channels