mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 22:55:18 +00:00 
			
		
		
		
	[cloudflarestream] Add support for cloudflare streams (closes #16375)
This commit is contained in:
		
							
								
								
									
										60
									
								
								youtube_dl/extractor/cloudflarestream.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								youtube_dl/extractor/cloudflarestream.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | # coding: utf-8 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CloudflareStreamIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'''(?x) | ||||||
|  |                     https?:// | ||||||
|  |                         (?: | ||||||
|  |                             (?:watch\.)?cloudflarestream\.com/| | ||||||
|  |                             embed\.cloudflarestream\.com/embed/[^/]+\.js\?.*?\bvideo= | ||||||
|  |                         ) | ||||||
|  |                         (?P<id>[\da-f]+) | ||||||
|  |                     ''' | ||||||
|  |     _TESTS = [{ | ||||||
|  |         'url': 'https://embed.cloudflarestream.com/embed/we4g.fla9.latest.js?video=31c9291ab41fac05471db4e73aa11717', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': '31c9291ab41fac05471db4e73aa11717', | ||||||
|  |             'ext': 'mp4', | ||||||
|  |             'title': '31c9291ab41fac05471db4e73aa11717', | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             'skip_download': True, | ||||||
|  |         }, | ||||||
|  |     }, { | ||||||
|  |         'url': 'https://watch.cloudflarestream.com/9df17203414fd1db3e3ed74abbe936c1', | ||||||
|  |         'only_matching': True, | ||||||
|  |     }, { | ||||||
|  |         'url': 'https://cloudflarestream.com/31c9291ab41fac05471db4e73aa11717/manifest/video.mpd', | ||||||
|  |         'only_matching': True, | ||||||
|  |     }] | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def _extract_urls(webpage): | ||||||
|  |         return [ | ||||||
|  |             mobj.group('url') | ||||||
|  |             for mobj in re.finditer( | ||||||
|  |                 r'<script[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//embed\.cloudflarestream\.com/embed/[^/]+\.js\?.*?\bvideo=[\da-f]+?.*?)\1', | ||||||
|  |                 webpage)] | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         video_id = self._match_id(url) | ||||||
|  |  | ||||||
|  |         formats = self._extract_m3u8_formats( | ||||||
|  |             'https://cloudflarestream.com/%s/manifest/video.m3u8' % video_id, | ||||||
|  |             video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls', | ||||||
|  |             fatal=False) | ||||||
|  |         formats.extend(self._extract_mpd_formats( | ||||||
|  |             'https://cloudflarestream.com/%s/manifest/video.mpd' % video_id, | ||||||
|  |             video_id, mpd_id='dash', fatal=False)) | ||||||
|  |         self._sort_formats(formats) | ||||||
|  |  | ||||||
|  |         return { | ||||||
|  |             'id': video_id, | ||||||
|  |             'title': video_id, | ||||||
|  |             'formats': formats, | ||||||
|  |         } | ||||||
| @@ -195,6 +195,7 @@ from .clippit import ClippitIE | |||||||
| from .cliprs import ClipRsIE | from .cliprs import ClipRsIE | ||||||
| from .clipsyndicate import ClipsyndicateIE | from .clipsyndicate import ClipsyndicateIE | ||||||
| from .closertotruth import CloserToTruthIE | from .closertotruth import CloserToTruthIE | ||||||
|  | from .cloudflarestream import CloudflareStreamIE | ||||||
| from .cloudy import CloudyIE | from .cloudy import CloudyIE | ||||||
| from .clubic import ClubicIE | from .clubic import ClubicIE | ||||||
| from .clyp import ClypIE | from .clyp import ClypIE | ||||||
|   | |||||||
| @@ -107,6 +107,7 @@ from .springboardplatform import SpringboardPlatformIE | |||||||
| from .yapfiles import YapFilesIE | from .yapfiles import YapFilesIE | ||||||
| from .vice import ViceIE | from .vice import ViceIE | ||||||
| from .xfileshare import XFileShareIE | from .xfileshare import XFileShareIE | ||||||
|  | from .cloudflarestream import CloudflareStreamIE | ||||||
|  |  | ||||||
|  |  | ||||||
| class GenericIE(InfoExtractor): | class GenericIE(InfoExtractor): | ||||||
| @@ -2013,6 +2014,19 @@ class GenericIE(InfoExtractor): | |||||||
|                 'skip_download': True, |                 'skip_download': True, | ||||||
|             }, |             }, | ||||||
|         }, |         }, | ||||||
|  |         { | ||||||
|  |             # CloudflareStream embed | ||||||
|  |             'url': 'https://www.cloudflare.com/products/cloudflare-stream/', | ||||||
|  |             'info_dict': { | ||||||
|  |                 'id': '31c9291ab41fac05471db4e73aa11717', | ||||||
|  |                 'ext': 'mp4', | ||||||
|  |                 'title': '31c9291ab41fac05471db4e73aa11717', | ||||||
|  |             }, | ||||||
|  |             'add_ie': [CloudflareStreamIE.ie_key()], | ||||||
|  |             'params': { | ||||||
|  |                 'skip_download': True, | ||||||
|  |             }, | ||||||
|  |         }, | ||||||
|         { |         { | ||||||
|             'url': 'http://share-videos.se/auto/video/83645793?uid=13', |             'url': 'http://share-videos.se/auto/video/83645793?uid=13', | ||||||
|             'md5': 'b68d276de422ab07ee1d49388103f457', |             'md5': 'b68d276de422ab07ee1d49388103f457', | ||||||
| @@ -3025,6 +3039,11 @@ class GenericIE(InfoExtractor): | |||||||
|             return self.playlist_from_matches( |             return self.playlist_from_matches( | ||||||
|                 xfileshare_urls, video_id, video_title, ie=XFileShareIE.ie_key()) |                 xfileshare_urls, video_id, video_title, ie=XFileShareIE.ie_key()) | ||||||
|  |  | ||||||
|  |         cloudflarestream_urls = CloudflareStreamIE._extract_urls(webpage) | ||||||
|  |         if cloudflarestream_urls: | ||||||
|  |             return self.playlist_from_matches( | ||||||
|  |                 cloudflarestream_urls, video_id, video_title, ie=CloudflareStreamIE.ie_key()) | ||||||
|  |  | ||||||
|         sharevideos_urls = [mobj.group('url') for mobj in re.finditer( |         sharevideos_urls = [mobj.group('url') for mobj in re.finditer( | ||||||
|             r'<iframe[^>]+?\bsrc\s*=\s*(["\'])(?P<url>(?:https?:)?//embed\.share-videos\.se/auto/embed/\d+\?.*?\buid=\d+.*?)\1', |             r'<iframe[^>]+?\bsrc\s*=\s*(["\'])(?P<url>(?:https?:)?//embed\.share-videos\.se/auto/embed/\d+\?.*?\buid=\d+.*?)\1', | ||||||
|             webpage)] |             webpage)] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․