mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	Add an extractor for syfy.com
It uses theplatfrom.com, which has been updated to work with f4m manifests
This commit is contained in:
		| @@ -203,6 +203,7 @@ from .stanfordoc import StanfordOpenClassroomIE | |||||||
| from .statigram import StatigramIE | from .statigram import StatigramIE | ||||||
| from .steam import SteamIE | from .steam import SteamIE | ||||||
| from .streamcloud import StreamcloudIE | from .streamcloud import StreamcloudIE | ||||||
|  | from .syfy import SyfyIE | ||||||
| from .sztvhu import SztvHuIE | from .sztvhu import SztvHuIE | ||||||
| from .teamcoco import TeamcocoIE | from .teamcoco import TeamcocoIE | ||||||
| from .techtalks import TechTalksIE | from .techtalks import TechTalksIE | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								youtube_dl/extractor/syfy.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								youtube_dl/extractor/syfy.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class SyfyIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'https?://www\.syfy\.com/videos/.+?vid:(?P<id>\d+)' | ||||||
|  |  | ||||||
|  |     _TEST = { | ||||||
|  |         'url': 'http://www.syfy.com/videos/Robot%20Combat%20League/Behind%20the%20Scenes/vid:2631458', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': 'NmqMrGnXvmO1', | ||||||
|  |             'ext': 'flv', | ||||||
|  |             'title': 'George Lucas has Advice for his Daughter', | ||||||
|  |             'description': 'Listen to what insights George Lucas give his daughter Amanda.', | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             # f4m download | ||||||
|  |             'skip_download': True, | ||||||
|  |         }, | ||||||
|  |         'add_ie': ['ThePlatform'], | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         mobj = re.match(self._VALID_URL, url) | ||||||
|  |         video_id = mobj.group('id') | ||||||
|  |         webpage = self._download_webpage(url, video_id) | ||||||
|  |         return self.url_result(self._og_search_video_url(webpage)) | ||||||
| @@ -11,7 +11,10 @@ _x = lambda p: xpath_with_ns(p, {'smil': 'http://www.w3.org/2005/SMIL21/Language | |||||||
|  |  | ||||||
|  |  | ||||||
| class ThePlatformIE(InfoExtractor): | class ThePlatformIE(InfoExtractor): | ||||||
|     _VALID_URL = r'(?:https?://link\.theplatform\.com/s/[^/]+/|theplatform:)(?P<id>[^/\?]+)' |     _VALID_URL = r'''(?x) | ||||||
|  |         (?:https?://(?:link|player)\.theplatform\.com/[sp]/[^/]+/ | ||||||
|  |            (?P<config>[^/\?]+/(?:swf|config)/select/)? | ||||||
|  |          |theplatform:)(?P<id>[^/\?&]+)''' | ||||||
|  |  | ||||||
|     _TEST = { |     _TEST = { | ||||||
|         # from http://www.metacafe.com/watch/cb-e9I_cZgTgIPd/blackberrys_big_bold_z30/ |         # from http://www.metacafe.com/watch/cb-e9I_cZgTgIPd/blackberrys_big_bold_z30/ | ||||||
| @@ -29,9 +32,7 @@ class ThePlatformIE(InfoExtractor): | |||||||
|         }, |         }, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     def _get_info(self, video_id): |     def _get_info(self, video_id, smil_url): | ||||||
|         smil_url = ('http://link.theplatform.com/s/dJ5BDC/{0}/meta.smil?' |  | ||||||
|             'format=smil&mbr=true'.format(video_id)) |  | ||||||
|         meta = self._download_xml(smil_url, video_id) |         meta = self._download_xml(smil_url, video_id) | ||||||
|  |  | ||||||
|         try: |         try: | ||||||
| @@ -50,26 +51,34 @@ class ThePlatformIE(InfoExtractor): | |||||||
|  |  | ||||||
|         head = meta.find(_x('smil:head')) |         head = meta.find(_x('smil:head')) | ||||||
|         body = meta.find(_x('smil:body')) |         body = meta.find(_x('smil:body')) | ||||||
|         base_url = head.find(_x('smil:meta')).attrib['base'] |  | ||||||
|         switch = body.find(_x('smil:switch')) |  | ||||||
|         formats = [] |  | ||||||
|         for f in switch.findall(_x('smil:video')): |  | ||||||
|             attr = f.attrib |  | ||||||
|             width = int(attr['width']) |  | ||||||
|             height = int(attr['height']) |  | ||||||
|             vbr = int(attr['system-bitrate']) // 1000 |  | ||||||
|             format_id = '%dx%d_%dk' % (width, height, vbr) |  | ||||||
|             formats.append({ |  | ||||||
|                 'format_id': format_id, |  | ||||||
|                 'url': base_url, |  | ||||||
|                 'play_path': 'mp4:' + attr['src'], |  | ||||||
|                 'ext': 'flv', |  | ||||||
|                 'width': width, |  | ||||||
|                 'height': height, |  | ||||||
|                 'vbr': vbr, |  | ||||||
|             }) |  | ||||||
|  |  | ||||||
|         self._sort_formats(formats) |         f4m_node = body.find(_x('smil:seq/smil:video')) | ||||||
|  |         if f4m_node is not None: | ||||||
|  |             formats = [{ | ||||||
|  |                 'ext': 'flv', | ||||||
|  |                 # the parameters are from syfy.com, other sites may use others | ||||||
|  |                 'url': f4m_node.attrib['src'] + '?g=UXWGVKRWHFSP&hdcore=3.0.3', | ||||||
|  |             }] | ||||||
|  |         else: | ||||||
|  |             base_url = head.find(_x('smil:meta')).attrib['base'] | ||||||
|  |             switch = body.find(_x('smil:switch')) | ||||||
|  |             formats = [] | ||||||
|  |             for f in switch.findall(_x('smil:video')): | ||||||
|  |                 attr = f.attrib | ||||||
|  |                 width = int(attr['width']) | ||||||
|  |                 height = int(attr['height']) | ||||||
|  |                 vbr = int(attr['system-bitrate']) // 1000 | ||||||
|  |                 format_id = '%dx%d_%dk' % (width, height, vbr) | ||||||
|  |                 formats.append({ | ||||||
|  |                     'format_id': format_id, | ||||||
|  |                     'url': base_url, | ||||||
|  |                     'play_path': 'mp4:' + attr['src'], | ||||||
|  |                     'ext': 'flv', | ||||||
|  |                     'width': width, | ||||||
|  |                     'height': height, | ||||||
|  |                     'vbr': vbr, | ||||||
|  |                 }) | ||||||
|  |             self._sort_formats(formats) | ||||||
|  |  | ||||||
|         return { |         return { | ||||||
|             'id': video_id, |             'id': video_id, | ||||||
| @@ -83,4 +92,13 @@ class ThePlatformIE(InfoExtractor): | |||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         mobj = re.match(self._VALID_URL, url) |         mobj = re.match(self._VALID_URL, url) | ||||||
|         video_id = mobj.group('id') |         video_id = mobj.group('id') | ||||||
|         return self._get_info(video_id) |         if mobj.group('config'): | ||||||
|  |             config_url = url+ '&form=json' | ||||||
|  |             config_url = config_url.replace('swf/', 'config/') | ||||||
|  |             config_json = self._download_webpage(config_url, video_id, u'Downloading config') | ||||||
|  |             config = json.loads(config_json) | ||||||
|  |             smil_url = config['releaseUrl'] + '&format=SMIL&formats=MPEG4' | ||||||
|  |         else: | ||||||
|  |             smil_url = ('http://link.theplatform.com/s/dJ5BDC/{0}/meta.smil?' | ||||||
|  |                 'format=smil&mbr=true'.format(video_id)) | ||||||
|  |         return self._get_info(video_id, smil_url) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz