|
a/src/mediaserver/cdplugins/qobuz/api/raw.py |
|
b/src/mediaserver/cdplugins/qobuz/api/raw.py |
|
... |
|
... |
30 |
socket.timeout = 5
|
30 |
socket.timeout = 5
|
31 |
|
31 |
|
32 |
class RawApi(object):
|
32 |
class RawApi(object):
|
33 |
|
33 |
|
34 |
def __init__(self):
|
34 |
def __init__(self):
|
35 |
self.appid = b'285473059' # XBMC
|
35 |
self.appid = '285473059' # XBMC
|
|
|
36 |
self.bappid = self.appid.encode('ASCII')
|
36 |
self.version = '0.2'
|
37 |
self.version = '0.2'
|
37 |
self.baseUrl = 'http://www.qobuz.com/api.json/'
|
38 |
self.baseUrl = 'http://www.qobuz.com/api.json/'
|
38 |
|
39 |
|
39 |
self.user_auth_token = None
|
40 |
self.user_auth_token = None
|
40 |
self.user_id = None
|
41 |
self.user_id = None
|
|
... |
|
... |
80 |
(http://www.qobuz.com/apps/api/QobuzAPI-TermsofUse.pdf)
|
81 |
(http://www.qobuz.com/apps/api/QobuzAPI-TermsofUse.pdf)
|
81 |
'''
|
82 |
'''
|
82 |
s3b = b'Bg8HAA5XAFBYV15UAlVVBAZYCw0MVwcKUVRaVlpWUQ8='
|
83 |
s3b = b'Bg8HAA5XAFBYV15UAlVVBAZYCw0MVwcKUVRaVlpWUQ8='
|
83 |
s3s = binascii.a2b_base64(s3b)
|
84 |
s3s = binascii.a2b_base64(s3b)
|
84 |
a = cycle(self.appid)
|
85 |
a = cycle(self.appid)
|
85 |
b = itzip(s3s, cycle(self.appid))
|
86 |
b = itzip(s3s, cycle(self.bappid))
|
86 |
if PY3:
|
87 |
if PY3:
|
87 |
self.s4 = b''.join((x ^ y).to_bytes(1, byteorder='big')
|
88 |
self.s4 = b''.join((x ^ y).to_bytes(1, byteorder='big')
|
88 |
for (x, y) in itzip(s3s, cycle(self.appid)))
|
89 |
for (x, y) in itzip(s3s, cycle(self.bappid)))
|
89 |
else:
|
90 |
else:
|
90 |
self.s4 = b''.join(chr(ord(x) ^ ord(y))
|
91 |
self.s4 = b''.join(chr(ord(x) ^ ord(y))
|
91 |
for (x, y) in itzip(s3s, cycle(self.appid)))
|
92 |
for (x, y) in itzip(s3s, cycle(self.bappid)))
|
92 |
|
93 |
|
93 |
def _api_request(self, params, uri, **opt):
|
94 |
def _api_request(self, params, uri, **opt):
|
94 |
'''Qobuz API HTTP get request
|
95 |
'''Qobuz API HTTP get request
|
95 |
Arguments:
|
96 |
Arguments:
|
96 |
params: parameters dictionary
|
97 |
params: parameters dictionary
|
|
... |
|
... |
112 |
|
113 |
|
113 |
This should produce something like:
|
114 |
This should produce something like:
|
114 |
Error: [200]
|
115 |
Error: [200]
|
115 |
Error: Bad Request [400]
|
116 |
Error: Bad Request [400]
|
116 |
'''
|
117 |
'''
|
117 |
info(self, 'uri: {}, params: {}', uri, str(params))
|
|
|
118 |
self.statTotalRequest += 1
|
118 |
self.statTotalRequest += 1
|
119 |
self.error = ''
|
119 |
self.error = ''
|
120 |
self.status_code = None
|
120 |
self.status_code = None
|
121 |
url = self._baseUrl + uri
|
121 |
url = self._baseUrl + uri
|
122 |
useToken = False if (opt and 'noToken' in opt) else True
|
122 |
useToken = False if (opt and 'noToken' in opt) else True
|
|
... |
|
... |
127 |
'''DEBUG'''
|
127 |
'''DEBUG'''
|
128 |
import copy
|
128 |
import copy
|
129 |
_copy_params = copy.deepcopy(params)
|
129 |
_copy_params = copy.deepcopy(params)
|
130 |
if 'password' in _copy_params:
|
130 |
if 'password' in _copy_params:
|
131 |
_copy_params['password'] = '***'
|
131 |
_copy_params['password'] = '***'
|
|
|
132 |
info(self, 'URI {} POST PARAMS: {} HEADERS: {}', uri,
|
|
|
133 |
str(_copy_params), str(headers))
|
132 |
'''END / DEBUG'''
|
134 |
'''END / DEBUG'''
|
133 |
r = None
|
135 |
r = None
|
134 |
try:
|
136 |
try:
|
135 |
r = self.session.post(url, data=params, headers=headers)
|
137 |
r = self.session.post(url, data=params, headers=headers)
|
136 |
except:
|
138 |
except:
|