Skip to main content

Overview

BeatSaver is the primary repository for custom Beat Saber maps. ScoreSaber Reloaded integrates with BeatSaver to enrich leaderboard and score data with map metadata, song information, and mapper details.

What is BeatSaver?

BeatSaver provides:
  • Custom map hosting and distribution
  • Map metadata (song name, artist, mapper)
  • Difficulty information for each characteristic
  • Song cover art
  • Mapper profiles and statistics
  • Map version history
  • Download statistics

How SSR Integrates

API Service

SSR implements a rate-limited BeatSaver API service:
From: common/src/api-service/impl/beatsaver.ts:12-20

API Endpoints

The service uses BeatSaver’s public API:
From: common/src/api-service/impl/beatsaver.ts:8-10

Data Synchronized

Map Metadata

For each map, SSR fetches and caches:
  • Basic Info: Map name, BSR key, hash
  • Song Details: Song name, artist, BPM, duration
  • Mapper Info: Mapper name, avatar, ID
  • Description: Full map description
  • Song Art: Cover image URL
  • Versions: All versions with different difficulties
From: backend/src/service/beatsaver.service.ts:39-58

Difficulty Information

SSR extracts specific difficulty data for each map characteristic:
From: backend/src/service/beatsaver.service.ts:59-68

Map Lookup

Single Map Lookup

Lookup a single map by its hash:
From: common/src/api-service/impl/beatsaver.ts:28-40

Batch Lookup

Lookup multiple maps at once (up to 50):
From: common/src/api-service/impl/beatsaver.ts:48-66

Latest Maps

Fetch the latest maps with filtering options:
From: common/src/api-service/impl/beatsaver.ts:76-109

Database Storage

Maps are stored in MongoDB for long-term caching:
From: backend/src/service/beatsaver.service.ts:104-118

API Controller

SSR exposes a BeatSaver proxy endpoint:
From: backend/src/controller/beatsaver.controller.ts:11-35 Endpoint:
Parameters:
  • hash (string): Map hash
  • difficulty (MapDifficulty): Difficulty level
  • characteristic (MapCharacteristic): Map characteristic (Standard, OneSaber, etc.)
  • type (query): Detail level - “basic” or “full”

Caching Strategy

Two-Tier Caching

SSR implements a two-tier caching system:
  1. Redis Cache: Short-term cache for API responses
  2. MongoDB Storage: Long-term storage for map data
From: backend/src/service/beatsaver.service.ts:79-96

Cache Key

Maps are cached using Redis with the following key format:
From: backend/src/service/beatsaver.service.ts:31-33

Discord Logging

BeatSaver-related events are logged to a dedicated Discord channel:
From: backend/src/bot/bot.ts:32

Hash Normalization

All map hashes are normalized to lowercase before storage and lookup to ensure consistency.
From: backend/src/service/beatsaver.service.ts:105-107

Rate Limiting

BeatSaver has a rate limit of 10 requests per second. SSR’s service automatically handles this:
From: common/src/api-service/impl/beatsaver.ts:14-18

Use Cases

Enriching Leaderboards

When displaying leaderboards, SSR fetches BeatSaver data to show:
  • Song name and artist
  • Map cover art
  • Mapper name
  • Map description

Playlist Generation

BeatSaver data is used when generating playlists to include:
  • Correct song metadata
  • Cover images
  • Difficulty labels

Search Functionality

BeatSaver integration enables search by:
  • Song name
  • Mapper name
  • BSR key

Best Practices

Always check the database cache before making API requests to BeatSaver to minimize API calls.
Batch lookups are limited to 50 maps. Split larger requests into multiple batches.