Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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