trunk (unreleased)
 * 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 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:</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
   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`
 * 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
   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
 * <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:</b>
 * Fixed category assembly (last entries for Urban were missing)
 * Fixed a few mallard section errors, added reddit details and 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
 * 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.
 * 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
 * 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"></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:
 * 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 help page
 * removed Live365 help page
 * 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, 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 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 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()
   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 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
 * 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
 * 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 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></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()
 * 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/ 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:
 * 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 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
 * 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 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,
 * 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 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
 * 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,
   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 `` 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 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 invocations without lambda: wrapping.
   Let display_categories only run in,
   whereas .load() is run directly from there now.
 * Statusbar updates via, immediate=True.
 * Make 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.)
 * Major rewrite of playlist_extract handler. Now retains url and titles for
   playlist types that contain it. Still provides simpler urls() wrapper for
   old usage.
   Move probe_* functions into playlist_extract class as well.
   Introduce basic playlist_fmt_prio list for supported formats. (Too many
   regexps to probe for allowed file extensions, etc.)
   Add support for .url and .desktop files (import only.)
 * Alias urllib*.unquote as urldecode()
 * Fix missing .module property for add_plugin_defaults.
 * Replace old __print__/dbg.XYZ references with new log.XYZ() wrapper.
 * Fix explanation on why iCast fetching takes a little while for some
 * Shorten "Ogg Vorbis 112kbit/s" option name (was expanding the general
   settings dialog too much).
 * Add overly crude playlist_convert.title() extraction (for M3U/PLS/XSPF/ASX
   and the custom STRING/TEXT format used by DND module).
   Insert imported rows at the right position. Scrolling won't work, because
   it's done in a separate thread.
 * Move playlist extension and context probing into separate functions.
   Introduce some rather crude import functionality for a few playlist file formats.
   (Still requires proper importer with title= reading, and entirely rows[] based
   function signatures in action module.)
 * Introduce log.ERR() etc. instead of __print__(dbg.XY...) workaround (was meant for Py3 only).
 * Remove some obsolete comments/code snippets.
 * Implement in-application row copying per JSON (info=51, mime=json/vnd.streamtuner2.station).
   Fixed set_text() bug by using set("STRING",..) atom instead.
 * Experiment with a few more target types. Works with a few text editors on
   STRING. Most just want a uri-list, but can't handle it.
 * Add plugin defaults.
 * Implement basic exporting and conversion for drag-and-drop. Needs to buffer
   implicit playlist file, because data_get() gets called excessively. Still
   support direct M3U/PLS/XSPF transfers (should any other application ever
   understand it), and direct URL transmission.
   No import functionality yet, but internal JSON format prepared as target type.
 * Semi-fix for brand-new initialization. Set default category from existing
   categories[] list. Setting the displayed path as well doesn't work yet.
   (It's just half-way selected after the next restart.)
 * Bring back .base_url instead of .homepage property for HTTP requests.
 * Simplify callback for GUI updates from within threads.
   Search plugin led to a memory corruption due to not using it for updates.
 * Add [feeds] support for Jamendo. (Pretty much only albums, so track lookup works.)
   Better support for configured audio format/mime. Ogg Vorbis now works in
   albums and playlists.
 * Fix homepage url issue / quote() checks for list first now.
   Restructure playlist extraction into ordered dict; use in conver_playlist as
   probe formats. Make xml/json url decoding explicit, prepare for custom
   extractors (e.g. real json or xml traversal, full row/title extraction).
 * Guard appstate_init channels.current setting for absent plugins.
 * Updated Jamendo plugin audioformat and listformat descriptors. Attempted to
   use v3.0 API for playlist tracks. Still no playlist API endpoint. So using
   a separate track requests now.
   Implemented a new action/playlist_convert URL extractor, which shall
   henceforth be known as "jamj" (JamJibberish).
   Fixed XML url extraction in regex mode, trivial backslash deescaping for JSON
   formats; and fixed multiply URL bug by copying row{} dict during conversion.
 * Removed dnd code snippets.
 * Experimental drag and drop code snippets. (Not going to work well with other
   apps, only VLC tested, everything else depends on text/uri-list temp file://
   URLs. Internal row dragging not implemented / no bookmarks subcats yet.)
 * Move PYZ shebang prefixing into `xpm` codebase.
   Simplifies local Makefile. Renamed PKG_PYZ into PKG_ZIP,
   and added extra target rules to Packfile.
 * Remove remnant module .title/etc attributes, and .current category overwriting.
 * Make .current a dynamic property for debugging.
   Skip load() update for category==None calls (doesn't happen with previous appstate).
   Undo default category setting. Now main.appstate_init values are used again.
   Don't position category liststore selection to #0.
   Enable "Format" station column.
 * Simplify appliation state restore.
   Don't override old .shown status / liststore position should be handled by GenericChannel.
   Suppress TreeView errors when clicking on empty station list area.
 * Tested fixed-width for pixbuf cellrenderer in stream lists; little effect.
   Set .module attribute for auxiliary windows (unused).
 * Mark PIL workaround as obsolete.
 * Run channel.first_show() on tab switches in a separate thread.
   This makes ST2 *look* snappy after initialization, and for the very first
   startup in particular. (Seems to work stable after all, even uncovers the
   HTTP statusbar updates now.)
 * Move preprocessing from Makefile to Packfile, just runs on channels/
   instead of all *.py files now.
 * Not implemented: `8tracks` (plugin name suffers from identifier mismatch,
   and it's not quite doable in ST2, because 8tracks requires feedback shortly
   after playback has begun; yet streamtuner can't inspect any configured audio
   player for actually doing so.)
 * Add old Compound★ example plugin, slightly updated for current meta data scheme.
 * Old helper script to make streamripper add genre.
   Though there are `-D` pattern options that often work better.
   And KStreamripper or fIcy/fPls might be more modern.
 * Remove ancient dependency.
   (Whole favicon module needs refurbishment though.
   Might be feasible to turn it into a plugin meanwhile.)
 * Last tagged release (2.1.6)
 * Move NEWS->changelog.gz conversion into xpm Packfile.

2.1.6 (2015-04-13)
 * Remove default %m3u placeholders. (Now defaulting to PLS, as supported by
   pretty much all players.)
 * Optional plugin, retrieves raw Wiki content from with
   country-grouped radio stations. (Will be bundled in another release.)
 * Prepare next beta release 2.1.6
 * Fix NoneType concatenation (empty genre: entries) in cache search.
 * Add easter egg in search_dialog only for PYZ package.
   (Now Makefile targets require though). 
   Resize GtkBuilder definition for search_dialog.
 * Fix default bitrates in static SomaFM stream list.
 * channel plugin, with entirely static station list.
 * Cleanup exportcat file extension mapping, and fix docs.
 * Manually implement $XDG_MUSIC_DIR lookup.
 * Safeguard get_data for plugin_meta(), as global or local extras would be
   found by module_list, but not get_data().
 * Give up. Just use embedded PNG for transparent empty_pixbif.
 * Fix bookmarks tab swtich on search completion.
 * Shorten first_show(). Plugins don't initialize on startup anymore, but again
   on first channel tab selection. Use first entry from categories as current,
   if none is set. Remove some obsolete code. Display now matches on fresh
   installations as well as with existing cache/state.
 * Slim down first_show() in main.channel_switch().
 * Fix case-sensitive PLS construction and File\d+ index starting from 1.
   Adapt format detection regexps as well for html, and xspf xmlns.
 * Initialize with empty station TreeView again. Make bookmarks channel not
   override the behaviour. (This sort of works around the .current category
   mismatch after startup.)
 * Move appstate restoration into init function.
   Implemented "quit" hook for action.cleanup_tmp_files,
   fixed app_restore `w.set_current_page` bug.
 * Rewritten action module and playlist conversion/export works okay enough.
   Merged into trunk.
 * Fix str→bytes saving for Py3. Tmplement tmp_files[] cleanup.
 * Finalize allowed filename extensions for exporting.
   Normalize Python3 string decoding (errors='ignore' per default).
   Update XSPF and SMIL export. Use row={} template now, instead of
   just carrying over title= to rewritten playlists.
 * Implement filename update in SaveAs dialog on changing FileFilter (.m3u,
   .pls, .xspf) extension.
 * Apply proper file extension to temp files (they're never cleaned up, are they?)
   Fix MIME type probing, strip attributes.
   Support Apple M3U minor type, detect GVP playlists.
 * SurfMusik actually holds .m3u playlists.
 * Sync with trunk changes.
 * Fix parent window references.
 * Removed custom pls conversion code, now uses action. playlist conversion tools.
 * Move concrete row(), rowno(), selected(), model_iter() and play(), record()
   implementations from main into channels.GenericModule.
 * Update comment on rewritten action module. Add alternative MIME types for
   m3u and asx, spport asf detection and extraction. Fix listformat→source arg.
   Move save() and filename handling out of save_playlist. Fix mediafmt_t
   lookup and print warning when there's an audio-response on playlist fetching
   (and it does happen). Change myoggradio plugin "format" population, and set
   listformat to "mixed(..)" for automatic probing.
 * Fixed ASX and SMIL playlist exporting, allowed new placeholders %xspf,
   %jspf, %asx, %smil for application configuration. Documented in help/ pages.
 * Python3 doesn't like `if [x = ...]` inline assignment trickery (kwargs out of scope).
 * Figured out how to use standard confirm-overwrite dialog (buttons were
   defined, but no actions associated). Removed custom msg box.
 * Update notes on python-requests >= 2.0.0 required now (streams=True).
   And fix reference to `icon.png` now.
 * Still some parameter renaming in action module to do. Optional support for
   row={} parameter in play/record calls, in case .pls/.m3u needs to be
   constructed (to retain title=).
   Adapt action playlist exporting to wrapper object, which preconverts plain
   URL lists or [rows] list, can itself call convert_playlist(), and optionalized
   file writing.
   Rewrite main save() and to utilize new save_playlist().
   Implement overwrite confirmation for Save-as dialog.
 * Use ordered list for playlist content probing.
   Fix listfmt() mime to abbr conversion.
   Allow non-http URLs for raw() extraction.
 * Consolidate listformat types to just "pls", "m3u" and "srv".
   Probe for direct ICY server contact in action.playlist_convert(),
   unify extraction methods.
 * Remove extraneous class wrapper action.action.
   Start to regroup listformat mapping (pls-url → m3u-fn rewrites).
   Will need some heuristics, as depending just on the channel.listformat
   assumption won't work in practice (some .pls servers actually host
   direct server links, or occasionally .m3u references even).
   Currently does nothing, just returns the pls/etc URL.
 * Create new branch named "action-mapfmts"
 * Added some notes about "Export all" plugin.
   List streams#actions as topic in
 * Split up Extensions› submenus. Register major plugins (timer, myoggradio,
   radiotray) as direct menu entries, but complex extensions (exportcat) as
   subentry still.
 * Fix main. references from bookmarks callback.
 * Got rid of switchy() expression, use plain `cond and val or ...` chain.
 * Temporary export mechanism (saves whole category into .pls file).
 * Less indentation, starting to overhaul at least.
   (Whole `action` module is overdue.)
 * Fix a few CLI bugs (doesn't work yet with dynamic module list),
   stub_parent() implementations for non-GUI mode should be merged.
 * Move argv initialization to conf.apply_args().
   Document config: format for argparse conversion.
   Enable file=sys.stderr for __print__/debug messages.
 * Add workaround for ArgumentParser, which tries to map config: descriptors
   onto AP.add_argument() params. (yikes)
 * Add UserAgentSwitcher plugin. (Just for experimenting really, not required.)

2.1.5 (2015-04-05)
 * Fix manual Makefile `install` rules. Update -D debug notes in README.
   Release as 2.1.5 (beta).
 * Provide a `-D` debugging flag and a `-d shoutcast` option to disable plugins
   prior startup.
 * Recategorized some dbg.ERR messages, but make them displayed now regardless
   of conf.debug setting.
 * Make Youtube channel also default.
 * Switch .meta.title attribute after UI initialization.
 * Fix `local` category base url, again.
   Make priority: default.
 * Change version number in plugin settings from orange to gray.
 * File reading in plugin_meta(): convert Py3 bytes to string.
 * Fixed some help page typos, added streamedit description, and some
   screenshots for the configuration window.
 * Changed pyz base path determination method (no more rx.zipfn guessing).
 * Capitalize remaining menu entries, update PNG icon to 64x64, remove examples
   from logo/banner template, default to size of 315·115 px.
 * Update window title for currently selected category tab.
 * Wrap `gzip_decode` as fallback for Python 2.
 * Manually register addon widget signals. Otherwise main keeps bugging with
   GtkWarnings when timer plugin is disabled.
 * Use os.path.expand* for env vars and `~` homedir placeholder.
 * Mention `make glade`, as gtk3.xml is now compressed per gzip after all.
 * Document Makefile requirements (version, xpm/fpm), prepare manual `install` target.
 * Spread out #pack: specifiers into doc files.
 * Add plugin defaults now really on initialization. Safeguard in configwin.
   Always use gtk.STOCK_NEW for empty app fields in config_dialog (not just for new lines).
 * Compress gtkBuilder file with zlib for distribution.
   (gzip not usable without workarounds in Python2)
 * Convert shell _pack script into sectioned Makefile.
 * Document fossil repo specific URLs (changelog/, cat/, trunk, version, zip/, tar/).
 * Use plain module_list() for config_dialog.add_plugins() instead of
   traversing main.channels and main.features separately. Uses module=
   lookup with hardwired "channels." and ".py" retrieval.
 * Catch HTTP errors for reload_categories().  Provide a descriptive
   .placeholder[] and .empty_stub[] stream list for channels reloading.
 * Moved back to old `mostPolular` method.
 * Removed duplicate category entries for internet_radio plugin.
 * Removed module_list() ordering, which is now handled by uikit.appstate.
   Documented plugin_meta() options, split out plugin_meta_extract() code.
 * Removed remains of [stop] button handling.
   Fixed url param in homepage channel callback.
 * Removed Gtk `theme` configuration options. (Didn't work anymore.)
 * Made channel tabs reorderable. Now kept in config/window.json as `tab_order`
   and current page saved as `tab_current` instead of pageno.
   Disabled progressbar changes for ahttp, made search_server search run in a
   thread so status can be shown.
 * Removed doubled radio button grouping in GtkBuilder file for search_dialog.
 * pngopt/pngadv/pngcrushed logo banner/icon.
 * Got rid of static main.channel_names[] list. Instead now querying Gtk
   notebook_channels widget for current page name ordering.
   More plugin defaults added to ConfigDict.defaults(), as workaround for
   not preparsing inactive plugins on startup.
 * Split out pack: specifier into `bin` and separately for help/ pages.
 * Compacter banner/logo base64, removed SVG variant.
 * All channel icons are now embedded into plugin meta data.
 * Removed channel icon *.pngs.
 * Add missing `configwin` (the externalized config_dialog).
   Fixed gtk3.xml for gtk2 once more.
   Orovide find_executable() in config, used by configwin to show if configured
   apps are actually available.
 * Fix incorrent indendation.
 * Compact plugin comments to be more user-targetted.
 * Initial version of API plugin. Built-in stub favicon.
   (Maybe later support station submissions here too, just like MOR.)
 * Updated docs regarding manual setups/packaging.
 * Readd MUSICgoal to bookmarks/links category (now that plugin is gone)
 * Adapted uikit.hbox to allow left or right column to be expanded/filled.
 * Changed plugin config: options default registration to use full .meta[] now
   instead of just config[] list. Thus plugins can be enabled/disabled right
   away based on priority: field. (On first startup all channels will show up
 * Fix config defaults registration.
 * Updated punkcast to display again, also show banners now instead of empty
   columns, and embedded favicon/png.
 * Removed dirble plugin for now (new API coming in April...?)
 * Update documentation files (dependencies and manual installation paths).
 * Add conf.get_data() alias, which automatically fetches resource relative to
   config module (that is, works on the global path, or within pyzip archive).
   Move module_list() from channels. into config, as it combines plugins and
   config management anyway.
 * Trim down plugin comment.
 * Moved add_plugin_defaults from main into GenericChannel constructor.
   Check for percentage>=0 in progress indicator of statusbar.
 * Split extension_main and extension_context menus.
   Fix pixmap icon back.
 * Fix conf.debug checking.
 * Nicer error message, and compacter plugin comment.
   Add default config value in init.
 * More PixbufLoader workarounds for Gtk3, and get_data() casting for Python 3.
 * Register extension menu entries twice (main menu, and stream context submenu),
   to avert Gtk warning.
 * Add new packaging scheme: `bin` becomes /usr/bin/ stub,
   while `` is used as __main__ handler for PYZ archive.
 * Slimmed down channel PNGs (for eventual later .py meta stuffing).
 * Remove manual gtk visibility setting (show_all used now).
   Use fallback stock icon in case .png or png: are missing for plugins.
 * Tried SVG for logo, but Gtk refuses to play along; given up.
   Set progressbar to no-show-all.
 * Slim down initialization (wrapper script for /usr/bin and pyzip will be used).
   Move module coupling into ST2 window constructor.
 * Remove gtk/visibility setting in favour of show_all().
   Fix pixbuf creation, b64decode ignoring non-base64 data.
 * Add basic menu_label= manually (GtkBuilder option seems to have no effect,
   only populates tab_label= with child widget.)
 * Made RadioTray fallback `play` available as option instead of bookmarking.
 * Moved load_theme() into uikit.
 * Example for embedding PNG resource in plugin meta data (favicon for notebook tabs).
 * Starting support for alternative genre/category sources.