Web player served by stemserve
Plex browsing, stem mixer with presets, shuffle, repeat all/one, playback speed, queue, waveform seek. stemserve serves web/ at / without the token. stemserve image now builds from the repo root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
605b88f1eb
commit
9299fee9a0
8 files changed
+1113
-20
No files matched your search
@@ -37,19 +37,21 @@ The stems folder mirrors the music folder. If a song lives at `Kansas/Leftovertu
|
||||
|
||||
## Apps
|
||||
|
||||
| | iOS | Android | Desktop player |
|
||||
|---|---|---|---|
|
||||
| Per-stem faders, mute, solo, mix presets | yes | yes | yes |
|
||||
| Waveform seek bar, live stem meters | yes | yes | |
|
||||
| Saved mix per song | yes | | |
|
||||
| Karaoke mode with synced lyrics | yes | | |
|
||||
| Stem playlists (a mix per song) | yes | | |
|
||||
| Plex playlists | yes | yes | yes |
|
||||
| Downloads for offline | yes | yes | |
|
||||
| 10-band and parametric EQ, AutoEQ import | yes | yes | |
|
||||
| Car | CarPlay | Android Auto | |
|
||||
| Voice | Siri | Google Assistant | |
|
||||
| Stem Now | yes | yes | |
|
||||
| | iOS | Android | Desktop player | Web |
|
||||
|---|---|---|---|---|
|
||||
| Per-stem faders, mute, solo, mix presets | yes | yes | yes | yes |
|
||||
| Waveform seek bar, live stem meters | yes | yes | | waveform |
|
||||
| Shuffle, repeat all/one | yes | yes | | yes |
|
||||
| Playback speed (keeps pitch) | yes | | | yes |
|
||||
| Saved mix per song | yes | | | |
|
||||
| Karaoke mode with synced lyrics | yes | | | |
|
||||
| Stem playlists (a mix per song) | yes | | | |
|
||||
| Plex playlists | yes | yes | yes | yes |
|
||||
| Downloads for offline | yes | yes | | |
|
||||
| 10-band and parametric EQ, AutoEQ import | yes | yes | | |
|
||||
| Car | CarPlay | Android Auto | | |
|
||||
| Voice | Siri | Google Assistant | | |
|
||||
| Stem Now | yes | yes | | |
|
||||
|
||||
Mix presets are Full, Karaoke, A Cappella, No Drums, Rhythm, No Guitar and No Bass.
|
||||
|
||||
@@ -85,10 +87,10 @@ docker run -d --name stemd --restart unless-stopped --stop-timeout 60 \
|
||||
|
||||
The first song downloads the model (about 700 MB). After that the log shows what's left, what it's on, and how fast it's going.
|
||||
|
||||
**stemserve** is one Python file using only the standard library. Copy `server/` to `/mnt/user/appdata/stemserve` and run `docker compose up -d --build` there, or by hand:
|
||||
**stemserve** is one Python file using only the standard library. It also serves the web player from `web/`. Copy the repo's `server/` and `web/` folders to `/mnt/user/appdata/stemserve` and run `docker compose up -d --build` in `server/`, or by hand:
|
||||
|
||||
```sh
|
||||
docker build -t stemserve /mnt/user/appdata/stemserve
|
||||
docker build -f /mnt/user/appdata/stemserve/server/Dockerfile -t stemserve /mnt/user/appdata/stemserve
|
||||
docker run -d --name stemserve --restart unless-stopped -p 8765:8765 \
|
||||
-v /mnt/user/Music/Stems:/stems:ro \
|
||||
-v /mnt/user/appdata/stemserve/cache:/cache \
|
||||
@@ -158,6 +160,7 @@ CarPlay and Siri need the `carplay-audio` and `siri` entitlements, which a free
|
||||
|
||||
### Using it
|
||||
|
||||
- **Now Playing:** shuffle and repeat sit either side of the play controls; tap repeat again for repeat one. The speed button (next to the mixer) goes from 0.5× to 2× without changing pitch.
|
||||
- **Mixer:** on Now Playing, under the waveform. Tap **Save** to keep a mix for that song; it comes back every time the song plays.
|
||||
- **Karaoke:** the mic button mutes vocals on every song and shows synced lyrics from [LRCLIB](https://lrclib.net). Tap a line to jump to it. Vocals can be On, Soft or Off, and Soft has a slider for how quiet.
|
||||
- **Playlists:** the Playlists tab switches between Plex and Stem.
|
||||
@@ -211,6 +214,18 @@ adb forward tcp:5277 tcp:5277
|
||||
~/Android/Sdk/extras/google/auto/desktop-head-unit -c ~/Android/Sdk/extras/google/auto/config/rotary.ini
|
||||
```
|
||||
|
||||
## Web
|
||||
|
||||
stemserve also serves a web player at its root, so `http://<server>:8765/` opens it. Sign in with Plex in Settings (or paste a server URL and token), then browse albums, artists, playlists and search like the apps. **Stems only** lists everything in the stems folder and works without Plex.
|
||||
|
||||
- Mixer, presets, shuffle, repeat, speed, queue and the waveform seek bar work like the phone apps. The mix carries over to the next song.
|
||||
- Songs without stems play straight from Plex.
|
||||
- Keys: Space play/pause, arrows seek, S shuffle, R repeat, `[` `]` speed, M mixer, Q queue.
|
||||
- Settings, queue and mix are kept in the browser. Nothing syncs with the apps.
|
||||
- If stemserve has `TOKEN` set, enter it in Settings.
|
||||
|
||||
It's plain HTML and JavaScript in `web/` with no build step. To run it somewhere else, serve `web/` and proxy `/api/` and `/file/` to stemserve on the same origin; with a different origin the stem faders fall back to element volume, which iOS Safari ignores.
|
||||
|
||||
## Desktop
|
||||
|
||||
Linux, Python 3.12 and [uv](https://docs.astral.sh/uv/). PyTorch defaults to ROCm (AMD); point the torch index in `pyproject.toml` elsewhere for NVIDIA or CPU.
|
||||
@@ -274,6 +289,7 @@ Stems/Kansas/Leftoverture/01 Carry On Wayward Son/
|
||||
| `POST /api/prepare?key=K&fmt=opus&br=256` | Starts Opus transcodes in the background |
|
||||
| `POST /api/stem` with `{"paths": [...]}` | Stem Now for these Plex files |
|
||||
| `GET /file/K/<file>.flac[?fmt=opus&br=256]` | The stem, with range support |
|
||||
| `GET /` | The web player from `web/` (or `WEB_DIR`), no token needed |
|
||||
|
||||
`K` is the song's folder under the stems root, like `Kansas/Leftoverture/01 Carry On Wayward Son`. Outside Docker:
|
||||
|
||||
@@ -289,6 +305,7 @@ ios/ iOS and CarPlay app (SwiftUI, xcodegen project)
|
||||
scripts/ build-ipa.sh, make-source.py
|
||||
android/ Android and Android Auto app (Kotlin, Compose, Media3)
|
||||
server/ stemd.py, stemserve.py, Dockerfiles, compose file
|
||||
web/ web player (served by stemserve)
|
||||
stemify/ desktop separator (PySide6 + QML) and shared separation code
|
||||
worker/ Demucs and RoFormer backends, run in a separate process
|
||||
player/ Stemify Player
|
||||
|
||||
Reference in new issue
Block a user