Merge remote-tracking branch 'upstream/master'
[youtube-dl] / youtube_dl / extractor / muenchentv.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import datetime
5 import json
6
7 from .common import InfoExtractor
8 from ..utils import (
9     determine_ext,
10     int_or_none,
11     js_to_json,
12 )
13
14
15 class MuenchenTVIE(InfoExtractor):
16     _VALID_URL = r'https?://(?:www\.)?muenchen\.tv/livestream'
17     IE_DESC = 'münchen.tv'
18     _TEST = {
19         'url': 'http://www.muenchen.tv/livestream/',
20         'info_dict': {
21             'id': '5334',
22             'display_id': 'live',
23             'ext': 'mp4',
24             'title': 're:^münchen.tv-Livestream [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
25             'is_live': True,
26         },
27         'params': {
28             'skip_download': True,
29         }
30     }
31
32     def _real_extract(self, url):
33         display_id = 'live'
34         webpage = self._download_webpage(url, display_id)
35
36         now = datetime.datetime.now()
37         now_str = now.strftime("%Y-%m-%d %H:%M")
38         title = self._og_search_title(webpage) + ' ' + now_str
39
40         data_js = self._search_regex(
41             r'(?s)\nplaylist:\s*(\[.*?}\]),related:',
42             webpage, 'playlist configuration')
43         data_json = js_to_json(data_js)
44         data = json.loads(data_json)[0]
45
46         video_id = data['mediaid']
47         thumbnail = data.get('image')
48
49         formats = []
50         for format_num, s in enumerate(data['sources']):
51             ext = determine_ext(s['file'], None)
52             label_str = s.get('label')
53             if label_str is None:
54                 label_str = '_%d' % format_num
55
56             if ext is None:
57                 format_id = label_str
58             else:
59                 format_id = '%s-%s' % (ext, label_str)
60
61             formats.append({
62                 'url': s['file'],
63                 'tbr': int_or_none(s.get('label')),
64                 'ext': 'mp4',
65                 'format_id': format_id,
66                 'preference': -100 if '.smil' in s['file'] else 0,
67             })
68         self._sort_formats(formats)
69
70         return {
71             'id': video_id,
72             'display_id': display_id,
73             'title': title,
74             'formats': formats,
75             'is_live': True,
76         }
77