A port of TheJoeFin/Trdo — the simple, elegant internet radio player — for Ubuntu 24.04 LTS and GNOME-based Linux desktops.
The original Trdo is a Windows system-tray radio player built with .NET 9 / WinUI 3. This Linux port recreates the same minimal, "car-radio preset" experience using the native GNOME stack.
| Original (Windows) | Linux Port |
|---|---|
| C# / .NET 9 | Python 3.12 |
| WinUI 3 / Windows App SDK | GTK4 + libadwaita |
| WinUIEx (tray) | MPRIS D-Bus (GNOME media controls) |
| MediaPlayer (audio) | GStreamer (playbin3) |
| Microsoft Store | Install script + .desktop entry |
- GNOME media controls — play/pause/skip from the top bar and lock screen via MPRIS
- Background playback — close the window while playing, audio continues
- One-click play/pause — just like pressing a car radio button
- Fast station switching — ~1 second startup via pipeline reuse
- Station search — powered by Radio Browser Info
- Favorite stations — save, reorder, remove
- Now playing metadata — title and artist from ICY/ID3 tags
- Favorite songs — star a playing track to save it
- Volume control — per-app slider with persistence
- Auto-reconnect — watchdog detects dropped streams and recovers
- Glitch-free playback — three-layer buffering architecture (see below)
- Structured logging — diagnostics in
~/.config/trdo/trdo.log
- Ubuntu 24.04 LTS (or any GNOME-based distro with GTK4 + libadwaita)
- Python ≥ 3.10
- GStreamer 1.20+
git clone https://github.com/ntangledbit/trdo-linux.git
cd trdo-linux
sudo bash install.shThe install script will:
- Install system packages:
python3-gi,gir1.2-gtk-4.0,gir1.2-adw-1,gir1.2-gstreamer-1.0, GStreamer plugins - Copy app files to
/opt/trdo - Symlink
trdointo/usr/local/bin - Install the
.desktopfile and app icon
sudo apt install python3-gi python3-gi-cairo python3-requests \
gir1.2-gtk-4.0 gir1.2-adw-1 \
gir1.2-gstreamer-1.0 gir1.2-gst-plugins-base-1.0 \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly gstreamer1.0-libav
chmod +x trdo
./trdosudo bash uninstall.sh- Launch from the Activities menu or
trdoin a terminal - Play/Pause — click the play button or use GNOME's top-bar media controls
- Next/Previous — skip through your saved stations
- Add stations — switch to the Search tab and search by name
- Save a song — click ★ while a track is playing
- Volume — drag the slider on the Now Playing page
- Quit — hamburger menu → Quit (closing the window while playing just hides it)
trdo-linux/
├── trdo # Entry point (executable)
├── trdo_app.py # GTK4/Adw application, window, MPRIS
├── trdo_player.py # GStreamer audio engine + watchdog
├── trdo_radio_api.py # Radio Browser Info API client
├── trdo_storage.py # JSON persistence layer
├── data/
│ └── default_stations.json
├── icons/
│ ├── trdo.svg
│ ├── trdo-playing.svg
│ └── trdo-stopped.svg
├── install.sh
├── uninstall.sh
└── trdo.desktop.in
The player uses a three-layer buffering architecture to eliminate glitches:
Network → [playbin3 preroll] → [16 MB queue2 FIFO] → [400 ms audio sink] → speakers
Layer 1 Layer 2 Layer 3
- Layer 1 — GStreamer preroll: Gates initial playback start (~200 ms). No
FLAG_BUFFERING— the pipeline never pauses during steady-state playback. - Layer 2 — Explicit queue2: 16 MB silent FIFO in a custom audio-sink bin. At 128 kbps, this holds ~13 minutes of audio. Absorbs all network variance without interrupting playback.
- Layer 3 — Audio sink buffer: 400 ms hardware buffer in PulseAudio/PipeWire, providing a final safety margin.
Station switches reuse the existing pipeline (READY → URI → PLAYING) instead of rebuilding from scratch, keeping switch time to ~1 second.
Settings and stations are stored in ~/.config/trdo/:
~/.config/trdo/
├── settings.json # volume, last station, autoplay
├── stations.json # saved stations
├── favorite_songs.json # starred tracks
└── trdo.log # player diagnostics
Tail the log file while Trdo is running:
tail -f ~/.config/trdo/trdo.logFor GStreamer-level debug output:
GST_DEBUG=3 trdoThe Windows version relies on WinUI 3 (XAML), the Windows App SDK tray APIs, and the built-in Windows MediaPlayer. The port maps each to its Linux-native counterpart:
- UI: WinUI 3 XAML → GTK4 + libadwaita (programmatic, no
.uifiles) - Tray: Windows notification area → MPRIS D-Bus service (GNOME media controls)
- Audio: Windows MediaPlayer → GStreamer playbin3 with custom audio-sink bin
- API: Radio Browser Info — identical cross-platform HTTP/JSON
- Storage: Windows app settings → JSON in
~/.config/trdo/
Contributions are welcome. Please open an issue to discuss larger changes before submitting a PR.
MIT — same as the original project.
- Original app by Joe Finney (TheJoeFin)
- Station data by Radio Browser Info