Add a readme file
This commit is contained in:
parent
7879e03cc5
commit
b3caf821de
104
README.md
Normal file
104
README.md
Normal file
@ -0,0 +1,104 @@
|
||||
# Setlist
|
||||
|
||||
A small Beat Saber (PC, BSIPA) plugin that syncs in-game playlist edits back to
|
||||
[BeatLeader](https://beatleader.com) so your playlists stay current outside the
|
||||
game — on the website, on your phone, or shared with friends.
|
||||
|
||||
## What it does
|
||||
|
||||
When you add a map to a playlist in-game (via the standard
|
||||
[PlaylistManager](https://github.com/rithik-b/PlaylistManager) "Add to playlist"
|
||||
flow), Setlist:
|
||||
|
||||
1. Watches `PlaylistManager.Utilities.Events.playlistSongAdded`.
|
||||
2. Checks whether the playlist is a **BeatLeader-synced playlist owned by you**
|
||||
— i.e. its `customData.syncURL` is an `api.beatleader.com/playlist/guid/…`
|
||||
URL and its `customData.owner` matches your platform user id.
|
||||
3. Serializes the updated playlist and **POSTs it back to BeatLeader**
|
||||
(`POST /user/playlist?id=…&shared=…`).
|
||||
|
||||
The POST reuses the [BeatLeader mod](https://github.com/BeatLeader/beatleader-mod)'s
|
||||
authenticated session — no extra login, no API token in your config, nothing to
|
||||
copy/paste. If BeatLeader is signed in, Setlist is signed in.
|
||||
|
||||
The result: edit playlists in VR; see them updated on the website and any
|
||||
device that consumes them, without alt-tabbing or running a sync script.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Beat Saber `1.40.8` (PC), via BSIPA.
|
||||
- [BeatLeader](https://github.com/BeatLeader/beatleader-mod) `^0.9.0` — must be
|
||||
installed **and signed in** for the sync to authenticate.
|
||||
- [PlaylistManager](https://github.com/rithik-b/PlaylistManager) `^1.7.0`.
|
||||
- [BeatSaberPlaylistsLib](https://github.com/Zingabopp/BeatSaberPlaylistsLib)
|
||||
`^1.7.0` (transitive via PlaylistManager).
|
||||
|
||||
See `Setlist/manifest.json` for the authoritative list.
|
||||
|
||||
## Install
|
||||
|
||||
Drop `Setlist.dll` into `Beat Saber/Plugins/` alongside BeatLeader and
|
||||
PlaylistManager (BSManager works fine). Confirm in `Logs/_latest.log`:
|
||||
|
||||
```
|
||||
[INFO @ ...] [Setlist|...] platformUserId=...
|
||||
[INFO @ ...] [Setlist|...] Playlist "...": hasSyncUrl=True, owner=..., ownerMatchesPlatform=true (...)
|
||||
```
|
||||
|
||||
When you add a map to one of those playlists in-game you should then see:
|
||||
|
||||
```
|
||||
[INFO @ ...] [Setlist|...] Setlist BeatLeader sync: OK HTTP 200 playlist="..." body=...
|
||||
```
|
||||
|
||||
## Build (Linux / NixOS, no Visual Studio / Rider)
|
||||
|
||||
This whole plugin is built from the `dotnet` CLI on Linux — including NixOS —
|
||||
no BSMT IDE extension required. The Linux + Cursor toolchain (.NET SDK 9, BSMT
|
||||
MSBuild tasks, the missing-`net472`-reference-assemblies workaround, and the
|
||||
"copy DLL into `Plugins/` on a Unix host" target) is documented in:
|
||||
|
||||
- [`docs/pc-modding.md`](docs/pc-modding.md) — full guide, adapted from the BSMG
|
||||
wiki for Linux + Cursor + LLM-assisted dev.
|
||||
- [`docs/bootstrap.md`](docs/bootstrap.md) — exactly how this project was
|
||||
scaffolded (template, NuGet pins, `BeatSaberDir`, etc.).
|
||||
|
||||
Quick start once `Setlist.csproj.user` points at your install:
|
||||
|
||||
```bash
|
||||
cd Setlist
|
||||
dotnet restore
|
||||
dotnet build -c Debug
|
||||
```
|
||||
|
||||
Output: `Setlist/bin/Debug/Setlist.dll`, also copied into
|
||||
`$BeatSaberDir/Plugins/Setlist.dll` by the Unix-host post-build target.
|
||||
|
||||
## How it integrates with the two host plugins
|
||||
|
||||
Both integrations are deliberately thin and live in a single project so they
|
||||
can be read end-to-end:
|
||||
|
||||
- **PlaylistManager** — Setlist subscribes to its public
|
||||
`Events.playlistSongAdded` hook (same one used by the in-game UI flow).
|
||||
Notes on that flow live in [`docs/playlistmanager-add-map.md`](docs/playlistmanager-add-map.md).
|
||||
|
||||
- **BeatLeader** — Setlist references the shipped `BeatLeader.dll`, waits on
|
||||
BeatLeader's own `Authentication._signedIn` flag, and POSTs through Unity's
|
||||
`UnityWebRequest` so the cookies BeatLeader's `HttpClient` already has on the
|
||||
shared `CookieContainer` are reused. Background and the alternative
|
||||
"go through `WebRequestFactory` directly" approach are in
|
||||
[`docs/beatleader-playlist-api.md`](docs/beatleader-playlist-api.md) and
|
||||
[`docs/beatleader-api-samples.md`](docs/beatleader-api-samples.md).
|
||||
|
||||
## Status
|
||||
|
||||
Early / personal-use. Currently scoped to:
|
||||
|
||||
- Adds (one new song → one POST). Removes, reorders, renames, and bulk edits
|
||||
are not yet wired.
|
||||
- BeatLeader as the sync target. The same model would extend to other backends
|
||||
that accept a full-playlist upload.
|
||||
|
||||
See [`AGENTS.md`](AGENTS.md) for repo conventions (version-bump-on-build,
|
||||
smoketest, etc.) if you're contributing or letting an agent work in this repo.
|
||||
Loading…
x
Reference in New Issue
Block a user