diff --git a/youtube_dlc/extractor/generic.py b/youtube_dlc/extractor/generic.py index d5d8ed94b..819ba46a8 100644 --- a/youtube_dlc/extractor/generic.py +++ b/youtube_dlc/extractor/generic.py @@ -130,6 +130,7 @@ from .gedi import GediEmbedsIE from .rcs import RCSEmbedsIE from .bitchute import BitChuteIE +from .rumble import RumbleEmbedIE from .arcpublishing import ArcPublishingIE from .medialaan import MedialaanIE @@ -3338,6 +3339,13 @@ def _real_extract(self, url): return self.playlist_from_matches( bitchute_urls, video_id, video_title, ie=BitChuteIE.ie_key()) + rumble_urls = RumbleEmbedIE._extract_urls(webpage) + if len(rumble_urls) == 1: + return self.url_result(rumble_urls[0], RumbleEmbedIE.ie_key()) + if rumble_urls: + return self.playlist_from_matches( + rumble_urls, video_id, video_title, ie=RumbleEmbedIE.ie_key()) + # Look for HTML5 media entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') if entries: diff --git a/youtube_dlc/extractor/rumble.py b/youtube_dlc/extractor/rumble.py index 4a0225109..b526de76b 100644 --- a/youtube_dlc/extractor/rumble.py +++ b/youtube_dlc/extractor/rumble.py @@ -1,6 +1,8 @@ # coding: utf-8 from __future__ import unicode_literals +import re + from .common import InfoExtractor from ..compat import compat_str from ..utils import ( @@ -28,6 +30,14 @@ class RumbleEmbedIE(InfoExtractor): 'only_matching': True, }] + @staticmethod + def _extract_urls(webpage): + return [ + mobj.group('url') + for mobj in re.finditer( + r'(?:<(?:script|iframe)[^>]+\bsrc=|["\']embedUrl["\']\s*:\s*)["\'](?P%s)' % RumbleEmbedIE._VALID_URL, + webpage)] + def _real_extract(self, url): video_id = self._match_id(url) video = self._download_json(