From a87235bc634ed6356fab939db2d043e519a8a317 Mon Sep 17 00:00:00 2001 From: Kay B <> Date: Sun, 3 Sep 2017 12:53:28 +0200 Subject: [PATCH 1/4] [generic] Fix support for multiple HTML5 on one page. Previously, multiple HTML5 on one page would lead to title conflicts, where every video had the same title and thereby only the first one would be downloaded ('video already downloaded'). This fixes #14080 --- youtube_dl/extractor/generic.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index c81efdc00..a5f11f152 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -2874,12 +2874,17 @@ class GenericIE(InfoExtractor): # Look for HTML5 media entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') if entries: - for entry in entries: - entry.update({ + if len(entries) == 1: + entries[0].update({ 'id': video_id, - 'title': video_title, - }) - self._sort_formats(entry['formats']) + 'title': video_itle}) + self._sort_formats(entries[0]['formats']) + else: + for num, entry in enumerate(entries): + entry.update({ + 'id': video_id, + 'title': '%s (%d) ' % (video_title, num+1)}) + self._sort_formats(entry['formats']) return self.playlist_result(entries) jwplayer_data = self._find_jwplayer_data( From 0a6ed9371ae223a5842208ea97b0d4a80d7eeecd Mon Sep 17 00:00:00 2001 From: Kay B <> Date: Tue, 5 Sep 2017 20:40:52 +0200 Subject: [PATCH 2/4] [generic] Fix issues for PR #14107 --- youtube_dl/extractor/generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index a5f11f152..d23c47c60 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -2877,13 +2877,13 @@ class GenericIE(InfoExtractor): if len(entries) == 1: entries[0].update({ 'id': video_id, - 'title': video_itle}) + 'title': video_title}) self._sort_formats(entries[0]['formats']) else: - for num, entry in enumerate(entries): + for num, entry in enumerate(entries, start=1): entry.update({ 'id': video_id, - 'title': '%s (%d) ' % (video_title, num+1)}) + 'title': '%s (%d) ' % (video_title, num)}) self._sort_formats(entry['formats']) return self.playlist_result(entries) From 0bba82ca93274768bc939d2fe97e4cf8c9ed6998 Mon Sep 17 00:00:00 2001 From: Kay B <> Date: Tue, 12 Sep 2017 23:33:25 +0200 Subject: [PATCH 3/4] [generic] Add test for PR #14107 --- youtube_dl/extractor/generic.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index d23c47c60..40323d2fa 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -1879,6 +1879,15 @@ class GenericIE(InfoExtractor): 'title': 'Building A Business Online: Principal Chairs Q & A', }, }, + { + # multiple HTML5 videos on one page + 'url': 'https://www.paragon-software.com/home/rk-free/keyscenarios.html', + 'info_dict': { + 'id': 'keyscenarios', + 'title': 'Rescue Kit 14 Free Edition - Getting started', + }, + 'playlist_count': 4, + } # { # # TODO: find another test # # http://schema.org/VideoObject @@ -2885,7 +2894,7 @@ class GenericIE(InfoExtractor): 'id': video_id, 'title': '%s (%d) ' % (video_title, num)}) self._sort_formats(entry['formats']) - return self.playlist_result(entries) + return self.playlist_result(entries, video_id, video_title) jwplayer_data = self._find_jwplayer_data( webpage, video_id, transform_source=js_to_json) From e44e870dbbe0aff68a724a6ee25d58825998efb6 Mon Sep 17 00:00:00 2001 From: Sergey M Date: Sat, 23 Sep 2017 05:49:18 +0700 Subject: [PATCH 4/4] Update generic.py --- youtube_dl/extractor/generic.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 40323d2fa..6a544e4a9 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -2886,14 +2886,16 @@ class GenericIE(InfoExtractor): if len(entries) == 1: entries[0].update({ 'id': video_id, - 'title': video_title}) - self._sort_formats(entries[0]['formats']) + 'title': video_title, + }) else: for num, entry in enumerate(entries, start=1): entry.update({ - 'id': video_id, - 'title': '%s (%d) ' % (video_title, num)}) - self._sort_formats(entry['formats']) + 'id': '%s-%s' % (video_id, num), + 'title': '%s (%d)' % (video_title, num), + }) + for entry in entries: + self._sort_formats(entry['formats']) return self.playlist_result(entries, video_id, video_title) jwplayer_data = self._find_jwplayer_data(