Beispiel #1
0
    def get_scored_tracks(cls, parameters, track, initial_tracks):
        tracks = []
        trial_count = 0
        finder = Track()
        base_track = track
        pa = ParameterAdapter()
        conditions = pa.parameters_to_conditions(parameters)

        while trial_count < RecommendApi.TRACK_TRIAL_LIMIT and len(tracks) <= RecommendApi.TRACK_COUNT_BASE:
            try:
                # get tracks by criticizes
                if len(tracks) > 0:
                    conditions["offset"] = len(tracks)

                if trial_count == 0:
                    tracks += initial_tracks

                new_tracks = finder.find(conditions)
                tracks += list(filter(lambda t: t.id not in [t.id for t in tracks], new_tracks))

                # filter by inputed parameters
                if track:
                    tracks = list(filter(lambda t: pa.filter_by_parameters(parameters, track, t), tracks))

            except HTTPError as ex:
                    pass

            trial_count += 1
            sleep(0.5)

        scored = tracks
        if len(tracks) > 0:
            if track is None:
                base_track = tracks[0]

            evaluator = Track.make_evaluator(TrackCriticizePattern)
            scored = evaluator.calc_score(tracks, base_track)

        scored = scored[:RecommendApi.TRACK_COUNT_BASE]

        return scored