Internet radio browser GUI for music/video streams from various directory services.

⌈⌋ branch:  streamtuner2

project state


  • No feature freeze yet.
  • But as the application is mostly complete, there are only sporadic releases.


  • The application runs mostly stable. The GUI interfaces are workable.
  • It's supposed to run on Gtk2 and Gtk3. Albeit threading is still an issue.
  • Python3 support is achieved.
  • There haven't been any optimizations regarding memory usage and performance.
  • The current internal API is still somewhat underdocumented.

Current bugs

  • Gtk crashes when switching channel tabs (threading issue)
  • Audio- and list-format support is not very robust / needs better API
  • Not all keyboard shortcuts work
  • Some internal UI state flags remain, that need to be substituted with Gtk callbacks.


  • Treeview layouts and lists are dynamically from datamap[] structure and stream{} dicts.
  • Channel categories are often built-in defaults (can be freshened up however)
  • Config vars and cache data get stored as JSON in ~/.config/streamtuner2/
  • Plugin meta data spec is mostly used now for configuration description, and plugin management.


  • Localization (not actually planned for)
  • Plugin for adding new stations
  • Cron mode for recording timer

Security notes

  • FAULTY DATA: Directory scrapers use partially complex regular expressions - which is probably not a security risk, but can lead to inexact decoding. Albeit HTML entitiy cleanup and constraints are in place. Charset fixups are done on a case-by-case basis. Doesn't help for Xiph however (already receiving garbage there). As for fragile, some DOM/PyQuery extraction targets are less exact even.
  • MEDIUM: integrity checking for .pls / .m3u references and files is only done on conversion. (Set audio players to use %xspf for maximum filtering.)
  • HIGH RISK: no verification of downloaded favicon image files (ico/png), as they are passed to gtk.gdk.Pixbuf (OTOH data pre-filtered by Google)
  • MEDIUM: audio players / decoders are easily affected by buffer overflows from corrupt mp3/stream data. However nothing we can preassert here, streamtuner2 just passes them on.