47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
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
|