summaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/miomio.py
blob: 6f40bf1b999eca49bd34f70f995620874ff42e4d (plain)
    1 # coding: utf-8
    2 from __future__ import unicode_literals
    3 
    4 import random
    5 
    6 from .common import InfoExtractor
    7 from ..compat import compat_urllib_request
    8 from ..utils import (
    9     xpath_text,
   10     int_or_none,
   11     ExtractorError,
   12 )
   13 
   14 
   15 class MioMioIE(InfoExtractor):
   16     IE_NAME = 'miomio.tv'
   17     _VALID_URL = r'https?://(?:www\.)?miomio\.tv/watch/cc(?P<id>[0-9]+)'
   18     _TESTS = [{
   19         # "type=video" in flashvars
   20         'url': 'http://www.miomio.tv/watch/cc88912/',
   21         'md5': '317a5f7f6b544ce8419b784ca8edae65',
   22         'info_dict': {
   23             'id': '88912',
   24             'ext': 'flv',
   25             'title': '【SKY】字幕 铠武昭和VS平成 假面骑士大战FEAT战队 魔星字幕组 字幕',
   26             'duration': 5923,
   27         },
   28     }, {
   29         'url': 'http://www.miomio.tv/watch/cc184024/',
   30         'info_dict': {
   31             'id': '43729',
   32             'title': '《动漫同人插画绘制》',
   33         },
   34         'playlist_mincount': 86,
   35         'skip': 'This video takes time too long for retrieving the URL',
   36     }, {
   37         'url': 'http://www.miomio.tv/watch/cc173113/',
   38         'info_dict': {
   39             'id': '173113',
   40             'title': 'The New Macbook 2015 上手试玩与简评'
   41         },
   42         'playlist_mincount': 2,
   43     }]
   44 
   45     def _real_extract(self, url):
   46         video_id = self._match_id(url)
   47         webpage = self._download_webpage(url, video_id)
   48 
   49         title = self._html_search_meta(
   50             'description', webpage, 'title', fatal=True)
   51 
   52         mioplayer_path = self._search_regex(
   53             r'src="(/mioplayer/[^"]+)"', webpage, 'ref_path')
   54 
   55         http_headers = {'Referer': 'http://www.miomio.tv%s' % mioplayer_path,}
   56 
   57         xml_config = self._search_regex(
   58             r'flashvars="type=(?:sina|video)&amp;(.+?)&amp;',
   59             webpage, 'xml config')
   60 
   61         # skipping the following page causes lags and eventually connection drop-outs
   62         self._request_webpage(
   63             'http://www.miomio.tv/mioplayer/mioplayerconfigfiles/xml.php?id=%s&r=%s' % (id, random.randint(100, 999)),
   64             video_id)
   65 
   66         vid_config_request = compat_urllib_request.Request(
   67             'http://www.miomio.tv/mioplayer/mioplayerconfigfiles/sina.php?{0}'.format(xml_config),
   68             headers=http_headers)
   69 
   70         # the following xml contains the actual configuration information on the video file(s)
   71         vid_config = self._download_xml(vid_config_request, video_id)
   72 
   73         if not int_or_none(xpath_text(vid_config, 'timelength')):
   74             raise ExtractorError('Unable to load videos!', expected=True)
   75 
   76         entries = []
   77         for f in vid_config.findall('./durl'):
   78             segment_url = xpath_text(f, 'url', 'video url')
   79             if not segment_url:
   80                 continue
   81             order = xpath_text(f, 'order', 'order')
   82             segment_id = video_id
   83             segment_title = title
   84             if order:
   85                 segment_id += '-%s' % order
   86                 segment_title += ' part %s' % order
   87             entries.append({
   88                 'id': segment_id,
   89                 'url': segment_url,
   90                 'title': segment_title,
   91                 'duration': int_or_none(xpath_text(f, 'length', 'duration'), 1000),
   92                 'http_headers': http_headers,
   93             })
   94 
   95         if len(entries) == 1:
   96             segment = entries[0]
   97             segment['id'] = video_id
   98             segment['title'] = title
   99             return segment
  100 
  101         return {
  102             '_type': 'multi_video',
  103             'id': video_id,
  104             'entries': entries,
  105             'title': title,
  106             'http_headers': http_headers,
  107         }

Generated by cgit