Esempio n. 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
Esempio n. 2
0
    def get_favorite_tracks(cls, parameters, track, initial_tracks):
        if track is None:
            Exception("If getting favorite, you have to set track parameter")

        tracks = []
        favoriters = []
        trial_count = 0
        pa = ParameterAdapter()
        user_evaluator = User.make_evaluator()

        while trial_count < RecommendApi.TRACK_TRIAL_LIMIT and len(tracks) <= RecommendApi.TRACK_COUNT_BASE:
            try:
                # get tracks by criticizes
                if trial_count == 0:
                    favoriters = track.get_favoriters()
                    if len(favoriters) > 0:
                        favoriters = user_evaluator.calc_score(favoriters, favoriters[0])
                    else:
                        break

                if len(favoriters) > trial_count:
                    new_tracks = favoriters[trial_count].item.get_favorites()
                    tracks += list(filter(lambda t: t.id not in [t.id for t in tracks], new_tracks))
                    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 = []
        if len(tracks) > 0:
            evaluator = Track.make_evaluator(TrackCriticizePattern)
            scored = evaluator.calc_score(tracks, track)
        else:
            scored = cls.get_scored_tracks(parameters, track, tracks)

        scored = scored[:RecommendApi.TRACK_COUNT_BASE]

        return scored