English | Deutsch
sqrtRADIO is a Python-based M3U/PLS playlist radio player with a retro 80s hardware-style GUI, timeshift for DVR streams, and local buffering for Icecast/HTTP stations. It replicates and extends m3u.js.
- M3U/PLS Playlist Support – Load HLS, Icecast, MP3, AAC, and other audio streams from M3U or PLS playlists.
- Nested Playlists – If a playlist entry points to another
.m3ufile, sqrtRADIO loads it as a new playlist instead of playing it as a stream..plsentries are also fetched and displayed as a navigable list. - HLS/DVR Playback – Play live HLS streams with timeshift and rewind.
- Client-Side Buffering – Icecast streams can be rewound up to 10 minutes using a local ring buffer.
- Preset Persistence – Save stream URLs to preset slots; they persist across restarts.
- Clipboard & File Export – Copy the current station URL or the loaded M3U playlist to clipboard, or export it as a file.
- Keyboard Shortcuts – Keyboard control for navigation and playback, can be toggled via a GUI checkbox.
- Volume & Balance Control – Adjust left/right balance and volume in real time.
- Stream Recording – Record a stream to MKV, MP3, AAC, OPUS, FLAC, OGG, or other formats.
- Load Local Playlist – Open a local
.m3u,.m3u8, or.plsfile directly from disk via the 📂 LOAD LOCAL button — no network required. - Paste URL – Paste a stream URL from the clipboard with a single click; the STATION field is automatically updated with the hostname.
- Bitrate Detection – Detects codec (e.g. MP3, FLAC, AAC), sample rate (kHz), and bitrate (kbps) via FFmpeg.
- Pause/Resume – Mute and pause playback while keeping stream state.
- Python 3.10+
- FFmpeg – Download from ffmpeg.org
- Python packages:
sounddevice,requests(all other dependencies are Python standard library)
-
Install FFmpeg
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt-get install ffmpeg - Windows: Download from ffmpeg.org and add to PATH
- macOS:
-
Install Python Dependencies
pip install sounddevice requests
-
Run sqrtRADIO
python sqrtRADIO.py
- Select a preset playlist or load your own M3U file.
- Click ▶ START to play the selected station.
- Use arrow keys (← →) or navigation buttons (
<<,>>) to browse through stations. - Click ■ (or press Q) to stop playback.
- Copy a stream URL to your clipboard.
- Click PASTE under the URL field — the URL is inserted and the STATION name updates to the hostname automatically.
- Click ▶ START to play.
- Click 📂 LOAD LOCAL below the M3U playlist area.
- Select a
.m3u,.m3u8, or.plsfile from your computer. - The playlist is loaded instantly — no internet connection needed.
- Enter or modify a stream URL in the VFD display's URL text box.
- Click the 💾 Speichern button next to the presets row.
- Enter a custom name for your new preset slot when prompted. Your configuration will automatically save to disk.
Toggle the TASTATUR checkbox on or off to manage global shortcuts:
| Key | Action |
|---|---|
| ← / → | Previous/Next Station |
| ↑ / ↓ | First/Last Station |
| Enter | START playback |
| Q | Stop (■) |
| P | Pause/Resume (⏸) |
| TAB | Open URL in browser |
| U | Go back in history (⇑) |
| R | Toggle Recording (⏺) |
| 1 / + | Volume up |
| − | Volume down |
| B | Balance left |
| N | Balance right |
| Esc | Disable keyboard control |
- Use the Timeshift buttons to rewind/fast-forward in supported streams.
- -600 s to -5 s: Rewind buttons.
- +5 s to +600 s: Fast-forward buttons.
- LIVE: Return to the live edge.
- Click ⏺ REC while a stream is playing.
- Choose your preferred audio format (MKV, MP3, AAC, etc.) and save location.
- Click ⏹ STOP to end recording.
Custom presets are stored as a JSON file named sqrtRADIO_presets.json. On the first launch, it is seeded with factory defaults (Kultur, Langwelle, HLS, etc.). Subsequent modifications are saved directly to the user-specific config directory:
- Windows:
%APPDATA%\sqrtRADIO - macOS:
~/Library/Application Support/sqrtRADIO - Linux:
~/.config/sqrtRADIONote: A maximum of 8 presets are supported, utilizing a FIFO (First-In, First-Out) queue mechanism once exceeded.
sqrtRADIO automatically selects the highest-bandwidth variant from master playlists, ensuring the best audio quality (similar to VLC behavior).
The player automatically detects DVR capabilities by:
- Parsing HLS manifests for
#EXT-X-PLAYLIST-TYPE:EVENTor#EXT-X-PLAYLIST-TYPE:VODtags. - Checking total segment duration (>90 seconds indicates DVR).
- Falling back to
ffprobefor non-HLS streams.
When a playlist entry or the URL field itself ends in .m3u (not .m3u8), tune() calls _get_m3u() on it instead of _play() — the new playlist replaces the current one rather than being played as an audio stream. .pls URLs are handled the same way via _get_pls(), which parses the INI-style FileN/TitleN entries and populates the same playlist display used for M3U. Extra directive lines such as #EXTVLCOPT are silently skipped when extracting the stream URL from a playlist entry.
Non-HLS streams (Icecast, HTTP MP3, etc.) are buffered locally in a 10-minute ring buffer (PCMBuffer), allowing seamless rewind without network latency.
Streams are recorded at full bitrate using FFmpeg's -c copy option (no re-encoding), preserving original quality.
MIT License – See LICENSE file for details.
English | Deutsch
sqrtRADIO ist ein Python-basierter M3U/PLS-Wiedergabelisten-Radioplayer mit Retro-80er-Hardware-GUI, Zeitversatz (Timeshift) für DVR-Streams und lokalem Puffer für Icecast/HTTP-Radiostationen. Es repliziert und erweitert m3u.js.
- M3U/PLS-Wiedergabelisten-Unterstützung – Laden Sie HLS-, Icecast-, MP3-, AAC- und andere Audioströme aus M3U- oder PLS-Wiedergabelisten.
- Verschachtelte Playlists – Zeigt ein Eintrag selbst auf eine weitere
.m3u-Datei, lädt sqrtRADIO diese als neue Playlist, statt sie als Stream abzuspielen..pls-Einträge werden ebenso geladen und als navigierbare Liste angezeigt. - HLS/DVR-Wiedergabe – Spielen Sie Live-HLS-Streams mit Zeitversatz und Rücklauf ab.
- Client-seitiger Puffer – Icecast-Streams können bis zu 10 Minuten mit einem lokalen Ringpuffer zurückgespult werden.
- Voreinstellungen-Speicherung – Speichern Sie Stream-URLs auf Preset-Schaltflächen; sie bleiben nach Programmneustarts erhalten.
- Zwischenablage & Datei-Export – Kopieren Sie die aktive Stations-URL oder die geladene M3U-Wiedergabeliste in die Zwischenablage, oder exportieren Sie sie als Datei.
- Tastaturkürzel – Tastatursteuerung für Navigation und Wiedergabe, über ein Kontrollkästchen umschaltbar.
- Lautstärke- und Balancesteuerung – Passen Sie Balance (L/R) und Lautstärke in Echtzeit an.
- Stream-Aufnahme – Zeichnen Sie einen Stream in den Formaten MKV, MP3, AAC, OPUS, FLAC, OGG oder anderen auf.
- Lokale Playlist laden – Öffnen Sie eine lokale
.m3u-,.m3u8- oder.pls-Datei direkt vom Datenträger über die Schaltfläche 📂 LOAD LOCAL — ohne Netzwerkverbindung. - URL einfügen – Fügen Sie eine Stream-URL aus der Zwischenablage per Klick ein; das STATION-Feld wird automatisch mit dem Hostnamen aktualisiert.
- Datenrate-Anzeige – Bestimmt Kodec (z.B. MP3, FLAC, AAC), Abtastrate (kHz) und Bitrate (kbps) über FFmpeg.
- Pause/Fortsetzen – Pausieren (Stummschalten) Sie die Wiedergabe, der Stream-Status bleibt erhalten.
- Python 3.10+
- FFmpeg – Herunterladen von ffmpeg.org
- Python-Pakete:
sounddevice,requests(alle übrigen Abhängigkeiten gehören zur Python-Standardbibliothek)
-
FFmpeg installieren
- macOS:
brew install ffmpeg - Ubuntu/Debian:
sudo apt-get install ffmpeg - Windows: Von ffmpeg.org herunterladen und zu PATH hinzufügen
- macOS:
-
Python-Abhängigkeiten installieren
pip install sounddevice requests
-
sqrtRADIO ausführen
python sqrtRADIO.py
- Wählen Sie eine Wiedergabeliste oder laden Sie Ihre eigene M3U-Datei.
- Klicken Sie auf ▶ START, um die gewählte Station abzuspielen.
- Verwenden Sie die Pfeiltasten (← →) oder die Navigationstasten (
<<,>>) zum Wechseln der Stationen. - Klicken Sie auf ■ (oder drücken Sie Q), um die Wiedergabe zu stoppen.
- Kopieren Sie eine Stream-URL in die Zwischenablage.
- Klicken Sie auf PASTE unter dem URL-Feld — die URL wird eingefügt und der Stationsname automatisch auf den Hostnamen aktualisiert.
- Klicken Sie auf ▶ START, um die Wiedergabe zu starten.
- Klicken Sie auf 📂 LOAD LOCAL unterhalb des M3U-Playlist-Bereichs.
- Wählen Sie eine
.m3u-,.m3u8- oder.pls-Datei von Ihrem Computer aus. - Die Playlist wird sofort geladen — ohne Internetverbindung.
- Tragen Sie eine Stream-URL direkt in das URL-Textfeld des VFD-Displays ein.
- Klicken Sie auf die Schaltfläche 💾 Speichern neben der Preset-Leiste.
- Geben Sie im Dialogfenster einen Namen für das neue Preset ein. Der Button wird erzeugt und die Konfiguration auf der Festplatte gesichert.
Aktivieren oder deaktivieren Sie die Tastaturshortcuts über das Kontrollkästchen TASTATUR:
| Taste | Aktion |
|---|---|
| ← / → | Vorherige/Nächste Station |
| ↑ / ↓ | Erste/Letzte Station |
| Enter | START-Wiedergabe |
| Q | Stopp (■) |
| P | Pause/Fortsetzen (⏸) |
| TAB | URL im Browser öffnen |
| U | Im Verlauf zurückgehen (⇑) |
| R | Aufnahme umschalten (⏺) |
| 1 / + | Lautstärke erhöhen |
| − | Lautstärke verringern |
| B | Balance nach links |
| N | Balance nach rechts |
| Esc | Tastatursteuerung deaktivieren |
- Verwenden Sie die Timeshift-Schaltflächen zum Zurückspulen/Vorspulen in unterstützten Streams.
- -600 s bis -5 s: Rücklauf-Schaltflächen.
- +5 s bis +600 s: Vorlauf-Schaltflächen.
- LIVE: Zurück zum Live-Rand.
- Klicken Sie auf ⏺ REC, während ein Stream läuft.
- Wählen Sie Ihr bevorzugtes Audioformat (MKV, MP3, AAC, etc.) und den Speicherort.
- Klicken Sie auf ⏹ STOP, um die Aufnahme zu beenden.
Eigene Presets werden in der JSON-Datei sqrtRADIO_presets.json hinterlegt. Beim ersten Start wird diese automatisch mit den Werkseinstellungen (Kultur, Langwelle, HLS etc.) generiert. Alle darauffolgenden Änderungen werden dauerhaft im benutzerspezifischen Konfigurationsordner gesichert:
- Windows:
%APPDATA%\sqrtRADIO - macOS:
~/Library/Application Support/sqrtRADIO - Linux:
~/.config/sqrtRADIOHinweis: Es werden maximal 8 Presets unterstützt. Wird dieses Limit überschritten, greift ein FIFO-Verfahren (First-In, First-Out), bei dem das älteste Preset überschrieben wird.
sqrtRADIO wählt automatisch die Variante mit der höchsten Bitrate aus Master-Wiedergabelisten, um die beste Audioqualität zu gewährleisten (ähnlich wie VLC).
Der Player erkennt DVR-Funktionen automatisch durch:
- Analyse von HLS-Manifesten auf
#EXT-X-PLAYLIST-TYPE:EVENToder#EXT-X-PLAYLIST-TYPE:VODTags. - Überprüfung der Gesamtsegmentdauer (>90 Sekunden zeigt DVR an).
- Fallback zu
ffprobefür Nicht-HLS-Streams.
Endet ein Playlist-Eintrag oder der Inhalt des URL-Felds selbst auf .m3u (nicht .m3u8), ruft tune() _get_m3u() statt _play() auf — die neue Playlist ersetzt die aktuelle, statt als Audiostream abgespielt zu werden. .pls-URLs werden auf dieselbe Weise über _get_pls() verarbeitet, das die INI-Einträge FileN/TitleN parst und dieselbe Playlist-Anzeige wie M3U befüllt. Zusätzliche Direktiven wie #EXTVLCOPT werden beim Auslesen der Stream-URL aus einem Playlist-Eintrag stillschweigend übersprungen.
Nicht-HLS-Streams (Icecast, HTTP MP3, etc.) werden lokal in einem 10-Minuten-Ringpuffer (PCMBuffer) gepuffert, was nahtloses Zurückspulen ohne Netzwerklatenzen ermöglicht.
Streams werden mit vollständiger Bitrate mit FFmpegs -c copy-Option aufgezeichnet (keine erneute Kodierung), um die ursprüngliche Qualität zu bewahren.
MIT-Lizenz – Weitere Informationen finden Sie in der Datei LICENSE.
