From 6c6eecce23aed940029aaaedc94bee0207bad78a Mon Sep 17 00:00:00 2001 From: Franklin Lee Date: Sun, 6 Oct 2024 22:43:10 -0700 Subject: [PATCH] [ie/rule34video] Fix extractor: use height instead of quality and fix extracting attributes --- yt_dlp/extractor/rule34video.py | 35 ++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/yt_dlp/extractor/rule34video.py b/yt_dlp/extractor/rule34video.py index 3630f5e40c..538e2be94a 100644 --- a/yt_dlp/extractor/rule34video.py +++ b/yt_dlp/extractor/rule34video.py @@ -9,8 +9,8 @@ get_element_html_by_class, get_elements_by_class, int_or_none, - parse_count, parse_duration, + str_to_int, unescapeHTML, ) from ..utils.traversal import traverse_obj @@ -77,20 +77,32 @@ def _real_extract(self, url): formats.append({ 'url': url, 'ext': ext.lower(), - 'quality': quality, + 'height': int(quality), }) - categories, creators, uploader, uploader_url = [None] * 4 + categories, creators, uploader, uploader_url, views, likes = [None] * 6 for col in get_elements_by_class('col', webpage): label = clean_html(get_element_by_class('label', col)) - if label == 'Categories:': + if label == 'Categories': categories = list(map(clean_html, get_elements_by_class('item', col))) - elif label == 'Artist:': + elif label == 'Artist': creators = list(map(clean_html, get_elements_by_class('item', col))) - elif label == 'Uploaded By:': - uploader = clean_html(get_element_by_class('name', col)) - uploader_url = extract_attributes(get_element_html_by_class('name', col) or '').get('href') + elif label == 'Uploaded by': + uploader = clean_html(get_element_by_class('item', col)) + uploader_url = extract_attributes(get_element_html_by_class('item', col) or '').get('href') + views_text = self._html_search_regex( + r'custom-eye">\s+]+>\s+\s+([^<]+)', webpage, 'views', default='').replace(' ', '') + views = int_or_none(views_text) + if views is None: + precise_match = re.search(r'\((?P[^d]+)\)', views_text) + if precise_match: + views = str_to_int(precise_match['precise_views']) + + likes_text = get_element_by_class('voters count', webpage) + likes_match = re.search(r'\((?P[^d]+)\)', likes_text) + if likes_match: + likes = str_to_int(likes_match['num_likes']) return { **traverse_obj(self._search_json_ld(webpage, video_id, default={}), ({ 'title': 'title', @@ -107,10 +119,9 @@ def _real_extract(self, url): 'thumbnail': self._html_search_regex( r'preview_url:\s+\'([^\']+)\'', webpage, 'thumbnail', default=None), 'duration': parse_duration(self._html_search_regex( - r'"icon-clock">\s+((?:\d+:?)+)', webpage, 'duration', default=None)), - 'view_count': int_or_none(self._html_search_regex( - r'"icon-eye">\s+([ \d]+)', webpage, 'views', default='').replace(' ', '')), - 'like_count': parse_count(get_element_by_class('voters count', webpage)), + r'custom-time">\s+]+>\s+\s+((?:\d+:?)+)', webpage, 'duration', default=None)), + 'view_count': views, + 'like_count': likes, 'comment_count': int_or_none(self._search_regex( r'[^(]+\((\d+)\)', get_element_by_attribute('href', '#tab_comments', webpage), 'comment count', fatal=False)), 'age_limit': 18,