def encode(cls, fp): """Compress and base64-encode a raw fingerprint""" # TODO: error handling efp_obj_ptr = ffi.new('char **') fp_obj = ffi.new('int32_t[]', fp) assert lib.groove_fingerprinter_encode(fp_obj, len(fp), efp_obj_ptr) == 0 # copy the result to python and free the c obj result = ffi.string(efp_obj_ptr[0]) lib.groove_fingerprinter_dealloc(efp_obj_ptr[0]) return result
def decode(cls, encoded_fp): """Uncompress and base64-decode a raw fingerprint""" efp_obj = ffi.new('char[]', encoded_fp) fp_obj_ptr = ffi.new('int32_t **') size_obj_ptr = ffi.new('int *') assert lib.groove_fingerprinter_decode(efp_obj, fp_obj_ptr, size_obj_ptr) == 0 # copy the result to python and free the c obj fp_obj = fp_obj_ptr[0] result = [int(fp_obj[n]) for n in range(size_obj_ptr[0])] lib.groove_fingerprinter_dealloc(fp_obj) return result
def __iter__(self): info_obj = ffi.new('struct GrooveFingerprinterInfo *'); while True: status = lib.groove_fingerprinter_info_get(self._obj, info_obj, True) assert status >= 0 if status != 1 or info_obj.item == ffi.NULL: break fp_obj = info_obj.fingerprint fp_size_obj = info_obj.fingerprint_size if self.base64_encode: efp_obj_ptr = ffi.new('char **') assert lib.groove_fingerprinter_encode(fp_obj, fp_size_obj, efp_obj_ptr) == 0 fp = ffi.string(efp_obj_ptr[0]) lib.groove_fingerprinter_dealloc(efp_obj_ptr[0]) else: fp = [int(fp_obj[n]) for n in range(fp_size_obj)] duration = float(info_obj.duration) pitem = self.playlist._pitem(info_obj.item) lib.groove_fingerprinter_free_info(info_obj) yield FingerprinterInfo(fp, duration, pitem)