trunk (unreleased)
 * Update available instances (default selection from current number of users)
 * Add record_helper.sh from axelhahn
 * adapt for renamed pluginconf properties
 * pluginconf 0.8
 * adapt to modularized pluginconf
 * also create CACHEDIR.TAG for data subdirs
 * Add developer API support for shoutcast.
 * add ajax station url fetching mode

2.2.2 (2022-02-22)
 * Release as 2.2.2
 * fix pixmap path
 * py2|py3 dependencies for packages
 * Also replace radionomy with streema in manual.
 * Swap out radionomy for streema in standard channels
 * update online HTML help
 * Radionomy is deprecated / mostly broken.
 * enable per default
 * disable station inflation * 2
 * document contrib channels, mor disabling
 * row[favicon] should be row[img]
 * Add podcast option
 * rcast: updated for current HTML
 * filtermusic: update for current station list HTML, add favicons + homepages
 * Migrate to JSON api
 * remove docblock, reinstate max_streams for loop.
 * update selectors for extraction
 * updated key mapping
 * update regex extraction fallback
 * Extract JSON blob from __NEXT_DATA__ script section
 * temporary workaround: topRadioStations,
   still need to discover original list
 * Simplify config description to avoid `,` commas paired with `|` pipe separator
   (pluginconf regex is more relaxed where ST2 would strictly only allow either)
 * Update for changed itemtype= url (https)
 * Implement jamendo APIs new `download_allowed` flags (as simple state icons
   here - purely visual, not actually affecting download button / not even sure
   if streamripper works on all entry types).
 * Update for recent change, but also implement JSON extraction while at it.
 * Limit spaces `# {0,3}` in plugin comment blocks before field: name
 * Reimplement combobox.parse_options for builtin/unprocessed record_flags,
   also make quicksearch not expand vertically anymore for Gtk3.
 * Set normal_bg="", and let pygtk yield warnings again
 * Update configwin for select:{} being preparsed by pluginconf now
 * Updated to 0.7.3
 * Add uikit.get_bg_color() for TreeView search, but keep #ffffff for Gtk2
 * try dual-dependencies on python2 & 3
 * Fix `format_exc(e)` itself causing an exception,
   and add explanation in `pq` wrapper which was supposed to mask import errors.
 * Cover ImportError with custom explanation
 * select: is now preparsed in pluginconf (but configwin/combobox expected
   tuple-list instead of dict till now; might need further changes)
 * updated html dump
 * peertube+youtube detection
 * Update to pluginconf 0.7.0 - more independent fallback functions, fix `id`
   tuple (again?!)
 * Fix some links, add forgotten reddit help page.
 * refine dependency list
 * safeguard wiki/links retrieval
 * Add more detailed user-agent string, introduce conf.version (from pmd)
 * Remove *.js remnants again from help/html/
 * Remove more stale links
 * Remove radioreddit, update some of the categories, and implement full
   subreddit extraction from wiki page.
 * Introduce wiki/links source for according bookmarks category.
 * Bug was from wget´s --local-encoding (select:/Combobox option)
 * Fix bug (too late to reproduce) for bool option being applied to ComboBoxText
   in record_flags/configwin
 * Apply absolute path for icon pixmap
 * If enabling https/certifi doesn't seem to work, just suppress ssl warnings.
 * Add notes on deprecations.
 * Adapt some links between configuration docs
 * Comment about RadioTray-Lite (no specific code support however)
 * Make `web` fetch mode the default (despite degraded beta interface)
 * Don't enable MyOggRadio channel per default for now.
 * Snap build option introduced (probably not going to be used for regular
   distribution, as the resulting package is exorbitantly large)
 * Fetch mode option removed for filtermusic
 * publicradiofan: strip `/cgibin/wrap.pl…` from some listings
 * magnatune: radios are gone?
 * peertube use correct /search/videos api for searches
 * Minor Python 3 fixes (syntax and str.decode)
 * Documentation typos fixed and itemized more config options for some plugins.
 * Apply more `self.status(i / pages)` progressbar calls for some channels.
 * ui change title bar: use gtk.STOCK_DIRECTORY as fallback when no png: icon
   is present (bookmarks channel)
 * Tuner2 is gone as well.
 * Update documentation (and html/ version) to reflect plugin changes and
   deprecations.
 * <b style="color:red">new channel: peertube</b>.
   <span style="color:#772233">Deprecated plugin: youtube</span>
 * Adapt yelp pages to plugin deprecations (dirble, streamlicensing, tuner2,
   etc.) and liveradio now being standard channel.
 * Support for LiveRadio.UK (in addition to .IE)
 * Add binary JPEG detection \xFF\xD8\xFF magic bytes.
 * Add .click() counting callback.
 * Utilize PyQuery .make_links_absolute(), to shorten img src extraction.
 * Remove dirble plugin.
 * Dirble is not coming back.
 * Format exceptions log.() calls
 * Add channel icon above title/link in toolbar.
 * Add new radio-browser icon.
 * radiobrowser: Initial transition to new Rust API and new server names.
   Added more configuration options, such as minimum count of stations per
   category (to hide fringe tags).
 * Fix integer handling in config dialog (once more).
   See also: ticket #4163057c37
 * Elevate liveradio.ie channel to default plugin.
   Introduce support for PyQuery extraction (HTML5 microdata).
 * temporary fix for MyOggRadio being offline.
 * radionet updated to extract from horrendous new html pages. Perhaps
   switching to extracting just the JSON blob later on. urn: resolution
   remains unchanged.
 * Update radiolist plugin for new wordpress site; now uses genre categories
   instead of countries.
 * Xiph simplified duplicate filter
 * updated SomeFM extraction and default stream list
 * filtermusic: XML blob is gone, just web extraction now.
 * Listenlive.eu is gone as well.
 * Add pq.find() and log.ERR to `pq` wrapper module.
 * Move and delete delicast/streamlicensing channels.
 * Delicast and Streamlicensing went offline.
 * bump version for radionet plugin
 * Fix for radionet station/player page change `"streamUrl":` to `"streams":[{"url":`
 * Add duplicate filter for Xiph.
 * Fix for new url prefix in station list.
 * Adapt Xiph plugin for BETA/dir-test.xoph.org rollout. It's fairly terrible:
   homepages gone, bitrate unavailable, case-sensitive category segregration.
   On the upside: direct streaming server urls.
   The 'cache' mode is likely broken soon, since the experimental JSON API is
   gone.
   For now using `.title()` on /genre/{} search. Adapted guess_format to
   recognize AAC. Subtitle is used in lieu of On Air: text for playing=
 * Fix string-remnant option type error (conf.max_streams comparison)
   From ticket @4163057c375e
 * Dead-end update for radiolist.net channel (only titles+homepages now).
 * fix for runtime error (dictionary changed size during iteration) on plugin
   alias: detection
 * Add status messages for HTTP error responses
 * vTuner: minor fix from stream_update regex
 * streema: fix url regex (now alphanumeric titles) and urn_resolve patterns for new player layout
 * Switched radionet plugin to resolve_urn() and speedier <div>-grep loop.
 * Crude fix for new station lookup. Regex still has horrible backtracking.
   (Should use resolve_urn rather than rnjs playlist workaround.)
 * Switch to XDG_CACHE_HOME/.cache (because that's what the cache files are,
   not really user data). More consistently use new storage path throughout
   core and plugins (favicon+cachereset).
 * Transitional .cache/XDG_DATA_HOME support (by symlinking from .config dir)
 * Remove 0install support.
 * Fix "play" setting detection / remove NotImplementedErr
 * 2.2.1
 * Add DBUS play_url() support with `play` option.

2.2.1 (2018-12-31)
 * Release as 2.2.1
 * Fix dict error for new categories.
 * More mapping options in Radiotray hook.
 * Optional toolbar button for search dialog.
 * Allow for subcategories in bookmarks.
 * Added crude support for binding internal calls `object.func()` to buttons.
 * Add .reload_bookmarks for RT-NG
 * shoutcast: reenable referer sending
 * Add debug/logging to plugin dependency checks.
 * Support for RT-NG direct bookmarks.json saving.
 * Fix cmd= parameter handling.
 * Preliminary support for Radiotray-NG
 * Add shoutcast_format=pls/m3u/xpsf option
 * Update fetching to use new //directory.shoutcast.com/ base url.
   Remove obsolete catmap checking. Category extraction still functional.
   ToDo: support playlist format alternatives (pls/m3u/xspf)..
 * Disable man page compression, as that left Yelp files inaccessible
 * state: obsolete
 * Update Firefox UA
 * Fix missing os. import for find_executable fallback.
 * rm debugging output
 * Update delicast plugin for new q: url scheme
 * Fix radiolist.net current page layout extraction
   (some countries empty now, just webplayers for some pages)
 * Change default streamripper user agent to 'iTunes 12.5/Gecko/SR'
 * Implement new commandline parsing options, kxrs` cmdline_split as found on SO.
   And configurable simple quote (but still enabled for conf.windows by default).
 * Jamendo radios are not available; prepared to use API however,
   in case they're relocated..
 * OggIcon plugin was misplaced
 * Fix orgi action.run reference; implemented .quote override
 * Fix/merge popen and shell variant
 * Add a shell version, new flags; some more docs.
 * <b>new plugin: st2subprocess</b>: Alternative process start
   (player/recording app) methods: subprocess.*, or exec/spawn, and win32 api
   methods.
 * Fix undefined headers={} / miscombined .update() call
 * Document required option.
 * Change default streamripper user agent.
 * delicast: updated for new radio listing format.
 * Update documentation, plan on making liveradio a default plugin.
 * Fix extraction for reordered streema attribute values.
 * Update man page with more available cmdline -flags
 * Rewrap »recording apps« table in configwin in ScrolledWindow again;
   reduce spacing between tables, add space before placeholder info text.
 * ... and also bump version
 * Reuse mime_guess+list_guess functions from action.heuristic_funcs
 * Collect audio format form URL guessing into new class heuristic_funcs
 * Enable search with post/json=1 and seperating token from other params{}
 * Support json= POST requests.
 * Add dirble search (but keep disabled: error "504 not allowed").
   Reintroduce pagination (slower, but with progress bar now).
   Add "Popular" and "Recent" categories.
   Reenable thumbnail fetching rather than plain favicons.
 * Relabel record option tabs to options/meta/network; regroup flags roughly.
   Add more options for wget and youtube-dl.
 * Remove verbose config: option, reclassify some record tool options.
 * Add notebook tabs for recordflags plugin. Instead of filtering them,
   distribute options into notebook tabs "_cfg", "_extra", or "_verbose".
 * Rename `_add` to `_pack`. Support opt= parameter to allow said `pack_*`
   function to operate on option flags (e.g. `category:` to target widget).
 * Fix verbose/extra merging, `-d` option for directory.
 * Fix manual wording
 * Add stub parameter -w (used by pydoc)
 * Document more interna of radio.net extraction
 * document recent channel/feature plugins
 * Minor fix for extraction regexp (http: prefix to station urls).
 * Shorten format comparison in postprocess_filter, remove original *gtkrc* stock
   item binding.
 * New plugin: Vorbis and Opus icons for OGG streams
 * Move -verbose flag into category:verbose.
 * Add -V cmdline arg.
 * Document channel website behaviour / internal playlist generation urls.
   Reuse global conf.max_streams (as orientation for no of pages to fetch).
 * Simplify best_url() dict generation, typecasting, add more comments on
   channel webpage.
 * Add version and -V flags.
 * <b style="color:red">new plugin: streamlicensing</b>
 * <b style="color:red">new plugin: radiolist.net</b>
 * Use bold tags for config descriptions instead of Unicode workaround.
   Group flags by category: basic, extra, verbose to filter out uneeded ones.
 * Support for markup in checkbox config options.
 * Added pip -U for mutagen; typo fixes.
 * Enable record options getting applied. Added wget and more fPls options.
   Separate out row,*k,**kw params from overriden action.record() call.
   Simplify and rearrange gtk callbacks.
 * <b>new plugin: recording options</b> which hijacks the record button,
   provides streamripper/fPls/youtube-dl specific command-line flags in a GUI.
 * More special case handling on Windows: file encoding, backslashes, url quoting
 * Add `urlquote`
 * Add osxpkg; though unused
 * Use sys.encoding for os.system calls on Windows
 * failed attempt to make config tables resizeable
 * timer: Test for .queue() result before setting statusbar := "Timer saved"
 * Check for windows-style paths in specbuttons file lookup
 * Fix `links` plugin format: attribute; make it understood by channel.play()
   that a homepage-only row triggers the web browser.
 * Introduce FeaturePlugin as new base class for channels and all other plugins.
   Pre-defines the meta, module attributes and calls init2().
 * Detect more absent variables/login, introduce UI delay on submission.
 * Catch unset time prior queueing. Use new FeaturePlugin class.
 * Default background color for channel.warn() calls.
 * Set `no-show-all` for statusbar_img to remain hidden on window init.
 * Introduce statusbar_img and GenericChannel.warn() function; albeit it allows
   any stock icon to be used. (May introduce a generalized background/foreground
   color wrapping.)
 * Support for #depends: and #breaks:, and optionally bin:… and python:… checks.
 * Guard empty streams["common"] dict.
 * Fix old module names.
 * Fix alternative checking with individual .cmp() ordering
 * Remove full config folder for uninstall.cmd
 * Try/catch abent cache/ or icons/ folders in ~/.config/streamtuner2/
 * Fix typo in default config save/load filename.
 * Prevent .row() - row["url"]/urn_resolve from crashing for homepage-only
   entries (from e.g. links channel).
 * Update to #pack: specified of channels/*.py
 * update 0install feed

2.2.0 (2016-12-31)
 * Release as 2.2.0 (mostly stable)
 * Updated help.chm, whitespace fixed, new theme download dir back.
 * Fetch meta["title"] instead of ["id"] for About dialog
 * Apply new options right when installing plugins.
 * Option `file_browser_converttourl`
 * bump version, pluginconf 0.6.5
 * Support alternative lists for #depends: fields, allow #alias: names,
   and supply `python` builtin for pluginconf.dependency() checker.
 * Fix a few typos.
 * Simplify virtual dependencies with new pluginconf.dependency(add=) param
 * set bitrate to integer 0 always ("n/a" won't work)
 * Remove stale comment, fix whitespace issue
 * Implement search function for I-R,
   fix DOM extraction method.
 * Use file:/// urls again. Escape backslashes for Windows now.
 * Exempt `%` from Win quoting.
 * User standard pluginconf.dependency() for themes filtering.
 * Introduce `depends:` field for themes as well (no version support, just
   basenames for linux/windows/gtk2/gtk3)
 * replace backslashes for VLC on `not conf.windows`
 * Clear up .so files completely on Linux if failed to install.
 * Make record-stop button a distributed plugin.
 * Prevent crash on absent url:/title: field
 * Extra buttons sorted by icon name. -- Rocus
 * Moved backslash conversion and .load() override back into file browser plugin.
 * Temporary workaround for file browser plugin to avoid reloading.
 * Unified the definitions for Make-Shortcut in @tasks.
   Moved the Python 2.7.13 GUID to $Python GUID, since it is used in regkey and
   Check-Pythoninstall.
   For the uninstall dismissed the batch variable %UsrFolder%, since it was
   used only once and can be derived from %installFolder%. This had also to be
   corrected in the uninstall script generation in install_python_gtk.ps1.
   In Resetprefs.cmd I changed the text to reflect that also the downloaded Gtk
   themes would be deleted.
   In uninstall.cmd I changed the rd command for the themes folder to use the
   correct rd syntax.
 * Guard non-writeable gtk_dir / extra statusbar info.
 * Fix missing url: plugin meta.
   Display bitrate and length.
   Fix more mutagen extraction faults.
 * Workaround for file:/// paths on windows with mixed driver letters and
   backslashes.
 * <b style="color:red">New plugin: rcast</b>
 * Bump version
 * Minor fixes to Win installer/uninstall, regarding background color, and
   streamripper detection.
 * os.access(gtk_dir, os.W_OK) in installhandler() not working on Windows (10).
   Incorrectly returns true for ProgramFiles paths, thus dll copying failed.
   Finally more cleanup code to remove the zip file, as well as dll - after
   successful extraction.
   → clear_theme() and clear_dll() are the new corresponding functions.
 * Add more .progress() indication
 * More details to overview, extract some flags, add dirname.
   List feature plugins in separate table.
 * Remove obsolete windows theme plugin.
 * Set Frequence3 as new default bookmark (curb the finder song)
 * new plugin: script stations, for single-station extractiong/user scripts
 * Adapt urn_resolve() invocation. Most handlers update the dict in place. A
   few will return a new row however. (This can be utilized to return a copy,
   instead of changing station entries → menat for user "script stations" plugin.)
 * streema: fix search using right parameter (search= instead of cat=)
 * fix .save_formats reference for file dialog
 * Fix path delimiter (it's probably ";" on Windows, blimey if only it was
   documented somewhere)
 * Fix popen(`locate`) exception.
 * Reverted all `module = __name__` assignments, because that was carrying the
   module over, not the base classname.
   Added #extraction-method: meta information to channel plugins.
 * <b style="color:red">new plugin: streema</b>
 * Fix gtk.rc_reset_styles
 * Change priority from obsolete to outdated
 * <b>new plugin: theme installer</b> for Gtk2 and Windows;
   fixed for support of JSON format; gtk_reset_styles -- Oliver
 * Support file open dialog
 * Update manual .chm version
 * Use $t.found
 * Colorize statusbar hint about config reset / save.
 * Oliver: fixed the $kwargs/$args→$iargs issue and colors
 * Document prefstore and cachereset plugins.
 * Switch order of load_config() widget checks: on Windows the spinbutton may
   have a different parent
 * safeguard absent config option
 * Undo __name__ shortcut, because it carries the package name as well
 * Fix $kwargs for PS2.0
 * Suppress ANSI codes for windows cmd
 * Ad iheartadio to links list
 * Make timer warning background orange
 * New plugin: cache reset (temp m3u/pls files, favicons, and channel.json files)
 * Fix `module = __name__` setting. (The .module attribute is still not
   avoidable, used too widely in GenericChannel etc.)
 * Undo statusbar clearing for .play() action;
   introduce markup support for status() messages.
 * Add statusbar message when converting
 * <b style=color:red>New plugin: vtuner2</b>
 * Use `module = __name__` consistently for all plugins
 * <b>New plugin: prefstore</b> and updated .win.pack+resetprefs.cmd
 * Better window presence check for taskkill
 * Remove $optionalInstall check (now in $task rule)
 * Check for "theme" key to exist in conf.*
 * Updated comment, more correct regex (albeit it's too strict in comparison to
   the real date/time extraction method now)
 * More typos fixed, updated html
 * New Windows install/uninstall versions.
 * Support for %% escaping.
 * Typo fix and deleting old html pages exportcat/extending/live365
 * Fix incorrect timespec format warning
 * Fix file copying.
 * Bundle librezlooks.dll for default Windows PyGtk install.
 * Bundle Rezlooks-dark theme for Windows.
 * Merged file type descriptions into single help page.
 * Manual slightly restructured, icons for plugins added back in.
 * minor updates
 * lsplugins: export {png} to help/img/
 * Fix regex groups for find_player_win path quoting
 * Removed plugin option background colors.
 * Introduce Gtk theme switching again.
 * Prevent crash on absent opt["select"] field.
 * Mirror manual changes into HTML pages.
 * Use new logo in manual, merge introduction into first help section.
 * Fix heaps of typos (as reported by Oliver).
 * Updated install/uninstall scripts, py-requests path version-independent.
 * timer: warning for invalid dates.
 * Fixed VLC default path (Oliver), added quoting regexp.
 * Fix help.chm lookup and default Windows paths.
 * Minor changes to winstaller script and default package content.
 * Expanded the manual on the search function, added more gui/key markup.
 * updated windows installer scripts
 * Introduce some application presets for Windows.
 * Added more icons for plugins and config options in manual.
 * Shortened installer scripts.
 * New windows installer files.
 * List windows apps specifically.
 * Add uninstall.cmd / minor changes to win install scripts.
 * Merged in new changes, made some defaults into script options.
   New funcs: Display-Logo, Warn-NonElevated, Ask-First, Console-MaxHeight,
   Create-UninstallScript, Any-Key, Check-Package. Some colorization fixes.
 * Revert yelp-"fixes", as adding required &lt;section&gt;s actually broke the layout.
 * Missing Yelp/jQuery files.
 * A few more prettifications and fixes after testing; moved all checks into functions+$tasks.
 * Combine path checks into main ForEach loop. Make-Shortcut() and
   Rewrite-Startscript() functions to embed those as $tasks too.
 * More detailed Win installer scripts, as provided by Oliver. Plus *.ico file
   for packaging.
 * Support .QTL output format
 * <b style="color:red">new plugin: liveradio.ie</b>
 * Fixed category assembly (last entries for Urban were missing)
 * Fixed a few mallard section errors, added reddit details and liveradio.io to
   contrib list.
 * Win install script: rewritten url/$files array to be more task-oriented.
 * bump version to push status:
 * -rc1
 * Combine relative and local path searches for help pages / or chm lookup.
 * Document Dirble plugin status indicators
 * Normalize all broken plugins with status: broken, and priority: obsolete
 * Fix UTF-8 BOM, SecPolicy for .BAT, and MSI registration for silent windows
   installers.
 * Make *.pls default again for exportcat.
 * Updated CHM for next release.
 * Pack help.chm into PYZ package.
 * Add CRLF line endings to Win post-setup scripts.
 * Fix priority/status: obsolete check.
 * Use web online manual as fallback if /usr/share/docs/streamtuner/help* absent.
 * Remove WindowsMedia from docs.
 * Rename wmplayer example.
 * Filter "status: obsolete" plugins.
 * Fix .chm help invocation
 * Removed: windowsmediaguide plugin
 * Clean up some commands for Win installer.
 * Install helpers (PowerShell) for .exe package, which install Python+Gtk after ST2.
 * Add windows CHM help file (only for .exe build at the moment)
 * Update some feature plugin docs.
 * Workaround plugin for RadioSure multi-URL entries.
 * action: optionalize quoting for BSD/Linux if plain http:// url without
   special chars. And fix regex to properly caret-escape + quote for Windows.
 * Adapt GenericChannel to use state icon for multi-URL stations.
   Fix RadioSure slightly to use spaces instead of TABs for `url` lists.
 * dirble: Fix unexpected Null/None for content_type and bitrate stream[] values.
 * exportcat: Strip non-filename characters (slash) from genre prefix.
 * Custom .quote() cmd argument escaping for windows.
 * Fixed file open "rt" mode.
 * Fix binary file open mode (CRLF corruption on Windows)
 * Strip carriage return from plugin meta block, which causes field reading to
   fail on Windows.
   And use `empty_pixbuf` as fallback for uikit.pixbuf() in case the content
   isn't valid base64 still.
 * Add Windows support (taskkill instead of pkill)
 * Move reddit into distributed plugins, add some midi subreddits.
 * Shorten plugins with new init2() callback.
 * Remove last remaining `newstation_cancel` signal reference
 * Update feature plugin cross references
 * Ensure streamedit picks up all changes, and populates fields even if absent
   in original row{}
 * Update HTML manual
 * Apply unhtml() after resolve_urn() lookup.
 * Fix hidden `conf.cmd` lookup
 * Remove newstation_ok/_cancel signal symbols.
 * Alternate "rt" and "r" gzopen file flag (the "t" is an addition of Python3
   gzip, and failed with Python2 on Windows)
 * Fix misnamed row{} reference.
 * Add unichr() function alias for Python3.
 * Use subprocess.list2cmdline() for Windows, and pipes.quote() for BSD/Linux command execution.
 * Make action.cmd() more explicit again.
   Introduce cmd= override flag for action.run_fmt_url().
   So that specbuttons can use it instead of just interpol().
   Thus the urn:/mime handlers will engage as well.
 * Document row placeholders, such as %title or $playing
 * Implement a status message for URN: resolving, shorten code back (- row[]
   object gets implicitly updated.)
 * Less debug messages for reciva.resolve_urn
 * Show player config screenshot also in config_apps/placeholder page.
 * Implement new .resolve_urn() hook (replacing .row() override),
   which is added automatically now in ChannelPlugin init.
 * Also perform an action.resolve_urn() right when accessing a row. Thus the
   stremaing lsits get updated on any .row() acccess (= now centrally covered).
 * Implement resolve_urn() and handlers to look up "urn:xxx:iii" stream urls
   pripr playback. (Currently just used by reciva and delicast. Now allows to
   remove channel.row() override.)
 * Keep some notes about how to specify application paths on Windows.
 * More specific command argument quoting for Windows.
 * Reciva: add search function
 * Undo extra os.system("start \"%s\"") quotes for Windows.
 * Contrib plugin: show `extra` column in bookmarks (origin channel).
   Changed bookmark.add() to add it only if field missing.
 * Reciva: added a more readable log.ERR() message for empty results.
 * Added login capability.
 * Python3 compatibility: can't use len() on TreeModelRow (Gtk3 doesn't return
   ListStore row). So use simpler but less exact try/except block to probe for
   our dict-ListStore and its pixbuf column.
 * Slim down comment (too lengthy contents break gtk tooltip)
 * Add value unserialization for plugin config `type: array/list` using
   format "1,2,3|4,5,6|..." and `dict` type with "1 => 2, 3 => 4, ..."
 * Build `new_station` dialog manually.
 * Document house-mixes plugin.
 * Add link to RadioDroid.
 * Prepare simpler new_station dialog.
 * Update specbuttons help pages.
 * radio-browser.info: support for submitting stations
 * bookmarks: save origin channel in `extra` field. (It's mostly unused, except
   for the Jamendo and timer plugins.)
 * Updated HTML version of help/
 * bump minor versions
 * Enable `list`/`array`/`table` config schemes in addition to `dict`.
   Currently unused, just added because it's little more code.
   No custom value="x,x,x|y,y,y" parser yet. Not for `dict` either, as
   it's only used by specbuttons with a predefined list.
 * Fix add_default=False logic.
 * Rename to "Spec buttons", use new {type:dict} config descriptor.
 * Update config_play/_record and their TreeViews for the slimmer ListStore
   without row[2] `editable` bool, and the more generic uikit.liststore_edit
   callback (still requires lambda handlers for column and liststore as
   user_data).
 * Move liststore_edit() and app_bin_check() from configwin. to uikit.
   Allow ListStore for config_play/_record/_specbuttons without `editable` row [2],
   which is now a property of the CellRenderers (instead of a cell-attribute).
   Specialized uikit.config_treeview() builds a custom two-column TreeView now.
 * Introduce `dict` configuration type, prepare TreeView in uikit (similar to
   record/play config table).
 * Cleaner specbuttons plugin, add support for placeholders in button commands.
   Add documentation and some config ideas.
 * action: Allow %url %title placeholders also with $ prefix.
   Also reuse interpolate() function for specbuttons and without default %pls.
 * <b style="color:red">new plugin: specbuttons</b> allows to define mini
   toolbar buttons to control applications (audio settings, mute/volume,
   start/kill players or other apps).
   Has been externalized as plugin. The UI features are built into gtk3.xml
   <img src="raw/9b0aa4e3a892b8a6e9c3174942367e265575369c?m=image/png" width=170 height=90 align=bottom alt="specbuttons">
 * Minor text fixes
 * Set "instant activation" option background yellow instead of orange.
 * -
 * Remove default specbuttons{} entry.
 * Shorten "house-mixes" title.
 * Allow plugin # config: bags only with <> or {} as delimiters, to support
   markup description/label.
 * Move action/playback handlers to contrib/cmdline/
 * Make specbuttons smaller, lookup image names (using `locate` - should be
   moved to configwin saving callback, as it's slow on startup otherwise)
 * Prepare specbuttons addin (small user-defined application control interface,
   adds to the main toolbar)
 * Smaller icon for housemixes plugin
 * Mini plugin to set current working directory on startup.
 * housemixes: set listformat to 'href' instead of pls
 * Fixed status updates for scanning 1-9 pages (still using conf.max_streams),
   sum up favorites/downloads/likes for overview.
 * Removed stray `print` statement
 * Fix statusbar #257: minor unicode fixes
   (wasn't showing up due to str/unicode in Py2, imported compat.unicode for Py3 now)
 * Fix HTML assembling (<body>.+?</body> cleanup for PyQuery to see all entries).
 * New channel <b style="color:red">housemixes.com</b> added.
 * Minor text fixes.
   Compacted "configuration" back into features topic.
 * Generates a "common-repo.json" list from specified files in a fossil
   repository. (Used with a glob param like "/repo.json/REPO/files/*.py" to
   slice out interesting meta information.)
   primary origin: http://fossil.include-once.org/fossil-skins/wiki/features
 * Prepare for crontab mode
 * Stop vTuner page fetching depending on &iCurrPage=+1 presence.
 * Minor text fixes
 * Fetch channels per API search first, add playlists afterwards.
 * Remove di.fm help page
 * removed Live365 help page
 * di.fm/sky.fm/jazzradio removed, no longer support direct streams
   (direct access won't work unless audio players also fake a browser user-agent)
 * Adapted extraction regex slightly.
 * Some types and pluginmanager2 notes (user-local versions vs. sys-wide plugins).
 * Updated help pages, radiobrowser.info summary
 * Removed <s>Live365</s>
 * (no comment)
 * Reword radiobrowser plugin comment.
 * Live365 is no more.
 * Default internetradio_max_pages=5 in the config. (Last report indicated it
   didn't get picked up. And it's a default plugin anyway.)
 * Disable SSL verification for UbuntuUsers Wiki.
 * Remove stray print statement
 * Fix SpinButton() initialization for Gtk3
 * Slight changes to extraction regex (`https` links mostly, and title-icon is just text now).
 * Radionomy changed station logo URLs. → Adapted to load rescaled 32x32 favicons again.
 * Minor documentation updates, add vTuner/RadioSure/Receiva in contrib plugin list.
 * Disable logging for google_homepage
 * Fix google_homepage regex, filter out tunein+streema urls.
 * List Symbola/Unifont as soft dependency
 * Introduce markdown links for plugin list generator
 * Update description for vTuner.
 * fix comment
 * Refetch ZIP/CSV only once per day, and extract each category from CSV separately.
 * Update UbuntuUsers wiki raw export URLs.
 * Group some categories, add description.
 * <b style="color:red">new RadioSure plugin</b>
 * <b style="color:red">New plugin for Reciva</b>
 * Generate static plugin list for fossil wiki.
 * Updated default categories, new sorting options.
 * separate comment about "buffy" mode
 * <b style="color:red">new vTuner plugin</a>
 * Configurable number of maximum result pages for RadioTime API.
 * Support multiple page requests (needs rework).
 * Add links to additional channel modules
 * Example config for MPD/MPC playback.
 * Introduce "New station..." menu entry.
   (via streamedit / non-functional on first invocation / needs custom simpler UI and implementation)
 * Fix `self.main` reference
 * Needs proper signal disconnecting (overlaps with standard record function).
 * Planning on JIT record function (streamripper in background).
 * Register config options.
 * Alternatively kill fPls
 * Reintroduces STOP button for killing streamripper.
 * Support fIcy/fPls for recording with time range/duration.
 * Add dependency.
 * Readd support for timer record durations 01:00-02:00, streamripper only.
 * Permit "Any" or "All" in time specifications (for all weekdays).
 * Preliminary fix for recent action.play/record hook changes.
 * Python3 fixes (use `log.XYZ` instead of `print` statement).
 * Reenable logging for `timer` module (seems non-functional ATM).
 * Fix POST requests to use data= instead of params=,
   else would turn into GET-style parameters.
   Add extra debugging (commented out).
 * Fix https:// URL prefix, to avoid extraneous redirects.
   Add referer=1, ajax=1 to all GET/POST requests.
   More readable extraction (rx/pq) callback.
 * Add missing pages to HTML manual version.
 * Link separate pages in feature plugin list.
 * Remove some "topic" links, as the Mallard breadcrumbs became overbearing.
 * Rewrite channel docs to use descriptive lists primarily.
   Add contrib_channels and _feature summary.
   Remove exportcat (now in contrib_feature).
 * Minor formulation fix.
 * Don't keep converter Soundcloud streaming URLs (access token time out after
   an hour or something).
 * Move broken plugins into disabled/ folder.
 * Stub debugging plugin.
 * Update sha1whateverchecksum for 0install.

2.1.9 (2015-05-26)
 * Release as 2.1.9 (semi-stable).
 * Update html manual.
 * Allow api: to be "python" or "streamtuner2"
 * Disable window tilte updating per default again.
 * Fix row[`url`] reference.
 * Update for new action.play() signature,
   scale down banner images.
 * Fix action.browser() to use only row{}, not pass url= argument.
   Native JAMJSON extractor now tests for ["tracks"] or uses plain ["results"] list.
 * Fix simplified regex to stop before }}} for URL extraction.
 * Fix unqualified icon_dir reference.
 * Add missing quotes for streamripper default option.
 * Remove url= attribute in main entry points in favour of row{}
 * Undo {expand:False} attribute for CellRendererPixbuf
 * Overwrite row["format"] after updating entry.
 * Fix audioformat to audio/mpeg.
 * Introduce action.handler{} callbacks to convert custom streaming URL
   types such as "audio/soundcloud". Unify backend code for .play/record/browser()
   calls.
   Reddit module just splits out domain name now, then checks for walledgarden
   links (filter option renamed).
   Introduce url_soundcloud plugin in favour of `soundcli` cmdline client setting.
 * Move channel.save() after column updating.
 * Lighter highlight color: for plugin options.
 * Introduce channel.fixed_size=[24,24] to constrain favicon CellRendererPixbuf.
   Works in conjunction to .img_resize= attribute for favicon/img converter.
   Set expand:False in default datamap[] for favicon cell.
 * Check for string length (.q) before starting cache/server search.
   Wrap channel+cat switching in ukit.do().
 * Add a "keep all" web links option.
 * Fix swapped boolean and integer options in set_plugin_defaults()
 * Support custom audio handlers for soundcloud etc.
   Example plugin to register them (only `soundcli` so far).
 * Simplify favicon callbacks, use channel= instead of artifical pixstore=
   tuple. update_rows() itself extracts liststore and indicies now.
   Introduce `img_resize` channel option for `img` banner rescaling in favicon
   module.
 * Fix `id` reference in dependency resolver.
 * Add more subreddits to category list. Placeholder groups with "→" decorator.
   Allow web-only links per config option (start web browser for sptfy/sndcl etc.)
 * Catch http/json result errors earlier. Break on absent "after" id.
 * Support config option boolean aliases (1, true, yes, on).
 * Use gtk-info/-error/-no for placeholder entries.
 * Channel plugin for <b style=color:red>reddit /r/*music*</b> categories.
   Just filters out Youtube or direct MP3/Ogg links at the moment.
 * Remove config.find_in_dirs(), which is unused now.
 * Make quicksearch icon activatable again (property "secondary-icon-activatable" was required).
 * Minor help page updates.
 * Fetch all 5 available pages from Xiph directory. Rewrite to use more
   directed regex extraction mode.
   Minor help page updates.
 * A bit more PEP8, without undoing all readability.
 * Allow Exif-wrapped JPEGs as well (not just JFIF regexp check).
   Comment on merging row["favourite"] merge via prepare_filters list.
 * Delay window title updating logic and ui_cht callback via uikit.do() wrapper.
   Seems to fix both:
    - Gdk:ERROR:/build/buildd/gtk+2.0-2.24.23/gdk/gdkregion-generic.c:1114:miUnionNonO: assertion failed: (r->x1 &lt; r->x2)
    - Error in `python': double free or corruption (fasttop): 0x0.....
 * Typecast str() for bookmarks.is_in() url lookups → redundant.
   (Prepare for merging columns-update hook.)
 * Strip double .png/.jpeg extension from cached `img` icons.
 * Remove _=time from streaminfo json urls.
 * Minor simplifications in manual, remove iCast page.
 * Adapt config options (color, and type: int)
 * Remove stray `print` statement
 * Typecast plugin options on initialization.
   Use SpinButton for `int` options instead of text label.
 * Introduce new hooks["switch"] for update_title().
   Used by new `Channel homepage link` plugin, which brings back
   streamtuner1-style service homepage.
 * Add toolbar placeholder for channel-link.
   Change conf.max_streams to SpinButton.
 * Minor comment updates, version bumps.
 * Remove ahttp aliases, print warning for "raw" extractor fallback,
   add some comment headlines for better overview.
 * Get rid of StringIO wrapper for json loading.
 * Add WinAmp user agent.
 * Fix python dependency, and embed PYTHONPATH in 0-requests feed.
 * New channel plugin for <b style=color:red>radio.net</b> station directory.
 * Remove channel_itunes manual page.
 * Use new autosave flag for DND.
 * Simplify windowsmedia regexp. Omit bitrate=32, because `filter_bitrate`
   makes it appear empty per default then.
 * Use shorter domain names for homepage favicons again.
 * Update Dirble comments.
 * Weighted selection of available stream urls from Dirble API.
 * Add ahttp.fix_url() for dirble `website` addresses.
 * `timedout` and `description` are seemingly gone from the API responses.
 * Add `filter_bitrate` to default pack: list.
 * Add 0install requests dependency.
 * Add 2.1.8-dev as 0install option; depend on Py 2.7 for now.
 * Update 0install descriptor to use command/runner with virtual python package.
 * Update manual regarding new favicon plugin and its options.
 * Set dest= and main=
 * Try &lt;file&gt; instead of &lt;archive&gt;
 * ./.
 * Update with signature
 * Add option to inhibit window title adaption ("Streamtuner2 - Channelname"),
   mostly just for filling up the "Display" config section again.
 * Add 0install pkg description wrapper for testing.
 * Remove a few options from configuration dialog;
   now available in [feature] plugin tabs for favicon module.
   Favicon module exposes google_station_homepage, and retrieval methods,
   but no longer `conf.show_favicons` (which is decided on just by having
   the plugin enabled - or not.)
   Introduce conf.auto_save_stations for favicon/DND plugin.
 * Default to encoding=utf-8 for jamendo API.
 * Add feature plugin icon.
 * Resize logo together with toolbar buttons.
 * Make favicon redisplay work after google_find_homepage() and existing
   icons in cache.
   Shorter timeout/display for status label for google search.
 * Move mime_fmt() into regular function.
   Fix live365 ahttp feedback= bug.
   Regroup functions and update a few comments in channels/__init__
 * Add default filters only once in GenericChannel.__init__
   Allow preprocess_filter callbacks access to current channel object.
   (Used by filter_bitrate to recognize .audioformat if row[format] is absent.)
 * Add plugin defaults (for newly added options, but previously active modules)
   in any case when starting with -D flag.
   Save settings.json in json.dumps(sort_keys=True) mode.
 * Add generic bitrate filter plugin, move functionality out of xiph channel.
 * Remove plugin #color:
 * Use GenericChannel.prepare_filters hook to update "favicon" filenames in rows.
   Precompile row_to_fn regexps.
   Fix google_find_homepage params (just a function, not a method).
 * Split up post-proccessing filters (run after load/update_streams), use
   filter callback list now.
   Separate prepare display filters as well (so to hook dedicated favicon
   callback into).
   Move conf.show_favicons option into uikit.columns() signature.
 * Break out _on_reload thread callback.
 * Remove _ prefix from ls, rowmap, pix_entry, as features/search was already
   depending on literal rowmap.
 * Change pluginconf lookups. Use only pkg basenames for configuration,
   but override channels.__path__ directly in module.
   Thus pluginconf can convert `plugin_base` into path list for module_list()
   scanning.
 * Switch dirble plugin to predeclare encoding="utf-8" for speed.
 * Disable iTunes plugin, no alternative resource.
 * Fix URL patching (after actually testing it).
   And provide fallback for image resizing (.thumbnail in PIL 2.3.0 is broken).
 * Move internal commentary out of plugin description block.
   Try/Catch processing failures in update_rows() loop.
   Use quieter=1 option for image downloads.
   Reimplement custom base_url+href favicon patching.
 * Add ahttp.get( quieter= ) option for less log.HTTP notices.
 * Work atop Python3 by using io.BytesIO rather than compat2and3 module.
 * Move `favicon` module into extension/feature plugin.
   Simplify row["favicon"] cache filename pregeneration; separate from favicon
   module (but basically duplicated code there).
   Refactor most internal favicon+banner processing, rename methods for clarity.
   Plugin registers itself as .hooks["play"] callback.
   Uses main.thread() now instead of custom variant.
   Create icon cache dir on initialiation rather.
   Use combined row_to_fn() for cache filename generation instead of domain(),
   url(), file(), etc.
   Previous banner downloads are ignored, because the filename normalization is
   more in line with domain favicons now.
   Only update pixstore on successful downloads.
   Pre-check the content type per binary regex now, before saving image files.
   Combine resizing into store_image() function as well.
   Even PNG files will be piped through PIL (for sanitization).
   Completely got rid of urllib usage.
   Homepage/HTML extraction got rewritten, simpler, still inexact; but works
   now for most webpages. Favicon homepage downloading checks both returned
   MIME type and actual file content prior saving. Shorten timeouts to 2-3
   seconds for Google and custom favicon retrieval.
 * Create stub plugins/__init__.py in any case.
 * Make AHTTP timeout= configurable.
 * Fix super slow requests download for Xiph YP.XML, due to automatic charset
   detected in requests.text access. Override encoding= now and manually
   .decode() known "utf-8" charset.
 * Implement favicon live updating. Play event and download_all now pass the
   treestore, with row index, and pix_entry number (column index in liststore).
   Favicon module checks for downloaded images twice now, and updates PixBuf
   in ListStore. (Works for both single station view, and download_all.)
 * Prepare for more complex hooks["play"] invocation (ignore args, kwargs).
 * Use custom GenericChannel.columns() wrapper to simplify passing TreeView
   widget and keeping returned liststore/rowmap/pix_entry.
 * Minor typo fixes.
 * Return ListStore, rowmap and pix_entry from uikit.columns()
 * Crash in search module again. Seemingly fixed it for threaded mode by preupdating
   the bookmarks.streams{search} result store before switching tabs.
 * Fix srver url extraction prior sending to myoggradio API.
 * Lock WindowsMediaGuide plugin against >2.1.8
 * Step-tutorial for bookmarking a station.
 * Explain in detail how to enable pluginmanager2 extension.
 * Additional project+help links for manual.
 * Make static category lists more readable.
 * Remove unsupported view-source: URL prefix, rewrite links from /cat/ to
   /doc/tip/ for downloading/plain view instead of text/html browsing.
 * Fix UTF-8 text decoding for CSV after downloading as binary.
 * Add description: line.
 * Add windows media guide radio lists (ASX). Fixed action module to extract
   with case-insensitve matches for that playlist format. (It's not really
   XML after all.)
 * Another radio station directory: listenlive.eu
 * Compressed GLRP csv playlist.
 * Add preliminary Magnatune contrib plugin. (Radio playlists are currently
   broken. Only small album list is fetched.)
 * Add yelp &lt;note&gt; icons.
 * Update config option references for channel pages.
 * Converted help images to more grayscale/indexed variants to reduce filesize.
 * Use fallback title= for mkrow() importing.
 * Fix urlencode references to urllib.quote.
 * Add favicon and description.
 * Fix JSON serialization.
 * Add trivial di.fm/sky.fm radio list fetcher.
 * Enable glrp.csv download from repo.
 * Remove default ["empty",] category.

2.1.8 (2015-05-06)
 * Release as 2.1.8
 * Fix some print and log statements.
 * Use Gtk3/gdk.Color.parse() as fallback to .get_colormap(), get rid of style
   copying (was only necessary with the previous theming support IIRC).
 * Inline copy&paste HTML entity definitions, because they seemingly were also
   sacrificed at the Python 3 altar.
 * Fix region_id default to enable v3 mostPopular query (YT stumbled over "UK").
 * Filter `None` from extracted URLs.
   Fix save_playlist.export; copy.copy each row before overwriting/filling url.
   Implement specific `jamj` extractor (regex stumbled over playlist title).
 * Add .save() after reading in CSV list.
 * Add playlist importer channel for GLRP.
 * Updated channel documentation with links.
 * Moved `file` and `punkcast` into contrib/ group.
 * ./.
 * Add -B and -3 options to `make run`
 * Add icon for file browser.
 * Fix some typos.
 * Add omitted HTML pages. (*.html is in the fossil `ignore-glob`, so they get
   skipped for github-skin statistics bar.)
 * Update documentation and notes for new channel/feature plugins.
 * Readd plugin_base paths in addition to module basenames,
   otherwise pluginconf.get_data won't find plugins/* either in the
   module_list() or per get_data() - one uses paths, the other pkg names.
 * Simplify core plugin dependency lookups.
 * Support direct URLs in DND import (only used as literal url=, brings up
   streamedit window afterwards).
 * Fix missing channel key error. Add icon.
 * Stub placeholder version: as `0`
 * Rewrite some comments.
 * Fix http reference, unneeded.
 * No more API.
 * Moved dependency() into pluginconf module, which shortens adding new
   installable modules to the vbox.
 * Make configwin construction slightly more readable, use new pluginconf functions.
 * Split pluginconf from config module.
 * Use file:// prefix for storing local paths. (Did break DND without "srv" export.)
 * Shorter format option descriptions.
 * Hopefully fix Gtk3 error by wrapping second set_current() call in uikit.do
 * Add some version: bumps and add a few versions to depends: references.
 * Perform basic version dependency checks before displaying downloadable plugins.
 * Disable iCast plugin for now.
 * Make plugin list prettier. Implement vbox redrawing on [save].
   Activation seems to work okay for channel plugins, and main already
   had enough safeguards to make st2.load_plugin_channels() work as is.
 * Make short help notices for player/recording configuration smaller.
 * Catch invalid image files when creating pixbuf in uikit.columns()
 * Add user plugin manager / download tool.
   Not very well integrated nor pretty.
   Still requires a restart, needs more hooks into config dialog. (Clean up
   previous plugin vboxes after installation. Auto-activation required to
   reimplement init loader. And channels.__path__ setup isn't yet injectable,
   because no plugin `order:` is honored by main/init, and pluginmanager2
   would run too late for overrides.)
 * Detect all command names in player config, so that both `xterm` and
   `streamripper` are probed for existence.
   Use dict comprehension for plugin_meta lookup.
   Remove wrap_entry in favour of generic uikit.wrap().
 * Allow to override encoding= for .text results (requests can't detect it
   automatically for binary/json responses).
 * Support multiple `plugin_base` references (namely "channels" and "plugins").
 * Add .wrap() from configdialog for general use.
 * Remove print statement.
 * Implement "buffy" mode for just keeping Xiphs YP.XML in memory once traversed.
 * Consolidate bitrate filter in main update_streams() method.
   Fix conjoined category strings.
 * Fix server search var reference.
 * Move parole behind vlc in setup alternatives.
 * Support literal references in text/uri-list per "srv" setting.
 * Better plugin comments for user interface.
 * Fix xiph search URL and by_format mapping.
 * Add combined unhtml() utility function for raw page extractors.
 * Clean out unneeded xml module references.
 * Xiph module: reintroduce YP.XML extraction (still exceedingly slow),
   simplify JSON cache API usage (may get retired, incurs a delay of its own),
   and add raw dir.xiph.org website scraping (fastest, and most features).
 * Added default icons to dialog windows, and st2 logo to main window.
   Introduce more keyboard shortcuts (F6 favicons, Alt-F5 category reload,
   etc..)
 * Use shorter entity_decode() call. Strip example content.
 * Allow to add custom statusmsg for lengthier HTTP requests.
 * Move strip_tags(), entity_decode(), and nl() out of class into normal functions.
 * Move strip_tags(), entity_decode(), and nl() out of class into normal functions.
 * New channel plugin for <b style=color:red>Radionomy</b>.
 * Fix `audioformat` property name.
 * Stub category tree building main[] in case of wrapped primary group.
   Add uikit.bg on STATE_ACTIVE, skip existing EventBox widgets.
 * Remove redundant pq and compat2and3 imports.
 * Use new @use_rx decorator to switch and fall back between regex/pyquery modes.
 * Implement custom HTML .entitiy_decode, because SAX didn't honor any HTML;
   and HTMLParser would require customized/compat2and3 imports.
   Colorize channel labels if #color: is specified in any plugins.
   And provide @use_rx decorator to alternate between regex/pyquery extractors.
 * More specific log.HTTP messages (GET vs POST)
 * Prepare row() and play() wrappers. No genre requests yet.
   (Still just a planned channel pugin.)
 * Rename 8tracks module to have a legal Python identifier (rather than the
   globals()/module rename workaround).
 * Tag with priority:never, as it's not meant to be bundled really.
 * Remove contrib/bieber joke example.
 * Separate statusbar timer-reset from text/progressbar setter.
 * Use empty stub {} dict in place of state.json contents on fresh init.
 * Add python2-requests dependency.
 * Test build -t arch Linux package as well.
 * A little more comments on playlist_export usage.
 * Implement state: mapping (though no idea what 0-2 mean),
   and make default API key internally predefined again.
 * Add delicast favicon.
 * Temporarily remove iCast plugin from packaging, but add dirble and filtermusic.
 * Basic channel plugin for delicast.com
 * Manually replace `nbsp;` in entity_decode
 * Make SSL verify= configurable.
 * Fix typos in myoggradio help page.
 * Bring back dirble channel.
 * Update HTML manual with current page set.
 * Add new channel plugin for filtermusic.net,
   which works both per website extraction and from XML map traversal.
   (Again, the HTML→regex grepping seems more reliable.)
 * Statusbar timeout and reset still not as planned.
 * Add new config dialog group for "Playlists".
   Conf setting `playlist_asis` completely skips action.convert_playlist().
   Works for any real m3u/pls/srv server and flexible audio players.
   But obviously breaks Jamendo albums or other JSON playlist sources.
 * No has_search for PRF channel.
 * Applied listformat= testing via action.extract_playlist.probe_ext().
 * iCast currently(?) down. Added JSON/HTTP log.ERR message.
 * Moved artwork (logo/icon) into dev/ folder.
 * Undo itertools.chain(), use plain list appending.
 * Exchanged all "import ahttp as http" for plain `ahttp` module usage.
 * PublicRadioFan directory plugin. (Works ok, but fetching is somewhat slow.)
 * Fix `st2.py` name/location in comment.
 * Support "TV" channel for UbuntuUsers. (Albeit few are still working.)
 * Also scroll to last category after .select_current
   (didn't automatically happen for current notebook.)
 * Removed export_format config option for exportcat plugin (as that's selectable
   now in the file dialog anyway).
   Recategorized dnd plugin to appear earlier in the [features] config tab.
 * Move `state.json` and .current restoration into GenericChannel.gui().
   Current category is reselected by TreeView traversal on instantion now.
   Previous state now load through config.state() for channels/__init__,
   not in main/init_app_state anymore (just row:expand / winsizes now).
   Disable .currentcat() overwriting, redundant now in display_categories().
   Still need to avoid second .select_current() call in first_show().
 * Document command line flags in manual.
 * Reorder target types, to prefer XSPF over PLS and M3U.
   Support .URL exports, keep distinct literal url/direct.
 * Updated category:/type:
 * PodSpider.xml database reader. Untested.
 * TreePath restoration +1 for drag and drop.
 * Readd `default`, and fix forgotten `favicon` import.
 * Fix uikit.do spool appending with len(idle_tasks) instead of -1.
   Unpack window state treepath tuple conversion into 1:2:3 strings.

2.1.7 (2015-04-26)
 * Document changes, fixes, new features in 2.1.7
 * Extended generic JSON extractor, to understand a few common field aliases.
   Add fallbacks for mime_app lookup in case */* is absent.
   Simplified %rowfield injection, which is commonly unused anyway.
 * Uneeded windows desktop shortcut.
 * Disable "Format" column again.
 * Embed base_url for extraction.
 * Missing Exception capture for error log.
 * Fixed gtk.main_iteration() extraneous parameter in gui_startup.
 * Cover most catched exceptions with log messages.
 * More customized log categories/colorization.
 * Add custom pls extractor (for unordered playlist entries), keep regex method
   as fallback. More logging.
 * Replace statusbar with plain gtk.Label,
   use glib.timeout_add for clearing it up implicitly.
 * More examples for recording/streamripper configuration.
 * Add spacing for config dialog options (indented per plugin).
   Narrower labels, icons now show up.
   Undo newline-removal for Gtk3 tooltips (work with preformatted text instead).
 * Fallback for Gtk3 using set_text() now.
   Fix "href" vs "raw" format probing.
 * Add .url exporting (shallow Windows variant of .desktop files).
 * Use generic `audio/mod-zip` for all MOD Archive urls.
 * Document current reuse_m3u and nothreads config behaviour.
   Rewrite placeholder and application help pages to be more understandable.
   Mention GUI alternatives to streamripper.
 * Prepare bookmarks-category DND as target (for internal stream moving).
   Fix FILE_NAME being passed as text not uris XSelection type.
   Use underscores in place of spaces to avoid urlencoding file:// references.
   Move log.DND colorization to config.
 * Add .desktop and .url to export format file extensions probing and SaveAs dialog.
 * Split plugin configuration into [channels] and [features] tabs.
 * Disable update_streams_partially_done() for Gtk3, as that's the main cause
   of memory corruption (despite being run in idle loop).
 * Add conf.nothreads flag and --nt cmdline flag, to prevent Gtk3 idle
   update race conditions if need be. (Still flaky for initial startups.)
 * Use distinct /tmp/streamtuner2/ directory for temporary pls/m3u/xspf files
   (also for DND). And have action. module reuse them, based on numeric row{} hash.
 * Some more comments and log messages.
 * Add uikit.tree() instantiation for bookmarks tab.
 * Draw gtk_cat columns on initialiation in .gui() call.
   Use more literal uikit.do() invocations without lambda: wrapping.
   Let display_categories only run in uikit.do/idle,
   whereas .load() is run directly from there now.
 * Statusbar updates via uikit.do, immediate=True.
 * Make uikit.do() manage a task spool itself. Run new tasks immediately if
   invoked already within gtk_idle callback.
   Move uikit.tree column creation into separate function, for immediate use
   through GenericChannel.gui() - instead of destroying+repopulating it on
   category-list reloads.
 * Remove some print statements, and switch to log.FUNC where necessary.
 * Add TreePath() abstractions for app_state/restore.
 * Update online manual to current help page set.
 * Add some notes about DND to the manual.
 * Fix .desktop file exporting. Add mime_guess() for streaming url.
   Move insert_rows() implementation out of DND module.
 * Move DND insert_rows() into GenericChannel.
   Add load(y=) parameter to scroll back to previous position after insert_rows().
 * Let bookmarks channel use generic.load() to reapply scroll position y= after inserts.
 * Remove old .ico workaround, as PIL2(Pillow) now integrates support.
   Leave the remaining code in shambles, and with excessive logging.
   Still needs a huge rewrite to optionalize Google reliance again.
   (The manual favicon fetching never worked, because the regexp is too
   crude for most sites; and URL joining is off too.)
 * Playlist DND import and conversion has been greatly simplified.
   (To the detriment of the action module now becoming more complex.)