from dataclasses import dataclass from song import Song USER_SCORE_WEIGHT = 0.7 GENRE_WEIGHT = 0.1 RANDOM_WEIGHT = 0.1 RECENT_PENALTY = 0.5 RECENT_COUNT = 10 @dataclass class UserScoredSong(Song): user_score: int @dataclass class Room: id: int coord: tuple[float, float] name: str pin: int | None tags: set[str] creative: bool songs: dict[str, UserScoredSong] history: list[Song] def rank_song( self, song: UserScoredSong, ) -> float: rank = 0.0 song_items = self.songs.items() lowest_score = min(song_items, key=lambda item: item[1].user_score)[1].user_score highest_score = min(song_items, key=lambda item: item[1].user_score)[1].user_score rank += translate(song.user_score, lowest_score, highest_score, 0.0, USER_SCORE_WEIGHT) last10items = self.history[-10:] return rank def translate(value: float, in_min: float, in_max: float, out_min: float, out_max: float): return (value - in_min) / (in_max - in_min) * (out_max - out_min) + out_min