[mgtv] Add new extractor (closes #9212)
[youtube-dl] / youtube_dl / extractor / mgtv.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 from .common import InfoExtractor
5 from ..utils import int_or_none
6
7
8 class MGTVIE(InfoExtractor):
9     _VALID_URL = r'https?://www\.mgtv\.com/v/(?:[^/]+/)*(?P<id>\d+).html'
10
11     _TEST = {
12         'url': 'http://www.mgtv.com/v/1/290525/f/3116640.html',
13         'md5': '',
14         'info_dict': {
15             'id': '3116640',
16             'ext': 'mp4',
17             'title': '我是歌手第四季双年巅峰会:韩红李玟“双王”领军对抗',
18             'description': '我是歌手第四季双年巅峰会',
19             'duration': 7461,
20             'thumbnail': 're:^https?://.*\.jpg$',
21         },
22         'params': {
23             'skip_download': True,  # m3u8 download
24         },
25     }
26
27     _FORMAT_MAP = {
28         '标清': ('Standard', 0),
29         '高清': ('High', 1),
30         '超清': ('SuperHigh', 2),
31     }
32
33     def _real_extract(self, url):
34         video_id = self._match_id(url)
35         api_data = self._download_json(
36             'http://v.api.mgtv.com/player/video', video_id,
37             query={'video_id': video_id})['data']
38         info = api_data['info']
39
40         formats = []
41         for idx, stream in enumerate(api_data['stream']):
42             format_name = stream.get('name')
43             format_id, preference = self._FORMAT_MAP.get(format_name, (None, None))
44             format_info = self._download_json(
45                 stream['url'], video_id,
46                 note='Download video info for format %s' % format_id or '#%d' % idx)
47             formats.append({
48                 'format_id': format_id,
49                 'url': format_info['info'],
50                 'ext': 'mp4',  # These are m3u8 playlists
51                 'preference': preference,
52             })
53         self._sort_formats(formats)
54
55         return {
56             'id': video_id,
57             'title': info['title'].strip(),
58             'formats': formats,
59             'description': info.get('desc'),
60             'duration': int_or_none(info.get('duration')),
61             'thumbnail': info.get('thumb'),
62         }