# coding: utf-8 from __future__ import unicode_literals import re from .common import InfoExtractor from ..utils import int_or_none class MinotoIE(InfoExtractor): _VALID_URL = r'(?:minoto:|https?://(?:play|iframe|embed)\.minoto-video\.com/(?P<player_id>[0-9]+)/)(?P<id>[a-zA-Z0-9]+)' def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) player_id = mobj.group('player_id') or '1' video_id = mobj.group('id') video_data = self._download_json('http://play.minoto-video.com/%s/%s.js' % (player_id, video_id), video_id) video_metadata = video_data['video-metadata'] formats = [] for fmt in video_data['video-files']: fmt_url = fmt.get('url') if not fmt_url: continue container = fmt.get('container') if container == 'hls': formats.extend(fmt_url, video_id, 'mp4', m3u8_id='hls', fatal=False) else: fmt_profile = fmt.get('profile') or {} f = { 'format_id': fmt_profile.get('name-short'), 'format_note': fmt_profile.get('name'), 'url': fmt_url, 'container': container, 'tbr': int_or_none(fmt.get('bitrate')), 'filesize': int_or_none(fmt.get('filesize')), 'width': int_or_none(fmt.get('width')), 'height': int_or_none(fmt.get('height')), } codecs = fmt.get('codecs') if codecs: codecs = codecs.split(',') if len(codecs) == 2: f.update({ 'vcodec': codecs[0], 'acodec': codecs[1], }) formats.append(f) self._sort_formats(formats) return { 'id': video_id, 'title': video_metadata['title'], 'description': video_metadata.get('description'), 'thumbnail': video_metadata.get('video-poster', {}).get('url'), 'formats': formats, }