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

⌈⌋ ⎇ branch:  streamtuner2


NEWS at [aab52a4d0d]

File NEWS artifact 6b1881193c part of check-in aab52a4d0d



2.1.9 (2015-05-25)
 * Overhaul favicon/banner module, support instant icon display updates,
   simpler cache filenames, rescaling, implicit sanitizing, less coupling.
 * Add radio.net channel.
 * Add di.fm/sky.fm/jazzradio as contrib plugin.
 * Add basic Magnatune channel.
 * Add ListenLive contrib plugin.
 * Add reddit channel plugin, and optional support for converting
   Soundcloud links to streamable addresses.
 * Add WindowsMediaGuide plugin and fix ASX extraction.
 * More Python3 fixes.
 * More forced UTF-8 decoding to speed downloading up.
 * Crash fixes for server search.
 * Fix for stream url conversion for MyOggRadio plugin.
 * Add bitrate filter plugin to apply on all channels.
 * Remove iTunes plugin.
 * Fix Dirble channel fetching, add weighted bitrate+format selection.
 * Add channel homepage title+link in toolbar (like in streamtuner1).
 * More internal simplifications and rewrites, externalized pluginconf.
 * Compact main settings list, introduce SpinButtons for integers.
 * Update documentation, add project links, slim down images.
 * Introduce 0install package using PYZ bundle.

2.1.8 (2015-05-05)
 * New channel plugins for Radionomy.com, Filtermusic.net, Delicast.com.
 * Added Dirble channel again, using new API.
 * Removed iCast plugin. Removed 8tracks plugin.
 * Brought back Xiph XML extraction, and added direct website extraction,
   in addition to JSON cache mode.
 * Add TV list for UbuntuUsers channel.
 * Introduction of User Plugin Manager and channel module updating,
   automatic plugin activation, contrib plugins: PublicRadioFan, GLRP.
 * Change Youtube plugin to use only v3 API henceforth.
 * Minor fixes to action/playlist extraction, add specific JAMJ extractor.
 * Update manual on new channel/feature plugins.
 * Separated config and pluginconf modules.
 * Fixes to contrib/ plugins: compound, file, punkcast.
 * Scroll back to last category on initialization, simplified window
   and state storage.
 * Some Gtk3 fixes, catch invalid favicons while updating columns,
   another fix for search function.
 * Better inline documentation for player configuration, more thorough
   program binary detection. Simplified channel parsing utility code,
   added @use_rx decorator. And a few more internal cleanups.
 * Add new configuration dialog group for Playlist processing.
 * Experimental new package for Arch Linux / pacman.

2.1.7 (2015-04-26)
- Experimental support for drag and drop, which allows playback,
  importing, or exporting stations from/to files.
- Configuration dialog became more clearly arranged by separating
  channels and feature plugins.
- More manual examples on recording configuration added.
- Several enhancements to playlist conversion, support for .desktop
  links, better heuristics, and working url+title extraction.
- All MOD files use generic audio/mod+zip MIME type.
- Use new and distinct /tmp/streamtuner2/ directory for cache+export.
- Implemented hashing for cached m3u/pls files.
- Support "feeds" stream in Jamendo, more complete Ogg Vorbis support
  and JAMJSON extraction instead of using old v2 API.
- Initial startup and application state restoration became more robust,
  active category is tracked more dynamically.
- Some internal simplifications and code cleanup (logging simplified,
  more uikit wrappers for Gtk3, removed outdated PIL workaround,
  cleanup up remnant module descriptions).
- Statusbar is just a plain text label, automatically emptied.
- Disable partial stream refreshing, and threading per --nt flag
  or config option, because Gtk3 support is still flaky. Let gtk_idle
  callbacks run in order through an internal precedence spool.
- Browser invocations corrected.
- Crash in cache search fixed.
- PYZ building now supported by xpm and Packfile for custom adaptions.

2.1.6 (2015-04-13)
 * The action module has been completely restructured. It now supports
   playlist rewriting, better heuristics, XSPF, JSPF, ASX, SMIL formats.
 * Along with that a category playlist export function was bundled, and
   the Save-As dialog reworked.
 * A new SomaFM channel was bundled, and user agent switcher plugin added.
 * Fixes for the bookmarks channel, cache search, plugin lookup code were
   applied.
 * Startup is faster again, but plugins now initialize on selection first.
   Which makes the category association exacter after restarts. 
 * More code cleanup and restructuring, GUI updates, command line flag
   handling. Still a beta release.

2.1.5 (2015-04-05)
- This is a beta release, with lots of cleanups and various bugfixes.
- Adds a self-contained PYZ package, which Python can run directly.
- Now fully utilizes the plugin meta data scheme for default settings,
  discovery, and to reduce internal complexity.
- A new channel plugin for "Radio-Browser.info" has been bundled.
- Another plugin for interfacing with "RadioTray" was introduced, to
  share bookmarks via DBUS once RadioTray implements it.
- Notebook tabs are now on the left per default, and can be rearranged
  directly in the GUI.
- The configuration dialog now indicates the availability of selected
  audio players. Default audio players are now automatically configured
  during the first startup.
- Gtk properties are now utilized more over internal UI state vars.
- The the GtkBuilder UI file is now compressed, the Gtk2 fallback removed.
- The former channel icon PNGs are now embedded.
- Theme configuration was removed.
- Category retrieval became more resilient.
- HTTP timeouts have been added.
- The bookmarks tab, settings window, search dialog, stream inspector/editor
  have been externalized into plugins; yet remain core features.
- The packaging layout has been slightly restructured - to support
  relocatable installations (for PyZIP package).
- Minor fixes to youtube, internet_radio, punkcast, timer and other plugins.
- Help pages have been updated further, as well as CREDITS, README and
  general PACKAGING infos, and most plugin short descriptions.
- The project wiki now contains a more details on plugin APIs.

2.1.4 (2015-03-25)
- Fixed Internet-Radio extraction.
- Added basic TuneIn channel.
- Removed Dirble and MusicGoal channels.
- Fix desktop and packaging infos according to Debian guidelines.
- Switch to fpm/xml for package building.
- Remove bundled requests library.
- Update icon and fix path to application logo.
- Minor documentation updates.

2.1.3 (2014-08-15)
- New plugin for Dirble.com introduced.
- Channel tabs can now be rearranged from notebook top to left side.
- Live365 was fixed again.
- Xiph cache service was fixed, and duplicates are now filtered out.
- Category map storage is now handled by backend instead of channels.
- Shorter Youtube homepage URLs are used, HTTP headers compacted.

2.1.2 (2014-07-31)
- Listing from the renewed Radionomy Shoutcast has been fixed.
- Live365 was disabled.
- New iTunes Radio stations channel (via RoliSoft Radio Playlist API).
- New channel module "iCast.io" as seen in VLC.
- SurfMusic.de is now available in a localized English display.
- Shorter Youtube URLs are now used, Wadsworth constant available.
- MyOggRadio.org API interaction fixed.
- Fixed cache search to copy results before overwriting category.
- Slim new search dialog offers scanning all channels or just current.
- More online music service links have been added.
- Better post-extraction cleanup.

2.1.1 (2014-05-28)
- Added SurfMusik and Youtube plugin channels. Google/DMOZ removed.
- Jamendo viewing now utilizes the v3.0 JSON API for genres/tracks
  and uses cover images instead of favicons.
- A new logo was introduced.
- The reworked configuration dialog now provides editable lists for
  player and recording apps configuration, a more descriptive options
  pane, a better overview for enabled and available plugins (with fresh
  meta comment blocks), and dropdowns instead of text-fields are used.
- Internet-Radio parsing was fixed, a workaround for absent titles
  added. Shoutcast also alternates between DOM and Regex fetching.
- For Xiph browsing a custom caching API was introduced.
- Status bar / download progress display was fixed.
- A history plugin was added. And extension hooks{} support started.
- Some more Python3 fixes applied. Documentation was adapted.

2.1.0 (2014-04-28)
- support for running on Python3 or Python2,
  as well as Gtk3 (PyGI) and Gtk2 (PyGtk with Python2) bindings
- fixed Shoutcast, DMOZ, Live365
- while Jamendo now lists radios only
- removal of basic.ch and tv channels
- include requests+urllib3 in favour of urllib+urllib2
- some manual pages have been updated
- drop PSON and only use plain json module henceforth
- new bundle/ directory, but pyquery/lxml dropped
- colorized debugging output
- uninitialized channels are no longer attached as tabs
- absent liststore references have finally been fixed

2.0.9 (2014-01-05)
- sys.path patch (less py module conflicts) from Stefan Talpalaru
- fixed main_quit signal slot, so window size saving works
- added [new] button in streamedit window
- prepared remaining print syntax for python3 (still needs 2to3 though)
- fix for https://bugzilla.redhat.com/show_bug.cgi?id=655596 array error
- transitioned glade file to gtk.Builder, just a few things broke
- made configuration window resizable
- locked station list columns, no longer resortable (associatation mismatch)
- applied Vincents fixed for Windows action.run and Shoutcast PQ parsing
- live365 parsing restored by patch from Abhisek Sanyal
- fix Pixbuf typecasing in mygtk liststore appending

2.0.8.7 (unreleased)
- Development

2.0.8.5 (unreleased)
- Development

2.0.8.2 (unreleased)
- Bugfixes

2.0.8 (2010-09-03)
- configuration files use prettified json
- fixed double quotation for %pls players and /local/file handling
- (unused) channel .shutdown function introduced (late saving)
- external plugin: basic file browser, no ID3 editing yet
- allow interpolating of %genre and other fields, streamripper wrapper
- fixed pyQuery parsing for latest shoutcast change
  (strangely the regular expressions were still working)

2.0.7 (2010-08-12)
- json cache files are now stored .gz compressed
- xiph channel .format() call fixed into .mime_fmt()
- simplified __init__ and attributes of main window object
- .play() is now a per-channel function
- global_key now accepts multiple keys, updates gtk view
- new musicgoal plugin with radios and podcasts
- silenced channel initialization errors
- double clicking tabs is functioning now (-> channel service homepage)
- shoutcast finally became a real channel plugin
- processing.py pseudo module removed

2.0.6 (2010-07-31)
- mirrored Station>Extensions menu into stream context menu
- creation of .nobackup files in cache/ and icons/ directories
- global_key plugin allows radio switching via keyboard shortcut
- compound channel plugin is new, mixes different source channels
- new external plugin: podspider
- more documentation restructuring
- feature plugins` options are now listed in configuration dialog
- current_channel_gtk()
- added basic package dependencies for .deb archives,
  packaged-in lxml/ removed (lacked etree.so anyway)
- TV plugin for shoutcast video listings
- simpler overriding of stream column titles is now possible
- cleaner .src.tgz package, contrib/ files have been externalized
- minor fix for quicksearch function

2.0.5 (2010-07-26)
- display logic now can extract homepage URLs from station titles
- automated google search for missing station homepages
- kept .m3u files are reused for playing (faster)
- registration code for (stations) extension submenu
- timer plugin for programming broadcast play/recordings, uses kronos
- heuristic update of bookmarks when reloading station lists
- general thread() wrapper function implemented, for worker pool
- simple mygtk wrapper for adding menu entries
- MyOggRadio plugin is now complete, can upload individual favourites
- links plugin, which lists other radio directories in bookmarks tab
- CLI mode implemented
- two PHP wrapper scripts to generate YP.Shoutcast for Streamtuner1
- GUI startup progress window added
- one GtkWarning message fixed
- the Shoutcast channel was plugin-ed out, but remains in the UI file
- multiple additions to and restructuring of the help files, manpage

2.0.4 (2010-07-22)
- PyQuery parsing for InternetRadio.org.uk channel, and adapted PQ
  usage for shoutcast
- utility function http.fix_url extended, common string parsing
  functions strip_tags, mime_fmt are now in channels.GenericChannel
- http module reworked, visual feedback now for GET and AJAX methods,
  and CookieJar was enabled
- channel/tab order can now be configured (instead of tab dragging)
- fixed PyQuery wrapper module, packaged lxml modules in (evades
  extra support for Windows port, native modules will be used on Linux)
- more Gtk.Widget mini help popups in the dialog windows

2.0.3 (2010-07-18)
- new channel plugin: MyOggRadio (an open source directory)
- also Internet-Radio.org.uk channel, but only regex parsing for now
- the quick search box is now in the toolbar, while an all-scanning
  search feature has been implemented in the former dialog
- Shoutcast.com broke regex parsing, the homepage links are gone
- Category updates are now performed in a thread too
- interna: GenericChannel.display() is now .prepare()
- live365 category parsing fixed
- Live365 and Xiph are no longer built-in tabs, can be fully disabled
- fixed disabling search, config, streamedit windows (gtk close event)
- and a few help files were added

2.0.2 (2010-07-13)
- more checks for initializing channel plugins
- gtkrc theming support extended: apply and combobox in config dialog
- PyQuery as new alternative parsing mechanism, as option for shoutcast
- category tree gets loaded on first display of empty channels
- windows port tested, new external project: python+gtk installer bundle
- removal of .pyc bytecode files from generic .deb and .rpm packages
- distribution includes gtkrc theme "MountainDew"
- removed most debug print statements, introduced a config option for it

2.0.1 (2010-07-08)
- new channel plugin: jamendo (just a simple browser for now)
- new channel plugin: basicch (all new, because old scraper nonfunc)
- new channel plugin: punkcast (just a very basic listing)
- fixed shoutcast channel parsing
- new elaborate http.ajax method using braindamaged urllib2
- extremely cool plugin configuration scheme implented w/ GUI controls
- plugins (except code or glade built-in) now deactivatable individually
- preliminary support for application themes
- support for per-channel .play() method
- reenabled audioformat= in play calls
- channeltab doubleclick doesn't work despite hours of fruitless trying
- add "format" to stream edit dialog
- new helper methods: mygtk.bg(), config.get()

2.0.0 (2010-07-05)
- search function implemented, highlights results in current category list
- right click context menu added
- station data inspection/editor added
- auto_save_appstate implemented
- station delete implemented
- clean up of internal application interfaces: new self.channel() instead
  of self.c[self.cc] kludges all around (all traces rm), and new self.row(),
  and some auxiliary windows now have handling code in separate classes
- now real favicons for directory providers are displayed
- removed directory service homepage button (still in menu), donated icon
  to stations instead; double-click on channel tab still resultless
- load_favicon hook (for currently playing station) added
- added channel switching to menu, and submenu view merged into edit
- fixed initialisation of open channel tab (previously only default
  shoutcast was populated by .first_show method)
- made a new logo for 2.0.0 release
- fixed shoutcast category loading

1.9.9-2 (2010-07-01)
- bookmark handling fixed
- pson/json decoding still flaky

1.9.9 (2010-07-01)
- fixed record action
- shoutcast parser redone twice
- rebuilding of TreeView list more robust noew, always in gobject.idle()
- favicon downloading methods implemented, display enabled per default
- live365 is buggy, but usable
- bookmarks still broken

1.9.8 (2010-06-25)
- save-as dialog implemented (export to .m3u, .pls or .xspf)
- download progress bar added
- last selected category and stream entry is remembered in all channel
  tabs now (though the implementation is spread between a separate but
  unused state.json and mygtk.app_state() which stores notext indexes)
- menu edit/copy implemented: saves current stream URL into clipboard
- fixed XDG_CONFIG_HOME use
- code parts have been extracted into separate modules
- the Google stations plugin has been ported from streamtuner1
- packaging of .deb and .rpm archives

1.9.7 (2010-06-20)
- configuration window added
- threading support enabled (uses python 2.6 processing if avail)
- more generic window/state saving
- update_categories() added in menu
- "generic" class for channels has been separated from shoutcast
- new channel module "live365" (without login support)
- bookmarks module has comments now
- new defaults for audio/ogg and other media types
- pseudo-json is now a fallback if python 2.6 module isn't there
- preparations for saner url extraction in action. class
- better doc for mygtk.columns()
- (temp.) faster initial startup by not .load()ing default category

1.9.6 (2010-06-15)
- added xiph.org example implementation, incomplete
- bookmark module basics done
- rowmap defined manually again, instead of in mygtk.

1.9.5 (2010-06-15)
- basic menu added, toolbar style switching
- glade XML file is searched in binary dir
- static classes move to bottom
- forgotten/deleted streams feature added 
- display() filter

1.9.4 (2010-06-14)
- category change
- app_state
- mygtk.column_view() and .column_data() have been merged into
  more general mygtk.columns() - more elaborate, only depends on
  datamap, instead of individual sublists, pixbuf support added
- shoutcast.rowtypes cellmap titles colsizes cellrendr colattrs gone

1.9.3 (2010-06-10)
- thread for http GET (doesn't work)
- app_restore added
- action.record, browse, homepage stream / channel, .reload streams
- .status() shortuct
- dict2list removed (now in .columns_view)
- treeviewcolumns sizes
- simplified form of datamap, less dicts, more lists, reshuffled
- http. wrapper class
- action. with actual os.system() call

1.9.2 (2010-06-10)
- action.play(), .m3u
- pseudojson instead of pickle in Config class
- more doc on top
- icons in column_view() for category trees
- fix for [format] regex in shoutcast
- mime defaults for action. module in conf
. .pls and .m3u methods in action.

1.9.1 (2010-06-10)
- first real shoutcast server scans
- ??
- ..
- cache stream lists + category names

1.9.0 (2010-06-10)
- first GUI implementation with standard glade
- at least shoutcast category names were read