126 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # coding: utf-8 | ||
|  | from __future__ import unicode_literals | ||
|  | 
 | ||
|  | import re | ||
|  | 
 | ||
|  | from .common import InfoExtractor | ||
|  | from ..utils import ( | ||
|  |     ExtractorError, | ||
|  |     int_or_none, | ||
|  |     xpath_attr, | ||
|  |     xpath_text, | ||
|  |     xpath_element, | ||
|  |     unescapeHTML, | ||
|  |     unified_timestamp, | ||
|  | ) | ||
|  | 
 | ||
|  | 
 | ||
|  | class SpringboardPlatformIE(InfoExtractor): | ||
|  |     _VALID_URL = r'''(?x)
 | ||
|  |                     https?:// | ||
|  |                         cms\.springboardplatform\.com/ | ||
|  |                         (?: | ||
|  |                             (?:previews|embed_iframe)/(?P<index>\d+)/video/(?P<id>\d+)| | ||
|  |                             xml_feeds_advanced/index/(?P<index_2>\d+)/rss3/(?P<id_2>\d+) | ||
|  |                         ) | ||
|  |                     '''
 | ||
|  |     _TESTS = [{ | ||
|  |         'url': 'http://cms.springboardplatform.com/previews/159/video/981017/0/0/1', | ||
|  |         'md5': '5c3cb7b5c55740d482561099e920f192', | ||
|  |         'info_dict': { | ||
|  |             'id': '981017', | ||
|  |             'ext': 'mp4', | ||
|  |             'title': 'Redman "BUD like YOU" "Usher Good Kisser" REMIX', | ||
|  |             'description': 'Redman "BUD like YOU" "Usher Good Kisser" REMIX', | ||
|  |             'thumbnail': r're:^https?://.*\.jpg$', | ||
|  |             'timestamp': 1409132328, | ||
|  |             'upload_date': '20140827', | ||
|  |             'duration': 193, | ||
|  |         }, | ||
|  |     }, { | ||
|  |         'url': 'http://cms.springboardplatform.com/embed_iframe/159/video/981017/rab007/rapbasement.com/1/1', | ||
|  |         'only_matching': True, | ||
|  |     }, { | ||
|  |         'url': 'http://cms.springboardplatform.com/embed_iframe/20/video/1731611/ki055/kidzworld.com/10', | ||
|  |         'only_matching': True, | ||
|  |     }, { | ||
|  |         'url': 'http://cms.springboardplatform.com/xml_feeds_advanced/index/159/rss3/981017/0/0/1/', | ||
|  |         'only_matching': True, | ||
|  |     }] | ||
|  | 
 | ||
|  |     @staticmethod | ||
|  |     def _extract_urls(webpage): | ||
|  |         return [ | ||
|  |             mobj.group('url') | ||
|  |             for mobj in re.finditer( | ||
|  |                 r'<iframe\b[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//cms\.springboardplatform\.com/embed_iframe/\d+/video/\d+.*?)\1', | ||
|  |                 webpage)] | ||
|  | 
 | ||
|  |     def _real_extract(self, url): | ||
|  |         mobj = re.match(self._VALID_URL, url) | ||
|  |         video_id = mobj.group('id') or mobj.group('id_2') | ||
|  |         index = mobj.group('index') or mobj.group('index_2') | ||
|  | 
 | ||
|  |         video = self._download_xml( | ||
|  |             'http://cms.springboardplatform.com/xml_feeds_advanced/index/%s/rss3/%s' | ||
|  |             % (index, video_id), video_id) | ||
|  | 
 | ||
|  |         item = xpath_element(video, './/item', 'item', fatal=True) | ||
|  | 
 | ||
|  |         content = xpath_element( | ||
|  |             item, './{http://search.yahoo.com/mrss/}content', 'content', | ||
|  |             fatal=True) | ||
|  |         title = unescapeHTML(xpath_text(item, './title', 'title', fatal=True)) | ||
|  | 
 | ||
|  |         video_url = content.attrib['url'] | ||
|  | 
 | ||
|  |         if 'error_video.mp4' in video_url: | ||
|  |             raise ExtractorError( | ||
|  |                 'Video %s no longer exists' % video_id, expected=True) | ||
|  | 
 | ||
|  |         duration = int_or_none(content.get('duration')) | ||
|  |         tbr = int_or_none(content.get('bitrate')) | ||
|  |         filesize = int_or_none(content.get('fileSize')) | ||
|  |         width = int_or_none(content.get('width')) | ||
|  |         height = int_or_none(content.get('height')) | ||
|  | 
 | ||
|  |         description = unescapeHTML(xpath_text( | ||
|  |             item, './description', 'description')) | ||
|  |         thumbnail = xpath_attr( | ||
|  |             item, './{http://search.yahoo.com/mrss/}thumbnail', 'url', | ||
|  |             'thumbnail') | ||
|  | 
 | ||
|  |         timestamp = unified_timestamp(xpath_text( | ||
|  |             item, './{http://cms.springboardplatform.com/namespaces.html}created', | ||
|  |             'timestamp')) | ||
|  | 
 | ||
|  |         formats = [{ | ||
|  |             'url': video_url, | ||
|  |             'format_id': 'http', | ||
|  |             'tbr': tbr, | ||
|  |             'filesize': filesize, | ||
|  |             'width': width, | ||
|  |             'height': height, | ||
|  |         }] | ||
|  | 
 | ||
|  |         m3u8_format = formats[0].copy() | ||
|  |         m3u8_format.update({ | ||
|  |             'url': re.sub(r'(https?://)cdn\.', r'\1hls.', video_url) + '.m3u8', | ||
|  |             'ext': 'mp4', | ||
|  |             'format_id': 'hls', | ||
|  |             'protocol': 'm3u8_native', | ||
|  |         }) | ||
|  |         formats.append(m3u8_format) | ||
|  | 
 | ||
|  |         self._sort_formats(formats) | ||
|  | 
 | ||
|  |         return { | ||
|  |             'id': video_id, | ||
|  |             'title': title, | ||
|  |             'description': description, | ||
|  |             'thumbnail': thumbnail, | ||
|  |             'timestamp': timestamp, | ||
|  |             'duration': duration, | ||
|  |             'formats': formats, | ||
|  |         } |