|
|
# coding: utf-8 from __future__ import unicode_literals
import json
from .common import InfoExtractor
from ..utils import ( ExtractorError, unified_timestamp, )
class TennisTVIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?tennistv\.com/videos/(?P<id>[-a-z0-9]+)' _TEST = { 'url': 'https://www.tennistv.com/videos/indian-wells-2018-verdasco-fritz', 'info_dict': { 'id': 'indian-wells-2018-verdasco-fritz', 'ext': 'mp4', 'title': 'Fernando Verdasco v Taylor Fritz', 'description': 're:^After his stunning victory.{174}$', 'thumbnail': 'https://atp-prod.akamaized.net/api/images/v1/images/112831/landscape/1242/0', 'timestamp': 1521017381, 'upload_date': '20180314', }, 'params': { 'skip_download': True, }, 'skip': 'Requires email and password of a subscribed account', } _NETRC_MACHINE = 'tennistv'
def _login(self): username, password = self._get_login_info() if not username or not password: raise ExtractorError('No login info available, needed for using %s.' % self.IE_NAME, expected=True)
login_form = { 'Email': username, 'Password': password, } login_json = json.dumps(login_form).encode('utf-8') headers = { 'content-type': 'application/json', 'Referer': 'https://www.tennistv.com/login', 'Origin': 'https://www.tennistv.com', }
login_result = self._download_json( 'https://www.tennistv.com/api/users/v1/login', None, note='Logging in', errnote='Login failed (wrong password?)', headers=headers, data=login_json)
if login_result['error']['errorCode']: raise ExtractorError('Login failed, %s said: %r' % (self.IE_NAME, login_result['error']['errorMessage']))
if login_result['entitlement'] != 'SUBSCRIBED': self.report_warning('%s may not be subscribed to %s.' % (username, self.IE_NAME))
self._session_token = login_result['sessionToken']
def _real_initialize(self): self._login()
def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id)
internal_id = self._search_regex(r'video=([0-9]+)', webpage, 'internal video id')
headers = { 'Origin': 'https://www.tennistv.com', 'authorization': 'ATP %s' % self._session_token, 'content-type': 'application/json', 'Referer': url, } check_data = { 'videoID': internal_id, 'VideoUrlType': 'HLSV3', } check_json = json.dumps(check_data).encode('utf-8') check_result = self._download_json( 'https://www.tennistv.com/api/users/v1/entitlementchecknondiva', video_id, note='Checking video authorization', headers=headers, data=check_json) formats = self._extract_m3u8_formats(check_result['contentUrl'], video_id, ext='mp4')
vdata_url = 'https://www.tennistv.com/api/channels/v1/de/none/video/%s' % video_id vdata = self._download_json(vdata_url, video_id)
timestamp = unified_timestamp(vdata['timestamp']) thumbnail = vdata['video']['thumbnailUrl'] description = vdata['displayText']['description'] title = vdata['video']['title']
series = vdata['tour'] venue = vdata['displayText']['venue'] round_str = vdata['seo']['round']
return { 'id': video_id, 'title': title, 'description': description, 'formats': formats, 'thumbnail': thumbnail, 'timestamp': timestamp, 'series': series, 'season': venue, 'episode': round_str, }
|