RadioPlayer
A lightweight, cross-platform radio player built with Tauri and Vanilla JavaScript. Features local playback and Google Cast integration.
Prerequisites
Before you begin, ensure you have the following installed on your machine:
- Node.js: Download Node.js (LTS version recommended).
- Rust: Install via rustup.rs.
- Visual Studio C++ Build Tools (Windows only): Required for compiling Rust. Ensure "Desktop development with C++" is selected during installation.
Installation
- Clone the repository:
git clone <repository-url>
cd RadioPlayer
-
Install dependencies:
npm install -
Verify Rust environment: It's good practice to ensure your Rust environment is ready.
cd src-tauri cargo check cd ..
Development
To start the application in development mode (with hot-reloading for frontend changes):
npm run tauri dev
This command will:
- Compile the Rust backend.
- Launch the application window.
- Watch for changes in
src/andsrc-tauri/.
Building for Production
To create an optimized, standalone executable for your operating system:
-
Run the build command:
npm run tauri build -
Locate the artifacts: After the build completes, the installers and executables will be found in:
- Windows:
src-tauri/target/release/bundle/msi/ornsis/ - macOS:
src-tauri/target/release/bundle/dmg/ormacos/ - Linux:
src-tauri/target/release/bundle/deb/orappimage/
- Windows:
Project Structure
src/: Frontend source code (Vanilla HTML/CSS/JS).index.html: The main entry point of the app.main.js: Core logic, handles UI events and communication with the Tauri backend.styles.css: Application styling.stations.json: Configuration file for available radio streams.
src-tauri/: Rust backend code.src/main.rs: The entry point for the Rust process. Handles Google Cast discovery and playback logic.tauri.conf.json: Configuration for the Tauri app (window size, permissions, package info).
Customization
Adding Radio Stations
To add new stations, edit the src/stations.json file. Add a new object to the array with a name and stream url:
[
{
"name": "My New Station",
"url": "https://stream-url.com/stream"
}
]
Adjusting Window Size
To change the default window size, edit src-tauri/tauri.conf.json:
"windows": [
{
"width": 360, // Change width
"height": 720, // Change height
"resizable": false
}
]
Troubleshooting
- Command
taurinot found: Ensure you are running commands vianpm run tauri ...or global install@tauri-apps/cli. - WebView2 Error (Windows): If the app doesn't start on Windows, ensure the Microsoft Edge WebView2 Runtime is installed.
- Build Failures: Try running
cargo updateinside thesrc-taurifolder to update Rust dependencies.
FFmpeg (Optional) for Native Playback
Local/native playback uses an external FFmpeg binary to decode radio streams.
How the app finds FFmpeg
At runtime it searches in this order:
RADIOPLAYER_FFMPEGenvironment variable (absolute or relative path)- Next to the application executable (Windows:
ffmpeg.exe, macOS/Linux:ffmpeg) - Common bundle resource folders relative to the executable:
resources/ffmpeg(.exe)Resources/ffmpeg(.exe)../resources/ffmpeg(.exe)../Resources/ffmpeg(.exe)
- Your system
PATH
Optional: download FFmpeg automatically (Windows)
This is opt-in (it is not run automatically during build/run). It downloads a prebuilt FFmpeg zip and extracts ffmpeg.exe into tools/ffmpeg/bin/ffmpeg.exe.
npm run ffmpeg:download
Then run npm run dev:native (or npm run build) to copy FFmpeg into src-tauri/resources/ for bundling.
License
[Add License Information Here]
Release v0.2
Public beta (v0.2) — updates since v0.1:
- Android build support: Project includes Android build scripts and Gradle wrappers. See scripts/build-android.sh and build-android.ps1. Prebuilt native helper binaries are available in
src-tauri/binaries/for convenience. - Web receiver & webapp: The
receiver/folder contains a Custom CAF Receiver UI (HTML/CSS/JS) and thewebapp/folder provides a standalone web distribution for hosting the app in browsers or PWAs. - Sidecar improvements:
sidecar/index.jsnow retries launches when devices returnNOT_ALLOWEDby attempting to stop existing sessions before retrying. Check sidecar logs forLaunch NOT_ALLOWEDmessages and retry attempts. - LIVE stream: The app continues to support the LIVE stream
https://live.radio1.si/Radio1MB(contentType:audio/mpeg, streamType:LIVE).
Included receiver files:
receiver/index.htmlreceiver/receiver.js(CAF Receiver initialization + LOAD interceptor for LIVE metadata)receiver/styles.cssreceiver/assets/logo.svg
Quick testing notes
- The receiver must be served over HTTPS for Cast devices to load it. For quick local testing you can use
mkcert+ a static HTTPS server:
# create local certs
mkcert -install
mkcert localhost
# serve the receiver folder over HTTPS
npx http-server receiver -p 8443 -S -C localhost.pem -K localhost-key.pem
- Use the Default Media Receiver App ID while developing, or register a Custom Receiver App in the Cast Developer Console and point its URL to your hosted
index.htmlfor production.
Sidecar / troubleshoot
- If a Cast launch fails with
NOT_ALLOWED, the sidecar will attempt to stop any existing sessions on the device and retry the launch (best-effort). Check sidecar logs forLaunch NOT_ALLOWEDand subsequent retry attempts. - Note: the sidecar uses
castv2-client(not the official Google sender SDK). Group/stereo behavior may vary across device types — for full sender capabilities consider adding an official sender implementation.