def _handle_internal(self, params): import time t = time.time() searcher = FingerprintSearcher(self.conn, self.index) searcher.max_length_diff = params.max_duration_diff if params.batch: fingerprints = params.fingerprints else: fingerprints = params.fingerprints[:1] all_matches = [] for p in fingerprints: if p['track_gid']: track_id = resolve_track_gid(self.conn, p['track_gid']) matches = [(0, track_id, p['track_gid'], 1.0)] else: matches = searcher.search(p['fingerprint'], p['duration']) all_matches.append(matches) response = {} if params.batch: response['fingerprints'] = fps = [] result_map = {} for p, matches in zip(fingerprints, all_matches): results = [] fps.append({'index': p['index'], 'results': results}) track_ids = self._inject_results(results, result_map, matches) logger.info("Lookup from %s: %s", params.application_id, list(track_ids)) else: response['results'] = results = [] result_map = {} self._inject_results(results, result_map, all_matches[0]) logger.info("Lookup from %s: %s", params.application_id, result_map.keys()) if params.meta and result_map: self.inject_metadata(params.meta, result_map) logger.info("Lookup took %s", time.time() - t) return response
def _handle_internal(self, params): import time t = time.time() update_user_agent_counter(self.redis, params.application_id, self.user_agent, self.user_ip) searcher = FingerprintSearcher(self.conn, self.index) searcher.max_length_diff = params.max_duration_diff if params.batch: fingerprints = params.fingerprints else: fingerprints = params.fingerprints[:1] all_matches = [] for p in fingerprints: if p['track_gid']: track_id = resolve_track_gid(self.conn, p['track_gid']) matches = [(0, track_id, p['track_gid'], 1.0)] else: matches = searcher.search(p['fingerprint'], p['duration']) all_matches.append(matches) response = {} if params.batch: response['fingerprints'] = fps = [] result_map = {} for p, matches in zip(fingerprints, all_matches): results = [] fps.append({'index': p['index'], 'results': results}) track_ids = self._inject_results(results, result_map, matches) update_lookup_counter(self.redis, params.application_id, bool(track_ids)) logger.debug("Lookup from %s: %s", params.application_id, list(track_ids)) else: response['results'] = results = [] result_map = {} self._inject_results(results, result_map, all_matches[0]) update_lookup_counter(self.redis, params.application_id, bool(result_map)) logger.debug("Lookup from %s: %s", params.application_id, result_map.keys()) if params.meta and result_map: self.inject_metadata(params.meta, result_map) if fingerprints: time_per_fp = (time.time() - t) / len(fingerprints) update_lookup_avg_time(self.redis, time_per_fp) return response
def _handle_internal(self, params): # type: (APIHandlerParams) -> Dict[str, Any] assert isinstance(params, LookupHandlerParams) import time t = time.time() update_user_agent_counter(self.ctx.redis, params.application_id, str(self.user_agent), self.user_ip) searcher = FingerprintSearcher( self.ctx.db.get_fingerprint_db(read_only=True), self.ctx.index) assert params.max_duration_diff is not None searcher.max_length_diff = params.max_duration_diff if params.batch: fingerprints = params.fingerprints else: fingerprints = params.fingerprints[:1] all_matches = [] for p in fingerprints: if isinstance(p, TrackLookupQuery): track_id = resolve_track_gid( self.ctx.db.get_fingerprint_db(read_only=True), p.track_gid) if track_id: matches = [ FingerprintMatch(fingerprint_id=0, track_id=track_id, track_gid=p.track_gid, score=1.0) ] else: matches = [] elif isinstance(p, FingerprintLookupQuery): matches = searcher.search(p.fingerprint, p.duration) all_matches.append(matches) response = {} # type: Dict[str, Any] if params.batch: response['fingerprints'] = fps = [] result_map = {} # type: ignore for p, matches in zip(fingerprints, all_matches): results = [] # type: ignore fps.append({'index': p.index, 'results': results}) track_ids = self._inject_results(results, result_map, matches) update_lookup_counter(self.ctx.redis, params.application_id, bool(track_ids)) logger.debug("Lookup from %s: %s", params.application_id, list(track_ids)) else: response['results'] = results = [] result_map = {} self._inject_results(results, result_map, all_matches[0]) update_lookup_counter(self.ctx.redis, params.application_id, bool(result_map)) logger.debug("Lookup from %s: %s", params.application_id, result_map.keys()) if params.meta and result_map: self.inject_metadata(params.meta, result_map) if fingerprints: time_per_fp = (time.time() - t) / len(fingerprints) update_lookup_avg_time(self.ctx.redis, time_per_fp) return response
def _handle_internal(self, params): # type: (APIHandlerParams) -> Dict[str, Any] assert isinstance(params, LookupHandlerParams) import time t = time.time() if self.ctx.statsd is not None: statsd = self.ctx.statsd.pipeline() else: statsd = None update_user_agent_counter(self.ctx.redis, params.application_id, str(self.user_agent), self.user_ip) searcher = FingerprintSearcher( self.ctx.db.get_fingerprint_db(read_only=True), self.ctx.index, timeout=self.ctx.config.website.search_timeout, ) assert params.max_duration_diff is not None searcher.max_length_diff = params.max_duration_diff if params.batch: fingerprints = params.fingerprints else: fingerprints = params.fingerprints[:1] max_results = 10 all_matches = [] for p in fingerprints: if isinstance(p, TrackLookupQuery): track_id = resolve_track_gid( self.ctx.db.get_fingerprint_db(read_only=True), p.track_gid) if track_id: matches = [ FingerprintMatch(fingerprint_id=0, track_id=track_id, track_gid=p.track_gid, score=1.0) ] else: matches = [] elif isinstance(p, FingerprintLookupQuery): fingerprint_search_t0 = time.time() matches = searcher.search(p.fingerprint, p.duration, max_results=max_results) fingerprint_search_t1 = time.time() if statsd is not None: statsd.incr('api.lookup.matches', len(matches)) statsd.timing( 'api.lookup.fingerprint_search', fingerprint_search_t1 - fingerprint_search_t0) all_matches.append(matches) self.ctx.db.session.close() response = {} # type: Dict[str, Any] if params.batch: response['fingerprints'] = fps = [] result_map = {} # type: ignore for p, matches in zip(fingerprints, all_matches): results = [] # type: ignore fps.append({'index': p.index, 'results': results}) track_ids = self._inject_results(results, result_map, matches) update_lookup_counter(self.ctx.redis, params.application_id, bool(track_ids)) logger.debug("Lookup from %s: %s", params.application_id, list(track_ids)) else: response['results'] = results = [] result_map = {} self._inject_results(results, result_map, all_matches[0]) update_lookup_counter(self.ctx.redis, params.application_id, bool(result_map)) logger.debug("Lookup from %s: %s", params.application_id, result_map.keys()) if self.ctx.config.website.search_return_metadata: if params.meta and result_map: inject_metadata_t0 = time.time() self.inject_metadata(params.meta, result_map) inject_metadata_t1 = time.time() if statsd is not None: statsd.timing('api.lookup.inject_metadata', inject_metadata_t1 - inject_metadata_t0) if fingerprints: time_total = (time.time() - t) time_per_fp = time_total / len(fingerprints) update_lookup_avg_time(self.ctx.redis, time_per_fp) if statsd is not None: statsd.timing('api.lookup.total', time_total) if statsd is not None: statsd.send() return response