From 8dd5418803a25de89d08cdb9d32f80f71c5d6c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Marqui=CC=81nez=20Ferra=CC=81ndiz?= Date: Wed, 29 Apr 2015 22:53:18 +0200 Subject: [PATCH 1/4] Make 'best' format only match non-DASH formats (closes #5554) Otherwise it's impossible to only download non-DASH formats, for example `best[height=?480]/best` would download a DASH video if it's the only one with height=480, instead for falling back to the second format specifier. For audio only urls (soundcloud, bandcamp ...), the best audio will be downloaded as before. --- test/test_YoutubeDL.py | 4 ++-- youtube_dl/YoutubeDL.py | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index bb4a65ee1..82b827536 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -237,7 +237,7 @@ class TestFormatSelection(unittest.TestCase): f2['url'] = 'url:' + f2id info_dict = _make_result([f1, f2], extractor='youtube') - ydl = YDL() + ydl = YDL({'format': 'best/bestvideo'}) yie = YoutubeIE(ydl) yie._sort_formats(info_dict['formats']) ydl.process_ie_result(info_dict) @@ -245,7 +245,7 @@ class TestFormatSelection(unittest.TestCase): self.assertEqual(downloaded['format_id'], f1id) info_dict = _make_result([f2, f1], extractor='youtube') - ydl = YDL() + ydl = YDL({'format': 'best/bestvideo'}) yie = YoutubeIE(ydl) yie._sort_formats(info_dict['formats']) ydl.process_ie_result(info_dict) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 827c88e0d..eee9c0154 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -915,7 +915,14 @@ class YoutubeDL(object): return None if format_spec == 'best' or format_spec is None: - return available_formats[-1] + audiovideo_formats = [ + f for f in available_formats + if f.get('vcodec') != 'none' and f.get('acodec') != 'none'] + if audiovideo_formats: + return audiovideo_formats[-1] + # for audio only urls, 'best' selects the best audio format + elif all(f.get('acodec') != 'none' for f in available_formats): + return available_formats[-1] elif format_spec == 'worst': audiovideo_formats = [ f for f in available_formats From e01c56f9e12d7abb2e3b548818a689146092806e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergey=20M=E2=80=A4?= Date: Thu, 30 Apr 2015 21:06:51 +0600 Subject: [PATCH 2/4] [YoutubeDL] Generalize best/worst format match behavior --- youtube_dl/YoutubeDL.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index eee9c0154..9d4a2dce8 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -914,22 +914,16 @@ class YoutubeDL(object): if not available_formats: return None - if format_spec == 'best' or format_spec is None: + if format_spec in ['best', 'worst', None]: + format_idx = 0 if format_spec == 'worst' else -1 audiovideo_formats = [ f for f in available_formats if f.get('vcodec') != 'none' and f.get('acodec') != 'none'] if audiovideo_formats: - return audiovideo_formats[-1] - # for audio only urls, 'best' selects the best audio format + return audiovideo_formats[format_idx] + # for audio only urls, select the best/worst audio format elif all(f.get('acodec') != 'none' for f in available_formats): - return available_formats[-1] - elif format_spec == 'worst': - audiovideo_formats = [ - f for f in available_formats - if f.get('vcodec') != 'none' and f.get('acodec') != 'none'] - if audiovideo_formats: - return audiovideo_formats[0] - return available_formats[0] + return available_formats[format_idx] elif format_spec == 'bestaudio': audio_formats = [ f for f in available_formats From cd298882cd6f8ed2571dd372f684ec17e992fd9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergey=20M=E2=80=A4?= Date: Thu, 30 Apr 2015 21:25:17 +0600 Subject: [PATCH 3/4] [vporn] Fix metadata extraction (#5560) --- youtube_dl/extractor/vporn.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/youtube_dl/extractor/vporn.py b/youtube_dl/extractor/vporn.py index 2d23effcc..04ed0b381 100644 --- a/youtube_dl/extractor/vporn.py +++ b/youtube_dl/extractor/vporn.py @@ -64,29 +64,29 @@ class VpornIE(InfoExtractor): title = self._html_search_regex( r'videoname\s*=\s*\'([^\']+)\'', webpage, 'title').strip() description = self._html_search_regex( - r'
(.*?)
', webpage, 'description', fatal=False) + r'class="(?:descr|description_txt)">(.*?)', + webpage, 'description', fatal=False) thumbnail = self._html_search_regex( r'flashvars\.imageUrl\s*=\s*"([^"]+)"', webpage, 'description', fatal=False, default=None) if thumbnail: thumbnail = 'http://www.vporn.com' + thumbnail uploader = self._html_search_regex( - r'(?s)UPLOADED BY.*?([^<]+)', + r'(?s)Uploaded by:.*?([^<]+)', webpage, 'uploader', fatal=False) categories = re.findall(r'([^<]+)', webpage) duration = parse_duration(self._search_regex( - r'duration (\d+ min \d+ sec)', webpage, 'duration', fatal=False)) + r'Runtime:\s*\s*(\d+ min \d+ sec)', + webpage, 'duration', fatal=False)) - view_count = str_to_int(self._html_search_regex( - r'([\d,\.]+) VIEWS', webpage, 'view count', fatal=False)) - like_count = str_to_int(self._html_search_regex( - r'([\d,\.]+)', webpage, 'like count', fatal=False)) - dislike_count = str_to_int(self._html_search_regex( - r'([\d,\.]+)', webpage, 'dislike count', fatal=False)) + view_count = str_to_int(self._search_regex( + r'class="views">([\d,\.]+) [Vv]iews<', + webpage, 'view count', fatal=False)) comment_count = str_to_int(self._html_search_regex( - r'

Comments \(([\d,\.]+)\)

', webpage, 'comment count', fatal=False)) + r"'Comments \(([\d,\.]+)\)'", + webpage, 'comment count', default=None)) formats = [] @@ -117,8 +117,6 @@ class VpornIE(InfoExtractor): 'categories': categories, 'duration': duration, 'view_count': view_count, - 'like_count': like_count, - 'dislike_count': dislike_count, 'comment_count': comment_count, 'age_limit': 18, 'formats': formats, From 7a03280df4555998fc99399907062b62383db2c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergey=20M=E2=80=A4?= Date: Thu, 30 Apr 2015 21:31:38 +0600 Subject: [PATCH 4/4] [vporn] More metadata extraction fixes and tests update (#5560) --- youtube_dl/extractor/vporn.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/youtube_dl/extractor/vporn.py b/youtube_dl/extractor/vporn.py index 04ed0b381..92c90e517 100644 --- a/youtube_dl/extractor/vporn.py +++ b/youtube_dl/extractor/vporn.py @@ -27,9 +27,6 @@ class VpornIE(InfoExtractor): 'duration': 393, 'age_limit': 18, 'view_count': int, - 'like_count': int, - 'dislike_count': int, - 'comment_count': int, } }, { @@ -47,9 +44,6 @@ class VpornIE(InfoExtractor): 'duration': 588, 'age_limit': 18, 'view_count': int, - 'like_count': int, - 'dislike_count': int, - 'comment_count': int, } }, ] @@ -72,10 +66,10 @@ class VpornIE(InfoExtractor): thumbnail = 'http://www.vporn.com' + thumbnail uploader = self._html_search_regex( - r'(?s)Uploaded by:.*?([^<]+)', + r'(?s)Uploaded by:.*?]*>(.+?)', webpage, 'uploader', fatal=False) - categories = re.findall(r'([^<]+)', webpage) + categories = re.findall(r']*>([^<]+)', webpage) duration = parse_duration(self._search_regex( r'Runtime:\s*\s*(\d+ min \d+ sec)',