2 from __future__ import unicode_literals
4 from .common import InfoExtractor
5 from ..compat import compat_HTTPError
13 class TVPlayerIE(InfoExtractor):
14 _VALID_URL = r'https?://(?:www\.)?tvplayer\.com/watch/(?P<id>[^/?#]+)'
16 'url': 'http://tvplayer.com/watch/bbcone',
20 'title': r're:^BBC One [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
24 'skip_download': True,
28 def _real_extract(self, url):
29 display_id = self._match_id(url)
30 webpage = self._download_webpage(url, display_id)
32 current_channel = extract_attributes(self._search_regex(
33 r'(<div[^>]+class="[^"]*current-channel[^"]*"[^>]*>)',
34 webpage, 'channel element'))
35 title = current_channel['data-name']
37 resource_id = self._search_regex(
38 r'resourceId\s*=\s*"(\d+)"', webpage, 'resource id')
39 platform = self._search_regex(
40 r'platform\s*=\s*"([^"]+)"', webpage, 'platform')
41 token = self._search_regex(
42 r'token\s*=\s*"([^"]+)"', webpage, 'token', default='null')
43 validate = self._search_regex(
44 r'validate\s*=\s*"([^"]+)"', webpage, 'validate', default='null')
47 response = self._download_json(
48 'http://api.tvplayer.com/api/v2/stream/live',
49 resource_id, headers={
50 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
51 }, data=urlencode_postdata({
57 }))['tvplayer']['response']
58 except ExtractorError as e:
59 if isinstance(e.cause, compat_HTTPError):
60 response = self._parse_json(
61 e.cause.read().decode(), resource_id)['tvplayer']['response']
63 '%s said: %s' % (self.IE_NAME, response['error']), expected=True)
66 formats = self._extract_m3u8_formats(response['stream'], resource_id, 'mp4')
67 self._sort_formats(formats)
71 'display_id': display_id,
72 'title': self._live_title(title),