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 __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)