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