Skip to content

ntangledbit/trdo-linux

Repository files navigation

Trdo for Linux

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.

Technology 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

Features

  • 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

Installation

Requirements

  • Ubuntu 24.04 LTS (or any GNOME-based distro with GTK4 + libadwaita)
  • Python ≥ 3.10
  • GStreamer 1.20+

Quick Install

git clone https://github.com/ntangledbit/trdo-linux.git
cd trdo-linux
sudo bash install.sh

The install script will:

  1. Install system packages: python3-gi, gir1.2-gtk-4.0, gir1.2-adw-1, gir1.2-gstreamer-1.0, GStreamer plugins
  2. Copy app files to /opt/trdo
  3. Symlink trdo into /usr/local/bin
  4. Install the .desktop file and app icon

Run Without Installing

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
./trdo

Uninstall

sudo bash uninstall.sh

Usage

  • Launch from the Activities menu or trdo in 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)

Architecture

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

Audio Engine

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.

Configuration

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

Debugging

Tail the log file while Trdo is running:

tail -f ~/.config/trdo/trdo.log

For GStreamer-level debug output:

GST_DEBUG=3 trdo

Porting Notes

The 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 .ui files)
  • 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/

Contributing

Contributions are welcome. Please open an issue to discuss larger changes before submitting a PR.

License

MIT — same as the original project.

Credits

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors