Switch to side-by-side view

--- a/src/mediaserver/cdplugins/qobuz/api/raw.py
+++ b/src/mediaserver/cdplugins/qobuz/api/raw.py
@@ -10,13 +10,18 @@
     :license: GPLv3, see LICENSE for more details.
 '''
 import sys
+PY3 = sys.version > '3'
 import pprint
 from time import time
 import math
 import hashlib
 import socket
 import binascii
-from itertools import izip, cycle
+if PY3:
+    itzip = zip
+else:
+    from itertools import izip as itzip
+from itertools import cycle
 import requests
 
 from qobuz.exception import QobuzXbmcError
@@ -27,7 +32,7 @@
 class RawApi(object):
 
     def __init__(self):
-        self.appid = '285473059'  # XBMC
+        self.appid = b'285473059'  # XBMC
         self.version = '0.2'
         self.baseUrl = 'http://www.qobuz.com/api.json/'
 
@@ -74,11 +79,16 @@
         General Terms and Conditions
         (http://www.qobuz.com/apps/api/QobuzAPI-TermsofUse.pdf)
         '''
-        s3b = 'Bg8HAA5XAFBYV15UAlVVBAZYCw0MVwcKUVRaVlpWUQ8='
+        s3b = b'Bg8HAA5XAFBYV15UAlVVBAZYCw0MVwcKUVRaVlpWUQ8='
         s3s = binascii.a2b_base64(s3b)
-        self.s4 = ''.join(chr(ord(x) ^ ord(y))
-                          for (x, y) in izip(s3s,
-                                             cycle(self.appid)))
+        a = cycle(self.appid)
+        b = itzip(s3s, cycle(self.appid))
+        if PY3:
+            self.s4 = b''.join((x ^ y).to_bytes(1, byteorder='big')
+                               for (x, y) in itzip(s3s, cycle(self.appid)))
+        else:
+            self.s4 = b''.join(chr(ord(x) ^ ord(y))
+                               for (x, y) in itzip(s3s, cycle(self.appid)))
 
     def _api_request(self, params, uri, **opt):
         '''Qobuz API HTTP get request