[sportbox] Fix extraction
[youtube-dl] / youtube_dl / extractor / sportbox.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import re
5
6 from .common import InfoExtractor
7 from ..utils import (
8     determine_ext,
9     int_or_none,
10     js_to_json,
11 )
12
13
14 class SportBoxEmbedIE(InfoExtractor):
15     _VALID_URL = r'https?://news\.sportbox\.ru/vdl/player(?:/[^/]+/|\?.*?\bn?id=)(?P<id>\d+)'
16     _TESTS = [{
17         'url': 'http://news.sportbox.ru/vdl/player/ci/211355',
18         'info_dict': {
19             'id': '211355',
20             'ext': 'mp4',
21             'title': 'В Новороссийске прошел детский турнир «Поле славы боевой»',
22             'thumbnail': r're:^https?://.*\.jpg$',
23             'duration': 292,
24             'view_count': int,
25         },
26         'params': {
27             # m3u8 download
28             'skip_download': True,
29         },
30     }, {
31         'url': 'http://news.sportbox.ru/vdl/player?nid=370908&only_player=1&autostart=false&playeri=2&height=340&width=580',
32         'only_matching': True,
33     }, {
34         'url': 'https://news.sportbox.ru/vdl/player/media/193095',
35         'only_matching': True,
36     }]
37
38     @staticmethod
39     def _extract_urls(webpage):
40         return re.findall(
41             r'<iframe[^>]+src="(https?://news\.sportbox\.ru/vdl/player[^"]+)"',
42             webpage)
43
44     def _real_extract(self, url):
45         video_id = self._match_id(url)
46
47         webpage = self._download_webpage(url, video_id)
48
49         wjplayer_data = self._parse_json(
50             self._search_regex(
51                 r'(?s)var\s+playerOptions\s*=\s*({.+?});', webpage, 'wjplayer settings'),
52             video_id, transform_source=js_to_json)
53
54         wjplayer_data['sources'] = self._parse_json(
55             self._search_regex(
56                 r'(?s)playerOptions\.sources\s*=\s*(\[.+?\]);', webpage, 'wjplayer sources'),
57             video_id, transform_source=js_to_json)
58
59         title = self._html_search_meta(
60             ['og:title', 'twitter:title'], webpage) or self._html_search_regex(
61             r'<title>(.+?)</title>', webpage, 'title', fatal=False) or video_id
62
63         formats = []
64         for source in wjplayer_data['sources']:
65             src = source.get('src')
66             if not src:
67                 continue
68             if determine_ext(src) == 'm3u8':
69                 formats.extend(self._extract_m3u8_formats(
70                     src, video_id, 'mp4', entry_protocol='m3u8_native',
71                     m3u8_id='hls', fatal=False))
72             else:
73                 formats.append({
74                     'url': src,
75                 })
76         self._sort_formats(formats)
77
78         view_count = int_or_none(self._search_regex(
79             r'Просмотров\s*:\s*(\d+)', webpage, 'view count', default=None))
80
81         return {
82             'id': video_id,
83             'title': title,
84             'thumbnail': wjplayer_data.get('poster'),
85             'duration': int_or_none(wjplayer_data.get('duration')),
86             'view_count': view_count,
87             'formats': formats,
88         }