Skip to main content

Station Player

A music and radio player for the playlists Station Studio makes, built to replace iTunes / Music as the thing that actually plays them.

It plays three kinds of thing:

  • Station Studio playlists: the iTunes XML files Station Studio exports, plus any library you export from Music / iTunes (File › Library › Export Library). Tracks play in the order the station generated them.
  • Music folders: any folder of audio files (mp3, m4a/aac, flac, wav, ogg/opus, aiff). Each folder shows up as its own playlist.
  • Internet radio: any stream URL, including .pls and .m3u links. Rebirth Radio is set up out of the box.

It runs as a small local server on your computer with a browser window as the UI. It needs nothing beyond Python 3.11+ and listens only on 127.0.0.1, so nothing is reachable from your network.

Install and run

You need Python 3.11 or newer and pipx (macOS: brew install pipx; Windows: py -m pip install --user pipx, then py -m pipx ensurepath). No checkout of this repo is needed.

Install the latest release (the exact command is on each Station Player release):

pipx install https://github.com/raby/station-studio/releases/download/player-v0.1.0/station_player-0.1.0-py3-none-any.whl
station-player

Once it's on PyPI, this shorter form works too: pipx install station-player. Upgrade later with pipx upgrade station-player (PyPI) or by running pipx install --force with a newer release's link.

From a checkout, for development:

cd player
python -m station_player

A browser tab opens at http://127.0.0.1:8765/. Useful flags:

station-player ~/Music/Albums ~/exports/week-012.xml   # add sources on launch
station-player --port 9000 --no-browser

Setting it up

Open Sources & settings in the sidebar.

  1. Playlists (iTunes XML). Add an exported .xml file, or a folder of them. On first run Station Player adds Station Studio's exports folder (~/.station-studio/exports) automatically when it exists, so every week you export appears without doing anything.
  2. Music folders. Add the folder your music lives in. Besides appearing under Folders, these files are used to find playlist tracks whose saved location no longer exists (matched by file name).
  3. Path rewrites. If the playlists were made on another computer, say a Mac library played back on a PC, rewrite the start of the path: from /Users/rob/Music/iTunes/iTunes Media to D:/Music.

Tracks whose audio file can't be found are greyed out and skipped. Only audio files (mp3, m4a/aac, flac, wav, ogg/opus, aiff, webm) are ever played or served, whatever a playlist file points at.

Settings live in ~/.station-player/config.json (override the folder with $STATION_PLAYER_HOME).

Playing

  • Double-click a track to play from there, or ▶ Play for the whole playlist. Shuffle and repeat (all / one) sit next to the transport.
  • Keyboard: Tab into the track list, move with ↑ ↓ (Home / End / Page Up / Page Down), Enter plays. Space plays and pauses; ← and → skip 10 seconds. Keyboard media keys and the OS now-playing panel work through the browser's Media Session support.
  • Pausing a radio station and pressing play again reconnects to the live broadcast instead of resuming from where it stopped.

A note on Station Studio's example stations

The example pools bundled with Station Studio are synthetic: their tracks have no audio files behind them, so they load but show as missing. Point Station Studio at an export of your own library and the playlists it generates carry each track's file location through to this player.

Development

cd player
python -m pytest

Releasing

Bump version in player/pyproject.toml and merge to main, then run Actions → Publish Station Player → Run workflow. It tests, builds, smoke-installs the wheel and creates a player-v<version> GitHub release with the files attached. Tick Also publish to PyPI to upload the same files to pypi.org (one-time setup is described at the top of .github/workflows/publish-player.yml).

The server is station_player/server.py (standard library http.server), the library reader is station_player/library.py, and the UI is plain HTML / CSS / JS in station_player/static/.

Metadata

Release files for station-player 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for station-player 0.1.0
File Size Uploaded
station_player-0.1.0.tar.gz 34.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for station-player 0.1.0
File Interpreter ABI Platform
station_player-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 64.6 kB

Release files / station_player-0.1.0.tar.gz

Download URL station_player-0.1.0.tar.gz
Size 34.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f0cba247418c2569204ff53a8bccf8e38de6429ae7187967ffc755e68f189e29
BLAKE2b-256 checksum
How to use checksums
f8dedc54fc9990b221a4c270e2c05818c476612f3c59163220e66fed8d285ca2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / station_player-0.1.0-py3-none-any.whl

Download URL station_player-0.1.0-py3-none-any.whl
Size 30.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f1ee674e24ef49eed2ad81cb76a4028d1c128fa3c1da458d713587be24bc6424
BLAKE2b-256 checksum
How to use checksums
783c244ab3e4b86af286493f05518fb1898f5842a98e83622c45dfbca1437111
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page