|
|
@ -0,0 +1,56 @@ |
|
|
|
# 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, |
|
|
|
} |