Merge pull request #48 from theincognito-inc/master

[hotstar] Move to API v1
This commit is contained in:
Tom-Oliver Heidel 2020-09-06 02:28:53 +02:00 committed by GitHub
commit 27e248cdcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,7 @@
import re import re
import time import time
import uuid import uuid
import json
from .common import InfoExtractor from .common import InfoExtractor
from ..compat import ( from ..compat import (
@ -30,16 +31,25 @@ def _call_api_impl(self, path, video_id, query):
exp = st + 6000 exp = st + 6000
auth = 'st=%d~exp=%d~acl=/*' % (st, exp) auth = 'st=%d~exp=%d~acl=/*' % (st, exp)
auth += '~hmac=' + hmac.new(self._AKAMAI_ENCRYPTION_KEY, auth.encode(), hashlib.sha256).hexdigest() auth += '~hmac=' + hmac.new(self._AKAMAI_ENCRYPTION_KEY, auth.encode(), hashlib.sha256).hexdigest()
token = self._download_json(
'https://api.hotstar.com/in/aadhar/v2/web/in/user/guest-signup',
video_id, note='Downloading token',
data=json.dumps({"idType": "device", "id": compat_str(uuid.uuid4())}).encode('utf-8'),
headers={
'hotstarauth': auth,
'Content-Type': 'application/json',
})['description']['userIdentity']
response = self._download_json( response = self._download_json(
'https://api.hotstar.com/' + path, video_id, headers={ 'https://api.hotstar.com/' + path, video_id, headers={
'hotstarauth': auth, 'hotstarauth': auth,
'x-country-code': 'IN', 'x-hs-appversion': '6.72.2',
'x-platform-code': 'JIO', 'x-hs-platform': 'web',
'x-hs-usertoken': token,
}, query=query) }, query=query)
if response['statusCode'] != 'OK': if response['message'] != "Playback URL's fetched successfully":
raise ExtractorError( raise ExtractorError(
response['body']['message'], expected=True) response['message'], expected=True)
return response['body']['results'] return response['data']
def _call_api(self, path, video_id, query_name='contentId'): def _call_api(self, path, video_id, query_name='contentId'):
return self._call_api_impl(path, video_id, { return self._call_api_impl(path, video_id, {
@ -49,13 +59,11 @@ def _call_api(self, path, video_id, query_name='contentId'):
def _call_api_v2(self, path, video_id): def _call_api_v2(self, path, video_id):
return self._call_api_impl( return self._call_api_impl(
'%s/in/contents/%s' % (path, video_id), video_id, { '%s/content/%s' % (path, video_id), video_id, {
'desiredConfig': 'encryption:plain;ladder:phone,tv;package:hls,dash', 'desired-config': 'encryption:plain;ladder:phone,tv;package:hls,dash',
'client': 'mweb', 'device-id': compat_str(uuid.uuid4()),
'clientVersion': '6.18.0', 'os-name': 'Windows',
'deviceId': compat_str(uuid.uuid4()), 'os-version': '10',
'osName': 'Windows',
'osVersion': '10',
}) })
@ -121,7 +129,7 @@ def _real_extract(self, url):
headers = {'Referer': url} headers = {'Referer': url}
formats = [] formats = []
geo_restricted = False geo_restricted = False
playback_sets = self._call_api_v2('h/v2/play', video_id)['playBackSets'] playback_sets = self._call_api_v2('play/v1/playback', video_id)['playBackSets']
for playback_set in playback_sets: for playback_set in playback_sets:
if not isinstance(playback_set, dict): if not isinstance(playback_set, dict):
continue continue