Skip to content

sqrt-ch/sqrtRADIO

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sqrtRADIO

English | Deutsch


M3U/PLS Playlist Player — HLS, Icecast, MP3, and More

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.

Features

  • 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 .m3u file, sqrtRADIO loads it as a new playlist instead of playing it as a stream. .pls entries 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 .pls file 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.

Requirements

  • Python 3.10+
  • FFmpegDownload from ffmpeg.org
  • Python packages: sounddevice, requests (all other dependencies are Python standard library)

Installation

  1. Install FFmpeg

    • macOS: brew install ffmpeg
    • Ubuntu/Debian: sudo apt-get install ffmpeg
    • Windows: Download from ffmpeg.org and add to PATH
  2. Install Python Dependencies

    pip install sounddevice requests
  3. Run sqrtRADIO

    python sqrtRADIO.py

Usage

Basic Playback

  1. Select a preset playlist or load your own M3U file.
  2. Click ▶ START to play the selected station.
  3. Use arrow keys (← →) or navigation buttons (<<, >>) to browse through stations.
  4. Click (or press Q) to stop playback.

Pasting a URL

  1. Copy a stream URL to your clipboard.
  2. Click PASTE under the URL field — the URL is inserted and the STATION name updates to the hostname automatically.
  3. Click ▶ START to play.

Loading a Local Playlist

  1. Click 📂 LOAD LOCAL below the M3U playlist area.
  2. Select a .m3u, .m3u8, or .pls file from your computer.
  3. The playlist is loaded instantly — no internet connection needed.

Managing Presets

  1. Enter or modify a stream URL in the VFD display's URL text box.
  2. Click the 💾 Speichern button next to the presets row.
  3. Enter a custom name for your new preset slot when prompted. Your configuration will automatically save to disk.

Keyboard Controls

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

Timeshift (DVR Streams)

  • 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.

Recording

  1. Click ⏺ REC while a stream is playing.
  2. Choose your preferred audio format (MKV, MP3, AAC, etc.) and save location.
  3. Click ⏹ STOP to end recording.

Technical Details

Preset Persistence & Storage

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/sqrtRADIO Note: A maximum of 8 presets are supported, utilizing a FIFO (First-In, First-Out) queue mechanism once exceeded.

HLS Adaptive Streaming

sqrtRADIO automatically selects the highest-bandwidth variant from master playlists, ensuring the best audio quality (similar to VLC behavior).

DVR Detection

The player automatically detects DVR capabilities by:

  1. Parsing HLS manifests for #EXT-X-PLAYLIST-TYPE:EVENT or #EXT-X-PLAYLIST-TYPE:VOD tags.
  2. Checking total segment duration (>90 seconds indicates DVR).
  3. Falling back to ffprobe for non-HLS streams.

Nested Playlists & PLS Support

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.

Icecast Rewind

Non-HLS streams (Icecast, HTTP MP3, etc.) are buffered locally in a 10-minute ring buffer (PCMBuffer), allowing seamless rewind without network latency.

Recording

Streams are recorded at full bitrate using FFmpeg's -c copy option (no re-encoding), preserving original quality.

License

MIT License – See LICENSE file for details.


sqrtRADIO Screenshot

sqrtRADIO

English | Deutsch


M3U/PLS-Wiedergabelisten Abspieler — HLS, Icecast, MP3 und mehr

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.

Funktionen

  • 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.

Anforderungen

  • Python 3.10+
  • FFmpegHerunterladen von ffmpeg.org
  • Python-Pakete: sounddevice, requests (alle übrigen Abhängigkeiten gehören zur Python-Standardbibliothek)

Installation

  1. FFmpeg installieren

    • macOS: brew install ffmpeg
    • Ubuntu/Debian: sudo apt-get install ffmpeg
    • Windows: Von ffmpeg.org herunterladen und zu PATH hinzufügen
  2. Python-Abhängigkeiten installieren

    pip install sounddevice requests
  3. sqrtRADIO ausführen

    python sqrtRADIO.py

Bedienung

Grundwiedergabe

  1. Wählen Sie eine Wiedergabeliste oder laden Sie Ihre eigene M3U-Datei.
  2. Klicken Sie auf ▶ START, um die gewählte Station abzuspielen.
  3. Verwenden Sie die Pfeiltasten (← →) oder die Navigationstasten (<<, >>) zum Wechseln der Stationen.
  4. Klicken Sie auf (oder drücken Sie Q), um die Wiedergabe zu stoppen.

URL einfügen

  1. Kopieren Sie eine Stream-URL in die Zwischenablage.
  2. Klicken Sie auf PASTE unter dem URL-Feld — die URL wird eingefügt und der Stationsname automatisch auf den Hostnamen aktualisiert.
  3. Klicken Sie auf ▶ START, um die Wiedergabe zu starten.

Lokale Playlist laden

  1. Klicken Sie auf 📂 LOAD LOCAL unterhalb des M3U-Playlist-Bereichs.
  2. Wählen Sie eine .m3u-, .m3u8- oder .pls-Datei von Ihrem Computer aus.
  3. Die Playlist wird sofort geladen — ohne Internetverbindung.

Presets verwalten und speichern

  1. Tragen Sie eine Stream-URL direkt in das URL-Textfeld des VFD-Displays ein.
  2. Klicken Sie auf die Schaltfläche 💾 Speichern neben der Preset-Leiste.
  3. Geben Sie im Dialogfenster einen Namen für das neue Preset ein. Der Button wird erzeugt und die Konfiguration auf der Festplatte gesichert.

Tastatursteuerung

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

Zeitversatz (DVR-Streams)

  • 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.

Aufnahme

  1. Klicken Sie auf ⏺ REC, während ein Stream läuft.
  2. Wählen Sie Ihr bevorzugtes Audioformat (MKV, MP3, AAC, etc.) und den Speicherort.
  3. Klicken Sie auf ⏹ STOP, um die Aufnahme zu beenden.

Technische Details

Voreinstellungen-Persistenz & Speicherort

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/sqrtRADIO Hinweis: 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.

HLS-Adaptive Übertragung

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).

DVR-Erkennung

Der Player erkennt DVR-Funktionen automatisch durch:

  1. Analyse von HLS-Manifesten auf #EXT-X-PLAYLIST-TYPE:EVENT oder #EXT-X-PLAYLIST-TYPE:VOD Tags.
  2. Überprüfung der Gesamtsegmentdauer (>90 Sekunden zeigt DVR an).
  3. Fallback zu ffprobe für Nicht-HLS-Streams.

Verschachtelte Playlists & PLS-Unterstützung

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.

Icecast-Rücklauf

Nicht-HLS-Streams (Icecast, HTTP MP3, etc.) werden lokal in einem 10-Minuten-Ringpuffer (PCMBuffer) gepuffert, was nahtloses Zurückspulen ohne Netzwerklatenzen ermöglicht.

Aufnahme

Streams werden mit vollständiger Bitrate mit FFmpegs -c copy-Option aufgezeichnet (keine erneute Kodierung), um die ursprüngliche Qualität zu bewahren.

Lizenz

MIT-Lizenz – Weitere Informationen finden Sie in der Datei LICENSE.

About

M3U Playlist Radio: Play HLS and Icecast radio stations via a simple m3u text file.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages