New function that makes playlists for every star level and sorts by lowest accuracy.

This commit is contained in:
Brian Lee 2024-07-19 08:49:35 -07:00
parent 3818be41eb
commit 1116a4c59f
2 changed files with 48 additions and 1 deletions

View File

@ -34,5 +34,6 @@ Homepage = "https://git.satstack.dev/blee/beatsaber-playlist-tool"
# https://setuptools.pypa.io/en/latest/userguide/entry_point.html # https://setuptools.pypa.io/en/latest/userguide/entry_point.html
[project.scripts] [project.scripts]
player_scores_by_stars = "saberlist.scoresaber:replay_ranked" player_scores_by_stars = "saberlist.scoresaber:replay_ranked"
replay_all_by_acc = "saberlist.scoresaber:replay_all_by_acc"
leaderboard_songs_by_stars = "saberlist.scoresaber:leaderboard_songs" leaderboard_songs_by_stars = "saberlist.scoresaber:leaderboard_songs"
#replay_ranked_bl = "saberlist.beatleader:replay_ranked" #replay_ranked_bl = "saberlist.beatleader:replay_ranked"

View File

@ -18,6 +18,13 @@ def filter_and_sort_scores_by_stars(scores, min_stars: float, max_stars: float):
sorted_scores = sorted(filtered_scores, key=lambda x: x.leaderboard.stars) sorted_scores = sorted(filtered_scores, key=lambda x: x.leaderboard.stars)
return sorted_scores return sorted_scores
def filter_and_sort_scores_by_acc(scores, min_stars: float, max_stars: float):
# Exclude scores outside the specified star range
filtered_scores = [score for score in scores if min_stars <= score.leaderboard.stars < max_stars]
# Calculate the score percentage for sorting
sorted_scores = sorted(filtered_scores, key=lambda x: (x.score.base_score / x.leaderboard.max_score) * 100)
return sorted_scores
# TODO: combine with scores_to_playlist() # TODO: combine with scores_to_playlist()
def leaderboards_to_playlist(leaderboards: list, playlist_title: str, playlist_author: str = "SaberList Tool") -> str: def leaderboards_to_playlist(leaderboards: list, playlist_title: str, playlist_author: str = "SaberList Tool") -> str:
playlist = { playlist = {
@ -76,6 +83,44 @@ def scores_to_playlist(scores: list, playlist_title, playlist_author = "SaberLis
return playlist_json return playlist_json
async def async_replay_all_by_acc():
"""Generate playlists for each star level and sort by lowest accuracy."""
scoresaber = ExtendedScoreSaberAPI()
try:
await scoresaber.start()
score_sort = ScoreSort.TOP
scores = []
default_title = "Replay SS"
default_player_id = '76561199407393962'
player_id = input(f"Enter the playerid (Default: {default_player_id}): ") or default_player_id
async for player_scores in scoresaber.player_scores_all(player_id, score_sort):
scores.extend(player_scores)
if scores:
max_stars = max(score.leaderboard.stars for score in scores)
for stars in range(1, int(max_stars) + 1):
playlist_title = f"{default_title} {stars}"
filtered_sorted_scores = filter_and_sort_scores_by_acc(scores, stars, stars + 1)
if filtered_sorted_scores:
scores_to_playlist(filtered_sorted_scores, playlist_title)
else:
print(f"No scores found for {stars}")
else:
print("No scores found for the given player.")
finally:
await scoresaber._http_client.close()
def replay_all_by_acc():
try:
asyncio.run(async_replay_all_by_acc())
except Exception as e:
print(f"An error occurred: {e}")
async def async_replay_ranked(): async def async_replay_ranked():
scoresaber = ExtendedScoreSaberAPI() scoresaber = ExtendedScoreSaberAPI()
try: try:
@ -95,7 +140,8 @@ async def async_replay_ranked():
async for player_scores in scoresaber.player_scores_all(player_id, score_sort): async for player_scores in scoresaber.player_scores_all(player_id, score_sort):
scores.extend(player_scores) scores.extend(player_scores)
filtered_sorted_scores = filter_and_sort_scores_by_stars(scores, min_stars, max_stars) # filtered_sorted_scores = filter_and_sort_scores_by_stars(scores, min_stars, max_stars)
filtered_sorted_scores = filter_and_sort_scores_by_acc(scores, min_stars, max_stars)
scores_to_playlist(filtered_sorted_scores, playlist_title) scores_to_playlist(filtered_sorted_scores, playlist_title)
finally: finally:
await scoresaber._http_client.close() await scoresaber._http_client.close()