# 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: 1. **Node.js**: [Download Node.js](https://nodejs.org/) (LTS version recommended). 2. **Rust**: Install via [rustup.rs](https://rustup.rs/). 3. **Visual Studio C++ Build Tools** (Windows only): Required for compiling Rust. Ensure "Desktop development with C++" is selected during installation. ## Installation 1. **Clone the repository**: ```bash git clone cd RadioPlayer ``` 2. **Install dependencies**: ```bash npm install ``` 3. **Verify Rust environment**: It's good practice to ensure your Rust environment is ready. ```bash cd src-tauri cargo check cd .. ``` ## Development To start the application in development mode (with hot-reloading for frontend changes): ```bash npm run tauri dev ``` This command will: 1. Compile the Rust backend. 2. Launch the application window. 3. Watch for changes in `src/` and `src-tauri/`. ## Building for Production To create an optimized, standalone executable for your operating system: 1. **Run the build command**: ```bash npm run tauri build ``` 2. **Locate the artifacts**: After the build completes, the installers and executables will be found in: - **Windows**: `src-tauri/target/release/bundle/msi/` or `nsis/` - **macOS**: `src-tauri/target/release/bundle/dmg/` or `macos/` - **Linux**: `src-tauri/target/release/bundle/deb/` or `appimage/` ## 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`: ```json [ { "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`: ```json "windows": [ { "width": 360, // Change width "height": 720, // Change height "resizable": false } ] ``` ## Troubleshooting * **Command `tauri` not found**: Ensure you are running commands via `npm 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](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) is installed. * **Build Failures**: Try running `cargo update` inside the `src-tauri` folder to update Rust dependencies. ## 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](scripts/build-android.sh) and [build-android.ps1](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 the `webapp/` folder provides a standalone web distribution for hosting the app in browsers or PWAs. - **Sidecar improvements:** `sidecar/index.js` now retries launches when devices return `NOT_ALLOWED` by attempting to stop existing sessions before retrying. Check sidecar logs for `Launch NOT_ALLOWED` messages 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.html` - `receiver/receiver.js` (CAF Receiver initialization + LOAD interceptor for LIVE metadata) - `receiver/styles.css` - `receiver/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: ```bash # 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.html` for 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 for `Launch NOT_ALLOWED` and 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.