playwire.py (2408B)
1 from __future__ import unicode_literals 2 3 import re 4 5 from .common import InfoExtractor 6 from ..utils import ( 7 dict_get, 8 float_or_none, 9 ) 10 11 12 class PlaywireIE(InfoExtractor): 13 _VALID_URL = r'https?://(?:config|cdn)\.playwire\.com(?:/v2)?/(?P<publisher_id>\d+)/(?:videos/v2|embed|config)/(?P<id>\d+)' 14 _TESTS = [{ 15 'url': 'http://config.playwire.com/14907/videos/v2/3353705/player.json', 16 'md5': 'e6398701e3595888125729eaa2329ed9', 17 'info_dict': { 18 'id': '3353705', 19 'ext': 'mp4', 20 'title': 'S04_RM_UCL_Rus', 21 'thumbnail': r're:^https?://.*\.png$', 22 'duration': 145.94, 23 }, 24 }, { 25 # m3u8 in f4m 26 'url': 'http://config.playwire.com/21772/videos/v2/4840492/zeus.json', 27 'info_dict': { 28 'id': '4840492', 29 'ext': 'mp4', 30 'title': 'ITV EL SHOW FULL', 31 }, 32 'params': { 33 # m3u8 download 34 'skip_download': True, 35 }, 36 }, { 37 # Multiple resolutions while bitrates missing 38 'url': 'http://cdn.playwire.com/11625/embed/85228.html', 39 'only_matching': True, 40 }, { 41 'url': 'http://config.playwire.com/12421/videos/v2/3389892/zeus.json', 42 'only_matching': True, 43 }, { 44 'url': 'http://cdn.playwire.com/v2/12342/config/1532636.json', 45 'only_matching': True, 46 }] 47 48 def _real_extract(self, url): 49 mobj = re.match(self._VALID_URL, url) 50 publisher_id, video_id = mobj.group('publisher_id'), mobj.group('id') 51 52 player = self._download_json( 53 'http://config.playwire.com/%s/videos/v2/%s/zeus.json' % (publisher_id, video_id), 54 video_id) 55 56 title = player['settings']['title'] 57 duration = float_or_none(player.get('duration'), 1000) 58 59 content = player['content'] 60 thumbnail = content.get('poster') 61 src = content['media']['f4m'] 62 63 formats = self._extract_f4m_formats(src, video_id, m3u8_id='hls') 64 for a_format in formats: 65 if not dict_get(a_format, ['tbr', 'width', 'height']): 66 a_format['quality'] = 1 if '-hd.' in a_format['url'] else 0 67 self._sort_formats(formats) 68 69 return { 70 'id': video_id, 71 'title': title, 72 'thumbnail': thumbnail, 73 'duration': duration, 74 'formats': formats, 75 }