From: E.Smith <31170571+azlm8t@users.noreply.github.com> Date: Tue, 25 Sep 2018 00:08:34 +0000 (+0100) Subject: python: Make files python2/python3 compatible. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f90477707b8cafa53dae4410be426b86251f1aa;p=thirdparty%2Ftvheadend.git python: Make files python2/python3 compatible. Ensure files are compatible with python2 and python3. Main differences: - print requires brackets - string is bytes in python2 and unicode in python3 - need to use struct to pack/unpack binary data - need to convert socket data to bytearray to allow data extraction --- diff --git a/lib/py/tvh/htsmsg.py b/lib/py/tvh/htsmsg.py index a0001519d..a5ea8ca36 100644 --- a/lib/py/tvh/htsmsg.py +++ b/lib/py/tvh/htsmsg.py @@ -19,21 +19,17 @@ Support for processing HTSMSG binary format """ import sys - +import struct # ########################################################################### # Utilities # ########################################################################### def int2bin(i): - return chr(i >> 24 & 0xFF) + chr(i >> 16 & 0xFF) \ - + chr(i >> 8 & 0xFF) + chr(i & 0xFF) - + return struct.pack(">i", i) def bin2int(d): - return (ord(d[0]) << 24) + (ord(d[1]) << 16) \ - + (ord(d[2]) << 8) + ord(d[3]) - + return struct.unpack(">i", d)[0] def uuid2int(uuid): if sys.byteorder == 'little': @@ -78,20 +74,20 @@ class HMFBin(str): # Convert python to HTSMSG type def hmf_type(f): if type(f) == list: - return HMF_LIST + ret = HMF_LIST elif type(f) == dict: - return HMF_MAP + ret = HMF_MAP elif type(f) == str: - return HMF_STR + ret = HMF_STR elif type(f) == int: - return HMF_S64 + ret = HMF_S64 elif type(f) == HMFBin: - return HMF_BIN + ret = HMF_BIN elif type(f) == bool: - return HMF_BOOL + ret = HMF_BOOL else: raise Exception('invalid type') - + return struct.pack("B", ret) # Size for field def _binary_count(f): @@ -124,26 +120,26 @@ def binary_count(msg): # Write out field in binary form def binary_write(msg): - ret = '' + ret = b'' lst = type(msg) == list for f in msg: na = '' if not lst: na = f f = msg[f] - ret = ret + chr(hmf_type(f)) - ret = ret + chr(len(na) & 0xFF) + ret = ret + hmf_type(f) + ret = ret + struct.pack("B", (len(na) & 0xFF)) l = _binary_count(f) ret = ret + int2bin(l) - ret = ret + na + ret = ret + na.encode('utf-8') if type(f) in [list, dict]: ret = ret + binary_write(f) elif type(f) in [str, HMFBin]: - ret = ret + f + ret = ret + f.encode() elif type(f) == int: while f: - ret = ret + chr(f & 0xFF) + ret = ret + struct.pack("B", (f & 0xFF)) f = f >> 8 else: raise Exception('invalid type') @@ -164,8 +160,8 @@ def deserialize0(data, typ=HMF_MAP): islist = True msg = [] while len(data) > 5: - typ = ord(data[0]) - nlen = ord(data[1]) + typ = data[0] + nlen = data[1] dlen = bin2int(data[2:6]) data = data[6:] @@ -190,7 +186,7 @@ def deserialize0(data, typ=HMF_MAP): item = 0 i = dlen - 1 while i >= 0: - item = (item << 8) | ord(data[i]) + item = (item << 8) | data[i] i = i - 1 elif typ in [HMF_LIST, HMF_MAP]: item = deserialize0(data[:dlen], typ) @@ -205,7 +201,7 @@ def deserialize0(data, typ=HMF_MAP): if islist: msg.append(item) else: - msg[name] = item + msg[name.decode()] = item data = data[dlen:] return msg @@ -218,7 +214,7 @@ def deserialize(fp, rec=False): self._rec = rec def __iter__(self): - print '__iter__()' + print ('__iter__()') return self def _read(self, num): @@ -241,13 +237,17 @@ def deserialize(fp, rec=False): self._fp = None raise StopIteration() num = bin2int(tmp) - data = '' + data = b'' while len(data) < num: tmp = self._read(num - len(data)) if not tmp: raise Exception('failed to read from fp') data = data + tmp if not self._rec: self._fp = None + # Python2 compatibility: data is a str in python2, + # and bytes in python3, so ensure we have consistency + # here. + data = bytearray(data) return deserialize0(data) ret = _Deserialize(fp, rec) diff --git a/lib/py/tvh/htsp.py b/lib/py/tvh/htsp.py index 49669ad16..b7f89982b 100644 --- a/lib/py/tvh/htsp.py +++ b/lib/py/tvh/htsp.py @@ -22,8 +22,8 @@ Much of the code is pretty rough, but might help people get started with communicating with HTSP server """ -import log -import htsmsg +import tvh.log as log +import tvh.htsmsg as htsmsg # ########################################################################### # HTSP Client