This commit is contained in:
Francesco De Carlo 2025-08-01 20:57:43 +02:00
commit e9b9193acf

View file

@ -3,15 +3,14 @@ from dataclasses import dataclass
from .song import Song from .song import Song
USER_SCORE_WEIGHT = 0.7 USER_SCORE_WEIGHT = 0.7
GENRE_WEIGHT = 0.1 ARTIST_WEIGHT = 0.1
TAG_WEIGHT = 0.1
RANDOM_WEIGHT = 0.1 RANDOM_WEIGHT = 0.1
RECENT_PENALTY = 0.5 RECENT_PENALTY = 0.5
RECENT_COUNT = 10 RECENT_COUNT = 10
@dataclass type UserScoredSong = tuple[Song, int]
class UserScoredSong(Song):
user_score: int
@dataclass @dataclass
@ -21,24 +20,42 @@ class Room:
name: str name: str
pin: int | None pin: int | None
tags: set[str] tags: set[str]
creative: bool
songs: dict[str, UserScoredSong] songs: dict[str, UserScoredSong]
history: list[Song] history: list[Song]
def rank_song( def rank_song(self, song: Song, user_score: int) -> float:
self,
song: UserScoredSong,
) -> float:
rank = 0.0 rank = 0.0
song_items = self.songs.items() song_items = self.songs.items()
lowest_score = min(song_items, key=lambda item: item[1].user_score)[1].user_score lowest_score = min(song_items, key=lambda item: item[1][1])[1][1]
highest_score = min(song_items, key=lambda item: item[1].user_score)[1].user_score highest_score = min(song_items, key=lambda item: item[1][1])[1][1]
rank += translate(song.user_score, lowest_score, highest_score, 0.0, USER_SCORE_WEIGHT) rank += translate(user_score, lowest_score, highest_score, 0.0, USER_SCORE_WEIGHT)
# last10items = self.history[-10:] recent_songs = self.history[-RECENT_COUNT:]
tag_counts = {}
artist_counts = {}
for song in recent_songs:
for tag in song.tags:
if tag not in tag_counts:
tag_counts[tag] = 0
tag_counts[tag] += 1
if song.artist not in artist_counts:
artist_counts[song.artist] = 0
artist_counts[song.artist] += 1
tag_total = 0
for tag in song.tags:
if tag in tag_counts:
tag_total += tag_counts[tag]
rank += translate(tag_total, 0, RECENT_COUNT, 0, TAG_WEIGHT)
rank += translate(artist_counts[song.artist], 0, RECENT_COUNT, 0, ARTIST_WEIGHT)
if song in recent_songs:
rank -= RECENT_PENALTY
return rank return rank