[SCM] streamtuner2/master: Imported Upstream version 2.1.1

takaki at users.alioth.debian.org takaki at users.alioth.debian.org
Fri Jun 6 06:53:02 UTC 2014


The following commit has been merged in the master branch:
commit 96a6de7277664c8ac69be0b9f791f6f4ff611fe8
Author: TANIGUCHI Takaki <takaki at asis.media-as.org>
Date:   Fri Jun 6 15:02:46 2014 +0900

    Imported Upstream version 2.1.1

diff --git a/README b/README
index 3941da1..d8dead5 100644
--- a/README
+++ b/README
@@ -96,6 +96,22 @@ Public Domain.
 history
 -------
 
+2.1.1
+- Added SurfMusik and Youtube plugin channels. Google/DMOZ removed.
+- Jamendo viewing now utilizes the v3.0 JSON API for genres/tracks
+  and uses cover images instead of favicons.
+- A new logo was introduced.
+- The reworked configuration dialog now provides editable lists for
+  player and recording apps configuration, a more descriptive options
+  pane, a better overview for enabled and available plugins (with fresh
+  meta comment blocks), and dropdowns instead of text-fields are used.
+- Internet-Radio parsing was fixed, a workaround for absent titles
+  added. Shoutcast also alternates between DOM and Regex fetching.
+- For Xiph browsing a custom caching API was introduced.
+- Status bar / download progress display was fixed.
+- A history plugin was added. And extension hooks{} support started.
+- Some more Python3 fixes applied. Documentation was adapted.
+
 2.1.0
 - support for running on Python3 or Python2,
   as well as Gtk3 (PyGI) and Gtk2 (PyGtk with Python2) bindings
diff --git a/_package.epm b/_package.epm
index a2db190..b87a857 100644
--- a/_package.epm
+++ b/_package.epm
@@ -1,5 +1,5 @@
 %product streamtuner2 - internet radio browser
-%version 2.1.0
+%version 2.1.1
 %vendor Mario Salzer
 %license
 %copyright Placed into the Public Domain, 2009-2014
@@ -47,31 +47,31 @@ f 644 root root /usr/share/streamtuner2/pq.py			./pq.py
 d 755 root root /usr/share/streamtuner2/channels		-
 f 644 root root /usr/share/streamtuner2/channels/__init__.py	./channels/__init__.py
 f 644 root root /usr/share/streamtuner2/channels/_generic.py	./channels/_generic.py
-f 644 root root /usr/share/streamtuner2/channels/shoutcast.py 	./channels/shoutcast.py
-f 644 root root /usr/share/streamtuner2/channels/shoutcast.png 	./channels/shoutcast.png
-f 644 root root /usr/share/streamtuner2/channels/xiph.py	./channels/xiph.py
-f 644 root root /usr/share/streamtuner2/channels/xiph.png 	./channels/xiph.png
-f 644 root root /usr/share/streamtuner2/channels/live365.py	./channels/live365.py
-f 644 root root /usr/share/streamtuner2/channels/live365.png 	./channels/live365.png
-f 644 root root /usr/share/streamtuner2/channels/google.py	./channels/google.py
-f 644 root root /usr/share/streamtuner2/channels/google.png	./channels/google.png
-f 644 root root /usr/share/streamtuner2/channels/punkcast.py	./channels/punkcast.py
-f 644 root root /usr/share/streamtuner2/channels/punkcast.png	./channels/punkcast.png
-#f 644 root root /usr/share/streamtuner2/channels/basicch.py 	./channels/basicch.py
-#f 644 root root /usr/share/streamtuner2/channels/basicch.png 	./channels/basicch.png
+f 644 root root /usr/share/streamtuner2/channels/internet_radio.py ./channels/internet_radio.py
+f 644 root root /usr/share/streamtuner2/channels/internet_radio.png ./channels/internet_radio.png
 f 644 root root /usr/share/streamtuner2/channels/jamendo.py 	./channels/jamendo.py
 f 644 root root /usr/share/streamtuner2/channels/jamendo.png 	./channels/jamendo.png
+f 644 root root /usr/share/streamtuner2/channels/live365.py	./channels/live365.py
+f 644 root root /usr/share/streamtuner2/channels/live365.png 	./channels/live365.png
+f 644 root root /usr/share/streamtuner2/channels/modarchive.py 	./channels/modarchive.py
+f 644 root root /usr/share/streamtuner2/channels/modarchive.png	./channels/modarchive.png
+f 644 root root /usr/share/streamtuner2/channels/musicgoal.py 	./channels/musicgoal.py
+f 644 root root /usr/share/streamtuner2/channels/musicgoal.png	./channels/musicgoal.png
 f 644 root root /usr/share/streamtuner2/channels/myoggradio.py 	./channels/myoggradio.py
 f 644 root root /usr/share/streamtuner2/channels/myoggradio.png	./channels/myoggradio.png
-f 644 root root /usr/share/streamtuner2/channels/internet_radio_org_uk.py ./channels/internet_radio_org_uk.py
-f 644 root root /usr/share/streamtuner2/channels/internet_radio_org_uk.png ./channels/internet_radio_org_uk.png
-f 644 root root /usr/share/streamtuner2/channels/timer.py 	./channels/timer.py
-f 644 root root /usr/share/streamtuner2/channels/links.py 	./channels/links.py
+f 644 root root /usr/share/streamtuner2/channels/punkcast.py	./channels/punkcast.py
+f 644 root root /usr/share/streamtuner2/channels/punkcast.png	./channels/punkcast.png
+f 644 root root /usr/share/streamtuner2/channels/shoutcast.py 	./channels/shoutcast.py
+f 644 root root /usr/share/streamtuner2/channels/shoutcast.png 	./channels/shoutcast.png
+f 644 root root /usr/share/streamtuner2/channels/surfmusik.py	./channels/surfmusik.py
+f 644 root root /usr/share/streamtuner2/channels/surfmusik.png	./channels/surfmusik.png
+f 644 root root /usr/share/streamtuner2/channels/xiph.py	./channels/xiph.py
+f 644 root root /usr/share/streamtuner2/channels/xiph.png 	./channels/xiph.png
+f 644 root root /usr/share/streamtuner2/channels/youtube.py	./channels/youtube.py
+f 644 root root /usr/share/streamtuner2/channels/youtube.png	./channels/youtube.png
 f 644 root root /usr/share/streamtuner2/channels/global_key.py 	./channels/global_key.py
-#f 644 root root /usr/share/streamtuner2/channels/tv.py 		./channels/tv.py
-#f 644 root root /usr/share/streamtuner2/channels/tv.png 	./channels/tv.png
-f 644 root root /usr/share/streamtuner2/channels/musicgoal.py 	./channels/musicgoal.py
-f 644 root root /usr/share/streamtuner2/channels/musicgoal.png	./channels/musicgoal.png
+f 644 root root /usr/share/streamtuner2/channels/links.py 	./channels/links.py
+f 644 root root /usr/share/streamtuner2/channels/timer.py 	./channels/timer.py
 #-- scripts
 #d 755 root root /usr/share/streamtuner2/scripts		-
 #f 644 root root /usr/share/streamtuner2/scripts/radiotop40_de.py  ./scripts/radiotop40_de.py
diff --git a/action.py b/action.py
index b0fc02f..fa2701b 100644
--- a/action.py
+++ b/action.py
@@ -4,15 +4,18 @@
 # type: functions
 # title: play/record actions
 # description: Starts audio applications, guesses MIME types for URLs
+# version: 0.7
 #
 #
-#  Multimedia interface for starting audio players or browser.
+#  Multimedia interface for starting audio players, recording app,
+#  or web browser (listed as "url/http" association in players).
 #
 #
 #  Each channel plugin has a .listtype which describes the linked
 #  audio playlist format. It's audio/x-scpls mostly, seldomly m3u,
 #  but sometimes url/direct if the entry[url] directly leads to the
 #  streaming server.
+#
 #  As fallback there is a regex which just looks for URLs in the
 #  given resource (works for m3u/pls/xspf/asx/...). There is no
 #  actual url "filename" extension guessing.
@@ -41,14 +44,15 @@ class action:
         # streamlink formats
         lt = {"asx":"video/x-ms-asf", "pls":"audio/x-scpls", "m3u":"audio/x-mpegurl", "xspf":"application/xspf+xml", "href":"url/http", "ram":"audio/x-pn-realaudio", "smil":"application/smil"}
         # media formats
-        mf = {"mp3":"audio/mp3", "ogg":"audio/ogg", "aac":"audio/aac"}
+        mf = {"mp3":"audio/mpeg", "ogg":"audio/ogg", "aac":"audio/aac"}
         
         
         # web
         @staticmethod
         def browser(url):
-            __print__( dbg.CONF, conf.browser )
-            action.run(conf.browser + " " + action.quote(url))
+            bin = conf.play.get("url/http", "sensible-browser")
+            __print__( dbg.CONF, bin )
+            action.run(bin + " " + action.quote(url))
 
 
             
@@ -63,15 +67,14 @@ class action:
 
         # calls player for stream url and format
         @staticmethod
-        def play(url, audioformat="audio/mp3", listformat="text/x-href"):
+        def play(url, audioformat="audio/mpeg", listformat="text/x-href"):
             if (url):
                 url = action.url(url, listformat)
-            if (audioformat):
-                if audioformat == "audio/mpeg":
-                    audioformat = "audio/mp3"  # internally we use the more user-friendly moniker
-                cmd = conf.play.get(audioformat, conf.play.get("*/*", "vlc %u"))
-                __print__( dbg.PROC,"play", url, cmd )
+            if audioformat == "audio/mp3":
+                audioformat = "audio/mpeg"
+            cmd = action.mime_match(audioformat, conf.play)
             try:
+                __print__( dbg.PROC, "play", url, cmd )
                 action.run( action.interpol(cmd, url) )
             except:
                 pass
@@ -88,13 +91,21 @@ class action:
 
         # streamripper
         @staticmethod
-        def record(url, audioformat="audio/mp3", listformat="text/x-href", append="", row={}):
+        def record(url, audioformat="audio/mpeg", listformat="text/x-href", append="", row={}):
             __print__( dbg.PROC, "record", url )
-            cmd = conf.record.get(audioformat, conf.record.get("*/*", None))
+            cmd = action.mime_match(audioformat, conf.record)
             try: action.run( action.interpol(cmd, url, row) + append )
             except: pass
 
 
+        # Convert MIME type into list of ["audio/xyz", "audio/*", "*/*"] for comparison against record/play association
+        @staticmethod
+        def mime_match(fmt, cmd_list):
+            for match in [ fmt, fmt[:fmt.find("/")] + "/*", "*/*" ]:
+                if cmd_list.get(match, None):
+                    return cmd_list[match]
+
+
         # save as .m3u
         @staticmethod
         def save(row, fn, listformat="audio/x-scpls"):
@@ -211,7 +222,7 @@ class action:
                 return re.findall("<Ref\s+href=\"(http://.+?)\"", http.get(pls))
             elif (re.search("\.m3u|\.ram|\.smil", pls)):	#audio/x-mpegurl
                 return re.findall("(http://[^\s]+)", http.get(pls), re.I)
-            else:  # just assume it was a direct mp3/ogg streamserver link
+            else:  # just assume it was a direct mpeg/ogg streamserver link
                 return [ (pls if pls.startswith("/") else http.fix_url(pls)) ]
             pass
 
diff --git a/ahttp.py b/ahttp.py
index 9720060..aa82676 100644
--- a/ahttp.py
+++ b/ahttp.py
@@ -43,13 +43,13 @@ def progress_feedback(*args):
 session = requests.Session()
 # default HTTP headers for requests
 session.headers.update({
-    "User-Agent": "streamtuner2/2.1 (X11; U; Linux AMD64; en; rv:1.5.0.1) like WinAmp/2.1 but not like Googlebot/2.1", #"Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6",
-    "Accept": "*/*;q=0.5, audio/*, url/*",
+    "User-Agent": "streamtuner2/2.1 (X11; U; Linux AMD64; en; rv:1.5.0.1) like WinAmp/2.1",
+    "Accept": "*/*;q=0.5, audio/*, video/*, json/*, url/*",
     "Accept-Language": "en-US,en,de,es,fr,it,*;q=0.1",
     "Accept-Encoding": "gzip,deflate",
     "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.1",
     "Keep-Alive": "115",
-    "Connection": "keep-alive",
+    "Connection": "close",
     "Pragma": "no-cache",
     "Cache-Control": "no-cache",
 })
@@ -61,10 +61,10 @@ session.headers.update({
 #  Well, it says "get", but it actually does POST and AJAXish GET requests too.
 #
 def get(url, params={}, referer="", post=0, ajax=0, binary=0, feedback=None):
-    __print__( dbg.HTTP, "GET", url)
+    __print__( dbg.HTTP, "GET", url, params )
 
     # statusbar info
-    progress_feedback(url, 0.1)
+    progress_feedback(url)
     
     # combine headers
     headers = {}
@@ -78,13 +78,16 @@ def get(url, params={}, referer="", post=0, ajax=0, binary=0, feedback=None):
         r = session.post(url, params=params, headers=headers)
     else:    
         r = session.get(url, params=params, headers=headers)
-        
+
+    #__print__( dbg.HTTP, r.request.headers );
+    #__print__( dbg.HTTP, r.headers );
+            
     # result
-    progress_feedback(0.9)
+    #progress_feedback(0.9)
     content = (r.content if binary else r.text)
     
     # finish, clean statusbar
-    progress_feedback()
+    progress_feedback("")
     __print__( dbg.INFO, "Content-Length", len(content) )
     return content
 
diff --git a/channels/__init__.py b/channels/__init__.py
index ab12809..39791e2 100644
--- a/channels/__init__.py
+++ b/channels/__init__.py
@@ -1,8 +1,63 @@
 #
 # encoding: UTF-8
+# api: streamtuner2
+# title: Plugin handling
+# description: Channels and feature plugins reside in channels/
 # api: python
 # type: R
+# category: core
+# priority: core
+#
+#
+#
+#
+#
 #
 
 
 from channels._generic import *
+
+# Only reexport plugin classes
+__all__ = [
+    "GenericChannel", "ChannelPlugin"
+]
+
+
+
+# Search through ./channels/ and get module basenames.
+# Also order them by conf.channel_order
+#
+def module_list():
+
+    # find plugin files
+    ls = os.listdir(conf.share + "/channels/")
+    ls = [fn[:-3] for fn in ls if re.match("^[a-z][\w\d_]+\.py$", fn)]
+    
+    # resort with tab order
+    order = [module.strip() for module in conf.channel_order.lower().replace(".","_").replace("-","_").split(",")]
+    ls = [module for module in (order) if (module in ls)] + [module for module in (ls) if (module not in order)]
+
+    return ls
+
+
+# Parse plugin comment blocks.
+#
+def module_meta():
+    meta = {}
+
+    rx_meta = re.compile(r"""^#\s*(\w+):\s*(.+)$""", re.M)
+
+    # Loop through all existing module.py scripts
+    for name in module_list():
+       meta[name] = dict(title="", type="", description="")
+
+       # Read and regex-extract into dict
+       with open("%s/channels/%s.py" % (conf.share, name)) as f:
+           for field in re.findall(rx_meta, f.read(1024)):
+               meta[name][field[0]] = field[1]
+
+    return meta
+
+
+
+
diff --git a/channels/_generic.py b/channels/_generic.py
index daf12ec..c0db09d 100644
--- a/channels/_generic.py
+++ b/channels/_generic.py
@@ -1,12 +1,14 @@
 #
 # encoding: UTF-8
 # api: streamtuner2
-# type: class
+# type: internal
+# category: ui
 # title: channel objects
 # description: base functionality for channel modules
-# version: 1.0
+# version: 1.1
 # author: mario
 # license: public domain
+# priority: core
 #
 #
 #  GenericChannel implements the basic GUI functions and defines
@@ -45,15 +47,14 @@ class struct(dict):
 class GenericChannel(object):
 
         # desc
-        api = "streamtuner2"
         module = "generic"
         title = "GenericChannel"
-        version = 1.0
         homepage = "http://milki.inlcude-once.org/streamtuner2/"
         base_url = ""
         listformat = "audio/x-scpls"
-        audioformat = "audio/mp3" # fallback value
+        audioformat = "audio/mpeg" # fallback value
         config = []
+        has_search = False
 
         # categories
         categories = ["empty", ]
@@ -162,7 +163,7 @@ class GenericChannel(object):
             if (self.current):
                 self.load(self.current)
             else:
-                mygtk.columns(self.gtk_list, self.datamap, [{}])
+                mygtk.columns(self.gtk_list, self.datamap, [])
                 
             # add to main menu
             mygtk.add_menu(parent.channelmenuitems, self.title, lambda w: parent.channel_switch(w, self.module) or 1)
@@ -184,12 +185,24 @@ class GenericChannel(object):
         
             # get data from cache or download
             if (force or not category in self.streams):
+                __print__(dbg.PROC, "load", "update_streams")
+                self.parent.status("Updating streams...")
+                self.parent.status(-0.1)
                 new_streams = self.update_streams(category)
       
                 if new_streams:
-                
-                    # modify
-                    [self.postprocess(row) for row in new_streams]
+
+                    # check and modify entry;
+                    # assert that title and url are present
+                    modified = []
+                    for row in new_streams:
+                        if len(set(["", None]) & set([row.get("title"), row.get("url")])):
+                            continue
+                        try:
+                            modified.append( self.postprocess(row) )
+                        except Exception as e:
+                            __print__(e, dbg.ERR, row)
+                    new_streams = modified
       
                     # don't lose forgotten streams
                     if conf.retain_deleted:
@@ -220,6 +233,8 @@ class GenericChannel(object):
 
             # set pointer
             self.current = category
+            self.parent.status("")
+            self.parent.status(1.0)
             pass
             
         # store current streams data
@@ -244,7 +259,13 @@ class GenericChannel(object):
 
         
         # prepare data for display
+        #
+        #  - favourite icon
+        #  - or deleted icon
+        #
         def prepare(self, streams):
+            #__print__(dbg.PROC, "prepare", streams)
+
             for i,row in enumerate(streams):
                                             # oh my, at least it's working
                                             # at start the bookmarks module isn't fully registered at instantiation in parent.channels{} - might want to do that step by step rather
@@ -266,15 +287,27 @@ class GenericChannel(object):
                 
                 # favicons?
                 if conf.show_favicons:
-                    homepage_url = row.get("homepage")
-                    # check for availability of PNG file, inject local icons/ filename
-                    if homepage_url and favicon.available(homepage_url):
-                        streams[i]["favicon"] = favicon.file(homepage_url)
+                
+                    # entry provides its own image
+                    if "img" in row:
+                        favicon_url = row["img"]
+                        streams[i]["favicon"] = favicon.localcopy(favicon_url)
+                    
+                    # get actual homepage favicon.png
+                    elif "homepage" in row:
+                        homepage_url = row.get("homepage")
+                        # check for availability of PNG file, inject local icons/ filename
+                        if homepage_url and favicon.available(homepage_url):
+                            streams[i]["favicon"] = favicon.file(homepage_url)
                 
             return streams
 
     
-        # data preparations directly after reload        
+        # data preparations directly after reload
+        #
+        # - drop shoutcast homepage links
+        # - or find homepage name in title
+        #
         def postprocess(self, row):
 
             # remove non-homepages from shoutcast
@@ -402,9 +435,9 @@ class GenericChannel(object):
             s = s.lower().strip()
             # rename
             map = {
-                "audio/mpeg":"audio/mp3",  # Note the real mime type is /mpeg, but /mp3 is more understandable in the GUI
+                "audio/mp3":"audio/mpeg",  # Note the real mime type is /mpeg, but /mp3 is more understandable in the GUI
                 "ogg":"ogg", "ogm":"ogg", "xiph":"ogg", "vorbis":"ogg", "vnd.xiph.vorbis":"ogg",
-                "mpeg":"mp3", "mp":"mp3", "mp2":"mp3", "mpc":"mp3", "mps":"mp3",
+                "mp3":"mpeg", "mp":"mpeg", "mp2":"mpeg", "mpc":"mpeg", "mps":"mpeg",
                 "aac+":"aac", "aacp":"aac",
                 "realaudio":"x-pn-realaudio", "real":"x-pn-realaudio", "ra":"x-pn-realaudio", "ram":"x-pn-realaudio", "rm":"x-pn-realaudio",
                 # yes, we do video
diff --git a/channels/file.py b/channels/file.py
index b4dd2f4..05f2e3a 100644
--- a/channels/file.py
+++ b/channels/file.py
@@ -1,13 +1,12 @@
 #
 # api: streamtuner2
-# title: file browser plugin
-# description: browses through local files, displays mp3/oggs and m3u/pls files
-# version: -0.5
+# title: File browser
+# description: Displays mp3/oggs or m3u/pls files from local media file directories.
+# type: channel
+# category: media
+# version: 0.0
+# priority: optional
 # depends: mutagen, kiwi
-# x:
-# x:
-# x:
-# x:
 #
 #
 # Local file browser.
diff --git a/channels/global_key.py b/channels/global_key.py
index 046587b..5f509ed 100644
--- a/channels/global_key.py
+++ b/channels/global_key.py
@@ -1,9 +1,11 @@
 #
-# type: feature
 # api: streamtuner2
-# title: global keyboard shortcut
-# description: allows switching radios in bookmarks list via key press
+# title: Global keyboard shortcut
+# description: Allows switching between bookmarked radios via key press.
+# type: feature
+# category: ui
 # version: 0.2
+# priority: extra
 # depends: python-keybinder
 #
 #
@@ -27,7 +29,6 @@ class global_key(object):
 
     module = "global_key"
     title = "keyboard shortcut"
-    version = 0.2
     
     config = [
         dict(name="switch_key", type="text", value="XF86Forward", description="global key for switching radio"),
diff --git a/channels/google.png b/channels/google.png
deleted file mode 100644
index 9b5e2ea..0000000
Binary files a/channels/google.png and /dev/null differ
diff --git a/channels/google.py b/channels/google.py
deleted file mode 100644
index a1300a3..0000000
--- a/channels/google.py
+++ /dev/null
@@ -1,166 +0,0 @@
-#
-# encoding: ISO-8859-1
-# api: streamtuner2
-# title: google stations
-# description: Looks up web radio stations from DMOZ/Google directory
-# depends: channels, re, http
-# version: 0.1
-# author: Mario, original: Jean-Yves Lefort
-#
-# This is a plugun from streamtuner1. It has been rewritten for the
-# more mundane plugin API of streamtuner2 - reimplementing ST seemed
-# to much work.
-# Also it has been rewritten to query DMOZ directly. Google required
-# the use of fake User-Agents for access, and the structure on DMOZ
-# is simpler (even if less HTML-compliant). DMOZ probably is kept
-# more up-to-date as well.
-# PS: we need to check out //musicmoz.org/
-#
-
-
-# Copyright (c) 2003, 2004 Jean-Yves Lefort
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-# 3. Neither the name of Jean-Yves Lefort nor the names of its contributors
-#    may be used to endorse or promote products derived from this software
-#    without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-
-import re, os, gtk
-from channels import *
-from xml.sax.saxutils import unescape as entity_decode, escape as xmlentities
-import ahttp as http
-
-
-### constants #################################################################
-
-
-GOOGLE_DIRECTORY_ROOT	= "http://www.dmoz.org"
-CATEGORIES_URL_POSTFIX	= "/Arts/Radio/Internet/"
-#GOOGLE_DIRECTORY_ROOT	= "http://directory.google.com"
-#CATEGORIES_URL_POSTFIX	= "/Top/Arts/Music/Sound_Files/MP3/Streaming/Stations/"
-GOOGLE_STATIONS_HOME	= GOOGLE_DIRECTORY_ROOT + CATEGORIES_URL_POSTFIX
-
-"""<li><a href="/Arts/Music/Sound_Files/MP3/Streaming/Stations/Jazz/"><b>Jazz</b></a>"""
-re_category	= re.compile('<a href="(.+)">()([^:]+?)()</a>@', re.I|re.M)
-
-#re_stream	= re.compile('^<td><font face="arial,sans-serif"><a href="(.*)">(.*)</a>')
-#re_description	= re.compile('^<br><font size=-1> (.*?)</font>')
-"""<li><a href="http://www.atlantabluesky.com/">Atlanta Blue Sky</a> - Rock and alternative streaming audio. Live real-time requests."""
-re_stream_desc	= re.compile('<li>\s*<a href="(.*)" class="listinglink">([^<>]+)</a>\s*( - )?\s*([^<>\n\r]+)', re.M|re.I)
-
-
-######
-
-
-# Google Stations is actually now DMOZ Stations
-class google(ChannelPlugin):
-
-    # description
-    title = "Google"
-    module = "google"
-    homepage = GOOGLE_STATIONS_HOME
-    version = 0.2
-    
-    # config data
-    config = [
-#        {"name": "theme", "type": "text", "value":"Tactile", "description":"Streamtuner2 theme; no this isn't a google-specific option. But you know, the plugin options are a new toy."},
-#        {"name": "flag2", "type": "boolean", "value":1, "description":"oh see, an unused checkbox"}
-    ]
-    
-
-    # category map
-    categories = ['Google/DMOZ Stations', 'Alternative', 'Ambient', 'Classical', 'College', 'Country', 'Dance', 'Experimental', 'Gothic', 'Industrial', 'Jazz', 'Local', 'Lounge', 'Metal', 'New Age', 'Oldies', 'Old-Time Radio', 'Pop', 'Punk', 'Rock', '80s', 'Soundtracks', 'Talk', 'Techno', 'Urban', 'Variety', 'World']
-    catmap = [('Google/DMOZ Stations', '__main', '/Arts/Radio/Internet/'), ['Alternative', 'Alternative', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Alternative/'], ['Ambient', 'Ambient', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Ambient/'], ['Classical', 'Classical', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Classical/'], ['College', 'College', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/College/'], ['Country', 'Country', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Country/'], ['Dance', 'Dance', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Dance/'], ['Experimental', 'Experimental', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Experimental/'], ['Gothic', 'Gothic', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Gothic/'], ['Industrial', 'Industrial', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Industrial/'], ['Jazz', 'Jazz', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Jazz/'], ['Local', 'Local', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Local/'], ['Lounge', 'Lounge', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Lounge/'], ['Metal', 'Metal', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Metal/'], ['New Age', 'New Age', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/New_Age/'], ['Oldies', 'Oldies', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Oldies/'], ['Old-Time Radio', 'Old-Time Radio', '/Arts/Radio/Formats/Old-Time_Radio/Streaming_MP3_Stations/'], ['Pop', 'Pop', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Pop/'], ['Punk', 'Punk', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/Punk/'], ['Rock', 'Rock', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Rock/'], ['80s', '80s', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/80s/'], ['Soundtracks', 'Soundtracks', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Soundtracks/'], ['Talk', 'Talk', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Talk/'], ['Techno', 'Techno', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Dance/Techno/'], ['Urban', 'Urban', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Urban/'], ['Variety', 'Variety', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/Variety/'], ['World', 'World', '/Arts/Music/Sound_Files/MP3/Streaming/Stations/World/']]
-
-
-    #def __init__(self, parent):
-    #    #self.update_categories()
-    #    ChannelPlugin.__init__(self, parent)
-
-
-    # refresh category list
-    def update_categories(self):
-    
-        # interim data structure for categories (label, google-id/name, url)
-        categories = [
-            ("Google/DMOZ Stations", "__main", "/Arts/Radio/Internet/"),
-        ]
-        
-        # fetch and extract list
-        html = http.get(GOOGLE_DIRECTORY_ROOT + CATEGORIES_URL_POSTFIX)
-
-        for row in re_category.findall(html):
-            if row:
-                name = entity_decode(row[2])
-                label = name
-
-                href = entity_decode(row[0])
-                if href[0] != "/":
-                    href = CATEGORIES_URL_POSTFIX + href
-                   
-                categories.append([label, name, href])
-
-        # return
-        self.catmap = categories
-        self.categories = [x[0] for x in categories]
-        pass
-        # actually saving this into _categories and _catmap.json would be nice
-        # ...
-
-
-
-    # download links from dmoz listing
-    def update_streams(self, cat, force=0):
-
-        # result list
-        ls = []    
-        
-        # get //dmoz.org/HREF for category name
-        try:
-            (label, name, href) = [x for x in self.catmap if x[0]==cat][0]
-        except:
-            return ls  # wrong category
-
-        # download
-        html = http.get(GOOGLE_DIRECTORY_ROOT + href)
-        
-        # filter
-        for row in re_stream_desc.findall(html):
-            
-            if row:
-                row = {
-                    "homepage": entity_decode(row[0]),
-                    "title": entity_decode(row[1]),
-                    "playing": entity_decode(row[3]),
-                }
-                ls.append(row)
-
-
-        # final list for current category
-        return ls
-        
-
-
diff --git a/channels/history.py b/channels/history.py
new file mode 100644
index 0000000..926aab6
--- /dev/null
+++ b/channels/history.py
@@ -0,0 +1,80 @@
+#
+# api: streamtuner2
+# title: History
+# description: List recently played stations under favourites > history.
+# version: 1.0
+# type: category
+# category: ui
+# priority: optional
+# 
+# Lists last activated streams in a new [history] tab in the favourites
+# channel.
+#
+#
+#
+
+
+
+from config import conf, __print__, dbg
+from channels import *
+
+
+
+class history:
+
+    # plugin info
+    module = "history"
+    title = "History"
+    
+    
+    # configuration settings
+    config = [
+        {
+            "name": "history",
+            "type": "int",
+            "value": "20",
+            "description": "Number of last played streams to keep in history list.",
+            "category": "limit"
+        }
+    ]
+    
+    # store
+    bm = None
+
+
+    # hook up to main tab
+    def __init__(self, parent):
+
+        # keep reference to main window    
+        self.bm = parent.channels["bookmarks"]
+
+        # create category
+        self.bm.add_category("history");
+
+        # hook up to .play event
+        parent.hooks["play"].append(self.queue)
+
+        
+    # add to favourites/history stream list
+    def queue(self, row):
+    
+        # assert a present store
+        streams = self.bm.streams
+        if not "history" in streams:
+            streams["history"] = []
+        hist = streams["history"]
+
+        # only new entries get added
+        if not row in hist:
+            hist.insert(0, row)
+        
+        # limit number of entries
+        max = int(conf.history)
+        while max > 0 and  len(hist) > max:
+            hist.pop()
+
+        # update store
+        self.bm.save()
+        #if self.bm.current == "history":
+        #   self.bm.load("history")
+
diff --git a/channels/internet_radio_org_uk.png b/channels/internet_radio.png
similarity index 100%
rename from channels/internet_radio_org_uk.png
rename to channels/internet_radio.png
diff --git a/channels/internet_radio.py b/channels/internet_radio.py
new file mode 100644
index 0000000..3a7425a
--- /dev/null
+++ b/channels/internet_radio.py
@@ -0,0 +1,271 @@
+#
+# api: streamtuner2
+# title: Internet-Radio.com
+# description: Broad list of webradios from all genres.
+# type: channel
+# category: radio
+# version: 1.1
+# priority: standard
+#
+# Internet-Radio.co.uk/.com is one of the largest directories of streams.
+# Available music genre classifications are mirrored verbatim and flatly.
+#
+# The new version of this plugin alternates between PyQuery and Regex
+# station extraction. Both overlook some paid or incomplete entries.
+# HTTP retrieval happens in one batch, determined by the number of pages
+# setting, rather than the global max_streams option.
+#
+#
+#
+#
+#
+
+
+
+from channels import *
+import re
+from config import conf, __print__, dbg
+import ahttp as http
+from pq import pq
+
+
+
+
+# streams and gui
+class internet_radio (ChannelPlugin):
+
+
+    # description
+    title = "InternetRadio"
+    module = "internet_radio"
+    homepage = "http://www.internet-radio.org.uk/"
+    listformat = "audio/x-scpls"
+    
+    # settings
+    config = [
+        {
+            "name": "internetradio_max_pages",
+            "type": "int",
+            "value": 5,
+            "category": "limit",
+            "description": "How many pages to fetch and read.",
+        },
+    ]
+    
+
+    # category map
+    categories = []
+    current = ""
+    default = ""
+
+
+    # load genres
+    def update_categories(self):
+    
+        html = http.get(self.homepage)
+        rx = re.compile("""<option[^>]+value="/stations/[-+&.\w\s%]+/">([^<]+)</option>""")
+        
+        self.categories = rx.findall(html)
+
+
+    # fetch station lists
+    def update_streams(self, cat, force=0):    
+    
+        entries = []
+        if cat not in self.categories:
+            return []
+
+        rx_pages = re.compile('href="/stations/[-+\w%\d\s]+/page(\d+)">\d+</a>')
+
+        # Fetch multiple pages at once
+        html = []
+        max_pages = max(int(conf.internetradio_max_pages), 1)
+        for page in range(1, max_pages):
+        
+            # Append HTML source
+            html.append(
+                http.get(
+                    self.homepage + "stations/" +
+                    cat.lower().replace(" ", "%20") +
+                    "/" + ("page"+str(page) if page>1 else "")
+                )
+            )
+            
+            # Is there a next page?
+            if str(page+1) not in rx_pages.findall(html[-1]):
+                break
+            self.parent.status(float(page)/float(max_pages+1))
+
+        # Alternatively try regex or pyquery parsing
+        #__print__(dbg.HTTP, html)
+        for use_rx in [not conf.pyquery, conf.pyquery]:
+            try:
+                entries = (self.with_regex(html) if use_rx else self.with_dom(html))
+                if len(entries):
+                    break
+            except Exception as e:
+                __print__(dbg.ERR, e)
+                continue
+            
+        # fin
+        return entries
+
+    # Advertised 
+    """
+    <tr valign="top" class="stream">
+    <td class="listing1" width="120" align="center">
+    <a onClick="return popitup('/player/?mount=http://uk2.internet-radio.com:31076/listen.pls&title=Box Uk Radio Danceradiouk&website=http://danceradiouk.com ')"
+       href="/player/?mount=http://uk2.internet-radio.com:31076/listen.pls&title=Box Uk Radio Danceradiouk&website=http://danceradiouk.com ">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-flash" alt="Flash Player"></a>
+       <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - M3U', 'http://uk2.internet-radio.com:31076/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://uk2.internet-radio.com:31076/listen.pls&t=.m3u">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-wmp" alt="Windows Media Player"></a>
+       <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - PLS', 'http://uk2.internet-radio.com:31076/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://uk2.internet-radio.com:31076/listen.pls&t=.pls">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-winamp" alt="Winamp">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-itunes" alt="iTunes"></a>
+       <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - RAM', 'http://uk2.internet-radio.com:31076/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://uk2.internet-radio.com:31076/listen.pls&t=.ram">
+       <img src="/images/blank.gif" class="sprite sprite-realplayer" alt="Realplayer"></a><br>
+       <div style="margin-top: 10px;"><a href="/stations/80s/">80s</a> <a href="/stations/90s/">90s</a> 00s <a href="/stations/rock/">Rock</a> <a href="/stations/disco/">Disco</a> <a href="/stations/pop/">Pop</a> </div></td>
+    <td class="listing2" ><img src="/images/icons/award_star_silver_1.png" alt="Featured" width="16" height="16">
+       <a href="/station/danceradioukchatbox/" style="font-weight:bold;">Box Uk Radio Danceradiouk</a>
+    <br>Bow Wow Wow - I Want Candy
+    <br><a onClick="_gaq.push(['_trackEvent','Link', 'Station Link', 'http://danceradiouk.com ']);"
+       class="url" href="http://danceradiouk.com " title="Box Uk Radio Danceradiouk" target="_blank">http://danceradiouk.com </a>
+    </td><td class="listing1" align="right" width="100">
+    128 Kbps<br>22 Listeners<br>
+    <img src="/images/blank.gif" class="sprite sprite-de" alt="Germany"><img src="/images/blank.gif" class="sprite sprite-cy" alt="Cyprus">
+    <img src="/images/blank.gif" class="sprite sprite-se" alt="Sweden"><img src="/images/blank.gif" class="sprite sprite-gb" alt="United Kingdom">
+    <img src="/images/blank.gif" class="sprite sprite-rw" alt="Rwanda"><img src="/images/blank.gif" class="sprite sprite-mx" alt="Mexico">
+    <img src="/images/blank.gif" class="sprite sprite-ru" alt="Russian Federation"><img src="/images/blank.gif" class="sprite sprite-si" alt="Slovenia">
+    <img src="/images/blank.gif" class="sprite sprite-ca" alt="Canada"><img src="/images/blank.gif" class="sprite sprite-tt" alt="Trinidad and Tobago">
+    <img src="/images/blank.gif" class="sprite sprite-ch" alt="Switzerland"><img src="/images/blank.gif" class="sprite sprite-hu" alt="Hungary">
+    <img src="/images/blank.gif" class="sprite sprite-lt" alt="Lithuania">
+    </td></tr>
+    """
+    # Normal
+    """
+    <tr valign="top" class="stream">
+    <td class="listing1" width="120" align="center">
+    <img style="margin-right: 6px;" src="/images/icons/blank.png" alt="Blank">
+    <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - M3U', 'http://80.86.106.136:80/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://80.86.106.136:80/listen.pls&t=.m3u">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-wmp" alt="Windows Media Player"></a>
+       <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - PLS', 'http://80.86.106.136:80/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://80.86.106.136:80/listen.pls&t=.pls">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-winamp" alt="Winamp">
+       <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-itunes" alt="iTunes"></a>
+       <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - RAM', 'http://80.86.106.136:80/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://80.86.106.136:80/listen.pls&t=.ram">
+       <img src="/images/blank.gif" class="sprite sprite-realplayer" alt="Realplayer"></a>
+       <br><div style="margin-top: 10px;">Top 40 </div></td>
+    <td class="listing2" ><img src="/images/icons/award_star_bronze_1.png" alt="Recommended" width="16" height="16">
+       <a href="/station/kissfmromania/" style="font-weight:bold;">KissFM Romania - www.kissfm.ro</a>
+    ---ALTERNATIVELY--- <span style="color: #c00;"><b> TDI Radio MP3 48kbps</b></span>
+    <br><a onClick="_gaq.push(['_trackEvent','Link', 'Station Link', 'http://www.kissfm.ro']);"
+       class="url" href="http://www.kissfm.ro" title="KissFM Romania - www.kissfm.ro" target="_blank">http://www.kissfm.ro</a>
+    </td><td class="listing1" align="right" width="100">
+    32 Kbps<br>5716 Listeners<br>
+    </td></tr>
+    """
+    # Variation
+    """
+    <td class="listing1" width="120" align="center">
+    <img style="margin-right: 6px;" src="/images/icons/blank.png" alt="Blank">
+      <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - M3U', 'http://colostreaming.com:8092/listen.pls']);"
+       href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://colostreaming.com:8092/listen.pls&t=.m3u">
+      <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-wmp" alt="Windows Media Player"></a>
+      <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - PLS', 'http://colostreaming.com:8092/listen.pls']);" 
+      href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://colostreaming.com:8092/listen.pls&t=.pls">
+      <img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-winamp" alt="Winamp"><img style="margin-right: 6px;" src="/images/blank.gif" class="sprite sprite-itunes" alt="iTunes"></a>
+      <a onClick="_gaq.push(['_trackEvent', 'TuneIn', 'Play - RAM', 'http://colostreaming.com:8092/listen.pls']);" href="http://servers.internet-radio.com/tools/playlistgenerator/?u=http://colostreaming.com:8092/listen.pls&t=.ram"><img src="/images/blank.gif" class="sprite sprite-realplayer" alt="Realplayer"></a>
+    <br><div style="margin-top: 10px;">Poprock <a href="/stations/dance/">Dance</a> 50s Various </div></td>
+    <td class="listing2" ><img src="/images/icons/award_star_bronze_1.png" alt="Recommended" width="16" height="16">
+      <span style="color: #c00;"><b> Jack and Jill Radio Pop Rock Dance 50s Big Band Classical Country Folk Jazz Blue</b></span>
+    <br>Vince Gill - When Love Finds You - (Album)When Love Finds You - 1994 Countr
+    <br><a onClick="_gaq.push(['_trackEvent','Link', 'Station Link', 'http://www.jackandjillradio.com']);"
+     class="url" href="http://www.jackandjillradio.com" title="Jack and Jill Radio Pop Rock Dance 50s Big Band Classical Country Folk Jazz Blues Its All Here!" target="_blank">http://www.jackandjillradio.com</a>
+    </td><td class="listing1" align="right" width="100">
+    24 Kbps<br></td>
+    """
+
+    # Regex extraction
+    def with_regex(self, html):
+        __print__(dbg.PROC, "internet-radio, regex")
+        r = []
+        html = "\n".join(html)
+        
+        # Break up into <tr> blocks before extracting bits
+        rx_tr = re.compile("""<tr[^>]*>(.+?)</tr>""", re.S)
+        rx_data = re.compile(r"""
+               \?u=(https?://[^'">]+/listen\.pls)       
+               .*?
+               <div[^>]+10px[^>]+>(.+?)</div>           
+               .*?
+               listing2
+               .*?
+               (?:href="/station/[^>]+> | <b>) ([^<>]+) </[ab]>
+               (?:\s*</span>\s*)*
+               (?:<br>\s*([^<>]+)\s*<br>)?                
+               .*?
+               (?:<a[^>]+class="url"[^>]+href="([^<">]+)")?  
+               .+
+               listing1
+               .*?
+               (?:(\d+)\s+Kbps \s*<br>\s*)?                  
+               (?:(\d+)\s+Listeners)?
+               (?:\s*<br>\s*)?
+               \s*</td>             
+        """, re.S|re.X)
+
+        for div in rx_tr.findall(html):
+            if div.find('id="pagination"') < 0:
+                #__print__(dbg.DATA, len(div))
+                uu = rx_data.search(div)
+                if uu:
+                    (url, genres, title, playing, homepage, bitrate, listeners) = uu.groups()
+                    
+                    # transform data
+                    r.append({
+                        "url": url,
+                        "genre": self.strip_tags(genres),
+                        "homepage": http.fix_url(homepage),
+                        "title": (title if title else "").strip(),
+                        "playing": (playing if playing else "").strip(),
+                        "bitrate": int(bitrate if bitrate else 0),
+                        "listeners": int(listeners if listeners else 0),
+                        "format": "audio/mpeg", # there is no stream info on that, but internet-radio.org.uk doesn't seem very ogg-friendly anyway, so we assume the default here
+                    })
+                else:
+                    __print__(dbg.ERR, "rx missed", div)
+        return r
+
+
+    # DOM traversing
+    def with_dom(self, html_list):
+        __print__(dbg.PROC, "internet-radio, dom")
+        rx_numbers = re.compile("(\d+)")
+        r = []
+        for html in html_list:
+            # the streams are arranged in table rows
+            doc = pq(html)
+            for dir in (pq(e) for e in doc("tr.stream")):
+                
+                bl = dir.find("td[align=right]").text()
+                bl = rx_numbers.findall(str(bl) + " 0 0")
+                
+                r.append({
+                    "title": dir.find("b").text(),
+                    "homepage": http.fix_url(dir.find("a.url").attr("href")),
+                    "url": dir.find("a").eq(2).attr("href"),
+                    "genre": dir.find("td").eq(0).text(),
+                    "bitrate": int(bl[0]),
+                    "listeners": int(bl[1]),
+                    "format": "audio/mpeg",
+                    "playing": dir.find("td").eq(1).children().remove().end().text()[13:].strip(),
+                })
+        return r
+            
+
+
diff --git a/channels/internet_radio_org_uk.py b/channels/internet_radio_org_uk.py
deleted file mode 100644
index 36a3ea8..0000000
--- a/channels/internet_radio_org_uk.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#
-# api: streamtuner2
-# title: internet-radio.org.uk
-# description: io channel
-# version: 0.1
-#
-#
-# Might become new main plugin
-#
-#
-#
-
-
-
-from channels import *
-import re
-from config import conf, __print__, dbg
-import ahttp as http
-from pq import pq
-
-
-
-
-# streams and gui
-class internet_radio_org_uk (ChannelPlugin):
-
-
-    # description
-    title = "InternetRadio"
-    module = "internet_radio_org_uk"
-    homepage = "http://www.internet-radio.org.uk/"
-    version = 0.1
-    listformat = "audio/x-scpls"
-    
-    # settings
-    config = [
-        {"name":"internetradio_max_pages", "type":"int", "value":5, "description":"How many pages to fetch and read."},
-    ]
-    
-
-    # category map
-    categories = []
-    current = ""
-    default = ""
-
-
-    # load genres
-    def update_categories(self):
-    
-        html = http.get(self.homepage)
-        rx = re.compile("""<option[^>]+value="/stations/[-+&.\w\s%]+/">([^<]+)</option>""")
-        
-        self.categories = rx.findall(html)
-
-
-
-
-
-    # fetch station lists
-    def update_streams(self, cat, force=0):    
-    
-        entries = []
-        if cat not in self.categories:
-            return []
-            
-        # regex
-        #rx_div = re.compile('<tr valign="top" class="stream">(.+?)</tr>', re.S)
-        rx_data = re.compile("""
-		(?:M3U|PLS)',\s*'(http://[^']+)'
-		.*?
-		<br><br>([^\n]*?)</td>
-		.*?
-		(?:href="(http://[^"]+)"[^>]+target="_blank"[^>]*)?
-		>\s*
-		<b>\s*(\w[^<]+)[<\n]
-		.*?
-		playing\s*:\s*([^<\n]+)
-		.*?
-                (\d+)\s*Kbps
-                (?:<br>(\d+)\s*Listeners)?
-        """, re.S|re.X)
-        #rx_homepage = re.compile('href="(http://[^"]+)"[^>]+target="_blank"')
-        rx_pages = re.compile('href="/stations/[-+\w%\d\s]+/page(\d+)">\d+</a>')
-        rx_numbers = re.compile("(\d+)")
-        self.parent.status("downloading category pages...")
-
-
-        # multiple pages
-        page = 1
-        max = int(conf.internetradio_max_pages)
-        max = (max if max > 1 else 1)
-        while page <= max:
-        
-            # fetch
-            html = http.get(self.homepage + "stations/" + cat.lower().replace(" ", "%20") + "/" + ("page"+str(page) if page>1 else ""))
-
-
-            # regex parsing?
-            if not conf.pyquery:            
-                # step through
-                for uu in rx_data.findall(html):
-                    (url, genre, homepage, title, playing, bitrate, listeners) = uu
-                    
-                    # transform data
-                    entries.append({
-                        "url": url,
-                        "genre": self.strip_tags(genre),
-                        "homepage": http.fix_url(homepage),
-                        "title": title,
-                        "playing": playing,
-                        "bitrate": int(bitrate),
-                        "listeners": int(listeners if listeners else 0),
-                        "format": "audio/mp3", # there is no stream info on that, but internet-radio.org.uk doesn't seem very ogg-friendly anyway, so we assume the default here
-                    })
-
-            # DOM parsing
-            else:
-                # the streams are arranged in table rows
-                doc = pq(html)
-                for dir in (pq(e) for e in doc("tr.stream")):
-                    
-                    bl = dir.find("td[align=right]").text()
-                    bl = rx_numbers.findall(str(bl) + " 0 0")
-                    
-                    entries.append({
-                        "title": dir.find("b").text(),
-                        "homepage": http.fix_url(dir.find("a.url").attr("href")),
-                        "url": dir.find("a").eq(2).attr("href"),
-                        "genre": dir.find("td").eq(0).text(),
-                        "bitrate": int(bl[0]),
-                        "listeners": int(bl[1]),
-                        "format": "audio/mp3",
-                        "playing": dir.find("td").eq(1).children().remove().end().text()[13:].strip(),
-                    })
-            
-            # next page?
-            if str(page+1) not in rx_pages.findall(html):
-                max = 0
-            else:
-                page = page + 1
-
-            # keep listview updated while searching
-            self.update_streams_partially_done(entries)
-            try: self.parent.status(float(page)/float(max))
-            except: """there was a div by zero bug report despite max=1 precautions"""
-            
-        # fin
-        self.parent.status()
-        return entries
-
-
diff --git a/channels/jamendo.py b/channels/jamendo.py
index 2d4c39d..7c31188 100644
--- a/channels/jamendo.py
+++ b/channels/jamendo.py
@@ -1,28 +1,43 @@
 
 # api: streamtuner2
-# title: jamendo browser
+# title: Jamendo
+# description: A license-free music collection and artist hub.
+# type: channel
+# version: 2.2
+# category: radio
+# depends: json
+# priority: default
 #
-# For now this is really just a browser, doesn't utilizt the jamendo API yet.
-# Requires more rework of streamtuner2 list display to show album covers.
+# Now utilizes the Jamendo /v3.0/ API.
 #
-# Recently required an API key as well. Thus probably will remain a stub.
+# Radio station lists are fixed for now. Querying the API twice per station
+# doesn't seem overly sensible.
 #
+# Tracks are queried by genre, where currently there's just a small built-in
+# tag list in ST2
 #
+# Per default Ogg Vorbis is used as streaming format. Playlists and albums
+# return as XSPF playlists.
+#
+#
+# The v3.0 streaming URLs don't seem to work. Therefore some /get2 URLs will
+# be used.
+#
+#  [x]  http://api.jamendo.com/v3.0/playlists/file?client_id=&id=
+#  [+]  http://storage-new.newjamendo.com/?trackid=792843&format=ogg2&u=0
+#  [+]  http://api.jamendo.com/get2/stream/track/xspf/?playlist_id=171574&n=all&order=random
+#  [+]  http://api.jamendo.com/get2/stream/track/xspf/?album_id=%s&streamencoding=ogg2&n=all
+#
+# Seem to resolve to OGG Vorbis each.
+#
+
 
 
 import re
 import ahttp as http
-from config import conf
+from config import conf, __print__, dbg
 from channels import *
-from xml.sax.saxutils import unescape
-
-
-
-
-
-
-
-
+import json
 
 
 
@@ -36,133 +51,343 @@ class jamendo (ChannelPlugin):
     title = "Jamendo"
     module = "jamendo"
     homepage = "http://www.jamendo.com/"
-    version = 0.2
+    version = 0.3
+    has_search = True
 
     base = "http://www.jamendo.com/en/"
     listformat = "url/http"
+    api_base = "http://api.jamendo.com/v3.0/"
+    cid = "49daa4f5"
 
-    categories = []  #"top 100", "reload category tree!", ["menu > channel > reload.."]]
-    titles = dict( title="Artist", playing="Album/Song", bitrate=False, listeners=False )
+    categories = []
+
+    titles = dict( title="Title", playing="Album/Artist/User", bitrate=False, listeners=False )
  
     config = [
-        {"name":"jamendo_stream_format", "value":"ogg2", "type":"text", "description":"streaming format, 'ogg2' or 'mp31'"}
+        {"name":"jamendo_stream_format",
+         "value":"ogg",
+         "type": "select",
+         "select": "ogg=Ogg Vorbis|mp32=MP3, 192vbr|mp31=MP3, 96kbps|flac=Xiph FLAC",
+         "description": "Default streaming audio format. Albums and playlists still return Vorbis mostly for best quality."
+        },
+        {"name": "jamendo_image_size",
+         "value": "50",
+         "type": "select",
+         "select": "25=25px|35=35px|50=50px|55=55px|60=60px|65=65px|70=70px|75=75px|85=85px|100=100px|130=130px|150=150px|200=200px|300=300px",
+         "description": "Preview images size (height and width) for albums or tracks."
+        },
+        {"name": "jamendo_count",
+         "value": "1",
+         "type":"text",
+         "description": "How many result sets (200 entries each) to retrieve."
+        }
     ]    
     
 
 
-
     # refresh category list
     def update_categories(self):
 
-        html = http.get(self.base + "tags")
-
-        rx_current = re.compile(r"""
-             <a\s[^>]+rel="tag"[^>]+href="(http://www.jamendo.com/\w\w/tag/[\w\d]+)"[^>]*>([\w\d]+)</a>
-        """, re.S|re.X)
-
-
-        #-- categories
-        tags = []
-        for uu in rx_current.findall(html):
-            (href, title) = uu
-            tags.append(title)
-            
         self.categories = [
-           "radios",
-#           "tags", tags
+            "radios",
+            "playlists",
+            "albums",
+                ["newest"],
+            "tracks",
+                [
+                "pop",
+                "synthpop",
+                "trashpop",
+                "disco",
+                "eurodance",
+                "electropop",
+
+                "rock",
+                "hardrock",
+                "alternativerock",
+                "acousticrock",
+                "poprock",
+
+                "dance",
+                "dancehall",
+                "trance",
+                "psytrance",
+                "trancecore",
+
+                "hiphop",
+                "rap",
+                "rappers",
+                "dubstep",
+                "beat",
+                "beats",
+                "breakbeats",
+                "dub",
+                "club",
+                "edm",
+                "electronic",
+                "techno",
+                "electric",
+                "synthesizer",
+                "triphop",
+                "house",
+                "electrohouse",
+                "darkelectro",
+                "rnb",
+
+                "metal",
+                "heavymetal",
+                "thrashmetal",
+                "powermetal",
+                "groovemetal",
+
+                "jazz",
+                "acidjazz",
+                "smoothjazz",
+                "classicjazz",
+
+                "instrumental",
+                "acoustic",
+
+                "singersongwriter",
+                "vocal",
+                "vocals",
+                "voice",
+
+
+                "game",
+                "gamemusic",
+                "8bit",
+                "computer",
+
+                "classical", ###
+                "organ",
+                "orchestral",
+                "choral",
+                "ballad",
+                "piano",
+                "mozart",
+                "violin",
+                "cello",
+                "fiddle",
+                "ukelele",
+                "trumpet",
+                "saxophone",
+                "harmonica",
+                "accordion",
+
+                "soul",
+                "blues",
+                "deltablues",
+                "swing",
+                "boogie",
+                "funk",
+                "electrofunk",
+                "folk",
+                "folkrock",
+
+                "world", ###
+                "african",
+                "middleeastern",
+                "arabic",
+                "asian",
+                "oriental",
+                "latin",
+                "french",
+                "german",
+                "irish",
+                "celtic",
+                "country",
+                "reggae",
+
+                "emotion",
+                "romantic", ###
+                "love",
+                "slow",
+                "quiet",
+                "happy",
+                "angry",
+                "sad",
+                "mysterious",
+                "atmospheric",
+                "mellow",
+                "dark",
+                "dream"
+                "energic",
+                "downtempo",
+                "sexy",
+                "melancholic",
+
+
+
+                "progressive",
+                "experimental",
+                "evolutive",
+                "alternative",
+                "sampler",
+                "minimalism",
+                "avantgarde",
+                "elegant",
+                "vintage",
+                "retro",
+                "oldschool",
+                "traditional",
+                "adult",
+                "communication",
+                "advertising",
+                "indie",
+                "improvisation",
+                "lofi",
+                "newage",
+                "grunge",
+                "raw",
+
+                "industrial",
+                "bass",
+                "drum",
+                "epic",
+                "soundtrack",
+                "rhythmic",
+                "keyboard",
+                "drummachine",
+                "acousticguitar",
+                "bongo",
+
+                "rumba",
+                "pinkfloydian",
+                "gothic",
+                "space",
+                "didgeridoo",
+                "energetic",
+                "worldfusion",
+                "fusion",
+                "noise",
+                "jungle",
+
+                "lounge",
+                "relaxing",
+                "easylistening",
+                "ambient",
+                "meditative",
+                "psychedelic",
+                "chillout",
+                "soft",
+                ]
         ]
-        
+        return self.categories
 
 
-    # download links from dmoz listing
-    def update_streams(self, cat, force=0):
+    # retrieve category or search
+    def update_streams(self, cat, search="", force=0):
 
         entries = []
+        fmt = self.stream_mime(conf.jamendo_stream_format)
         
-        # return a static list for now
+        # Static list of Radios
         if cat == "radios":
+            for radio in ["BestOf", "Pop", "Rock", "Lounge", "Electro", "HipHop", "World", "Jazz", "Metal", "Soundtrack", "Relaxation", "Classical"]:
+                entries.append({
+                    "genre": radio,
+                    "title": radio,
+                    "url": "http://streaming.radionomy.com/Jam" + radio,
+                    "playing": "various artists",
+                    "format": "audio/mpeg",
+                    "homepage": "http://www.jamendo.com/en/radios",
+                    "img": "http://imgjam1.jamendo.com/new_jamendo_radios/%s30.jpg" % radio.lower(),
+                })
         
-            entries = [
-                {"title": "Pop", "url": "http://streaming.radionomy.com/JamPop", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Rock", "url": "http://streaming.radionomy.com/JamRock", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Lounge", "url": "http://streaming.radionomy.com/JamLounge", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Electro", "url": "http://streaming.radionomy.com/JamElectro", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "HipHop", "url": "http://streaming.radionomy.com/JamHipHop", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "World", "url": "http://streaming.radionomy.com/JamWorld", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Jazz", "url": "http://streaming.radionomy.com/JamJazz", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Metal", "url": "http://streaming.radionomy.com/JamMetal", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Soundtrack", "url": "http://streaming.radionomy.com/JamSoundtrack", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Relaxation", "url": "http://streaming.radionomy.com/JamRelaxation", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-                {"title": "Classical", "url": "http://streaming.radionomy.com/JamClassical", "playing": "", "format": "audio/mpeg", "homepage": "http://www.jamendo.com/en/radios"},
-            ]
-        
-        return entries
-    
-        # top list
-        if cat == "top" or cat == "top 100":
-            html = http.get(self.base + "top")
-
-	    rx_top = re.compile("""
-		<img[^>]+src="(http://imgjam.com/albums/[\w\d]+/\d+/covers/1.\d+.jpg)"
-		.*?
-		<a\stitle="([^"]+)\s*-\s*([^"]+)"\s+class="track_name"\s+href="(http://www.jamendo.com/\w+/track/(\d+))"
-	    """, re.X|re.S)
-
-	    for uu in rx_top.findall(html):
-		(cover, title, artist, track, track_id) = uu
-		entries.append({
-		    "title": artist,
-		    "playing": title,
-		    "homepage": track,
-		    "url": self.track_url(track_id, conf.jamendo_stream_format),
-		    "favicon": self.cover(cover),
-		    "format": self.stream_mime(),
-		})
+        # Playlist
+        elif cat == "playlists":
+            for e in self.api(method = cat, order = "creationdate_desc"):
+                entries.append({
+                    "title": e["name"],
+                    "playing": e["user_name"],
+                    "homepage": e["shareurl"],
+                    #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]),
+                    "url": "http://api.jamendo.com/get2/stream/track/xspf/?playlist_id=%s&n=all&order=random&from=app-%s" % (e["id"], self.cid),
+                    "format": "application/xspf+xml",
+                })
+
+        # Albums
+        elif cat in ["albums", "newest"]:
+            if cat == "albums":
+                order = "popularity_week"
+            else:
+                order = "releasedate_desc"
+            for e in self.api(method = "albums/musicinfo", order = order, include = "musicinfo"):
+                entries.append({
+                    "genre": " ".join(e["musicinfo"]["tags"]),
+                    "title": e["name"],
+                    "playing": e["artist_name"],
+                    "img": e["image"],
+                    "homepage": e["shareurl"],
+                    #"url": "http://api.jamendo.com/v3.0/playlists/file?client_id=%s&id=%s" % (self.cid, e["id"]),
+                    "url": "http://api.jamendo.com/get2/stream/track/xspf/?album_id=%s&streamencoding=ogg2&n=all&from=app-%s" % (e["id"], self.cid),
+                    "format": "application/xspf+xml",
+                })
 		
-		
-        # genre list            
+        # Genre list, or Search
         else:
-            html = http.get(self.base + "tag/" + cat)
-            
-            rx_tag = re.compile("""
-		<a\s+title="([^"]+)\s*-\s*([^"]+)"
-		\s+href="(http://www.jamendo.com/\w+/album/(\d+))"\s*>
-		\s*<img[^>]+src="(http://imgjam.com/albums/[\w\d]+/\d+/covers/1.\d+.jpg)"
-		.*? /tag/([\w\d]+)"
-            """, re.X|re.S)
-
-	    for uu in rx_tag.findall(html):
-		(artist, title, album, album_id, cover, tag) = uu
-		entries.append({
-		    "title": artist,
-		    "playing": title,
-		    "homepage": album,
-		    "url": self.track_url(album_id, conf.jamendo_stream_format, "album"),
-		    "favicon": self.cover(cover),
-		    "genre": tag,
-		    "format": self.stream_mime(),
-		})
+            if cat:
+                data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo",
+                                fuzzytags = cat, audioformat = conf.jamendo_stream_format)
+            elif search:
+                data = self.api(method = "tracks", order = "popularity_week", include = "musicinfo",
+                                search = search, audioformat = conf.jamendo_stream_format)
+            else:
+                data = []
+            for e in data:
+                entries.append({
+                    "lang": e["musicinfo"]["lang"],
+                    "genre": " ".join(e["musicinfo"]["tags"]["genres"]),
+                    "extra": ", ".join(e["musicinfo"]["tags"]["vartags"]),
+                    "title": e["name"],
+                    "playing": e["album_name"] + " / " + e["artist_name"],
+                    "img": e["album_image"],
+                    "homepage": e["shareurl"],
+                    #"url": e["audio"],
+                    "url": "http://storage-new.newjamendo.com/?trackid=%s&format=ogg2&u=0&from=app-%s" % (e["id"], self.cid),
+                    "format": self.stream_mime(fmt),
+                })
  
         # done    
         return entries
+
+    
+    # Collect data sets from Jamendo API
+    def api(self, method, **params):
+        r = []
+        max = 200 * int(conf.jamendo_count)
+        params = dict(
+            list({
+                "client_id": self.cid,
+                "format": "json",
+                "audioformat": "mp32",
+                "imagesize": conf.jamendo_image_size,
+                "offset": 0,
+                "limit": 200,
+            }.items()) + list(params.items())
+        )
+        while (params["offset"] < max) and (len(r) % 200 == 0):
+            data = http.get(self.api_base + method, params)
+            data = json.loads(data)
+            if data:
+                r += data["results"]
+            else:
+                return r
+            params["offset"] += 200;
+            self.parent.status(float(params["offset"])/float(max+17))
+        return r
         
-        
-    # smaller album link
-    def cover(self, url):
-        return url.replace(".100",".50").replace(".130",".50")
-     
-    # track id to download url   
-    def track_url(self, track_id, fmt="ogg2", track="track", urltype="redirect"):
-        # track = "album"
-        # fmt = "mp31"
-        # urltype = "m3u"
-	return "http://api.jamendo.com/get2/stream/"+track+"/"+urltype+"/?id="+track_id+"&streamencoding="+fmt
 
     # audio/*
-    def stream_mime(self):
-        if conf.jamendo_stream_format.find("og") >= 0:
-            return "audio/ogg"
+    def stream_mime(self, name):
+        map = {
+            "ogg": "audio/ogg", "ogg2": "audio/ogg",
+            "mp3": "audio/mpeg", "mp31": "audio/mpeg", "mp32": "audio/mpeg",
+            "flac": "audio/flac"
+        }
+        if name in map:
+            return map[name]
         else:
-            return "audio/mp3"
-
+            return map["mp3"]
 
diff --git a/channels/links.py b/channels/links.py
index e10b73b..827260d 100644
--- a/channels/links.py
+++ b/channels/links.py
@@ -1,9 +1,11 @@
 #
 # api: streamtuner2
-# title: links to directory services
-# description: provides a simple list of homepages for directory services
+# title: Links to directory services
+# description: Static list of various music directory websites.
+# type: category
+# category: web
 # version: 0.1
-# priority: rare
+# priority: default
 #
 #
 # Simply adds a "links" entry in bookmarks tab, where known channels
diff --git a/channels/live365.py b/channels/live365.py
index 2d9ac79..d21298b 100644
--- a/channels/live365.py
+++ b/channels/live365.py
@@ -1,5 +1,11 @@
-# api: st2
-# title: live365 channel
+
+# api: streamtunter2
+# title: Live365
+# description: Around 5000 categorized internet radio streams, some paid ad-free ones.
+# type: channel
+# category: radio
+# version: 0.2
+# priority: optional
 #
 # 2.0.9 fixed by Abhisek Sanyal
 #
@@ -28,10 +34,8 @@ class live365(ChannelPlugin):
 
 
         # desc
-        api = "streamtuner2"
         module = "live365"
         title = "Live365"
-        version = 0.1
         homepage = "http://www.live365.com/"
         base_url = "http://www.live365.com/"
         listformat = "url/http"
@@ -118,10 +122,10 @@ class live365(ChannelPlugin):
 #            src="(http://www.live365.com/.+?/stationlogo\w+.jpg)".+?
 
             # append entries to result list
-            __print__( dbg.DATA, html )
+            #__print__( dbg.DATA, html )
             ls = []
             for row in rx.findall(html):
-                __print__( dbg.DATA, row )
+                #__print__( dbg.DATA, row )
                 points = int(row[8])
                 count = int(row[9])
                 ls.append({
diff --git a/channels/modarchive.py b/channels/modarchive.py
index 317c286..35dccca 100644
--- a/channels/modarchive.py
+++ b/channels/modarchive.py
@@ -1,6 +1,11 @@
 
 # api: streamtuner2
-# title: modarchive browser
+# title: MODarchive
+# description: Collection of module / tracker audio files (MOD, S3M, XM, etc.)
+# type: channel
+# version: 0.2
+# priority: extra
+# category: music
 #
 #
 # Just a genre browser.
@@ -9,6 +14,10 @@
 # download method, it'll receive a .zip archive with embeded .mod file.
 # VLC in */* seems to work fine however.
 #
+# Modarchive actually provides an API
+# http://modarchive.org/index.php?xml-api
+# (If only it wasn't XML based..)
+#
 
 
 import re
@@ -16,7 +25,6 @@ import ahttp as http
 from config import conf
 from channels import *
 from config import __print__, dbg
-from xml.sax.saxutils import unescape
 
 
 
@@ -38,11 +46,11 @@ class modarchive (ChannelPlugin):
     title = "modarchive"
     module = "modarchive"
     homepage = "http://www.modarchive.org/"
-    version = 0.1
     base = "http://modarchive.org/"
+    titles = dict(genre="Genre", title="Song", playing="File", listeners="Rating", bitrate=0)
 
     # keeps category titles->urls    
-    catmap = {}
+    catmap = {"Chiptune": "54", "Electronic - Ambient": "2", "Electronic - Other": "100", "Rock (general)": "13", "Trance - Hard": "64", "Swing": "75", "Rock - Soft": "15", "R & B": "26", "Big Band": "74", "Ska": "24", "Electronic - Rave": "65", "Electronic - Progressive": "11", "Piano": "59", "Comedy": "45", "Christmas": "72", "Chillout": "106", "Reggae": "27", "Electronic - Industrial": "34", "Grunge": "103", "Medieval": "28", "Demo Style": "55", "Orchestral": "50", "Soundtrack": "43", "Electronic - Jungle": "60", "Fusion": "102", "Electronic - IDM": "99", "Ballad": "56", "Country": "18", "World": "42", "Jazz - Modern": "31", "Video Game": "8", "Funk": "32", "Electronic - Drum & Bass": "6", "Alternative": "48", "Electronic - Minimal": "101", "Electronic - Gabber": "40", "Vocal Montage": "76", "Metal (general)": "36", "Electronic - Breakbeat": "9", "Soul": "25", "Electronic (general)": "1", "Punk": "35", "Pop - Synth": "61", "Electronic - Dance": "3", "Pop (general)": "12", "Trance - Progressive": "85", "Trance (general)": "71", "Disco": "58", "Electronic - House": "10", "Experimental": "46", "Trance - Goa": "66", "Rock - Hard": "14", "Trance - Dream": "67", "Spiritual": "47", "Metal - Extreme": "37", "Jazz (general)": "29", "Trance - Tribal": "70", "Classical": "20", "Hip-Hop": "22", "Bluegrass": "105", "Halloween": "82", "Jazz - Acid": "30", "Easy Listening": "107", "New Age": "44", "Fantasy": "52", "Blues": "19", "Other": "41", "Trance - Acid": "63", "Gothic": "38", "Electronic - Hardcore": "39", "One Hour Compo": "53", "Pop - Soft": "62", "Electronic - Techno": "7", "Religious": "49", "Folk": "21"}
     categories = []
  
     
@@ -98,20 +106,21 @@ class modarchive (ChannelPlugin):
     # download links from dmoz listing
     def update_streams(self, cat, force=0):
 
-        url = "http://modarchive.org/index.php?query="+self.catmap[cat]+"&request=search&search_type=genre"
-        html = http.get(url)
+        url = "http://modarchive.org/index.php"
+        params = dict(query=self.catmap[cat], request="search", search_type="genre")
+        html = http.get(url, params)
         entries = []
         
         rx_mod = re.compile("""
-            href="(http://modarchive.org/data/downloads.php[?]moduleid=(\d+)[#][^"]+)"
-            .*?    /formats/(\w+).png"
+            href="(http://api\.modarchive\.org/downloads\.php[?]moduleid=(\d+)[#][^"]+)"
+            .*?    /formats/(\w+)\.png"
             .*?    title="([^">]+)">([^<>]+)</a>
-            .*?    >Rated</a>\s*(\d+)
+            .*?    >(?:Rated|Unrated)</a>\s*(\d*)
         """, re.X|re.S)
         
         for uu in rx_mod.findall(html):
             (url, id, fmt, title, file, rating) = uu
-            __print__( dbg.DATA, uu )
+            #__print__( dbg.DATA, uu )
             entries.append({
                 "genre": cat,
                 "url": url,
@@ -119,7 +128,7 @@ class modarchive (ChannelPlugin):
                 "format": self.mime_fmt(fmt) + "+zip",
                 "title": title,
                 "playing": file,
-                "listeners": int(rating),
+                "listeners": int(rating if rating else 0),
                 "homepage": "http://modarchive.org/index.php?request=view_by_moduleid&query="+id,
             })
         
diff --git a/channels/musicgoal.py b/channels/musicgoal.py
index 584317f..880e843 100644
--- a/channels/musicgoal.py
+++ b/channels/musicgoal.py
@@ -1,10 +1,12 @@
 #
 # api: streamtuner2
-# title: MUSICGOAL channel
-# description: musicgoal.com/.de combines radio and podcast listings
+# title: MUSICGOAL
+# description: Broad list of radio stations and podcasts. Provides a sane API, but only 5 results each.
+# type: channel
+# category: radio
 # version: 0.1
+# priority: optional
 # status: experimental
-# pre-config: <const name="api"/>
 #
 # Musicgoal.com is a radio and podcast directory. This plugin tries to use
 # the new API for accessing listing data.
@@ -32,7 +34,6 @@ class musicgoal (ChannelPlugin):
         # desc
         module = "musicgoal"
         title = "MUSICGOAL"
-        version = 0.1
         homepage = "http://www.musicgoal.com/"
         base_url = homepage
         listformat = "url/direct"
diff --git a/channels/myoggradio.py b/channels/myoggradio.py
index d3f77c4..eca1996 100644
--- a/channels/myoggradio.py
+++ b/channels/myoggradio.py
@@ -1,12 +1,11 @@
 #
 # api: streamtuner2
-# title: MyOggRadio channel plugin
-# description: open source internet radio directory MyOggRadio
+# title: MyOggRadio
+# description: Open source internet radio directory.
+# type: channel
+# category: radio
 # version: 0.5
-# config:
-#    <var name="myoggradio_login" type="text" value="user:password" description="login account for myoggradio service" />
 # priority: standard
-# category: channel
 # depends: json, StringIO
 #
 # MyOggRadio is an open source radio station directory. Because this matches
@@ -23,6 +22,7 @@
 from channels import *
 from config import conf
 from action import action
+from mygtk import mygtk
 
 import re
 import json
@@ -39,7 +39,6 @@ class myoggradio(ChannelPlugin):
     module = "myoggradio"
     homepage = "http://www.myoggradio.org/"
     api = "http://ehm.homelinux.org/MyOggRadio/"
-    version = 0.5
     listformat = "url/direct"
     
     # config data
diff --git a/channels/punkcast.py b/channels/punkcast.py
index b454101..d420c30 100644
--- a/channels/punkcast.py
+++ b/channels/punkcast.py
@@ -1,6 +1,11 @@
 
 # api: streamtuner2
-# title: punkcast listing
+# title: PunkCast
+# description: Online video site that covered NYC artists. Not updated anymore.
+# type: channel
+# category: video
+# version: 0.1
+# priority: rare
 #
 #
 # Disables itself per default.
@@ -38,7 +43,6 @@ class punkcast (ChannelPlugin):
     title = "punkcast"
     module = "punkcast"
     homepage = "http://www.punkcast.com/"
-    version = 0.1
 
     # keeps category titles->urls    
     catmap = {}
@@ -70,7 +74,7 @@ class punkcast (ChannelPlugin):
                     "genre": "?",
                     "title": title,
                     "playing": "PUNKCAST #"+id,
-                    "format": "audio/mp3",
+                    "format": "audio/mpeg",
                     "homepage": homepage,
             })
 
diff --git a/channels/shoutcast.py b/channels/shoutcast.py
index b6f03ae..fce2bb0 100644
--- a/channels/shoutcast.py
+++ b/channels/shoutcast.py
@@ -1,9 +1,12 @@
 #
 # api: streamtuner2
-# title: shoutcast
-# description: Channel/tab for Shoutcast.com directory
+# title: Shoutcast.com
+# description: Primary list of shoutcast servers (now managed by radionomy).
+# type: channel
+# category: radio
+# priority: default
+# version: 1.4
 # depends: pq, re, http
-# version: 1.3
 # author: Mario
 # original: Jean-Yves Lefort
 #
@@ -35,15 +38,12 @@ class shoutcast(channels.ChannelPlugin):
         api = "streamtuner2"
         module = "shoutcast"
         title = "SHOUTcast"
-        version = 1.2
         homepage = "http://www.shoutcast.com/" 
         base_url = "http://shoutcast.com/"
         listformat = "audio/x-scpls"
 
         # settings
         config = [
-            dict(name="pyquery", type="boolean", value=0, description="Use more reliable PyQuery HTML parsing\ninstead of faster regular expressions."),
-            dict(name="debug", type="boolean", value=0, description="enable debug output"),
         ]
         
         # categories
@@ -88,130 +88,109 @@ class shoutcast(channels.ChannelPlugin):
             pass
 
 
-
-        #def strip_tags(self, s):
-        #    rx = re.compile(""">(\w+)<""")
-        #    return " ".join(rx.findall(s))
-
         # downloads stream list from shoutcast for given category
         def update_streams(self, cat, search=""):
 
             if (not cat or cat == self.empty):
                 __print__( dbg.ERR, "nocat" )
                 return []
-            ucat = urllib.quote(cat)
 
+            #/radiolist.cfm?action=sub&string=&cat=Oldies&_cf_containerId=radiolist&_cf_nodebug=true&_cf_nocache=true&_cf_rc=0
+            #/radiolist.cfm?start=19&action=sub&string=&cat=Oldies&amount=18&order=listeners
+            # page
+            url = "http://www.shoutcast.com/radiolist.cfm"
+            params = {
+                "action": "sub",
+                "string": "",
+                "cat": cat,
+                "order": "listeners",
+                "amount": conf.max_streams,
+            }
+            referer = "http://www.shoutcast.com/?action=sub&cat="+cat
+            html = http.get(url, params=params, referer=referer, ajax=1)
+            self.parent.status(0.75)
+
+            #__print__(dbg.DATA, html)
+            #__print__(re.compile("id=(\d+)").findall(html));
+            # new html
+            """ 
+            <tr>
+               <td width="6%"><a href="#" onClick="window.open('player/?radname=Schlagerhoelle%20%2D%20das%20Paradies%20fr%20Schlager%20%20und%20Discofox&stationid=14687&coding=MP3','radplayer','height=232,width=776')"><img class="icon transition" src="/img/icon-play.png" alt="Play"></a></td>
+               <td width="30%"><a class="transition" href="http://yp.shoutcast.com/sbin/tunein-station.pls?id=14687">Schlagerhoelle - das Paradies fr Schlager  und Discofox</a></td>
+               <td width="12%" style="text-align:left;" width="10%">Oldies</td>
+               <td width="12%" style="text-align:left;" width="10%">955</td>
+               <td width="12%" style="text-align:left;" width="10%">128</td>
+               <td width="12%" style="text-align:left;" width="10%">MP3</td>
+            </tr>
+            """
+
+            # With the new shallow <td> lists it doesn't make much sense to use
+            # the pyquery DOM traversal. There aren't any sensible selectors to
+            # extract values; it's just counting the tags.
+            #
+            # And there's a bug in PyQuery 1.2.4 and CssSelector. So make two
+            # attempts, alternate between regex and DOM; user preference first.
+            #
+            for use_rx in [not conf.pyquery or not pq, conf.pyquery]:
+                try:
+                    entries = (self.with_regex(html) if use_rx else self.with_dom(html))
+                    if len(entries):
+                        break
+                except Exception as e:
+                    __print__(dbg.ERR, e)
+                    continue
+            return entries
 
-            # loop
+
+        # Extract using regex
+        def with_regex(self, html):
+            __print__(dbg.PROC, "channels.shoutcast.update_streams: regex scraping mode")
+            rx_stream = re.compile(
+                """
+                 <a [^>]+  href="http://yp.shoutcast.com/sbin/tunein-station.pls\?
+                           id=(\d+)">   ([^<>]+)   </a>  </td>
+                 \s+  <td [^>]+  >([^<>]+)</td>
+                 \s+  <td [^>]+  >(\d+)</td>
+                 \s+  <td [^>]+  >(\d+)</td>
+                 \s+  <td [^>]+  >(\w+)</td>
+                """,
+                re.S|re.I|re.X
+            )
+            # extract entries
             entries = []
-            next = 0
-            max = int(conf.max_streams)
-            count = max
-            rx_stream = None
-
-            try:
-               if (next < max):
-
-
-                  #/radiolist.cfm?action=sub&string=&cat=Oldies&_cf_containerId=radiolist&_cf_nodebug=true&_cf_nocache=true&_cf_rc=0
-                  #/radiolist.cfm?start=19&action=sub&string=&cat=Oldies&amount=18&order=listeners
-                  # page
-                  url = "http://www.shoutcast.com/radiolist.cfm?action=sub&string=&cat="+ucat+"&order=listeners&amount="+str(count)
-                  __print__(dbg.HTTP, url)
-                  referer = "http://www.shoutcast.com/?action=sub&cat="+ucat
-                  params = {}
-                  html = http.get(url, params=params, referer=referer, ajax=1)
-
-                  #__print__(dbg.DATA, html)
-                  #__print__(re.compile("id=(\d+)").findall(html));
-
-
-                  # With the new shallow <td> lists it doesn't make much sense to use
-                  # the pyquery DOM traversal. There aren't any sensible selectors to
-                  # extract values; it's just counting the tags.
-
-
-                  # regular expressions (default)
-                  if not conf.get("pyquery") or not pq:
-
-                      # new html
-                      """ 
-                      <tr>
-                         <td width="6%"><a href="#" onClick="window.open('player/?radname=Schlagerhoelle%20%2D%20das%20Paradies%20fr%20Schlager%20%20und%20Discofox&stationid=14687&coding=MP3','radplayer','height=232,width=776')"><img class="icon transition" src="/img/icon-play.png" alt="Play"></a></td>
-                         <td width="30%"><a class="transition" href="http://yp.shoutcast.com/sbin/tunein-station.pls?id=14687">Schlagerhoelle - das Paradies fr Schlager  und Discofox</a></td>
-                         <td width="12%" style="text-align:left;" width="10%">Oldies</td>
-                         <td width="12%" style="text-align:left;" width="10%">955</td>
-                         <td width="12%" style="text-align:left;" width="10%">128</td>
-                         <td width="12%" style="text-align:left;" width="10%">MP3</td>
-                      </tr>
-                      """
-                  
-                      # new extraction regex
-                      if not rx_stream:
-                          rx_stream = re.compile(
-                              """
-                               <a [^>]+  href="http://yp.shoutcast.com/sbin/tunein-station.pls\?
-                                         id=(\d+)">   ([^<>]+)   </a>  </td>
-                               \s+  <td [^>]+  >([^<>]+)</td>
-                               \s+  <td [^>]+  >(\d+)</td>
-                               \s+  <td [^>]+  >(\d+)</td>
-                               \s+  <td [^>]+  >(\w+)</td>
-                              """,
-                              re.S|re.I|re.X
-                          )
-
-
-                      # extract entries
-                      self.parent.status("parsing document...")
-                      __print__(dbg.PROC, "channels.shoutcast.update_streams: regex scraping mode")
-
-                      for m in rx_stream.findall(html):
-                          #__print__(m)
-                          (id, title, genre, listeners, bitrate, fmt) = m
-                          entries += [{
-                              "id": id,
-                              "url": "http://yp.shoutcast.com/sbin/tunein-station.pls?id=" + id,
-                              "title": self.entity_decode(title),
-                              #"homepage": http.fix_url(homepage),
-                              #"playing": self.entity_decode(playing),
-                              "genre": genre,
-                              "listeners": int(listeners),
-                              "max": 0, #int(uu[6]),
-                              "bitrate": int(bitrate),
-                              "format": self.mime_fmt(fmt),
-                          }]
-
-
-                  # PyQuery parsing
-                  else:
-                      # iterate over DOM
-                      for div in (pq(e) for e in pq(html).find("tr")):
-
-                          entries.append({
-                               "title": div.find("a.transition").text(),
-                               "url": div.find("a.transition").attr("href"),
-                               "homepage": "",
-                               "listeners": int(div.find("td:eq(3)").text()),
-                               "bitrate": int(div.find("td:eq(4)").text()),
-                               "format": self.mime_fmt(div.find("td:eq(5)").text()),
-                               "max": 0,
-                               "genre": cat,
-                          })
-
-
-                  # display partial results (not strictly needed anymore, because we fetch just one page)
-                  self.parent.status()
-                  self.update_streams_partially_done(entries)
-                  
-                  # more pages to load?
-                  next = 99999
-                     
-            except Exception as e:
-               __print__(dbg.ERR, e)
-               return entries
-            
-            #fin
-            __print__(dbg.DATA, entries)
+            for m in rx_stream.findall(html):
+                #__print__(m)
+                (id, title, genre, listeners, bitrate, fmt) = m
+                entries += [{
+                    "id": id,
+                    "url": "http://yp.shoutcast.com/sbin/tunein-station.pls?id=" + id,
+                    "title": self.entity_decode(title),
+                    #"homepage": http.fix_url(homepage),
+                    #"playing": self.entity_decode(playing),
+                    "genre": genre,
+                    "listeners": int(listeners),
+                    "max": 0, #int(uu[6]),
+                    "bitrate": int(bitrate),
+                    "format": self.mime_fmt(fmt),
+                }]
+            return entries
+
+
+        # Iterate over DOM instead
+        def with_dom(self, html):
+            __print__(dbg.PROC, "channels.shoutcast.update_streams: attempt PyQuery/DOM traversal")
+            entries = []
+            for div in (pq(e) for e in pq(html).find("tr")):
+                entries.append({
+                     "title": div.find("a.transition").text(),
+                     "url": div.find("a.transition").attr("href"),
+                     "homepage": "",
+                     "listeners": int(div.find("td:eq(3)").text()),
+                     "bitrate": int(div.find("td:eq(4)").text()),
+                     "format": self.mime_fmt(div.find("td:eq(5)").text()),
+                     "max": 0,
+                     "genre": cat,
+                })
             return entries
 
 
diff --git a/channels/surfmusik.png b/channels/surfmusik.png
new file mode 100644
index 0000000..18975a0
Binary files /dev/null and b/channels/surfmusik.png differ
diff --git a/channels/surfmusik.py b/channels/surfmusik.py
new file mode 100644
index 0000000..33fed24
--- /dev/null
+++ b/channels/surfmusik.py
@@ -0,0 +1,139 @@
+# encoding: UTF-8
+# api: streamtuner2
+# title: SurfMusik
+# description: User collection of streams categorized by region and genre.
+# version: 0.1
+# type: channel
+# category: radio
+# author: gorgonz123
+# source: http://forum.ubuntuusers.de/topic/streamtuner2-zwei-internet-radios-anhoeren-au/3/
+# recognizes: max_streams
+#
+# While the categories and genre names are in German, there's a vast
+# collection of international stations on Surfmusik.de
+# While it's not an open source project, most entries are user contributed.
+#
+# They do have a Windows client, hencewhy it's even more important for
+# streamtuner2 to support it on other plattforms.
+#
+# TV stations don't seem to work mostly. And loading the webtv/ pages would
+# be somewhat slow (for querying the actual mms:// streams).
+#
+# * There's also an English version //surfmusic.com/
+#   So it might make sense to duplicate it with alternative category titles.
+#
+
+import re
+import ahttp as http
+from config import conf
+from channels import *
+
+
+
+# Surfmusik sharing site
+class surfmusik (ChannelPlugin):
+
+    # description
+    title = "SurfMusik"
+    module = "surfmusik"
+    homepage = "http://www.surfmusik.de/"
+
+    base = "http://www.surfmusik.de/"
+    base2 = "http://www.surfmusic.de/"
+    listformat = "audio/x-scpls"
+
+    categories = [
+        "Genres", ["50ger 50s", "Dubstep", "Latin Jazz", "Schlager", "60ger 60s", "Electronic", "Latino", "Sega", "70ger 70s", "Eurodance ", "Lounge", "Soft", "80ger 80s", "Filmmusik", "Metal", "Sport", "90ger 90s", "Flamenco", "Merengue", "Swing", "Acid", "Gay", "Mix", "Tamil", "Ambient", "Gospel", "New Age", "Tango", "Arabische Musik", "Gothic", "News", "Techno", "Afrikanische Musik", "Groove", "Nostalgie", "Gabber", "Artist Radio ", "Halloween", "Hardstyle", "Bachata", "Hip Hop", "Oldies", "Jumpstyle", "Bhangra", "Hoerspiel Radio", "Minimal", "Balladen", "House", "Pop", "Schranz", "Big Band", "Indian", "Punk", "Top 40", "Blues", "Indisch", "Radioversprecher", "Trance", "Bollywood", "Instrumentalmusik", "Reggae", "Trip Hop", "Campusradio", "Information", "RnB", "Tropical", "Celtic", "Italo Disco ", "Rochester", "Urban", "Chillout", "Jazz", "Rock", "Variety", "Country", "Karnevalsmusik", "Rock n Roll", "Volksmusik", "Dance", "Kinderradio", "Rumba/Salsa", "Zumba", "Discofox", "Kirchlich", "Russische Chansons", "Drum n Bass", "Klassik", "Salsa"],
+        "Deutschland", ["Baden Wuerttemberg", "Niedersachsen", "Bayern", "Nordrhein-Westfalen", "Berlin", "Rheinland-Pfalz", "Brandenburg", "Saarland", "Bremen", "Sachsen", "Hamburg", "Sachsen-Anhalt", "Hessen", "Schleswig-Holstein", "Mecklenburg-Vorpommern", "Thueringen"],
+        "Europa", ["Albanien", "Griechenland", "Mallorca", "Slowakei", "Andorra", "Irland", "Malta", "Slovenien", "Armenien", "Island", "Niederlande", "Spanien", "Aserbaidschan", "Italien", "Norwegen", "Tschech. Republ", "Belgien", "Kasachstan", "Oesterreich", "Tuerkei", "Bosnien", "Kanarische Inseln", "Polen", "Ungarn", "Bulgarien", "Kirgistan", "Portugal", "Ukraine", "Daenemark", "Kroatien", "Rumaenien", "Wales", "Deutschland", "Lettland", "Russland", "Weissrussland", "England", "Liechtenstein", "Schottland", "Zypern", "Estland", "Litauen", "Schweden", "Finnland", "Luxemburg", "Schweiz", "Frankreich", "Mazedonien", "Serbien"],
+        "Afrika", ["Angola", "Malawi", "Aethiopien", "Mauritius", "Aegypten", "Marokko", "Algerien", "Namibia", "Benin", "Nigeria", "Burundi", "Reunion", "Elfenbeinkueste", "Senegal", "Gabun", "Simbabwe", "Ghana", "Somalia", "Kamerun", "Sudan", "Kap Verde", "Suedafrika", "Kenia", "Tansania", "Kongo", "Togo", "Libyen", "Tunesien", "Madagaskar", "Uganda", "Mali"],
+        "USA", ["Alabama", "Illinois", "Montana", "Rhode Island", "Alaska", "Indiana", "Nebraska", "South Carolina", "Arizona", "Iowa", "Nevada", "South Dakota", "Arkansas", "Kansas", "New Hampshire", "Tennessee", "Californien", "Kentucky", "New Jersey", "Texas", "Colorado", "Louisiana", "New Mexico", "Utah", "Connecticut", "Maine", "New York", "Vermont", "Delaware", "Maryland", "North Carolina", "Virginia", "Distr.Columbia", "Massachusetts", "North Dakota", "Washington", "Florida", "Michigan", "Ohio", "West Virginia", "Georgia", "Minnesota", "Oklahoma", "Wisconsin", "Hawaii", "Mississippi", "Oregon", "Wyoming", "Idaho", "Missouri", "Pennsylvania", "NOAA Wetter Radio"],
+        "Kanada", ["Alberta", "Ontario", "British Columbia", "Prince Edward Island", "Manitoba", "Québec", "Neufundland", "Saskatchewan", "New Brunswick", "Nordwest-Territorien", "Nova Scotia", "Yukon", "Nunavut",],
+        "Amerika", ["Mexiko", "Costa Rica", "Argentinien", "Aruba", "El Salvador", "Bolivien", "Antigua", "Guatemala", "Brasilien", "Barbados", "Honduras", "Chile", "Bahamas", "Nicaragua", "Ecuador", "Bermuda", "Panama", "Guyana", "Curaçao", "Guyana", "Domenik. Republ", "Kolumbien", "Grenada", "Paraguay", "Guadeloupe", "Uruguay", "Haiti", "Suriname", "Jamaika", "Peru", "Kaimaninseln", "Venezuela", "Kuba", "Martinique", "Puerto Rico", "St.Lucia", "Saint Martin", "Trinidad und Tobago"],
+        "Asien", ["Afghanistan", "Kirgistan", "Vereinigte Arabische Emirate", "Sued-Korea", "Bahrain", "Kuwait", "Bangladesch", "Libanon", "Brunei", "Malaysia", "China", "Nepal", "Guam", "Oman", "Hong Kong", "Pakistan", "Iran", "Palaestina", "Indien", "Philippinen", "Indonesien", "Saudi Arabien", "Israel", "Singapur", "Jordanien", "Sri Lanka", "Japan", "Syrien", "Kambodscha", "Taiwan", "Kasachstan", "Thailand",],
+        "Ozeanien", ["Australien", "Neuseeland", "Suedpol", "Fidschi", "Papanew", "Tahiti",],
+        #"SurfTV",
+        "MusikTV", "NewsTV",
+        "Poli", "Flug",
+    ] 
+    titles = dict( genre="Genre", title="Station", playing="Location", bitrate=False, listeners=False )
+ 
+    config = [
+        #{"name": "surfmusik_lang", "type": "select", "select":"DE=SurfMusik.de|EN=SurfMusic.de", "description": "You can alternatively use the German or English category titles.", "category": "language"}
+    ]    
+
+
+    # just a static list for now
+    def update_categories(self):
+        pass
+
+
+    # summarize links from surfmusik
+    def update_streams(self, cat, force=0):
+
+        entries = []
+        i = 0
+        max = int(conf.max_streams)
+        is_tv = 0
+        
+        # placeholder category
+        if cat in ["Genres"]:
+            path = None
+        # tv
+        elif cat in ["SurfTV", "MusikTV", "NewsTV"]:
+            path = ""
+            is_tv = 1
+        # genre 
+        elif cat in self.categories[1]:
+            path = "genre/"
+        # country
+        else:
+            path = "land/"
+        
+        if path is not None:
+            html = http.get(self.base + path + cat.lower() + ".html")
+            html = re.sub("&#x?\d+;", "", html)
+        
+            rx_radio = re.compile(r"""
+                <td\s+class="home1"><a[^>]*\s+href="(.+?)"[^>]*> .*?
+                <a\s+class="navil"\s+href="([^"]+)"[^>]*>([^<>]+)</a></td>
+                <td\s+class="ort">(.*?)</td>.*?
+                <td\s+class="ort">(.*?)</td>.*?
+            """, re.X|re.I)
+            rx_video = re.compile(r"""
+                <a[^>]+href="([^"]+)"[^>]*>(?:<[^>]+>)*Externer
+            """, re.X|re.I)
+
+            # per-country list
+            for uu in rx_radio.findall(html):
+                (url, homepage, name, genre, stadt) = uu
+                
+                # find mms:// for webtv stations
+                if is_tv:
+                    m = rx_video.search(http.get(url))
+                    if m:
+                        url = m.group(1)
+                # just convert /radio/ into /m3u/ link
+                else:
+                    url = "http://www.surfmusik.de/m3u/" + url[30:-5] + ".m3u"
+
+                entries.append({
+                    "title": name,
+                    "homepage": homepage,
+                    "url": url, 
+                    "playing": stadt,
+                    "genre": genre,
+                    "format": ("video/html" if is_tv else "audio/mpeg"),
+                })
+
+                # limit result list
+                if i > max:
+                   break
+                if i % 10 == 0:
+                   self.parent.status(float(i)/float(max+5))
+                i += 1
+ 
+        # done    
+        return entries
+
+
diff --git a/channels/timer.py b/channels/timer.py
index 0349111..e93f558 100644
--- a/channels/timer.py
+++ b/channels/timer.py
@@ -1,11 +1,11 @@
 #
 # api: streamtuner2
-# title: radio scheduler
-# description: time play/record events for radio stations
+# title: Recording timer
+# description: Schedules play/record events for bookmarked radio stations.
+# type: feature
+# category: ui
 # depends: kronos
 # version: 0.5
-# config:
-# category: features
 # priority: optional
 # support: unsupported
 #
@@ -26,6 +26,7 @@ import kronos
 from mygtk import mygtk
 from action import action
 import copy
+import re
 
 
 
@@ -35,7 +36,6 @@ class timer:
     # plugin info
     module = "timer"
     title = "Timer"
-    version = 0.5
     
     
     # configuration settings
@@ -167,7 +167,7 @@ class timer:
     def play(self, row, *args, **kwargs):
         action.play(
             url = row["url"],
-            audioformat = row.get("format","audio/mp3"), 
+            audioformat = row.get("format","audio/mpeg"), 
             listformat = row.get("listformat","url/direct"),
         )
 
@@ -185,7 +185,7 @@ class timer:
         # start recording
         action.record(
             url = row["url"],
-            audioformat = row.get("format","audio/mp3"), 
+            audioformat = row.get("format","audio/mpeg"), 
             listformat = row.get("listformat","url/direct"),
             append = append,
         )
diff --git a/channels/xiph.py b/channels/xiph.py
index 9ab74b0..a624799 100644
--- a/channels/xiph.py
+++ b/channels/xiph.py
@@ -1,16 +1,19 @@
 #
 # api: streamtuner2
 # title: Xiph.org
-# description: Xiph/ICEcast radio directory
-# version: 0.1
+# description: ICEcast radio directory. Now utilizes a cached JSON API.
+# type: channel
+# category: radio
+# version: 0.3
+# priority: standard
 #
 #
 # Xiph.org maintains the Ogg streaming standard and Vorbis audio compression
 # format, amongst others. The ICEcast server is an alternative to SHOUTcast.
-# But it turns out, that Xiph lists only MP3 streams, no OGG. And the directory
-# is less encompassing than Shoutcast.
-#
 #
+# It meanwhile provides a JSOL dump, which is faster to download and process.
+# So we'll use that over the older yp.xml. (Sadly it also doesn't output
+# homepage URLs, listeners, etc.)
 #
 #
 
@@ -22,11 +25,12 @@ from mygtk import mygtk
 import ahttp as http
 from channels import *
 from config import __print__, dbg
+import json
 
 # python modules
 import re
-from xml.sax.saxutils import unescape as entity_decode, escape as xmlentities
-import xml.dom.minidom
+#from xml.sax.saxutils import unescape as entity_decode, escape as xmlentities
+#import xml.dom.minidom
 
 
 
@@ -38,26 +42,26 @@ class xiph (ChannelPlugin):
         api = "streamtuner2"
         module = "xiph"
         title = "Xiph.org"
-        version = 0.1
         homepage = "http://dir.xiph.org/"
-        base_url = "http://dir.xiph.org/"
-        yp = "yp.xml"
+        #base_url = "http://api.dir.xiph.org/"
+        json_url = "http://api.include-once.org/xiph/cache.php"
         listformat = "url/http"
         config = [
            {"name":"xiph_min_bitrate", "value":64, "type":"int", "description":"minimum bitrate, filter anything below", "category":"filter"}
         ]
+        has_search = True
 
         # content
-        categories = ["all", [],           ]
+        categories = [ "pop", "top40" ]
         current = ""
-        default = "all"
+        default = "pop"
         empty = None
         
         
         # prepare category names
         def __init__(self, parent=None):
             
-            self.categories = ["all"]
+            self.categories = []
             self.filter = {}
             for main in self.genres:
                 if (type(main) == str):
@@ -78,79 +82,43 @@ class xiph (ChannelPlugin):
 
         # just counts genre tokens, does not automatically create a category tree from it
         def update_categories(self):
-            g = {}
-            for row in self.streams["all"]:
-                for t in row["genre"].split():
-                    if g.has_key(t):
-                        g[t] += 1
-                    else:
-                        g[t] = 0
-            g = [ [v[1],v[0]] for v in g.items() ]
-            g.sort()
-            g.reverse()
-            for row in g:
-                pass
-                __print__( dbg.DATA, '        "' + row[1] + '", #' + str(row[0]) )
-
+            pass
 
-        # xml dom node shortcut to text content
-        def x(self, entry, name):
-            e = entry.getElementsByTagName(name)
-            if (e):
-                if (e[0].childNodes):
-                    return e[0].childNodes[0].data
-                    
-        # convert bitrate string to integer
-        # (also convert "Quality \d+" to pseudo bitrate)
-        def bitrate(self, s):
-            uu = re.findall("(\d+)", s)
-            if uu:
-                br = uu[0]
-                if br > 10:
-                    return int(br)
-                else:
-                    return int(br * 25.6)
-            else:
-                return 0
 
-        # downloads stream list from shoutcast for given category
+        # downloads stream list from xiph.org for given category
         def update_streams(self, cat, search=""):
 
-            # there is actually just a single category to download,
-            # all else are virtual
-            if (cat == "all"):
+            # With the new JSON cache API on I-O, we can load categories individually:
+            params = {}
+            if cat:
+                params["cat"] = cat.lower()
+            if search:
+                params["search"] = search
             
-                #-- get data
-                yp = http.get(self.base_url + self.yp)
-                
-                #-- extract
-                l = []
-                __print__( dbg.DATA, "xml.dom.minidom parses yp.xml" )
-                for entry in xml.dom.minidom.parseString(yp).getElementsByTagName("entry"):
-                    bitrate = self.bitrate(self.x(entry, "bitrate"))
-                    if conf.xiph_min_bitrate and bitrate and bitrate >= int(conf.xiph_min_bitrate):
-                      l.append({
-                        "title": str(self.x(entry, "server_name")),
-                        "url": str(self.x(entry, "listen_url")),
-                        "format": self.mime_fmt(str(self.x(entry, "server_type"))[6:]),
-                        "bitrate": bitrate,
-                        "channels": str(self.x(entry, "channels")),
-                        "samplerate": str(self.x(entry, "samplerate")),
-                        "genre": str(self.x(entry, "genre")),
-                        "playing": str(self.x(entry, "current_song")),
-                        "listeners": 0,
-                        "max": 0,              # this information is in the html view, but not in the yp.xml (seems pretty static, we might as well make it a built-in list)
-                        "homepage": "",
-                      })
-                
-            # filter out a single subtree
-            else:
-                rx = re.compile(self.filter.get(cat.lower(), cat.lower()))
-                l = []
-                for i,row in enumerate(self.streams["all"]):
-                    if rx.search(row["genre"]):
-                        l.append(row)
+            #-- get data
+            data = http.get(self.json_url, params=params)
+            #__print__(dbg.DATA, data)
             
+            #-- extract
+            l = []
+            __print__( dbg.PROC, "processing api.dir.xiph.org JSON (via api.include-once.org cache)" )
+            data = json.loads(data)
+            for e in data.values():
+                #__print__(dbg.DATA, e)
+                bitrate = int(e["bitrate"])
+                if conf.xiph_min_bitrate and bitrate and bitrate >= int(conf.xiph_min_bitrate):
+                  l.append({
+                    "title": e["stream_name"],
+                    "url": e["listen_url"],
+                    "format": e["type"],
+                    "bitrate": int(e["bitrate"]),
+                    "genre": e["genre"],
+                    "playing": e["current_song"],
+                    "listeners": 0,
+                    "max": 0,
+                    "homepage": (e["homepage"] if ("homepage" in e) else ""),
+                  })
+                
             # send back the list 
             return l
 
@@ -158,147 +126,377 @@ class xiph (ChannelPlugin):
 
 
         genres = [
-            "scanner", #442
-            "rock", #305
-            [
-              "metal|heavy", #36
-            ],
-            "various", #286
-            [
-              "mixed", #96
-            ],
-            "pop", #221
-            [
-              "top40|top|40|top 40", #32
-              "charts|hits", #20+4
-              "80s", #68
-              "90s", #20
-              "disco", #17
-              "remixes", #10
-            ],
-            "electronic|electro", #33
-            [
-              "dance", #161
-              "house", #106
-              "trance", #82
-              "techno", #72
-              "chillout", #16
-              "lounge", #12
-            ],
-            "alternative", #68
-            [
-              "college", #32
-              "student", #20
-              "progressive", #20
-            ],
-            "classical|classic", #58+20
-            "live", #57
-            "jazz", #42
-            [
-              "blues", #19
-            ],
-            "talk|spoken|speak", #41
-            [
-              "news", #39
-              "public", #12
-              "info", #5
-            ],
-            "world|international", #25
-            [
-              "latin", #34
-              "reggae", #12
-              "indie", #12
-              "folk", #9
-              "schlager", #14
-              "jungle", #13
-              "country", #7
-              "russian", #6
-            ],
-            "hip hop|hip|hop", #34
-            [
-               "oldschool", #10
-               "rap",
-            ],
-            "ambient", #34
-            "adult", #33
-           ## "music", #32
-            "oldies", #31
-            [
-              "60s", #2
-              "70s", #17
-            ],
-            "religious", #4
-            [
-              "christian|bible", #14
-            ],
-            "rnb|r&b", #12
-            [
-              "soul", #11
-              "funk", #24
-              "urban", #11
-            ],
-            "other", #25
-            [
-              "deep", #14
-              "soft", #12
-              "minimal", #12
-              "eclectic", #12
-              "drum", #12
-              "bass", #12
-              "experimental", #11
-              "hard", #10
-              "funky", #10
-              "downtempo", #10
-              "slow", #9
-              "break", #9
-              "electronica", #8
-              "dub", #8
-              "retro", #7
-              "punk", #7
-              "psychedelic", #7
-              "goa", #7
-              "freeform", #7
-              "c64", #7
-              "breaks", #7
-              "anime", #7
-              "variety", #6
-              "psytrance", #6
-              "island", #6
-              "downbeat", #6
-              "underground", #5
-              "newage", #5
-              "gothic", #5
-              "dnb", #5
-              "club", #5
-              "acid", #5
-              "video", #4
-              "trip", #4
-              "pure", #4
-              "industrial", #4
-              "groove", #4
-              "gospel", #4
-              "gadanie", #4
-              "french", #4
-              "dark", #4
-              "chill", #4
-              "age", #4
-              "wave", #3
-              "vocal", #3
-              "tech", #3
-              "studio", #3
-              "relax", #3
-              "rave", #3
-              "hardcore", #3
-              "breakbeat", #3
-              "avantgarde", #3
-              "swing", #2
-              "soundtrack", #2
-              "salsa", #2
-              "italian", #2
-              "independant", #2
-              "groovy", #2
-              "european", #2
-              "darkwave", #2
-            ],
-        ]
+              "pop",
+              [
+                  "top40",
+                  "90s",
+                  "80s",
+                  "britpop",
+                  "disco",
+                  "urban",
+                  "party",
+                  "mashup",
+                  "kpop",
+                  "jpop",
+                  "lounge",
+                  "softpop",
+                  "top",
+                  "popular",
+                  "schlager",
+              ],
+              "rock",
+              [
+                  "alternative",
+                  "electro",
+                  "country",
+                  "mixed",
+                  "metal",
+                  "eclectic",
+                  "folk",
+                  "anime",
+                  "hardcore",
+                  "pure"
+                  "jrock"
+              ],
+              "dance",
+              [
+                  "electronic",
+                  "deephouse",
+                  "dancefloor",
+                  "elektro"
+                  "eurodance"
+                  "b",
+                  "r",
+              ],
+              "hits",
+              [
+                  "russian"
+                  "hit",
+                  "star"
+              ],
+              "radio",
+              [
+                  "live",
+                  "community",
+                  "student",
+                  "internet",
+                  "webradio",
+              ],
+              "classic",
+              [
+                   "classical",
+                   "ebu",
+                   "vivaldi",
+                   "piano",
+                   "opera",
+                   "classix",
+                   "chopin",
+                   "renaissance",
+                   "classique",
+              ],
+              "talk",
+              [
+                  "news",
+                  "politics",
+                  "medicine",
+                  "health"
+                  "sport",
+                  "education",
+                  "entertainment",
+                  "podcast",
+              ],
+              "various",
+              [
+                  "hits",
+                  "ruhit",
+                  "mega"
+              ],
+              "house",
+              [
+                  "lounge",
+                  "trance",
+                  "techno",
+                  "handsup",
+                  "gay",
+                  "breaks",
+                  "dj",
+              "electronica",
+              ],
+              "trance",
+              [
+                  "clubbing",
+                  "electronical"
+              ],
+              "jazz",
+              [
+                  "contemporary"
+              ],
+              "oldies",
+              [
+                  "golden",
+                  "decades",
+                  "info",
+                  "70s",
+                  "60s"
+              ],
+              "religious",
+              [
+                  "spiritual",
+                  "inspirational",
+                  "christian",
+                  "catholic",
+                  "teaching",
+                  "christmas",
+                  "gospel",
+              ],
+              "music",
+              "unspecified",
+              "misc",
+              "adult",
+              "indie",
+              [
+                  "reggae",
+                  "blues",
+                  "college",
+                  "soundtrack"
+              ],
+              "mixed",
+              [
+                  "disco",
+                  "mainstream",
+                  "soulfull"
+              ],
+              "funk",
+              "hiphop",
+              [
+                  "rap",
+                  "dubstep",
+                  "hip",
+                  "hop"
+              ],
+              "top",
+              [
+                  "urban"
+              ],
+              "musica",
+              "ambient",
+              [
+                  "downtempo",
+                  "dub"
+              ],
+              "promodj",
+              "world",    # REGIONAL
+              [
+                  "france",
+                  "greek",
+                  "german",
+                  "westcoast",
+                  "bollywood",
+                  "indian",
+                  "nederlands",
+                  "europa",
+                  "italia",
+                  "brazilian",
+                  "tropical",
+                  "korea",
+                  "seychelles",
+                  "black",
+                  "japanese",
+                  "ethnic",
+                  "country",
+                  "americana",
+                  "western",
+                  "cuba",
+                  "afrique",
+                  "paris",
+                  "celtic",
+                  "ambiance",
+                  "francais",
+                  "liberte",
+                  "anglais",
+                  "arabic",
+                  "hungary",
+                  "folklore"
+                  "latin",
+                  "dutch"
+                  "italy"
+              ],
+              "artist",   # ARTIST NAMES
+              [
+                  "mozart",
+                  "beatles",
+                  "michael",
+                  "nirvana",
+                  "elvis",
+                  "britney",
+                  "abba",
+                  "madonna",
+                  "depeche",
+              ],
+              "salsa",
+              "love",
+              "la",
+              "soul",
+              "techno",
+              [
+                  "club",
+                  "progressive",
+                  "deep"
+              "electro",
+              ],
+              "best",
+              "100%",
+              "rnb",
+              "retro",
+              "new",
+              "smooth",
+              [
+                  "cool"
+              ],
+              "easy",
+              [
+                  "lovesongs",
+                  "relaxmusic"
+              ],
+              "chillout",
+              "slow",
+              [
+                  "soft"
+              ],
+              "mix",
+              [
+                  "modern"
+              ],
+              "punk",
+              [
+                  "ska"
+              ],
+              "international",
+              "bass",
+              "zouk",
+              "video",
+              [
+                  "game"
+              ],
+              "hardstyle",
+              "scanner",
+              "chill",
+              [
+                  "out",
+                  "trip"
+              ],
+              "drum",
+              "roots",
+              "ac",
+              [
+                  "chr",
+                  "dc"
+              ],
+              "public",
+              "contemporary",
+              [
+                  "instrumental"
+              ],
+              "minimal",
+              "hot",
+              [
+                  "based"
+              ],
+              "free",
+              [
+                  "format"
+              ],
+              "hard",
+              [
+                  "heavy",
+                  "classicrock"
+              ],
+              "reggaeton",
+              "southern",
+              "musica",
+              "old",
+              "emisora",
+              "img",
+              "rockabilly",
+              "charts",
+              [
+                  "best80",
+                  "70er",
+                  "80er",
+                  "60er"
+                  "chart",
+              ],
+              "other",
+              [
+                  "varios"
+              ],
+              "soulful",
+              "listening",
+              "vegyes",
+              "creative",
+              "variety",
+              "commons",
+              [
+                  "ccmusik"
+              ],
+              "tech",
+              [
+                  "edm",
+                  "prog"
+              ],
+              "minecraft",
+              "animes",
+              "goth",
+              "technologie",
+              "tout",
+              "musical",
+              [
+                  "broadway"
+              ],
+              "romantica",
+              "newage",
+              "nostalgia",
+              "oldschool",
+              [
+                  "00s"
+              ],
+              "wij",
+              "relax",
+              [
+                  "age"
+              ],
+              "theatre",
+              "gothic",
+              "dnb",
+              "disney",
+              "funky",
+              "young",
+              "psychedelic",
+              "habbo",
+              "experimental",
+              "exitos",
+              "digital",
+              "no",
+              "industrial",
+              "epic",
+              "soundtracks",
+              "cover",
+              "chd",
+              "games",
+              "libre",
+              "wave",
+              "vegas",
+              "comedy",
+              "alternate",
+              "instrumental",
+              [
+                  "swing"
+              ],
+              "ska",
+              [
+                  "punkrock",
+                  "oi"
+              ],
+              "darkwave",
+          ]
 
diff --git a/channels/youtube.png b/channels/youtube.png
new file mode 100644
index 0000000..170b350
Binary files /dev/null and b/channels/youtube.png differ
diff --git a/channels/youtube.py b/channels/youtube.py
new file mode 100644
index 0000000..9248614
--- /dev/null
+++ b/channels/youtube.py
@@ -0,0 +1,332 @@
+# encoding: UTF-8
+# api: streamtuner2
+# title: Youtube
+# description: Channel, playlist and video browsing for youtube.
+# type: channel
+# version: 0.1
+# category: video
+# priority: optional
+# suggests: youtube-dl
+# requires: ahttp
+# 
+# 
+# Lists recently popular youtube videos by category or channels.
+#
+# Introduces the faux MIME type "video/youtube" for player and recording
+# configuration; both utilizing `youtube-dl`. But VLC can consume Youtube
+# URLs directly anyhow.
+#
+# For now custom channel names must be configured in the settings dialog
+# text entry, and applied using Channel > Update categories..
+#
+#
+# INTERNA
+#
+# The Youtube v3.0 API is quite longwinded. Here the .api() call shadows
+# a few of the details.
+# While .wrap3() unpacks the various variations of where the video IDs
+# get hidden in the result sets.
+# Google uses some quote/billing algorithm for all queries. It seems
+# sufficient for Streamtuner2 for now, as the fields= JSON filter strips
+# a lot of uneeded data. (Clever idea, but probably incurs more processing
+# effort on Googles servers than it actually saves bandwidth, but hey..)
+#
+#
+# EXAMPLES
+#
+#  api("videos", chart="mostPopular")
+#  api("search", chart="mostPopular", videoCategoryId=10, order="date", type="video")
+#  api("channels", categoryId=10)
+#  api("search", topicId="/m/064t9", type="video")
+#
+# Discovery
+#
+#   videoCat  Music  id= 10
+#   guideCat  Music  id= GCTXVzaWM   channelid= UCBR8-60-B28hp2BmDPdntcQ
+#   topicId   Music  mid= /m/0kpv0g
+#
+#
+
+from config import *
+from channels import *
+
+import ahttp
+import json
+
+
+
+# Youtube
+class youtube (ChannelPlugin):
+
+    # description
+    title = "Youtube"
+    module = "youtube"
+    homepage = "http://www.youtube.com/"
+    listformat = "url/youtube"
+    fmt = "video/youtube"
+    titles = dict( genre="Channel", title="Title", playing="Playlist", bitrate=False, listeners=False )
+
+    # API config
+    service = {
+        2: [ "http://gdata.youtube.com/",
+            {
+                "v": 2,
+                "alt": "json",
+                "max-results": 50,
+            }
+        ],
+        3: [ "https://www.googleapis.com/youtube/v3/",
+            {
+                "key": "AIzaSyAkbLSLn1VgsdFXCJjjdZtLd6W8RqtL4Ag",
+                "maxResults": 50,
+                "part": "id,snippet",
+                "fields": "pageInfo,nextPageToken,items(id,snippet(title,thumbnails/default/url,channelTitle))",
+            }
+        ]
+    }
+
+    categories = [
+        "mostPopular",
+        ["Music", "Comedy", "Movies", "Shows", "Short Movies", "Trailers", "Film & Animation", "Entertainment", "News & Politics"],
+        "topics",
+        ["Pop", "Billboard charts", "Rock", "Hip Hop", "Classical", "Soundtrack", "Ambient",
+         "Jazz", "Blues", "Soul", "Country", "Disco", "Dance", "House", "Trance", "Techno", "Electronica"],
+        "my channels",
+        ["Key of Awesome", "Pentatonix"]
+    ] 
+
+    # plugin settings 
+    config = [
+       {
+          "name": "youtube_channels",
+          "type": "text",
+          "value": "Key Of Awesome, Pentatonix",
+          "description": "Preferred channels to list videos from.",
+          "category": "select",
+       },
+       {
+          "name": "youtube_region",
+          "type": "select",
+          "select": "=No Region|AR=Argentina|AU=Australia|AT=Austria|BE=Belgium|BR=Brazil|CA=Canada|CL=Chile|CO=Colombia|CZ=Czech Republic|EG=Egypt|FR=France|DE=Germany|GB=Great Britain|HK=Hong Kong|HU=Hungary|IN=India|IE=Ireland|IL=Israel|IT=Italy|JP=Japan|JO=Jordan|MY=Malaysia|MX=Mexico|MA=Morocco|NL=Netherlands|NZ=New Zealand|PE=Peru|PH=Philippines|PL=Poland|RU=Russia|SA=Saudi Arabia|SG=Singapore|ZA=South Africa|KR=South Korea|ES=Spain|SE=Sweden|CH=Switzerland|TW=Taiwan|AE=United Arab Emirates|US=United States",
+          "value": "UK",
+          "description": "Filter by region id.",
+          "category": "auth",
+       },
+    ]    
+
+    # from GET https://www.googleapis.com/youtube/v3/videoCategories?part=id%2Csnippet&
+    videocat_id = {
+        "Film & Animation": 1,
+        "Autos & Vehicles": 2,
+        "Music": 10,
+        "Pets & Animals": 15,
+        "Sports": 17,
+        "Short Movies": 18,
+        "Travel & Events": 19,
+        "Gaming": 20,
+        "Videoblogging": 21,
+        "People & Blogs": 22,
+        "Comedy": 34,
+        "Entertainment": 24,
+        "News & Politics": 25,
+        "Howto & Style": 26,
+        "Education": 27,
+        "Science & Technology": 28,
+        "Nonprofits & Activism": 29,
+        "Movies": 30,
+        "Anime/Animation": 31,
+        "Action/Adventure": 32,
+        "Classics": 33,
+        "Documentary": 35,
+        "Drama": 36,
+        "Family": 37,
+        "Foreign": 38,
+        "Horror": 39,
+        "Sci-Fi/Fantasy": 40,
+        "Thriller": 41,
+        "Shorts": 42,
+        "Shows": 43,
+        "Trailers": 44,
+    }
+    # Freebase topics
+    topic_id = {
+        "pop": "/m/064t9",
+        "billboard charts": "/m/04qf57",
+        "rock": "/m/06by7",
+        "dance": "/m/0ggx5q",
+        "classical": "/m/0ggq0m",
+        "hip hop": "/m/0glt670",
+        "soundtrack": "/m/0l14gg",
+        "ambient": "/m/0fd3y",
+        "electronica": "/m/0m0jc",
+        "jazz": "/m/03_d0",
+        "techno": "/m/07gxw",
+        "disco": "/m/026z9",
+        "country": "/m/01lyv",
+        "blues": "/m/0155w",
+        "soul": "/m/0gywn",
+        "trance": "/m/07lnk",
+        "house": "/m/03mb9",
+    }
+
+
+    # just a static list for now
+    def update_categories(self):
+        i = self.categories.index("my channels") + 1
+        self.categories[i] = [ title.strip() for title in conf.youtube_channels.split(",") ]
+
+
+    # retrieve and parse
+    def update_streams(self, cat, force=0, search=None):
+
+        entries = []
+        channels = self.categories[self.categories.index("my channels") + 1]
+        
+        # Most Popular
+        if cat == "mostPopular":
+            #for row in self.api("feeds/api/standardfeeds/%s/most_popular"%conf.youtube_region, ver=2):
+            #    entries.append(self.wrap2(row))
+            for row in self.api("videos", chart="mostPopular", regionCode=conf.youtube_region):
+                entries.append( self.wrap3(row, {"genre": "mostPopular"}) )
+
+        # Categories
+        elif cat in self.videocat_id:
+            for row in self.api("search", chart="mostPopular", videoCategoryId=self.videocat_id[cat], order="date", type="video"):
+                entries.append( self.wrap3(row, {"genre": cat}) )
+
+        # Topics
+        elif cat.lower() in self.topic_id:
+            for row in self.api("search", order="date", regionCode=conf.youtube_region, topicId=self.topic_id[cat.lower()], type="video"):
+                entries.append( self.wrap3(row, {"genre": cat}) )
+
+        # My Channels
+        # - searches channel id for given title
+        # - iterates over playlist
+        # - then over playlistitems to get videos
+        elif cat in channels:
+            # channel id, e.g. UCEmCXnbNYz-MOtXi3lZ7W1Q
+            UC = self.channel_id(cat)
+            
+            # playlist
+            for i,playlist in enumerate(self.api("playlists", fields="items(id,snippet/title)", channelId=UC, maxResults=15)):
+
+                # items (videos)
+                for row in self.api("playlistItems", playlistId=playlist["id"], fields="items(snippet(title,resourceId/videoId,description))"):
+                    entries.append(self.wrap3(row, {"genre": cat, "playing": playlist["snippet"]["title"]}))
+
+                self.update_streams_partially_done(entries)
+                self.parent.status(i / 15.0)
+            
+        # plain search request for videos        
+        elif search is not None:
+            for row in self.api("search", type="video", regionCode=conf.youtube_region, q=search):
+                entries.append( self.wrap3(row, {"genre": ""}) )
+        
+        # empty entries
+        else:
+            entries = [dict(title="Placeholder for subcategories", genre="./.", playing="./.", url="http://youtube.com/")]
+ 
+        # done    
+        return entries
+        
+
+    
+    # Search for channel name:
+    def channel_id(self, title):
+        id = self.channel2id.get(title)
+        if not id:
+            data = self.api("search", part="id", type="channel", q=title)
+            if data:
+                id = data[0]["id"]["channelId"]
+        self.channel2id[title] = id
+        return id
+    channel2id = {}
+
+
+
+    #-- Retrieve Youtube API query results
+    #
+    def api(self, method, ver=3, pages=5, **params):
+        items = []
+
+        # URL and default parameters
+        (base_url, defaults) = self.service[ver]
+        params = dict( list(defaults.items()) + list(params.items())  )
+
+        # Retrieve data set
+        while pages > 0:
+            j = ahttp.get(base_url + method, params=params)
+            #__print__(dbg.DATA, j)
+            if j:
+                # json decode
+                data = json.loads(j)
+                
+                # extract items
+                if "items" in data:
+                    items += data["items"]
+                elif "feed" in data:
+                    items += data["feed"]["entry"]
+                else:
+                    pages = 0
+
+            # Continue to load results?
+            if len(items) >= int(conf.max_streams):
+                pages = 0
+            elif "pageInfo" in data and data["pageInfo"]["totalResults"] < 50:
+                pages = 0
+            elif "nextPageToken" in data:
+                params["pageToken"] = data["nextPageToken"]
+                pages -= 1
+            else:
+                pages = 0
+            self.parent.status( (10 - 1.852 * pages) / 10.5 )
+
+        return items
+
+
+
+    # Wrap API 3.0 result into streams row
+    def wrap3(self, row, data):
+
+        # Video id
+        if "id" in row:
+            # plain /video queries
+            id = row["id"]
+            # for /search queries
+            if type(row["id"]) is dict:
+                id = id["videoId"]
+        # for /playlistItems
+        elif "resourceId" in row["snippet"]:
+            id = row["snippet"]["resourceId"]["videoId"]
+
+        data.update(dict(
+            url = "http://youtube.com/v/" + id,
+            homepage = "https://youtube.com/watch?v=" + id,
+            format = self.fmt,
+            title = row["snippet"]["title"],
+        ))
+        
+        # optional values
+        if "playing" not in data:
+            data["playing"] = row["snippet"]["channelTitle"]
+        if "description" in row["snippet"]:
+            data["description"] = row["snippet"]["description"],
+
+        return data
+
+
+    # API version 2.0s jsonified XML needs different unpacking:
+    def wrap2(self, row):
+        #__print__(dbg.DATA, row)
+        return dict(
+            genre = row["category"][1]["term"],
+            title = row["title"]["$t"],
+            playing = row["author"][0]["name"]["$t"],
+            format = self.fmt,
+            url = row["content"]["src"].split("?")[0],
+            homepage = row["media$group"]["media$player"]["url"],
+            image = row["media$group"]["media$thumbnail"][0]["url"],
+        )
+
+
+
diff --git a/cli.py b/cli.py
index dd7532f..40772c4 100644
--- a/cli.py
+++ b/cli.py
@@ -35,7 +35,7 @@ class StreamTunerCLI (object):
 
     
     # channel plugins
-    channel_modules = ["shoutcast", "xiph", "internet_radio_org_uk", "jamendo", "myoggradio", "live365"]
+    channel_modules = ["shoutcast", "xiph", "internet_radio", "jamendo", "myoggradio", "live365"]
     current_channel = "cli"
     plugins = {} # only populated sparsely by .stream()
     
@@ -109,7 +109,7 @@ syntax:  streamtuner2 action [channel] "stream title"
     def play(self, *args):
         row = self.stream(*args)
         if row.get("url"):
-            #action.action.play(row["url"], audioformat=row.get("format","audio/mp3"))
+            #action.action.play(row["url"], audioformat=row.get("format","audio/mpeg"))
             self.plugins[self.current_channel].play(row)
             
     # return cache data 1:1
diff --git a/config.py b/config.py
index 9f4bb1c..6bdf9e7 100644
--- a/config.py
+++ b/config.py
@@ -22,6 +22,9 @@ import gzip
 import platform
 
 
+# export symbols
+__all__ = ["conf", "__print__", "dbg"]
+
 
 
 #-- create a single instance of config object
@@ -50,6 +53,7 @@ class ConfigDict(dict):
             last = self.load("settings")
             if (last):
                 self.update(last)
+                self.migrate()
             # store defaults in file
             else:
                 self.save("settings")
@@ -58,42 +62,44 @@ class ConfigDict(dict):
 
         # some defaults
         def defaults(self):
-            self.browser = "sensible-browser"
             self.play = {
-               "audio/mp3": "audacious ",	# %u for url to .pls, %g for downloaded .m3u
+               "audio/mpeg": "audacious ",	# %u for url to .pls, %g for downloaded .m3u
                "audio/ogg": "audacious ",
-               "audio/aac": "amarok -l ",
-               "audio/x-pn-realaudio": "vlc ",
-               "audio/*": "totem ",
-               "*/*": "vlc %srv",
+               "audio/*": "audacious ",
+               "video/youtube": "totem $(youtube-dl -g %srv)",
+               "video/*": "vlc --one-instance %srv",
+               "url/http": "sensible-browser",
             }
             self.record = {
-               "*/*": "x-terminal-emulator -e streamripper %srv",
-                    #  x-terminal-emulator -e streamripper %srv -d /home/***USERNAME***/Musik
+               "audio/*": "xterm -e streamripper %srv",   # -d /home/***USERNAME***/Musik
+               "video/youtube": "xterm -e \"youtube-dl %srv\"",
             }
             self.plugins = {
-                "bookmarks": 1,  # built-in plugins, cannot be disabled
+                "bookmarks": 1, # built-in plugin, cannot be disabled
                 "shoutcast": 1,
-                "xiph": 0,     # way too slow on first start
-                "punkcast": 0,   # disable per default
+                "xiph": 1,
+                "modarchive": 0, # disable per default
+                "file": 0,      # disable per default
+                "punkcast": 0,  # disable per default
+                "history": 0,
                 "basicch": 0,   # ceased
-                "tv": 0,   # no longer working
+                "tv": 0,        # ceased
             }
             self.tmp = os.environ.get("TEMP", "/tmp")
-            self.max_streams = "120"
+            self.max_streams = "500"
             self.show_bookmarks = 1
             self.show_favicons = 1
             self.load_favicon = 1
-            self.heuristic_bookmark_update = 1
-            self.retain_deleted = 1
+            self.heuristic_bookmark_update = 0
+            self.retain_deleted = 0
             self.auto_save_appstate = 1
             self.theme = "" #"MountainDew"
-            self.debug = False
-            self.channel_order = "shoutcast, xiph, internet_radio_org_uk, jamendo, myoggradio, .."
+            self.channel_order = "shoutcast, xiph, internet_radio, jamendo, myoggradio, .."
             self.reuse_m3u = 1
-            self.google_homepage = 1
+            self.google_homepage = 0
             self.windows = platform.system()=="Windows"
-            self.debug = 1
+            self.pyquery = 1
+            self.debug = 0
 
             
         # each plugin has a .config dict list, we add defaults here
@@ -146,7 +152,11 @@ class ConfigDict(dict):
             else:
                 f = open(file, "w")
             # encode
-            json.dump(data, f, indent=(4 if nice else None))
+            data = json.dumps(data, indent=(4 if nice else None))
+            try:
+                f.write(data.encode("utf-8"))
+            except TypeError as e:
+                f.write(data)  # Python3 sometimes wants to write strings rather than bytes
             f.close()
 
 
@@ -179,6 +189,13 @@ class ConfigDict(dict):
                     self[key] = value
             # descends into sub-dicts instead of wiping them with subkeys
 
+        # update old setting names
+        def migrate(self):
+            # 2.1.1
+            if "audio/mp3" in self.play:
+                self.play["audio/mpeg"] = self.play["audio/mp3"]
+                del self.play["audio/mp3"]
+
              
         # check for existing filename in directory list
         def find_in_dirs(self, dirs, file):
diff --git a/favicon.py b/favicon.py
index bd8e9c9..d4bbc42 100644
--- a/favicon.py
+++ b/favicon.py
@@ -52,10 +52,11 @@ def download_thread(entries):
     for e in entries:
         # try just once
         if e.get("homepage") in tried_urls:
-            pass
+            continue
         # retrieve specific img url as favicon
         elif e.get("img"):
-            pass
+            localcopy(e["img"], True)
+            continue
         # favicon from homepage URL
         elif e.get("homepage"):
             download(e["homepage"])
@@ -121,6 +122,24 @@ def file(url):
 # does the favicon exist
 def available(url):
     return os.path.exists(file(url))
+    
+    
+# copy image from url into icons/ directory
+def localcopy(url, download=False):
+    if url.startswith("http"):
+        fn = re.sub("[:/]", "_", url)
+        fn = conf.dir + "/icons/" + fn
+        if os.path.exists(fn):
+            return fn
+        elif download:
+            imgdata = ahttp.get(url, binary=1)
+            with open(fn, "wb") as f:
+                f.write(imgdata)
+                f.close()
+        if os.path.exists(fn):    
+            return fn
+    else:
+        return url
 
 
 
diff --git a/gtk2.xml b/gtk2.xml
index ee67909..f3dd802 100644
--- a/gtk2.xml
+++ b/gtk2.xml
@@ -2,587 +2,1101 @@
 <interface>
   <requires lib="gtk+" version="2.20"/>
   <!-- interface-naming-policy toplevel-contextual -->
-  <object class="GtkDialog" id="search_dialog">
+  <object class="GtkListStore" id="config_play">
+    <columns>
+      <!-- column-name type -->
+      <column type="gchararray"/>
+      <!-- column-name app -->
+      <column type="gchararray"/>
+      <!-- column-name gboolean1 -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="config_record">
+    <columns>
+      <!-- column-name type -->
+      <column type="gchararray"/>
+      <!-- column-name app -->
+      <column type="gchararray"/>
+      <!-- column-name gboolean1 -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkWindow" id="win_config">
+    <property name="width_request">565</property>
     <property name="can_focus">False</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">station search</property>
-    <property name="window_position">center-on-parent</property>
-    <property name="type_hint">dialog</property>
-    <property name="deletable">False</property>
-    <property name="gravity">center</property>
-    <property name="opacity">0.95999999999999996</property>
-    <signal name="close" handler="search_cancel" swapped="no"/>
-    <signal name="delete-event" handler="search_cancel" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox1">
+    <property name="title" translatable="yes">streamtuner settings</property>
+    <property name="window_position">center</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="icon">/usr/share/pixmaps/streamtuner2.png</property>
+    <signal name="delete-event" handler="config_cancel" swapped="no"/>
+    <child>
+      <object class="GtkFrame" id="frame1">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="cancel">
-                <property name="label" translatable="yes">cancel</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <signal name="clicked" handler="search_cancel" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleButton" id="togglebutton1">
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="google_search">
-                <property name="label" translatable="yes">google it</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Instead of searching in the station list, just look up the above search term on google.</property>
-                <property name="use_action_appearance">False</property>
-                <property name="relief">half</property>
-                <signal name="clicked" handler="search_google" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="server_search">
-                <property name="label" translatable="yes">query srv</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Instead of doing a cache search, go through the search functions on the directory service homepages. (UNIMPLEMENTED)</property>
-                <property name="use_action_appearance">False</property>
-                <property name="relief">half</property>
-                <signal name="clicked" handler="search_srv" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="cache_search">
-                <property name="label" translatable="yes">cache _search</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Start searching for above search term in the currently loaded station lists. Doesn't find *new* information, just looks through the known data.</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_underline">True</property>
-                <accelerator key="Return" signal="activate"/>
-                <signal name="clicked" handler="search_go" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">4</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">none</property>
         <child>
-          <object class="GtkVBox" id="vbox1">
+          <object class="GtkVBox" id="vbox1233">
+            <property name="height_request">500</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="spacing">20</property>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes"><b><big>search</big></b></property>
-                <property name="use_markup">True</property>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
             <child>
-              <object class="GtkTable" id="table1">
+              <object class="GtkNotebook" id="config_notebook">
+                <property name="width_request">520</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">Which channels/directories to look through.</property>
-                <property name="n_rows">4</property>
-                <property name="n_columns">4</property>
-                <property name="column_spacing">5</property>
-                <property name="row_spacing">1</property>
+                <property name="can_focus">True</property>
+                <property name="scrollable">True</property>
                 <property name="homogeneous">True</property>
                 <child>
-                  <object class="GtkCheckButton" id="search_channel_all">
-                    <property name="label" translatable="yes">all channels</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkLabel" id="label1">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">for</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="search_full">
+                  <object class="GtkScrolledWindow" id="scrolledwindow2">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="has_focus">True</property>
-                    <property name="is_focus">True</property>
-                    <property name="tooltip_text" translatable="yes">A single word to search for in all stations.</property>
-                    <property name="invisible_char">●</property>
-                    <property name="activates_default">True</property>
-                    <property name="primary_icon_activatable">False</property>
-                    <property name="secondary_icon_activatable">False</property>
-                    <property name="primary_icon_sensitive">True</property>
-                    <property name="secondary_icon_sensitive">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="label4">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
-                <property name="spacing">3</property>
-                <property name="homogeneous">True</property>
-                <child>
-                  <object class="GtkButton" id="cancel1">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_title">
-                    <property name="label" translatable="yes">in title</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_description">
-                    <property name="label" translatable="yes">in description</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_all">
-                    <property name="label" translatable="yes">any fields</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="cancel4">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">4</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox4">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
-                <property name="spacing">3</property>
-                <property name="homogeneous">True</property>
-                <child>
-                  <object class="GtkButton" id="cancel2">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_homepage">
-                    <property name="label" translatable="yes">homepage url</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkViewport" id="viewport2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="border_width">15</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox_cfg_player">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="label_player">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes"><b>Audio player</b> association.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">automatic</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <child>
+                                  <object class="GtkTreeView" id="tv_config_player">
+                                    <property name="width_request">540</property>
+                                    <property name="height_request">200</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="border_width">5</property>
+                                    <property name="model">config_play</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="rules_hint">True</property>
+                                    <property name="search_column">0</property>
+                                    <property name="level_indentation">8</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
+                                        <property name="spacing">10</property>
+                                        <property name="min_width">125</property>
+                                        <property name="title" translatable="yes">Format</property>
+                                        <property name="sort_indicator">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
+                                            <signal name="edited" handler="config_play_list_edit_col0" swapped="no"/>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="editable">2</attribute>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
+                                        <property name="spacing">10</property>
+                                        <property name="min_width">300</property>
+                                        <property name="title" translatable="yes">Application</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
+                                            <signal name="edited" handler="config_play_list_edit_col1" swapped="no"/>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="editable">2</attribute>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_record3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_record1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes"><b>Recording</b> applications.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkTreeView" id="tv_config_record">
+                                <property name="width_request">540</property>
+                                <property name="height_request">100</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="border_width">5</property>
+                                <property name="model">config_record</property>
+                                <property name="headers_clickable">False</property>
+                                <property name="rules_hint">True</property>
+                                <property name="search_column">0</property>
+                                <property name="level_indentation">8</property>
+                                <property name="enable_grid_lines">both</property>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="tvc_config_record_type">
+                                    <property name="spacing">10</property>
+                                    <property name="min_width">125</property>
+                                    <property name="title" translatable="yes">Format</property>
+                                    <property name="sort_indicator">True</property>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="tvcr_config_record_type">
+                                        <signal name="edited" handler="config_record_list_edit_col0" swapped="no"/>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="editable">2</attribute>
+                                        <attribute name="text">0</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="tvc_config_record_app">
+                                    <property name="spacing">10</property>
+                                    <property name="min_width">300</property>
+                                    <property name="title" translatable="yes">Application</property>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="tvcr_config_record_app">
+                                        <signal name="edited" handler="config_record_list_edit_col1" swapped="no"/>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="editable">2</attribute>
+                                        <attribute name="text">1</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label15">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="yalign">0.49000000953674316</property>
+                                <property name="label" translatable="yes">Use <a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">placeholders</a> such as <b>%pls</b> for Shoutcast playlists,
+or pass <b>%m3u</b> for players that expect mp3 playlist files,
+and <b>%srv</b> to use direct streaming URLs.</property>
+                                <property name="use_markup">True</property>
+                                <property name="wrap">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_extra">
-                    <property name="label" translatable="yes">extra info</property>
+                <child type="tab">
+                  <object class="GtkLabel" id="label13">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="draw_indicator">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Player</property>
                   </object>
                   <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
+                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkCheckButton" id="search_in_genre">
-                    <property name="label" translatable="yes">and genre</property>
+                  <object class="GtkScrolledWindow" id="scrolledwindow3">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="cancel3">
-                    <property name="label" translatable="yes"> </property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <child>
+                      <object class="GtkViewport" id="viewport3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="border_width">15</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox1options">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="label_cfg_tab_options_display">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">Display</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_show_favicons">
+                                <property name="label" translatable="yes">Display favicons for individual music stations.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_load_favicon">
+                                <property name="label" translatable="yes">Load favicon for played stations.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_show_bookmarks">
+                                <property name="label" translatable="yes">Show bookmark star for favourites in stream lists.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label45">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="tooltip_text" translatable="yes">needs restart</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Use specific Gtk+ theme for Streamtuner2.</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="theme_cb_placeholder">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_auto_save_appstate">
+                                <property name="label" translatable="yes">Save window state, sizes and selections automatically.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label2spc3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">8</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_cfg_tab_options_display3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">Station loading</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">9</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_pyquery">
+                                <property name="label" translatable="yes">Prefer HTML traversing (PyQuery) over regex text matching.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="image_position">top</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">10</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="doc_pyquery_vs_regex">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes"><small>Most plugins intellegently fall back, but sometimes overriding
+the website extraction method can fix some station list update errors.</small></property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">11</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox5">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkEntry" id="config_max_streams">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="max_length">5</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="width_chars">5</property>
+                                    <property name="text" translatable="yes">500</property>
+                                    <property name="shadow_type">out</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label19">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="xpad">6</property>
+                                    <property name="label" translatable="yes">Limit stream number per channel / category.
+<small>Some plugins use custom overrides.</small></property>
+                                    <property name="use_markup">True</property>
+                                    <property name="ellipsize">end</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="padding">5</property>
+                                <property name="position">12</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_retain_deleted">
+                                <property name="label" translatable="yes">Retain deleted stations in list.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">14</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_heuristic_bookmark_update">
+                                <property name="label" translatable="yes">Update favorites from freshened stream URLs.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">15</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_google_homepage">
+                                <property name="label" translatable="yes">Google missing station homepages.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">16</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label4spc">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">20</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_cfg_tab_options_display1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">System</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">21</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox2tmpfiles">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="label24">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Temporary files directory  </property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="config_tmp">
+                                    <property name="width_request">200</property>
+                                    <property name="height_request">20</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_stock">gtk-save-as</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">24</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_reuse_m3u">
+                                <property name="label" translatable="yes">Keep and reuse temporary .m3u files for played stations.</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">26</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox1cfgdir">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="label26">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Config directory.
+<small>This is determined by XDG_CONFIG_HOME.</small></property>
+                                    <property name="use_markup">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="config_dir">
+                                    <property name="width_request">200</property>
+                                    <property name="height_request">20</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="width_chars">20</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_stock">gtk-home</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">False</property>
+                                <property name="padding">3</property>
+                                <property name="position">28</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_debug">
+                                <property name="label" translatable="yes">Enable _debug messages (on the console).</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">30</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label20">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Options</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow" id="scrolledwindow1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">never</property>
+                    <child>
+                      <object class="GtkViewport" id="viewport1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="border_width">15</property>
+                        <property name="resize_mode">queue</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkVBox" id="plugin_options">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="spacing">10</property>
+                            <child>
+                              <object class="GtkLabel" id="label1cplginsdoc">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.05000000074505806</property>
+                                <property name="label" translatable="yes"><b>Channels</b> show up as tabs. While <b>feature</b> <i>plugins</i> add menu entries
+or internal functions. Changes take effect after restarting streamtuner2.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox6">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="label27">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0.40999999642372131</property>
+                                    <property name="label" translatable="yes">Tab ordering</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">6</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="config_channel_order">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHSeparator" id="hseparator1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label44">
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Channel
+Plugins</property>
+                  </object>
+                  <packing>
+                    <property name="position">3</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox124124">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="label152095092">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="button2">
+                    <property name="label" translatable="yes">cancel</property>
+                    <property name="width_request">100</property>
+                    <property name="height_request">35</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="clicked" handler="config_cancel" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="button1">
+                    <property name="label" translatable="yes">save</property>
+                    <property name="width_request">100</property>
+                    <property name="height_request">35</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="relief">none</property>
+                    <signal name="clicked" handler="config_save" swapped="no"/>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">4</property>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
               </object>
               <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox3">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
+                <property name="expand">False</property>
                 <property name="fill">True</property>
-                <property name="position">5</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
         </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">cancel</action-widget>
-      <action-widget response="0">togglebutton1</action-widget>
-      <action-widget response="0">google_search</action-widget>
-      <action-widget response="0">server_search</action-widget>
-      <action-widget response="0">cache_search</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkMenu" id="streamactions">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_play">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">play</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_play_clicked" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_record">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">record</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_record_clicked" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_bookmark">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">bookmark</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="bookmark" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="extensionsCTM">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">Extensions</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="----">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="save">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">save</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="save_as" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="edit">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">edit</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="streamedit_open" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem1">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="homepage">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="use_action_appearance">False</property>
-        <property name="label" translatable="yes">station homepage</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
+        <child type="label">
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes"><big><b>Configuration Settings</b></big></property>
+            <property name="use_markup">True</property>
+          </object>
+        </child>
       </object>
     </child>
   </object>
-  <object class="GtkDialog" id="timer_dialog">
+  <object class="GtkDialog" id="search_dialog">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
-    <property name="type_hint">normal</property>
-    <signal name="delete-event" handler="true" swapped="no"/>
+    <property name="title" translatable="yes">station search</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="type_hint">dialog</property>
+    <property name="deletable">False</property>
+    <property name="gravity">center</property>
+    <property name="opacity">0.95999999999999996</property>
+    <signal name="close" handler="search_cancel" swapped="no"/>
+    <signal name="delete-event" handler="search_cancel" swapped="no"/>
     <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox2">
+      <object class="GtkVBox" id="dialog-vbox1">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="spacing">2</property>
         <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area2">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="timer_cancel">
+              <object class="GtkButton" id="cancel">
                 <property name="label" translatable="yes">cancel</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <signal name="clicked" handler="timer_cancel" swapped="no"/>
+                <signal name="clicked" handler="search_cancel" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -591,13 +1105,9 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="timer_ok">
-                <property name="label" translatable="yes">ok</property>
-                <property name="visible">True</property>
+              <object class="GtkToggleButton" id="togglebutton1">
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <signal name="clicked" handler="timer_ok" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -605,1369 +1115,1795 @@
                 <property name="position">1</property>
               </packing>
             </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkTable" id="table2">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="n_rows">3</property>
-            <property name="n_columns">3</property>
             <child>
-              <object class="GtkEntry" id="timer_value">
+              <object class="GtkButton" id="google_search">
+                <property name="label" translatable="yes">google it</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="invisible_char">●</property>
-                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
-                <property name="primary_icon_activatable">False</property>
-                <property name="secondary_icon_activatable">False</property>
-                <property name="primary_icon_sensitive">True</property>
-                <property name="secondary_icon_sensitive">True</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Instead of searching in the station list, just look up the above search term on google.</property>
+                <property name="relief">half</property>
+                <signal name="clicked" handler="search_google" swapped="no"/>
               </object>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
               </packing>
             </child>
             <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
+              <object class="GtkButton" id="server_search">
+                <property name="label" translatable="yes">query srv</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Instead of doing a cache search, go through the search functions on the directory service homepages. (UNIMPLEMENTED)</property>
+                <property name="relief">half</property>
+                <signal name="clicked" handler="search_srv" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
             </child>
             <child>
-              <placeholder/>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">timer_cancel</action-widget>
-      <action-widget response="0">timer_ok</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkWindow" id="url_action_container">
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkVBox" id="url_action_list">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <child>
-          <object class="GtkLabel" id="url_action_1_online_forum">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://sourceforge.net/projects/streamtuner2/forums/forum/1173108</property>
+              <object class="GtkButton" id="cache_search">
+                <property name="label" translatable="yes">cache _search</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Start searching for above search term in the currently loaded station lists. Doesn't find *new* information, just looks through the known data.</property>
+                <property name="use_underline">True</property>
+                <accelerator key="Return" signal="activate"/>
+                <signal name="clicked" handler="search_go" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
           </object>
           <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="url_action_2_fossil_wiki">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://fossil.include-once.org/streamtuner2/</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="url_action_3_project_homepage">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://milki.include-once.org/streamtuner2/</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-  </object>
-  <object class="GtkWindow" id="win_config">
-    <property name="width_request">565</property>
-    <property name="can_focus">False</property>
-    <property name="title" translatable="yes">streamtuner settings</property>
-    <property name="window_position">center</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="icon">/usr/share/pixmaps/streamtuner2.png</property>
-    <signal name="delete-event" handler="config_cancel" swapped="no"/>
-    <child>
-      <object class="GtkFrame" id="frame1">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
-        <child>
-          <object class="GtkVBox" id="vbox1233">
-            <property name="height_request">500</property>
+          <object class="GtkVBox" id="vbox1">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
+            <property name="spacing">20</property>
             <child>
-              <object class="GtkNotebook" id="config_notebook">
-                <property name="width_request">520</property>
+              <object class="GtkLabel" id="label2">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="scrollable">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes"><b><big>search</big></b></property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkTable" id="table1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Which channels/directories to look through.</property>
+                <property name="n_rows">4</property>
+                <property name="n_columns">4</property>
+                <property name="column_spacing">5</property>
+                <property name="row_spacing">1</property>
                 <property name="homogeneous">True</property>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow2">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">automatic</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport2">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkTable" id="table3">
-                            <property name="width_request">350</property>
-                            <property name="height_request">471</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="n_rows">13</property>
-                            <property name="n_columns">2</property>
-                            <property name="column_spacing">5</property>
-                            <property name="row_spacing">5</property>
-                            <child>
-                              <object class="GtkLabel" id="label6">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/aac</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label9">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/x-real</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label10">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label14">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label11">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">*/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_aac">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_x_pn_realaudio">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio__">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play____">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label15">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Shoutcast links are %u or %pls, parsed m3u files
-are available with %g or %m3u, while %d or %srv
-represent direct URLs to the streaming servers.</property>
-                                <property name="wrap">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label12">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Recording</b></property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">8</property>
-                                <property name="bottom_attach">9</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_record____">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label22">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">    </property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">10</property>
-                                <property name="bottom_attach">11</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label16">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Web Browser</b></property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">11</property>
-                                <property name="bottom_attach">12</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label17">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">url/http</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">12</property>
-                                <property name="bottom_attach">13</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_browser">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">12</property>
-                                <property name="bottom_attach">13</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_mp3">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label7">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/mp3</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_ogg">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label59">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/ogg</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label8">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Format</b></property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label46">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Audio Player</b></property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label124124_placeholder">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">placeholder
-<a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">see help</a></property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label13">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Player</property>
-                  </object>
-                  <packing>
-                    <property name="tab_fill">False</property>
-                  </packing>
+                <child>
+                  <placeholder/>
                 </child>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow3">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">automatic</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport3">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkTable" id="table4">
-                            <property name="width_request">340</property>
-                            <property name="height_request">457</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="n_rows">12</property>
-                            <property name="n_columns">2</property>
-                            <child>
-                              <object class="GtkCheckButton" id="config_show_bookmarks">
-                                <property name="label" translatable="yes">show bookmark star for favourites in stream lists</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHBox" id="hbox5">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkEntry" id="config_max_streams">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="max_length">5</property>
-                                    <property name="invisible_char">●</property>
-                                    <property name="width_chars">4</property>
-                                    <property name="text" translatable="yes">120</property>
-                                    <property name="shadow_type">out</property>
-                                    <property name="invisible_char_set">True</property>
-                                    <property name="primary_icon_activatable">False</property>
-                                    <property name="secondary_icon_activatable">False</property>
-                                    <property name="primary_icon_sensitive">True</property>
-                                    <property name="secondary_icon_sensitive">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label19">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="xpad">6</property>
-                                    <property name="label" translatable="yes">limit stream number per channel / category</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_retain_deleted">
-                                <property name="label" translatable="yes">retain deleted stations in list</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_show_favicons">
-                                <property name="label" translatable="yes">display favicons for individual music stations</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_load_favicon">
-                                <property name="label" translatable="yes">load favicon for played stations</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_heuristic_bookmark_update">
-                                <property name="label" translatable="yes">update favorites from freshened stream urls</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_google_homepage">
-                                <property name="label" translatable="yes">google for homepage URL if missing</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHBox" id="hbox6">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkLabel" id="label27">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label" translatable="yes">ordering of
-channel tabs</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkEntry" id="config_channel_order">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
-                                    <property name="invisible_char_set">True</property>
-                                    <property name="primary_icon_activatable">False</property>
-                                    <property name="secondary_icon_activatable">False</property>
-                                    <property name="primary_icon_sensitive">True</property>
-                                    <property name="secondary_icon_sensitive">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">11</property>
-                                <property name="bottom_attach">12</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_auto_save_appstate">
-                                <property name="label" translatable="yes">automatically save window state</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">10</property>
-                                <property name="bottom_attach">11</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHBox" id="hbox7">
-                                <property name="height_request">16</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkHBox" id="hbox11">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <child>
-                                      <object class="GtkLabel" id="label45">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="tooltip_text" translatable="yes">needs restart</property>
-                                        <property name="xpad">11</property>
-                                        <property name="label" translatable="yes">use Gtk+ theme</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">True</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">0</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkComboBox" id="theme">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">True</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_channel_all">
+                    <property name="label" translatable="yes">all channels</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">for</property>
                   </object>
                   <packing>
-                    <property name="position">1</property>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label20">
+                <child>
+                  <object class="GtkEntry" id="search_full">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Display</property>
+                    <property name="can_focus">True</property>
+                    <property name="has_focus">True</property>
+                    <property name="is_focus">True</property>
+                    <property name="tooltip_text" translatable="yes">A single word to search for in all stations.</property>
+                    <property name="invisible_char">●</property>
+                    <property name="activates_default">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                    <property name="primary_icon_sensitive">True</property>
+                    <property name="secondary_icon_sensitive">True</property>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">1</property>
-                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow4">
+                  <object class="GtkLabel" id="label4">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">automatic</property>
-                    <property name="vscrollbar_policy">automatic</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport4">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkTable" id="table5">
-                            <property name="width_request">350</property>
-                            <property name="height_request">450</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="n_rows">13</property>
-                            <property name="n_columns">2</property>
-                            <child>
-                              <object class="GtkLabel" id="label23">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Directories</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label24">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">temporary
-files</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_tmp">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label47">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">0.10000000149011612</property>
-                                <property name="xpad">1</property>
-                                <property name="label" translatable="yes">Start streamtuner2 with <b>http_proxy=</b>
-as environment variable. This will
-get picked up by Python and urllib.</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label28">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">HTTP proxy</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label26">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">0.10000000149011612</property>
-                                <property name="label" translatable="yes">You can only influence this by
-setting XDG_CONFIG_HOME to a
-different location.</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label25">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">.config dir</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_dir">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="editable">False</property>
-                                <property name="invisible_char">●</property>
-                                <property name="invisible_char_set">True</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                                <property name="primary_icon_sensitive">True</property>
-                                <property name="secondary_icon_sensitive">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="config_reuse_m3u">
-                                <property name="label" translatable="yes">reuse temporary .m3u files</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
+                    <property name="can_focus">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
+                <property name="spacing">3</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkButton" id="cancel1">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                   </object>
                   <packing>
-                    <property name="position">2</property>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label29">
+                <child>
+                  <object class="GtkCheckButton" id="search_in_title">
+                    <property name="label" translatable="yes">in title</property>
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">System</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_description">
+                    <property name="label" translatable="yes">in description</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">2</property>
-                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow1">
+                  <object class="GtkCheckButton" id="search_in_all">
+                    <property name="label" translatable="yes">any fields</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="resize_mode">queue</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkVBox" id="plugin_options">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="spacing">10</property>
-                            <child>
-                              <object class="GtkLabel" id="filler_pl_options_info">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">1</property>
-                                <property name="yalign">0</property>
-                                <property name="ypad">2</property>
-                                <property name="label" translatable="yes">You can enable <i>channels</i> and <i>plugins</i> here. Changes take effect after restarting streamtuner2.</property>
-                                <property name="use_markup">True</property>
-                                <property name="justify">right</property>
-                                <property name="wrap">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="cancel4">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
+                <property name="spacing">3</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkButton" id="cancel2">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                   </object>
                   <packing>
-                    <property name="position">3</property>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label44">
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Channel
-Plugins</property>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_homepage">
+                    <property name="label" translatable="yes">homepage url</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_extra">
+                    <property name="label" translatable="yes">extra info</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_genre">
+                    <property name="label" translatable="yes">and genre</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="draw_indicator">True</property>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">3</property>
-                    <property name="tab_fill">False</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkButton" id="cancel3">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
               </object>
               <packing>
                 <property name="expand">True</property>
                 <property name="fill">True</property>
+                <property name="position">5</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">cancel</action-widget>
+      <action-widget response="0">togglebutton1</action-widget>
+      <action-widget response="0">google_search</action-widget>
+      <action-widget response="0">server_search</action-widget>
+      <action-widget response="0">cache_search</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkMenu" id="streamactions">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_play">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">play</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_play_clicked" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_record">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">record</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_record_clicked" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_bookmark">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">bookmark</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="bookmark" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="extensionsCTM">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Extensions</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="----">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="save">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">save</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="save_as" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="edit">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">edit</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="streamedit_open" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="menuitem1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="homepage">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">station homepage</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
+      </object>
+    </child>
+  </object>
+  <object class="GtkDialog" id="timer_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <signal name="delete-event" handler="true" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="timer_cancel">
+                <property name="label" translatable="yes">cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="timer_cancel" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox124124">
+              <object class="GtkButton" id="timer_ok">
+                <property name="label" translatable="yes">ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="timer_ok" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTable" id="table2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="n_rows">3</property>
+            <property name="n_columns">3</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkEntry" id="timer_value">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkLabel" id="label152095092">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button2">
-                    <property name="label" translatable="yes">cancel</property>
-                    <property name="width_request">100</property>
-                    <property name="height_request">35</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <signal name="clicked" handler="config_cancel" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button1">
-                    <property name="label" translatable="yes">save</property>
-                    <property name="width_request">100</property>
-                    <property name="height_request">35</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_action_appearance">False</property>
-                    <signal name="clicked" handler="config_save" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">●</property>
+                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+                <property name="primary_icon_sensitive">True</property>
+                <property name="secondary_icon_sensitive">True</property>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
               </packing>
             </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
           </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
         </child>
-        <child type="label">
-          <object class="GtkLabel" id="label3">
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">timer_cancel</action-widget>
+      <action-widget response="0">timer_ok</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkWindow" id="url_action_container">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkVBox" id="url_action_list">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkLabel" id="url_action_1_online_forum">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes"><big><b>Configuration Settings</b></big></property>
-            <property name="use_markup">True</property>
+            <property name="label" translatable="yes">http://sourceforge.net/projects/streamtuner2/forums/forum/1173108</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="url_action_2_fossil_wiki">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">http://fossil.include-once.org/streamtuner2/</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="url_action_3_project_homepage">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">http://milki.include-once.org/streamtuner2/</property>
           </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
         </child>
       </object>
     </child>
@@ -1991,6 +2927,9 @@ Plugins</property>
         <property name="column_spacing">5</property>
         <property name="row_spacing">5</property>
         <child>
+          <placeholder/>
+        </child>
+        <child>
           <object class="GtkLabel" id="label31">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
@@ -2181,7 +3120,6 @@ Plugins</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <signal name="clicked" handler="streamedit_cancel" swapped="no"/>
               </object>
               <packing>
@@ -2198,7 +3136,6 @@ Plugins</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="tooltip_text" translatable="yes">Save changes.</property>
-                <property name="use_action_appearance">False</property>
                 <signal name="clicked" handler="streamedit_save" swapped="no"/>
               </object>
               <packing>
@@ -2214,7 +3151,6 @@ Plugins</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <signal name="clicked" handler="streamedit_new" swapped="no"/>
               </object>
               <packing>
@@ -2310,9 +3246,6 @@ Plugins</property>
             <property name="bottom_attach">8</property>
           </packing>
         </child>
-        <child>
-          <placeholder/>
-        </child>
       </object>
     </child>
   </object>
@@ -2351,7 +3284,6 @@ Plugins</property>
                       <object class="GtkMenuItem" id="streammenu">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">_Station</property>
                         <property name="use_underline">True</property>
                         <child type="submenu">
@@ -2362,7 +3294,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menu_bookmark">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">bookmark</property>
                                 <property name="use_underline">True</property>
                                 <accelerator key="F8" signal="activate"/>
@@ -2375,7 +3306,6 @@ Plugins</property>
                                 <property name="label">gtk-save-as</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
@@ -2388,7 +3318,6 @@ Plugins</property>
                                 <property name="label">gtk-edit</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
@@ -2401,7 +3330,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="extensions0">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Extensions</property>
                                 <property name="use_underline">True</property>
                                 <child type="submenu">
@@ -2429,7 +3357,6 @@ Plugins</property>
                                 <property name="label">gtk-quit</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="F4" signal="activate" modifiers="GDK_MOD1_MASK"/>
@@ -2445,7 +3372,6 @@ Plugins</property>
                         <property name="label">gtk-edit</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <child type="submenu">
@@ -2457,7 +3383,6 @@ Plugins</property>
                                 <property name="label">gtk-copy</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <signal name="activate" handler="menu_copy" swapped="no"/>
@@ -2468,7 +3393,6 @@ Plugins</property>
                                 <property name="label">gtk-delete</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
@@ -2481,7 +3405,6 @@ Plugins</property>
                                 <property name="label">gtk-find</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/>
@@ -2498,7 +3421,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuitem8">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">_Toolbar</property>
                                 <property name="use_underline">True</property>
                                 <child type="submenu">
@@ -2510,7 +3432,6 @@ Plugins</property>
                                         <property name="label">gtk-revert-to-saved</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="use_underline">True</property>
                                         <property name="use_stock">True</property>
                                       </object>
@@ -2525,7 +3446,6 @@ Plugins</property>
                                       <object class="GtkMenuItem" id="menuitem10">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="label" translatable="yes">Only Symbols</property>
                                         <property name="use_underline">True</property>
                                         <signal name="activate" handler="menu_toolbar_style_icons" swapped="no"/>
@@ -2535,7 +3455,6 @@ Plugins</property>
                                       <object class="GtkMenuItem" id="menuitem11">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="label" translatable="yes">With Text</property>
                                         <property name="use_underline">True</property>
                                         <signal name="activate" handler="menu_toolbar_style_both" swapped="no"/>
@@ -2551,7 +3470,6 @@ Plugins</property>
                                       <object class="GtkMenuItem" id="menuitem12">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="label" translatable="yes">Small</property>
                                         <property name="use_underline">True</property>
                                         <signal name="activate" handler="menu_toolbar_size_small" swapped="no"/>
@@ -2561,7 +3479,6 @@ Plugins</property>
                                       <object class="GtkMenuItem" id="menuitem13">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="label" translatable="yes">Medium</property>
                                         <property name="use_underline">True</property>
                                         <signal name="activate" handler="menu_toolbar_size_medium" swapped="no"/>
@@ -2571,7 +3488,6 @@ Plugins</property>
                                       <object class="GtkMenuItem" id="menuitem14">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="label" translatable="yes">Large</property>
                                         <property name="use_underline">True</property>
                                         <signal name="activate" handler="menu_toolbar_size_large" swapped="no"/>
@@ -2585,7 +3501,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuitem15savestates">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Save states</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="app_state" swapped="no"/>
@@ -2596,7 +3511,6 @@ Plugins</property>
                                 <property name="label">gtk-properties</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <accelerator key="F12" signal="activate"/>
@@ -2611,7 +3525,6 @@ Plugins</property>
                       <object class="GtkMenuItem" id="channelmenu">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">_Channel</property>
                         <property name="use_underline">True</property>
                         <child type="submenu">
@@ -2622,7 +3535,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuitem10homepage">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Homepage of directory service</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="on_homepage_channel_clicked" swapped="no"/>
@@ -2632,7 +3544,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuitem_reload">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Reload</property>
                                 <property name="use_underline">True</property>
                                 <accelerator key="F5" signal="activate"/>
@@ -2644,7 +3555,6 @@ Plugins</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="tooltip_text" translatable="yes">this will take a few minutes</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Update favicons...</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="update_favicons" swapped="no"/>
@@ -2654,7 +3564,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuitem_refreshcategory">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">Reload Category Tree</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="update_categories" swapped="no"/>
@@ -2675,7 +3584,6 @@ Plugins</property>
                         <property name="label">gtk-help</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <child type="submenu">
@@ -2686,7 +3594,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="helpmenu1">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">documentation</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="menu_help" swapped="no"/>
@@ -2696,7 +3603,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menuonlineforum">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">online forum</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="menu_onlineforum" swapped="no"/>
@@ -2706,7 +3612,6 @@ Plugins</property>
                               <object class="GtkMenuItem" id="menufossilwiki">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="label" translatable="yes">wiki/fossil/bugs</property>
                                 <property name="use_underline">True</property>
                                 <signal name="activate" handler="menu_fossilwiki" swapped="no"/>
@@ -2717,7 +3622,6 @@ Plugins</property>
                                 <property name="label">gtk-about</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="use_underline">True</property>
                                 <property name="use_stock">True</property>
                                 <signal name="activate" handler="menu_about" swapped="no"/>
@@ -2748,7 +3652,6 @@ Plugins</property>
                           <object class="GtkToolButton" id="play">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="use_action_appearance">False</property>
                             <property name="label" translatable="yes">play</property>
                             <property name="stock_id">gtk-media-play</property>
                             <signal name="clicked" handler="on_play_clicked" swapped="no"/>
@@ -2762,7 +3665,6 @@ Plugins</property>
                           <object class="GtkToolButton" id="record">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="use_action_appearance">False</property>
                             <property name="label" translatable="yes">record</property>
                             <property name="stock_id">gtk-media-record</property>
                             <signal name="clicked" handler="on_record_clicked" swapped="no"/>
@@ -2776,7 +3678,6 @@ Plugins</property>
                           <object class="GtkToolButton" id="homepage_stream">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="use_action_appearance">False</property>
                             <property name="label" translatable="yes">station</property>
                             <property name="stock_id">gtk-home</property>
                             <signal name="clicked" handler="on_homepage_stream_clicked" swapped="no"/>
@@ -2800,7 +3701,6 @@ Plugins</property>
                           <object class="GtkToolButton" id="reload">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="use_action_appearance">False</property>
                             <property name="label" translatable="yes">reload</property>
                             <property name="stock_id">gtk-refresh</property>
                             <signal name="clicked" handler="on_reload_clicked" swapped="no"/>
@@ -2812,9 +3712,8 @@ Plugins</property>
                         </child>
                         <child>
                           <object class="GtkToolButton" id="stop">
-                            <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="use_action_appearance">False</property>
+                            <property name="visible_horizontal">False</property>
                             <property name="label" translatable="yes">stop</property>
                             <property name="stock_id">gtk-cancel</property>
                             <signal name="clicked" handler="on_stop_clicked" swapped="no"/>
diff --git a/gtk3.xml b/gtk3.xml
index ca05f0f..becab24 100644
--- a/gtk3.xml
+++ b/gtk3.xml
@@ -2,1597 +2,451 @@
 <!-- Generated with glade 3.16.1 -->
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <object class="GtkDialog" id="search_dialog">
+  <object class="GtkListStore" id="config_play">
+    <columns>
+      <!-- column-name type -->
+      <column type="gchararray"/>
+      <!-- column-name app -->
+      <column type="gchararray"/>
+      <!-- column-name gboolean1 -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="config_record">
+    <columns>
+      <!-- column-name type -->
+      <column type="gchararray"/>
+      <!-- column-name app -->
+      <column type="gchararray"/>
+      <!-- column-name gboolean1 -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkWindow" id="win_config">
+    <property name="width_request">565</property>
     <property name="can_focus">False</property>
-    <property name="opacity">0.95999999999999996</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">station search</property>
-    <property name="window_position">center-on-parent</property>
-    <property name="type_hint">dialog</property>
-    <property name="deletable">False</property>
-    <property name="gravity">center</property>
-    <signal name="close" handler="search_cancel" swapped="no"/>
-    <signal name="delete-event" handler="search_cancel" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
+    <property name="title" translatable="yes">streamtuner settings</property>
+    <property name="window_position">center</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="icon">/usr/share/pixmaps/streamtuner2.png</property>
+    <signal name="delete-event" handler="config_cancel" swapped="no"/>
+    <child>
+      <object class="GtkFrame" id="frame1">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="cancel">
-                <property name="label" translatable="yes">cancel</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="clicked" handler="search_cancel" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToggleButton" id="togglebutton1">
-                <property name="use_action_appearance">False</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="google_search">
-                <property name="label" translatable="yes">google it</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Instead of searching in the station list, just look up the above search term on google.</property>
-                <property name="relief">half</property>
-                <signal name="clicked" handler="search_google" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="server_search">
-                <property name="label" translatable="yes">query srv</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Instead of doing a cache search, go through the search functions on the directory service homepages. (UNIMPLEMENTED)</property>
-                <property name="relief">half</property>
-                <signal name="clicked" handler="search_srv" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="cache_search">
-                <property name="label" translatable="yes">cache _search</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Start searching for above search term in the currently loaded station lists. Doesn't find *new* information, just looks through the known data.</property>
-                <property name="use_underline">True</property>
-                <signal name="clicked" handler="search_go" swapped="no"/>
-                <accelerator key="Return" signal="activate"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">4</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">none</property>
         <child>
-          <object class="GtkVBox" id="vbox1">
+          <object class="GtkVBox" id="vbox1233">
+            <property name="height_request">500</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="spacing">20</property>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes"><b><big>search</big></b></property>
-                <property name="use_markup">True</property>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
             <child>
-              <object class="GtkTable" id="table1">
+              <object class="GtkNotebook" id="config_notebook">
+                <property name="width_request">520</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">Which channels/directories to look through.</property>
-                <property name="n_rows">4</property>
-                <property name="n_columns">4</property>
-                <property name="column_spacing">5</property>
-                <property name="row_spacing">1</property>
-                <property name="homogeneous">True</property>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
+                <property name="can_focus">True</property>
+                <property name="scrollable">True</property>
                 <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
+                  <object class="GtkScrolledWindow" id="scrolledwindow2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <child>
+                      <object class="GtkViewport" id="viewport2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="border_width">15</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkVBox" id="vbox_cfg_player">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="label_player">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes"><b>Audio player</b> association.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <child>
+                                  <object class="GtkTreeView" id="tv_config_player">
+                                    <property name="width_request">540</property>
+                                    <property name="height_request">200</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="border_width">5</property>
+                                    <property name="model">config_play</property>
+                                    <property name="headers_clickable">False</property>
+                                    <property name="rules_hint">True</property>
+                                    <property name="search_column">0</property>
+                                    <property name="level_indentation">8</property>
+                                    <property name="enable_grid_lines">both</property>
+                                    <child internal-child="selection">
+                                      <object class="GtkTreeSelection" id="treeview-selection1"/>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="tvc_config_player_type">
+                                        <property name="spacing">10</property>
+                                        <property name="min_width">125</property>
+                                        <property name="title" translatable="yes">Format</property>
+                                        <property name="sort_indicator">True</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="tvcr_config_player_type">
+                                            <signal name="edited" handler="config_play_list_edit_col0" swapped="no"/>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="editable">2</attribute>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="tvc_config_player_app">
+                                        <property name="spacing">10</property>
+                                        <property name="min_width">300</property>
+                                        <property name="title" translatable="yes">Application</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="tvcr_config_player_app">
+                                            <signal name="edited" handler="config_play_list_edit_col1" swapped="no"/>
+                                          </object>
+                                          <attributes>
+                                            <attribute name="editable">2</attribute>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_record3">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label_record1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes"><b>Recording</b> applications.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkTreeView" id="tv_config_record">
+                                <property name="width_request">540</property>
+                                <property name="height_request">100</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="border_width">5</property>
+                                <property name="model">config_record</property>
+                                <property name="headers_clickable">False</property>
+                                <property name="rules_hint">True</property>
+                                <property name="search_column">0</property>
+                                <property name="level_indentation">8</property>
+                                <property name="enable_grid_lines">both</property>
+                                <child internal-child="selection">
+                                  <object class="GtkTreeSelection" id="treeview-selection2"/>
+                                </child>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="tvc_config_record_type">
+                                    <property name="spacing">10</property>
+                                    <property name="min_width">125</property>
+                                    <property name="title" translatable="yes">Format</property>
+                                    <property name="sort_indicator">True</property>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="tvcr_config_record_type">
+                                        <signal name="edited" handler="config_record_list_edit_col0" swapped="no"/>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="editable">2</attribute>
+                                        <attribute name="text">0</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="tvc_config_record_app">
+                                    <property name="spacing">10</property>
+                                    <property name="min_width">300</property>
+                                    <property name="title" translatable="yes">Application</property>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="tvcr_config_record_app">
+                                        <signal name="edited" handler="config_record_list_edit_col1" swapped="no"/>
+                                      </object>
+                                      <attributes>
+                                        <attribute name="editable">2</attribute>
+                                        <attribute name="text">1</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">5</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label15">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="yalign">0.49000000953674316</property>
+                                <property name="label" translatable="yes">Use <a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">placeholders</a> such as <b>%pls</b> for Shoutcast playlists,
+or pass <b>%m3u</b> for players that expect mp3 playlist files,
+and <b>%srv</b> to use direct streaming URLs.</property>
+                                <property name="use_markup">True</property>
+                                <property name="wrap">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
                 </child>
-                <child>
-                  <placeholder/>
+                <child type="tab">
+                  <object class="GtkLabel" id="label13">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Player</property>
+                  </object>
+                  <packing>
+                    <property name="tab_fill">False</property>
+                  </packing>
                 </child>
                 <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_channel_all">
-                    <property name="label" translatable="yes">all channels</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkLabel" id="label1">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">for</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="search_full">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="has_focus">True</property>
-                    <property name="is_focus">True</property>
-                    <property name="tooltip_text" translatable="yes">A single word to search for in all stations.</property>
-                    <property name="invisible_char">●</property>
-                    <property name="activates_default">True</property>
-                    <property name="primary_icon_activatable">False</property>
-                    <property name="secondary_icon_activatable">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="label4">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
-                <property name="spacing">3</property>
-                <property name="homogeneous">True</property>
-                <child>
-                  <object class="GtkButton" id="cancel1">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_title">
-                    <property name="label" translatable="yes">in title</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_description">
-                    <property name="label" translatable="yes">in description</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_all">
-                    <property name="label" translatable="yes">any fields</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="cancel4">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">4</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox4">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
-                <property name="spacing">3</property>
-                <property name="homogeneous">True</property>
-                <child>
-                  <object class="GtkButton" id="cancel2">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_homepage">
-                    <property name="label" translatable="yes">homepage url</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_extra">
-                    <property name="label" translatable="yes">extra info</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="search_in_genre">
-                    <property name="label" translatable="yes">and genre</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0.5</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="cancel3">
-                    <property name="label" translatable="yes"> </property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="relief">none</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">4</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox3">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">5</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">cancel</action-widget>
-      <action-widget response="0">togglebutton1</action-widget>
-      <action-widget response="0">google_search</action-widget>
-      <action-widget response="0">server_search</action-widget>
-      <action-widget response="0">cache_search</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkMenu" id="streamactions">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_play">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">play</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_play_clicked" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_record">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">record</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_record_clicked" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="streamactions_bookmark">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">bookmark</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="bookmark" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="extensionsCTM">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">Extensions</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="----">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="save">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">save</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="save_as" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="edit">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">edit</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="streamedit_open" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkSeparatorMenuItem" id="menuitem1">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="homepage">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">station homepage</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
-      </object>
-    </child>
-  </object>
-  <object class="GtkDialog" id="timer_dialog">
-    <property name="can_focus">False</property>
-    <property name="border_width">5</property>
-    <property name="type_hint">normal</property>
-    <signal name="delete-event" handler="true" swapped="no"/>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox2">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area2">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="timer_cancel">
-                <property name="label" translatable="yes">cancel</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="clicked" handler="timer_cancel" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="timer_ok">
-                <property name="label" translatable="yes">ok</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="clicked" handler="timer_ok" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkTable" id="table2">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="n_rows">3</property>
-            <property name="n_columns">3</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <object class="GtkEntry" id="timer_value">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="invisible_char">●</property>
-                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
-                <property name="primary_icon_activatable">False</property>
-                <property name="secondary_icon_activatable">False</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">timer_cancel</action-widget>
-      <action-widget response="0">timer_ok</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkWindow" id="url_action_container">
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkVBox" id="url_action_list">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <child>
-          <object class="GtkLabel" id="url_action_1_online_forum">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://sourceforge.net/projects/streamtuner2/forums/forum/1173108</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="url_action_2_fossil_wiki">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://fossil.include-once.org/streamtuner2/</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="url_action_3_project_homepage">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">http://milki.include-once.org/streamtuner2/</property>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-  </object>
-  <object class="GtkWindow" id="win_config">
-    <property name="width_request">565</property>
-    <property name="can_focus">False</property>
-    <property name="title" translatable="yes">streamtuner settings</property>
-    <property name="window_position">center</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="icon">/usr/share/pixmaps/streamtuner2.png</property>
-    <signal name="delete-event" handler="config_cancel" swapped="no"/>
-    <child>
-      <object class="GtkFrame" id="frame1">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
-        <child>
-          <object class="GtkVBox" id="vbox1233">
-            <property name="height_request">500</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <child>
-              <object class="GtkNotebook" id="config_notebook">
-                <property name="width_request">520</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="scrollable">True</property>
-                <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow2">
+                  <object class="GtkScrolledWindow" id="scrolledwindow3">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <child>
-                      <object class="GtkViewport" id="viewport2">
+                      <object class="GtkViewport" id="viewport3">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="border_width">15</property>
                         <property name="shadow_type">none</property>
                         <child>
-                          <object class="GtkTable" id="table3">
-                            <property name="width_request">350</property>
-                            <property name="height_request">471</property>
+                          <object class="GtkVBox" id="vbox1options">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="n_rows">13</property>
-                            <property name="n_columns">2</property>
-                            <property name="column_spacing">5</property>
-                            <property name="row_spacing">5</property>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label6">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/aac</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label9">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/x-real</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label10">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label14">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
                             <child>
-                              <object class="GtkLabel" id="label11">
+                              <object class="GtkLabel" id="label_cfg_tab_options_display">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">*/*</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_aac">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_x_pn_realaudio">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">Display</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkEntry" id="config_play_audio__">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
+                              <object class="GtkCheckButton" id="config_show_favicons">
+                                <property name="label" translatable="yes">Display favicons for individual music stations.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkEntry" id="config_play____">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
+                              <object class="GtkCheckButton" id="config_load_favicon">
+                                <property name="label" translatable="yes">Load favicon for played stations.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label15">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Shoutcast links are %u or %pls, parsed m3u files
-are available with %g or %m3u, while %d or %srv
-represent direct URLs to the streaming servers.</property>
-                                <property name="wrap">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label12">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Recording</b></property>
-                                <property name="use_markup">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">8</property>
-                                <property name="bottom_attach">9</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkEntry" id="config_record____">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
+                              <object class="GtkCheckButton" id="config_show_bookmarks">
+                                <property name="label" translatable="yes">Show bookmark star for favourites in stream lists.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label22">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">    </property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">10</property>
-                                <property name="bottom_attach">11</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label16">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Web Browser</b></property>
-                                <property name="use_markup">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">11</property>
-                                <property name="bottom_attach">12</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">3</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label17">
+                              <object class="GtkLabel" id="label45">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">url/http</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">12</property>
-                                <property name="bottom_attach">13</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_browser">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">12</property>
-                                <property name="bottom_attach">13</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_play_audio_mp3">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
+                                <property name="tooltip_text" translatable="yes">needs restart</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Use specific Gtk+ theme for Streamtuner2.</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">4</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label7">
+                              <object class="GtkHBox" id="theme_cb_placeholder">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/mp3</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                                <child>
+                                  <placeholder/>
+                                </child>
                               </object>
                               <packing>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">5</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkEntry" id="config_play_audio_ogg">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
+                              <object class="GtkCheckButton" id="config_auto_save_appstate">
+                                <property name="label" translatable="yes">Save window state, sizes and selections automatically.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">6</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label59">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">audio/ogg</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label8">
+                              <object class="GtkLabel" id="label2spc3">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Format</b></property>
-                                <property name="use_markup">True</property>
                               </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">8</property>
+                              </packing>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label46">
+                              <object class="GtkLabel" id="label_cfg_tab_options_display3">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes"><b>Audio Player</b></property>
-                                <property name="use_markup">True</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">Station loading</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">9</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label124124_placeholder">
+                              <object class="GtkCheckButton" id="config_pyquery">
+                                <property name="label" translatable="yes">Prefer HTML traversing (PyQuery) over regex text matching.</property>
                                 <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">placeholder
-<a href="http://fossil.include-once.org/streamtuner2/wiki?name=player">see help</a></property>
-                                <property name="use_markup">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="xalign">0</property>
+                                <property name="image_position">top</property>
+                                <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">10</property>
                               </packing>
                             </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label13">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Player</property>
-                  </object>
-                  <packing>
-                    <property name="tab_fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow3">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport3">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkTable" id="table4">
-                            <property name="width_request">340</property>
-                            <property name="height_request">457</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="n_rows">12</property>
-                            <property name="n_columns">2</property>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_show_bookmarks">
-                                <property name="label" translatable="yes">show bookmark star for favourites in stream lists</property>
-                                <property name="use_action_appearance">False</property>
+                              <object class="GtkLabel" id="doc_pyquery_vs_regex">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
+                                <property name="can_focus">False</property>
                                 <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
+                                <property name="label" translatable="yes"><small>Most plugins intellegently fall back, but sometimes overriding
+the website extraction method can fix some station list update errors.</small></property>
+                                <property name="use_markup">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">11</property>
                               </packing>
                             </child>
                             <child>
@@ -1605,15 +459,15 @@ represent direct URLs to the streaming servers.</property>
                                     <property name="can_focus">True</property>
                                     <property name="max_length">5</property>
                                     <property name="invisible_char">●</property>
-                                    <property name="width_chars">4</property>
-                                    <property name="text" translatable="yes">120</property>
+                                    <property name="width_chars">5</property>
+                                    <property name="text" translatable="yes">500</property>
                                     <property name="shadow_type">out</property>
                                     <property name="primary_icon_activatable">False</property>
                                     <property name="secondary_icon_activatable">False</property>
                                   </object>
                                   <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
@@ -1621,8 +475,12 @@ represent direct URLs to the streaming servers.</property>
                                   <object class="GtkLabel" id="label19">
                                     <property name="visible">True</property>
                                     <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
                                     <property name="xpad">6</property>
-                                    <property name="label" translatable="yes">limit stream number per channel / category</property>
+                                    <property name="label" translatable="yes">Limit stream number per channel / category.
+<small>Some plugins use custom overrides.</small></property>
+                                    <property name="use_markup">True</property>
+                                    <property name="ellipsize">end</property>
                                   </object>
                                   <packing>
                                     <property name="expand">True</property>
@@ -1632,14 +490,18 @@ represent direct URLs to the streaming servers.</property>
                                 </child>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="padding">5</property>
+                                <property name="position">12</property>
                               </packing>
                             </child>
                             <child>
+                              <placeholder/>
+                            </child>
+                            <child>
                               <object class="GtkCheckButton" id="config_retain_deleted">
-                                <property name="label" translatable="yes">retain deleted stations in list</property>
-                                <property name="use_action_appearance">False</property>
+                                <property name="label" translatable="yes">Retain deleted stations in list.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
@@ -1647,16 +509,14 @@ represent direct URLs to the streaming servers.</property>
                                 <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">14</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_show_favicons">
-                                <property name="label" translatable="yes">display favicons for individual music stations</property>
-                                <property name="use_action_appearance">False</property>
+                              <object class="GtkCheckButton" id="config_heuristic_bookmark_update">
+                                <property name="label" translatable="yes">Update favorites from freshened stream URLs.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
@@ -1664,16 +524,14 @@ represent direct URLs to the streaming servers.</property>
                                 <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">15</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_load_favicon">
-                                <property name="label" translatable="yes">load favicon for played stations</property>
-                                <property name="use_action_appearance">False</property>
+                              <object class="GtkCheckButton" id="config_google_homepage">
+                                <property name="label" translatable="yes">Google missing station homepages.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
@@ -1681,196 +539,188 @@ represent direct URLs to the streaming servers.</property>
                                 <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">3</property>
-                                <property name="bottom_attach">4</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">16</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_heuristic_bookmark_update">
-                                <property name="label" translatable="yes">update favorites from freshened stream urls</property>
-                                <property name="use_action_appearance">False</property>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label4spc">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
+                                <property name="can_focus">False</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">6</property>
-                                <property name="bottom_attach">7</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">20</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_google_homepage">
-                                <property name="label" translatable="yes">google for homepage URL if missing</property>
-                                <property name="use_action_appearance">False</property>
+                              <object class="GtkLabel" id="label_cfg_tab_options_display1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.019999999552965164</property>
+                                <property name="ypad">9</property>
+                                <property name="label" translatable="yes">System</property>
+                                <attributes>
+                                  <attribute name="weight" value="bold"/>
+                                  <attribute name="gravity" value="east"/>
+                                </attributes>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">21</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox2tmpfiles">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="label24">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Temporary files directory  </property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="config_tmp">
+                                    <property name="width_request">200</property>
+                                    <property name="height_request">20</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="primary_icon_stock">gtk-save-as</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">24</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_reuse_m3u">
+                                <property name="label" translatable="yes">Keep and reuse temporary .m3u files for played stations.</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
-                                <property name="xalign">0</property>
+                                <property name="xalign">0.5</property>
                                 <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">7</property>
-                                <property name="bottom_attach">8</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">26</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkHBox" id="hbox6">
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox1cfgdir">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <child>
-                                  <object class="GtkLabel" id="label27">
+                                  <object class="GtkLabel" id="label26">
                                     <property name="visible">True</property>
                                     <property name="can_focus">False</property>
-                                    <property name="label" translatable="yes">ordering of
-channel tabs</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Config directory.
+<small>This is determined by XDG_CONFIG_HOME.</small></property>
+                                    <property name="use_markup">True</property>
                                   </object>
                                   <packing>
-                                    <property name="expand">True</property>
+                                    <property name="expand">False</property>
                                     <property name="fill">True</property>
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkEntry" id="config_channel_order">
+                                  <object class="GtkEntry" id="config_dir">
+                                    <property name="width_request">200</property>
+                                    <property name="height_request">20</property>
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
+                                    <property name="editable">False</property>
                                     <property name="invisible_char">●</property>
+                                    <property name="width_chars">20</property>
+                                    <property name="primary_icon_stock">gtk-home</property>
                                     <property name="primary_icon_activatable">False</property>
                                     <property name="secondary_icon_activatable">False</property>
                                   </object>
                                   <packing>
-                                    <property name="expand">True</property>
+                                    <property name="expand">False</property>
                                     <property name="fill">True</property>
                                     <property name="position">1</property>
                                   </packing>
                                 </child>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">11</property>
-                                <property name="bottom_attach">12</property>
+                                <property name="expand">True</property>
+                                <property name="fill">False</property>
+                                <property name="padding">3</property>
+                                <property name="position">28</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_auto_save_appstate">
-                                <property name="label" translatable="yes">automatically save window state</property>
-                                <property name="use_action_appearance">False</property>
+                              <placeholder/>
+                            </child>
+                            <child>
+                              <object class="GtkCheckButton" id="config_debug">
+                                <property name="label" translatable="yes">Enable _debug messages (on the console).</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
-                                <property name="xalign">0</property>
+                                <property name="use_underline">True</property>
+                                <property name="xalign">0.5</property>
                                 <property name="draw_indicator">True</property>
                               </object>
                               <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">10</property>
-                                <property name="bottom_attach">11</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkHBox" id="hbox7">
-                                <property name="height_request">16</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkHBox" id="hbox11">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <child>
-                                      <object class="GtkLabel" id="label45">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="tooltip_text" translatable="yes">needs restart</property>
-                                        <property name="xpad">11</property>
-                                        <property name="label" translatable="yes">use Gtk+ theme</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">True</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">0</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkComboBox" id="theme">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">True</property>
-                                        <property name="fill">True</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="padding">5</property>
+                                <property name="position">30</property>
                               </packing>
                             </child>
                             <child>
                               <placeholder/>
                             </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
                           </object>
                         </child>
                       </object>
@@ -1884,7 +734,7 @@ channel tabs</property>
                   <object class="GtkLabel" id="label20">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Display</property>
+                    <property name="label" translatable="yes">Options</property>
                   </object>
                   <packing>
                     <property name="position">1</property>
@@ -1892,118 +742,87 @@ channel tabs</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow4">
+                  <object class="GtkScrolledWindow" id="scrolledwindow1">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">never</property>
                     <child>
-                      <object class="GtkViewport" id="viewport4">
+                      <object class="GtkViewport" id="viewport1">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="border_width">15</property>
+                        <property name="resize_mode">queue</property>
                         <property name="shadow_type">none</property>
                         <child>
-                          <object class="GtkTable" id="table5">
-                            <property name="width_request">350</property>
-                            <property name="height_request">450</property>
+                          <object class="GtkVBox" id="plugin_options">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="n_rows">13</property>
-                            <property name="n_columns">2</property>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
+                            <property name="spacing">10</property>
                             <child>
-                              <placeholder/>
+                              <object class="GtkLabel" id="label1cplginsdoc">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0.05000000074505806</property>
+                                <property name="label" translatable="yes"><b>Channels</b> show up as tabs. While <b>feature</b> <i>plugins</i> add menu entries
+or internal functions. Changes take effect after restarting streamtuner2.</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
                             </child>
                             <child>
-                              <placeholder/>
+                              <object class="GtkHBox" id="hbox6">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="label27">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">0.40999999642372131</property>
+                                    <property name="label" translatable="yes">Tab ordering</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="padding">6</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="config_channel_order">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="width_chars">30</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
                             </child>
                             <child>
-                              <placeholder/>
+                              <object class="GtkHSeparator" id="hseparator1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
                             </child>
                             <child>
                               <placeholder/>
@@ -2078,135 +897,19 @@ channel tabs</property>
                               <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label23">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Directories</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label24">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">temporary
-files</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkEntry" id="config_tmp">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">1</property>
-                                <property name="bottom_attach">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label47">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">0.10000000149011612</property>
-                                <property name="xpad">1</property>
-                                <property name="label" translatable="yes">Start streamtuner2 with <b>http_proxy=</b>
-as environment variable. This will
-get picked up by Python and urllib.</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="label28">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">HTTP proxy</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">9</property>
-                                <property name="bottom_attach">10</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label26">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">0.10000000149011612</property>
-                                <property name="label" translatable="yes">You can only influence this by
-setting XDG_CONFIG_HOME to a
-different location.</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">5</property>
-                                <property name="bottom_attach">6</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkLabel" id="label25">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">.config dir</property>
-                              </object>
-                              <packing>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkEntry" id="config_dir">
-                                <property name="width_request">200</property>
-                                <property name="height_request">20</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="editable">False</property>
-                                <property name="invisible_char">●</property>
-                                <property name="primary_icon_activatable">False</property>
-                                <property name="secondary_icon_activatable">False</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">4</property>
-                                <property name="bottom_attach">5</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="config_reuse_m3u">
-                                <property name="label" translatable="yes">reuse temporary .m3u files</property>
-                                <property name="use_action_appearance">False</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="xalign">0.5</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="left_attach">1</property>
-                                <property name="right_attach">2</property>
-                                <property name="top_attach">2</property>
-                                <property name="bottom_attach">3</property>
-                              </packing>
+                              <placeholder/>
                             </child>
                             <child>
                               <placeholder/>
@@ -2268,294 +971,2064 @@ different location.</property>
                     </child>
                   </object>
                   <packing>
-                    <property name="position">2</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label44">
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Channel
+Plugins</property>
+                  </object>
+                  <packing>
+                    <property name="position">3</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox124124">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="label152095092">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="button2">
+                    <property name="label" translatable="yes">cancel</property>
+                    <property name="width_request">100</property>
+                    <property name="height_request">35</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="clicked" handler="config_cancel" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="button1">
+                    <property name="label" translatable="yes">save</property>
+                    <property name="width_request">100</property>
+                    <property name="height_request">35</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="clicked" handler="config_save" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel" id="label3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes"><big><b>Configuration Settings</b></big></property>
+            <property name="use_markup">True</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkDialog" id="search_dialog">
+    <property name="can_focus">False</property>
+    <property name="opacity">0.95999999999999996</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">station search</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="type_hint">dialog</property>
+    <property name="deletable">False</property>
+    <property name="gravity">center</property>
+    <signal name="close" handler="search_cancel" swapped="no"/>
+    <signal name="delete-event" handler="search_cancel" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label" translatable="yes">cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="search_cancel" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkToggleButton" id="togglebutton1">
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="google_search">
+                <property name="label" translatable="yes">google it</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Instead of searching in the station list, just look up the above search term on google.</property>
+                <property name="relief">half</property>
+                <signal name="clicked" handler="search_google" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="server_search">
+                <property name="label" translatable="yes">query srv</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Instead of doing a cache search, go through the search functions on the directory service homepages. (UNIMPLEMENTED)</property>
+                <property name="relief">half</property>
+                <signal name="clicked" handler="search_srv" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cache_search">
+                <property name="label" translatable="yes">cache _search</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="tooltip_text" translatable="yes">Start searching for above search term in the currently loaded station lists. Doesn't find *new* information, just looks through the known data.</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="search_go" swapped="no"/>
+                <accelerator key="Return" signal="activate"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">20</property>
+            <child>
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes"><b><big>search</big></b></property>
+                <property name="use_markup">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkTable" id="table1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Which channels/directories to look through.</property>
+                <property name="n_rows">4</property>
+                <property name="n_columns">4</property>
+                <property name="column_spacing">5</property>
+                <property name="row_spacing">1</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_channel_all">
+                    <property name="label" translatable="yes">all channels</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="label1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">for</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="search_full">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="has_focus">True</property>
+                    <property name="is_focus">True</property>
+                    <property name="tooltip_text" translatable="yes">A single word to search for in all stations.</property>
+                    <property name="invisible_char">●</property>
+                    <property name="activates_default">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label4">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
+                <property name="spacing">3</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkButton" id="cancel1">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_title">
+                    <property name="label" translatable="yes">in title</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_description">
+                    <property name="label" translatable="yes">in description</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_all">
+                    <property name="label" translatable="yes">any fields</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">3</property>
                   </packing>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label29">
+                <child>
+                  <object class="GtkButton" id="cancel4">
+                    <property name="label" translatable="yes"> </property>
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">System</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                   </object>
                   <packing>
-                    <property name="position">2</property>
-                    <property name="tab_fill">False</property>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">In which fields to look for the search term.</property>
+                <property name="spacing">3</property>
+                <property name="homogeneous">True</property>
                 <child>
-                  <object class="GtkScrolledWindow" id="scrolledwindow1">
+                  <object class="GtkButton" id="cancel2">
+                    <property name="label" translatable="yes"> </property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <child>
-                      <object class="GtkViewport" id="viewport1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="border_width">15</property>
-                        <property name="resize_mode">queue</property>
-                        <property name="shadow_type">none</property>
-                        <child>
-                          <object class="GtkVBox" id="plugin_options">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="spacing">10</property>
-                            <child>
-                              <object class="GtkLabel" id="filler_pl_options_info">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="xalign">1</property>
-                                <property name="yalign">0</property>
-                                <property name="ypad">2</property>
-                                <property name="label" translatable="yes">You can enable <i>channels</i> and <i>plugins</i> here. Changes take effect after restarting streamtuner2.</property>
-                                <property name="use_markup">True</property>
-                                <property name="justify">right</property>
-                                <property name="wrap">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_homepage">
+                    <property name="label" translatable="yes">homepage url</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_extra">
+                    <property name="label" translatable="yes">extra info</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="search_in_genre">
+                    <property name="label" translatable="yes">and genre</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="xalign">0.5</property>
+                    <property name="draw_indicator">True</property>
                   </object>
                   <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
                     <property name="position">3</property>
                   </packing>
                 </child>
-                <child type="tab">
-                  <object class="GtkLabel" id="label44">
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Channel
-Plugins</property>
+                <child>
+                  <object class="GtkButton" id="cancel3">
+                    <property name="label" translatable="yes"> </property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                   </object>
                   <packing>
-                    <property name="position">3</property>
-                    <property name="tab_fill">False</property>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
               </object>
               <packing>
                 <property name="expand">True</property>
                 <property name="fill">True</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">5</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">cancel</action-widget>
+      <action-widget response="0">togglebutton1</action-widget>
+      <action-widget response="0">google_search</action-widget>
+      <action-widget response="0">server_search</action-widget>
+      <action-widget response="0">cache_search</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkMenu" id="streamactions">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_play">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">play</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_play_clicked" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_record">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">record</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_record_clicked" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="streamactions_bookmark">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">bookmark</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="bookmark" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="extensionsCTM">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Extensions</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="----">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="save">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">save</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="save_as" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="edit">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">edit</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="streamedit_open" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="menuitem1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="homepage">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">station homepage</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_homepage_stream_clicked" swapped="no"/>
+      </object>
+    </child>
+  </object>
+  <object class="GtkDialog" id="timer_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <signal name="delete-event" handler="true" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="timer_cancel">
+                <property name="label" translatable="yes">cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="timer_cancel" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox124124">
+              <object class="GtkButton" id="timer_ok">
+                <property name="label" translatable="yes">ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="timer_ok" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkTable" id="table2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="n_rows">3</property>
+            <property name="n_columns">3</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkEntry" id="timer_value">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkLabel" id="label152095092">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button2">
-                    <property name="label" translatable="yes">cancel</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="width_request">100</property>
-                    <property name="height_request">35</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <signal name="clicked" handler="config_cancel" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkButton" id="button1">
-                    <property name="label" translatable="yes">save</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="width_request">100</property>
-                    <property name="height_request">35</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <signal name="clicked" handler="config_save" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">●</property>
+                <property name="text" translatable="yes">Fri,Sat 20:00-21:00</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
               </packing>
             </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
           </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
         </child>
-        <child type="label">
-          <object class="GtkLabel" id="label3">
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">timer_cancel</action-widget>
+      <action-widget response="0">timer_ok</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkWindow" id="url_action_container">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkVBox" id="url_action_list">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkLabel" id="url_action_1_online_forum">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes"><big><b>Configuration Settings</b></big></property>
-            <property name="use_markup">True</property>
+            <property name="label" translatable="yes">http://sourceforge.net/projects/streamtuner2/forums/forum/1173108</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="url_action_2_fossil_wiki">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">http://fossil.include-once.org/streamtuner2/</property>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="url_action_3_project_homepage">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">http://milki.include-once.org/streamtuner2/</property>
           </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
         </child>
       </object>
     </child>
@@ -2755,7 +3228,6 @@ Plugins</property>
             <child>
               <object class="GtkButton" id="cancel5">
                 <property name="label" translatable="yes">cancel</property>
-                <property name="use_action_appearance">False</property>
                 <property name="width_request">100</property>
                 <property name="height_request">25</property>
                 <property name="visible">True</property>
@@ -2771,7 +3243,6 @@ Plugins</property>
             <child>
               <object class="GtkButton" id="ok1">
                 <property name="label" translatable="yes">ok</property>
-                <property name="use_action_appearance">False</property>
                 <property name="width_request">100</property>
                 <property name="height_request">25</property>
                 <property name="visible">True</property>
@@ -2788,7 +3259,6 @@ Plugins</property>
             <child>
               <object class="GtkButton" id="streamedit_new">
                 <property name="label" translatable="yes">new</property>
-                <property name="use_action_appearance">False</property>
                 <property name="width_request">50</property>
                 <property name="height_request">25</property>
                 <property name="visible">True</property>
@@ -2904,11 +3374,8 @@ Plugins</property>
         <property name="can_focus">False</property>
         <child>
           <object class="GtkHBox" id="hbox8">
-            <property name="height_request">64</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="valign">start</property>
-            <property name="hexpand">True</property>
             <child>
               <object class="GtkVBox" id="vbox3">
                 <property name="visible">True</property>
@@ -2919,7 +3386,6 @@ Plugins</property>
                     <property name="can_focus">False</property>
                     <child>
                       <object class="GtkMenuItem" id="streammenu">
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes">_Station</property>
@@ -2930,7 +3396,6 @@ Plugins</property>
                             <property name="can_focus">False</property>
                             <child>
                               <object class="GtkMenuItem" id="menu_bookmark">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">bookmark</property>
@@ -2943,7 +3408,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                 <property name="label">gtk-save-as</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -2956,7 +3420,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="gtk-edit">
                                 <property name="label">gtk-edit</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -2969,7 +3432,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="extensions0">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Extensions</property>
@@ -2997,7 +3459,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="imagemenuitem_quit">
                                 <property name="label">gtk-quit</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3013,7 +3474,6 @@ Plugins</property>
                     <child>
                       <object class="GtkImageMenuItem" id="editmenu">
                         <property name="label">gtk-edit</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -3025,7 +3485,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="imagemenuitem_copy">
                                 <property name="label">gtk-copy</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3036,7 +3495,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="menuitem_delete">
                                 <property name="label">gtk-delete</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3049,7 +3507,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="imagemenuitem8">
                                 <property name="label">gtk-find</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3066,7 +3523,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuitem8">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">_Toolbar</property>
@@ -3078,7 +3534,6 @@ Plugins</property>
                                     <child>
                                       <object class="GtkImageMenuItem" id="menuitem9">
                                         <property name="label">gtk-revert-to-saved</property>
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="use_underline">True</property>
@@ -3093,7 +3548,6 @@ Plugins</property>
                                     </child>
                                     <child>
                                       <object class="GtkMenuItem" id="menuitem10">
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="label" translatable="yes">Only Symbols</property>
@@ -3103,7 +3557,6 @@ Plugins</property>
                                     </child>
                                     <child>
                                       <object class="GtkMenuItem" id="menuitem11">
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="label" translatable="yes">With Text</property>
@@ -3119,7 +3572,6 @@ Plugins</property>
                                     </child>
                                     <child>
                                       <object class="GtkMenuItem" id="menuitem12">
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="label" translatable="yes">Small</property>
@@ -3129,7 +3581,6 @@ Plugins</property>
                                     </child>
                                     <child>
                                       <object class="GtkMenuItem" id="menuitem13">
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="label" translatable="yes">Medium</property>
@@ -3139,7 +3590,6 @@ Plugins</property>
                                     </child>
                                     <child>
                                       <object class="GtkMenuItem" id="menuitem14">
-                                        <property name="use_action_appearance">False</property>
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
                                         <property name="label" translatable="yes">Large</property>
@@ -3153,7 +3603,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuitem15savestates">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Save states</property>
@@ -3164,7 +3613,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="menu_settings">
                                 <property name="label">gtk-properties</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3179,7 +3627,6 @@ Plugins</property>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="channelmenu">
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes">_Channel</property>
@@ -3190,7 +3637,6 @@ Plugins</property>
                             <property name="can_focus">False</property>
                             <child>
                               <object class="GtkMenuItem" id="menuitem10homepage">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Homepage of directory service</property>
@@ -3200,7 +3646,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuitem_reload">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Reload</property>
@@ -3211,7 +3656,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuitem10favicons">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="tooltip_text" translatable="yes">this will take a few minutes</property>
@@ -3222,7 +3666,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuitem_refreshcategory">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Reload Category Tree</property>
@@ -3243,7 +3686,6 @@ Plugins</property>
                     <child>
                       <object class="GtkImageMenuItem" id="helpmenu">
                         <property name="label">gtk-help</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -3254,7 +3696,6 @@ Plugins</property>
                             <property name="can_focus">False</property>
                             <child>
                               <object class="GtkMenuItem" id="helpmenu1">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">documentation</property>
@@ -3264,7 +3705,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menuonlineforum">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">online forum</property>
@@ -3274,7 +3714,6 @@ Plugins</property>
                             </child>
                             <child>
                               <object class="GtkMenuItem" id="menufossilwiki">
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">wiki/fossil/bugs</property>
@@ -3285,7 +3724,6 @@ Plugins</property>
                             <child>
                               <object class="GtkImageMenuItem" id="imagemenuitem10">
                                 <property name="label">gtk-about</property>
-                                <property name="use_action_appearance">False</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
                                 <property name="use_underline">True</property>
@@ -3316,7 +3754,6 @@ Plugins</property>
                         <property name="icon_size">6</property>
                         <child>
                           <object class="GtkToolButton" id="play">
-                            <property name="use_action_appearance">False</property>
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes">play</property>
@@ -3330,7 +3767,6 @@ Plugins</property>
                         </child>
                         <child>
                           <object class="GtkToolButton" id="record">
-                            <property name="use_action_appearance">False</property>
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes">record</property>
@@ -3344,7 +3780,6 @@ Plugins</property>
                         </child>
                         <child>
                           <object class="GtkToolButton" id="homepage_stream">
-                            <property name="use_action_appearance">False</property>
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes">station</property>
@@ -3368,7 +3803,6 @@ Plugins</property>
                         </child>
                         <child>
                           <object class="GtkToolButton" id="reload">
-                            <property name="use_action_appearance">False</property>
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes">reload</property>
@@ -3382,9 +3816,8 @@ Plugins</property>
                         </child>
                         <child>
                           <object class="GtkToolButton" id="stop">
-                            <property name="use_action_appearance">False</property>
-                            <property name="visible">True</property>
                             <property name="can_focus">False</property>
+                            <property name="visible_horizontal">False</property>
                             <property name="label" translatable="yes">stop</property>
                             <property name="stock_id">gtk-cancel</property>
                             <signal name="clicked" handler="on_stop_clicked" swapped="no"/>
@@ -3430,7 +3863,7 @@ Plugins</property>
                 </child>
               </object>
               <packing>
-                <property name="expand">False</property>
+                <property name="expand">True</property>
                 <property name="fill">True</property>
                 <property name="position">0</property>
               </packing>
@@ -3453,7 +3886,7 @@ Plugins</property>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">True</property>
+            <property name="fill">False</property>
             <property name="position">0</property>
           </packing>
         </child>
@@ -3461,8 +3894,6 @@ Plugins</property>
           <object class="GtkNotebook" id="notebook_channels">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
             <property name="scrollable">True</property>
             <property name="enable_popup">True</property>
             <signal name="switch-page" handler="on_notebook_channels_switch_page" swapped="no"/>
@@ -3483,7 +3914,7 @@ Plugins</property>
                         <property name="enable_tree_lines">True</property>
                         <signal name="button-release-event" handler="on_category_clicked" swapped="no"/>
                         <child internal-child="selection">
-                          <object class="GtkTreeSelection" id="treeview-selection1"/>
+                          <object class="GtkTreeSelection" id="treeview-selection3"/>
                         </child>
                       </object>
                     </child>
@@ -3505,7 +3936,7 @@ Plugins</property>
                         <signal name="button-press-event" handler="station_context_menu" swapped="no"/>
                         <signal name="row-activated" handler="on_stream_row_activated" swapped="no"/>
                         <child internal-child="selection">
-                          <object class="GtkTreeSelection" id="treeview-selection2"/>
+                          <object class="GtkTreeSelection" id="treeview-selection4"/>
                         </child>
                       </object>
                     </child>
@@ -3553,7 +3984,7 @@ Plugins</property>
             </child>
           </object>
           <packing>
-            <property name="expand">False</property>
+            <property name="expand">True</property>
             <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
@@ -3562,8 +3993,6 @@ Plugins</property>
           <object class="GtkHBox" id="hbox10">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="valign">end</property>
-            <property name="hexpand">True</property>
             <child>
               <object class="GtkStatusbar" id="statusbar">
                 <property name="visible">True</property>
@@ -3607,7 +4036,6 @@ Plugins</property>
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
-            <property name="pack_type">end</property>
             <property name="position">2</property>
           </packing>
         </child>
diff --git a/help/channel_internetradioorguk.page b/help/channel_internetradioorguk.page
index e14f9a0..529bd92 100644
--- a/help/channel_internetradioorguk.page
+++ b/help/channel_internetradioorguk.page
@@ -9,12 +9,12 @@
         <desc>Large radio directory from the UK.</desc>
 </info>
 
-	<title>Internet-Radio.org.uk</title>
+	<title>Internet-Radio.com</title>
 
-	<p>I-R.org.uk is a good alternative to Shoutcast. It also lacks a channel homepage in most
+	<p>I-R.com is a good alternative to Shoutcast. It also lacks a channel homepage in most
 	cases, but is a likewise encyclopedical directory. Genres are similiar to Shoutcast.</p>
 
 	<note><p>Note that this plugin uses its own setting for how many links to retrieve. Instead
-	of stream numbers, it only counts pages. This is a lazyness related bug.</p></note>
+	of stream numbers, it only counts pages (which however speeds up processing now).</p></note>
 
 </page>
diff --git a/help/channel_jamendo.page b/help/channel_jamendo.page
index a60ec95..52f7b71 100644
--- a/help/channel_jamendo.page
+++ b/help/channel_jamendo.page
@@ -14,8 +14,11 @@
 	files for individual musicians and artists. Tracks and albums can thus be downloaded
 	free of charge. Yeah, imagine that.</p>
 
-        <p>The streamtuner2 plugin for Jamendo is pretty limited at the moment. It just provides
-	a quick overview over top artists and most listened albums from each genre. To browse
-	the whole collections, better go to the Jamendo homepage or use Rhythmbox.</p>
+        <p>The new Jamendo v3.0 is now utilized. It allows to list albums, playlists, and
+        individual tracks by genre. Radios are a static list.</p>
+
+        <p>Instead of favicons, streamtuner2 can fetch album or track covers. Thus the images
+        are a bit larger, and retrieving them all via Channel > Load favicons... takes a while
+        longer.</p>
 
 </page>
diff --git a/help/channel_surfmusik.page b/help/channel_surfmusik.page
new file mode 100644
index 0000000..6521f33
--- /dev/null
+++ b/help/channel_surfmusik.page
@@ -0,0 +1,34 @@
+<page	xmlns="http://projectmallard.org/1.0/"
+	type="guide"
+	id="surfmusik">
+
+<info>
+	<link type="guide" xref="index#channels"/>
+	<link type="guide" xref="channels#list"/>
+	<link type="guide" xref="configuration#plugins"/>
+        <desc>International radio listings.</desc>
+</info>
+
+	<title>SurfMusic</title>
+
+	<p><link href="http://surfmusic.de/">SurfMusic</link> is a user-collection of
+        internet radios. It's grouped by genres, or locations / countries.</p>
+
+        <p>It's both pretty large and rather quick to extract listings from. And it mostly
+        includes station homepage links.</p>
+
+
+        <p>The MusicTV and NewsTV sections also return results, but those are mostly
+        web-based video stations. Some of them are outdated links even.</p>
+
+
+<terms>
+  <title>Channel options.</title>
+  <item>
+    <title><code>Language</code></title>
+    <p>The current version is German-only. The English genre titles will be added
+    later.</p>
+  </item>
+</terms>
+
+</page>
diff --git a/help/channel_youtube.page b/help/channel_youtube.page
new file mode 100644
index 0000000..0f65f0e
--- /dev/null
+++ b/help/channel_youtube.page
@@ -0,0 +1,38 @@
+<page	xmlns="http://projectmallard.org/1.0/"
+	type="guide"
+	id="youtube">
+
+<info>
+	<link type="guide" xref="index#channels"/>
+	<link type="guide" xref="channels#list"/>
+	<link type="guide" xref="configuration#plugins"/>
+        <desc>Youtube music/video listings.</desc>
+</info>
+
+	<title>Youtube</title>
+
+	<p>Googles <link href="https://youtube.com/">Youtube</link> provides a quirky
+        JSON API that makes browsing channels and genres feasible. This beta plugin
+        provides a little overview, and usually retrieves recent video uploads.</p>
+
+        <p>VLC can directly play Youtube URLs. For other players the default application
+        setting wraps <link href="http://youtube-dl.org/">youtube-dl</link>, which is also
+        used for recording.</p>
+
+
+<terms>
+  <title>Channel options.</title>
+  <item>
+    <title><code>Region</code></title>
+    <p>With the country dropdown you can predefine which mostPopular listins are returned.</p>
+  </item>
+  <item>
+    <title><code>My Channels</code></title>
+    <p>You can edit the list of YT channel names to fetch some of your favourite artists/uploaders.
+    To apply this setting, and have new categories show up in the genre pane, use
+    <guiseq><gui>Channel</gui> <gui>Update category tree</gui></guiseq> first.
+    </p>
+  </item>
+</terms>
+
+</page>
diff --git a/help/channels.page b/help/channels.page
index c2079b3..fc2d863 100644
--- a/help/channels.page
+++ b/help/channels.page
@@ -4,7 +4,7 @@
 
 	<info>
 	<link type="guide" xref="index#browsing"/>
-	<desc>Switching through the channel tabs, different radio directoriy services.</desc>
+	<desc>Switching through the channel tabs, different radio directory services.</desc>
 	</info>
 
 	<title>Channels</title>
@@ -24,8 +24,8 @@
 	</steps>
 
 	<p>Individual channels provide different music/radio information. The table
-        views are however identical in each tab. You could modify the <code>datamap[]</code>
-        in the plugin files, if you want to adapt this.</p>
+        views are mostly identical in each tab. (You could modify the <code>datamap[]</code>
+        in the plugin files if you wanted to adapt this.)</p>
 
 	<section id="list">
 		<title>Available channels</title>
diff --git a/help/config_apps.page b/help/config_apps.page
index 12529fb..e53dda3 100644
--- a/help/config_apps.page
+++ b/help/config_apps.page
@@ -27,11 +27,13 @@
 	</table>
 
 	<p>Some audio players open a second instance when you actually want to switch radios.
-	In this case it's a common workaround to write <code>pkill vlc ; vlc %u</code> instead.
-	This ends the previous player and starts it anew.</p>
+	In this case it's a common workaround to write <code>pkill vlc ; vlc %u</code> instead,
+	which ends the previous player process and starts it anew.
+        For VLC there's however also the option <code>--one-instance</code>, which sometimes
+        works better.</p>
 
-	<p>Some applications, like Rhythmbox or Banshee, are pure GUI applications and cannot
-	be invoked with a play URL by other apps. This makes them unsuitable for use with
+	<p>Some applications, like Rhythmbox or Banshee, are primarily audio browsers, not players,
+        and cannot be invoked with a play URL by other apps. This makes them less suitable for use with
 	streamtuner2.</p>
 
 	<section id="abbr">
diff --git a/help/configuration.page b/help/configuration.page
index 661021d..06770de 100644
--- a/help/configuration.page
+++ b/help/configuration.page
@@ -9,46 +9,47 @@
 
 	<title>Settings dialog</title>
 
-	<p>There are many options in streamtuner2. You can find the settings dialog in the edit menu,
-        preferences (last entry).</p>
+	<p>There are multiple behaviour options in streamtuner2.
+        You can find the settings dialog in the edit menu as "Preferences" (last entry).
+        </p>
 
         <terms>
-          <title>It is separated into four main areas.</title>
+          <title>It is separated into three main areas.</title>
           <item>
             <title>Player</title>
-            <p>Lists audio formats and the applications which shall be used for playing.</p>
+            <p>Lists audio formats and the audio player applications, or recording tools below.</p>
           </item>
           <item>
-            <title>Display</title>
-            <p>Influences the display of all stream/station lists.</p>
-          </item>
-          <item>
-            <title>System</title>
-            <p>Filesystem and environment settings. Boring.</p>
+            <title>Options</title>
+            <p>Influences the display of all stream/station lists, and contains some system settings.</p>
           </item>
           <item>
             <title>Channel Plugins</title>
-            <p>Every channel tab can have specific options. These are configured here. Also you can disable channels you don't need.</p>
+            <p>Every channel tab can have specific options. These are configured here.
+            Also you can disable channels you don't need.</p>
           </item>
         </terms>
 
 
 	<section id="apps">
 		<title>Player application settings</title>
-		<p>MIME types are elaborate identifiers for file types. audio/mp3 for example represents MP3 files, and audio/ogg
+		<p>MIME types are elaborate identifiers for file types; audio/mp3 for example represents MP3 files, and audio/ogg
 		means just OGG.</p>
 		<p>The text entry fields can hold the application name of an audio player. Often the application name
-		is just a lower case version of the program title, but you might have to look it up.</p>
-		<p>Behind the application program name is a placeholder. If the audio player is invoked, this placeholder
-		gets replaces with an URL (a http://..-Link) of the selected radio stream.</p>
-		<p>It's introduced by percent sign, and followed by letters. %m3u for example generates a .m3u file. Most
-		audio players understand that. Otherwise try %pls, which might even be faster because streamtuner2 doesn't
-		have to download and preprocess it. %srv instead gives a direct stream link.</p>
-		<p>The entry for */* is a catch-all. If the audio format of a radio station isn't know, this application
-		gets called.</p>
+		is just a lower case version of the program title.</p>
+		<p>Behind application names a placeholder can be used. On invocation such placeholders
+		get replaced with an URL (a http://..-Link) or filename for the selected radio stream.</p>
+		<p>It's introduced by a percent sign, and followed by letters. %m3u for example generates a .m3u file,
+                which most audio players understand. Otherwise try %pls, which might even be faster because streamtuner2 doesn't
+		have to download and preprocess it. Alternatively %srv instead gives a direct stream link.</p>
+		<p>Catch-all entries like */* or a generic audio/* entry allow to configure a default player.
+		</p>
 		<p><title>Recording</title></p>
-		<p>The last entry in the 'Apps' section specifies streamripper. It is used for recording stations. You
-		might want to add some commandline -arguments here.</p>
+		<p>The second block of entries in the 'Apps' section specifies recording applications.
+                Here streamripper is preconfigured for audio streams, and youtube-dl for Youtube videos for instance.
+                To define a target directory, you can add commandline arguments to each. Also it's typically
+                helpful to leave the xterm prefix on, so you can follow the processing state. (Alternatively to
+                xterm there is x-terminal-emulator, or rxvt, gnome-terminal, xfce4-terminal, etc.)</p>
 	</section>
 
 
@@ -68,12 +69,6 @@
 		<p>Remembering window states makes streamtuner2 not forget which channel and category was last
 		selected. You can however disable this option, and instead manually save the window states/layout
 		in the edit menu, if you want.</p>
-	</section>
-	
-
-	<section id="system">
-		<title>System info</title>
-		<p>There are just a few options here, and some are hard-wired. Usually you don't want to change them.</p>
 		<p>Setting another temporary directory might be useful, if you want to keep the temporary .m3u cache
 		files. They are created whenever you hit play. For archival or speed-up porposes you might want to keep
 		them elsewhere. They don't take a lot of space.</p>
@@ -82,8 +77,8 @@
 	<section id="plugins">
 		<title>Plugin and Channel settings</title>
 		<p>Each channel plugin can bring its own list of configuration settings. These are collected here.</p>
-		<p>The heading for each plugin is actually a button, which allows disabling the plugin. Alas the state
-		cannot be easily discerned with all themes.</p>
+		<p>The heading for each plugin allows to enable or disable it. To apply changed states you need to restart
+                streamtuner2 however.</p>
 		<p>If you want to find out more about the short option descriptions (most settings are checkboxes),
 		please have a look into the channels directory /usr/share/streamtuner2/channels/ and corresponding
 		*.py files. These are readable, and sometimes contain more information.</p>
diff --git a/help/search.page b/help/search.page
index 3cb389c..b328896 100644
--- a/help/search.page
+++ b/help/search.page
@@ -10,12 +10,18 @@
 
 	<title>Searching</title>
 
-	<p>There are two search functions. The quick search field is in the toolbar, and allows
-	to highlight search terms in the current station list. The cache search is available
-	through the <guiseq><gui>Edit</gui> <gui>Search</gui></guiseq> menu instead and provides more details.</p>
+	<p>There are two search functions.</p>
+
+
+	<section id="quicksearch">
+	<title>Quick search</title>
+        <p>Just enter text into the quick search box atop. Streamtuner2 will instantly highlight
+	any matches in the current stations view. If you switch tabs, just click the glass icon
+	to reapply the highlighting.</p>
+	</section>
 
 	<section id="cachesearch">
-	<title>Dialog options</title>
+	<title>Search window</title>
 	<p>You can get to the search dialog via <guiseq><gui>Edit</gui> <gui>Find</gui></guiseq> or <key>Ctrl</key>+<key>F</key>. Centrally to this dialog is the
 	text field, where you can specify the phrase to scan for.</p>
 
@@ -27,24 +33,17 @@
 	into. Often you just want to search the titles of radio stations. But you can also
 	have the search occour in the description/playing fields. Alternatively you could
 	just search the homepage links.</p>
-	</section>
 
-	<section id="methods">
-	<title>Search methods</title>
 	<p>Lastly, there are three search methods. You mostly want to use the <gui>cache search</gui>,
 	which just scans through the station lists streamtuner2 has downloaded. Since you are mostly
 	looking for something you had already seen, this will give you the desired results.</p>
+
 	<p>The <gui>server search</gui> would try to do a live search on the directory servers,
 	providing you with the most recent data. However, it's not implemented for all channel
 	plugins, and therefore brings limited output.</p>
+
 	<p>Use the button <gui>google it</gui> as last resort, if streamtuner2 didn't find anything.</p>
-	</section>
 
-	<section id="quicksearch">
-	<title>Quick search</title>
-        <p>Just enter text into the quick search box. Streamtuner2 will instantly highlight
-	any matches in the current stations view. If you switch tabs, just click the glass icon
-	to reapply the highlighting.</p>
 	</section>
 
 </page>
diff --git a/mygtk.py b/mygtk.py
index f00444e..d44eb2f 100644
--- a/mygtk.py
+++ b/mygtk.py
@@ -90,7 +90,7 @@ class mygtk:
         # for missing cols. All values must already be in the correct type however.
         #
         @staticmethod
-        def columns(widget, datamap=[], entries=[], pix_entry=False, typecast=0):
+        def columns(widget, datamap=[], entries=None, pix_entry=False, typecast=0):
 
             # create treeviewcolumns?
             if (not widget.get_column(0)):
@@ -147,8 +147,8 @@ class mygtk:
                 #widget.set_reorderable(True)
                
             # add data?
-            if (entries):
-                #- expand datamap            
+            if (entries is not None):
+                #- expand datamap
                 vartypes = []  #(str, str, bool, str, int, int, gtk.gdk.Pixbuf, str, int)
                 rowmap = []    #["title", "desc", "bookmarked", "name", "count", "max", "img", ...]
                 if (not rowmap):
@@ -197,7 +197,9 @@ class mygtk:
                     except:
                         # brute-force typecast
                         ls.append( [va  if ty==gtk.gdk.Pixbuf  else ty(va)   for va,ty in zip(row,vartypes)]  )
-                __print__("→", row, len(row))
+
+                if entries:
+                     __print__("→", row, len(row))
                 
                 # apply array to widget
                 widget.set_model(ls)
@@ -396,6 +398,26 @@ class mygtk:
             return w
 
 
+        # Create GtkLabel
+        @staticmethod
+        def label(text):
+            label = gtk.Label(text)
+            label.set_property("visible", True)
+            label.set_line_wrap(True) 
+            label.set_size_request(400, -1)
+            return label
+
+        # Wrap two widgets in horizontal box
+        @staticmethod
+        def hbox(w1, w2):
+            b = gtk.HBox(homogeneous=False, spacing=10)
+            b.set_property("visible", True)
+            b.pack_start(w1, expand=False, fill=False)
+            b.pack_start(w2, expand=True, fill=True)
+            return b
+
+
+        # Attach textual menu entry and callback
         @staticmethod
         def add_menu(menuwidget, label, action):
             m = gtk.MenuItem(label)
@@ -413,3 +435,65 @@ class mygtk:
             
 
 
+# Text-only dropdown list.
+#
+# Necessary because gtk.ComboBoxText binding is absent in debian packages
+# https://bugzilla.gnome.org/show_bug.cgi?id=660659
+#
+# This one implements a convenience method `.set_default()` to define the active
+# selection by value, rather than by index.
+#
+# Can use a list[] of entries or a key->value dict{}, where the value becomes
+# display text, and the key the internal value.
+#
+class ComboBoxText(gtk.ComboBox):
+
+    ls = None
+
+    def __init__(self, entries, no_scroll=1):
+
+        # prepare widget
+        gtk.ComboBox.__init__(self)
+        self.set_property("visible", True)
+        cell = gtk.CellRendererText()
+        self.pack_start(cell, True)
+        self.add_attribute(cell, "text", 1)
+        if no_scroll:
+            self.connect("scroll_event", self.no_scroll)
+
+        # collect entries
+        self.ls = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+        self.set_model(self.ls)
+        if type(entries[0]) is not tuple:
+            entries = zip(entries, entries)
+        for key,value in entries:
+            self.ls.append([key, value])
+        
+    # activate dropdown of given value
+    def set_default(self, value):
+        for index,row in enumerate(self.ls):
+            if value in row:
+                return self.set_active(index)
+        # add as custom entry
+        self.ls.append([value, value])
+        self.set_active(index + 1)
+
+    # fetch currently selected text entry
+    def get_active_text(self):
+        index = self.get_active()
+        if index >= 0:
+            return self.ls[index][0]
+
+    # Signal/Event callback to prevent hover scrolling of ComboBox widgets
+    def no_scroll(self, widget, event, data=None):
+        return True
+
+
+    # Expand A=a|B=b|C=c option list into (key,value) tuple list, or A|B|C just into a list.
+    @staticmethod
+    def parse_options(opts, sep="|", assoc="="):
+        if opts.find(assoc) >= 0:
+            return [ (k,v) for k,v in (x.split(assoc, 1) for x in opts.split(sep)) ]
+        else:
+            return opts.split(sep) #dict( (v,v) for v in opts.split(sep) )
+
diff --git a/st2.py b/st2.py
index 21d8135..13f88a2 100755
--- a/st2.py
+++ b/st2.py
@@ -3,9 +3,9 @@
 # api: python
 # type: application
 # title: streamtuner2
-# description: directory browser for internet radio / audio streams
+# description: Directory browser for internet radio / audio streams
 # depends: pygtk | pygi, threading, pyquery, kronos, requests
-# version: 2.1.0
+# version: 2.1.1
 # author: mario salzer
 # license: public domain
 # url: http://freshmeat.net/projects/streamtuner2
@@ -78,22 +78,23 @@ except:
 
 # add library path
 sys.path.insert(0, "/usr/share/streamtuner2")   # pre-defined directory for modules
-sys.path.insert(0, "/usr/share/streamtuner2/bundle")   # external libraries
+sys.path.append(   "/usr/share/streamtuner2/bundle")   # external libraries
 sys.path.insert(0, ".")   # development module path
 
 # gtk modules
-from mygtk import pygtk, gtk, gobject, ui_file, mygtk, ver as GTK_VER
+from mygtk import pygtk, gtk, gobject, ui_file, mygtk, ver as GTK_VER, ComboBoxText
 
 # custom modules
 from config import conf   # initializes itself, so all conf.vars are available right away
 from config import __print__, dbg
 import ahttp
 import action  # needs workaround... (action.main=main)
+import channels
 from channels import *
 import favicon
 
 
-__version__ = "2.1.0"
+__version__ = "2.1.1"
 
 
 # this represents the main window
@@ -108,6 +109,9 @@ class StreamTunerTwo(gtk.Builder):
         features = {}    # non-channel plugins
         working = []     # threads
         add_signals = {} # channel gtk-handler signals
+        hooks = {
+            "play": [favicon.download_playing],  # observers queue here
+        }
 
         # status variables
         channel_names = ["bookmarks"]    # order of channel notebook tabs
@@ -129,7 +133,7 @@ class StreamTunerTwo(gtk.Builder):
             # initialize channels
             self.channels = {
               "bookmarks": bookmarks(parent=self),   # this the remaining built-in channel
-              "shoutcast": None,#shoutcast(parent=self),
+              #"shoutcast": None,#shoutcast(parent=self),
             }
             gui_startup(3/20.0)
             self.load_plugin_channels()   # append other channel modules / plugins
@@ -180,10 +184,15 @@ class StreamTunerTwo(gtk.Builder):
                 "menu_toolbar_size_small": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_SMALL_TOOLBAR)),
                 "menu_toolbar_size_medium": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DND)),
                 "menu_toolbar_size_large": lambda w: (self.toolbar.set_icon_size(gtk.ICON_SIZE_DIALOG)),
-                # else
+                # win_config
                 "menu_properties": config_dialog.open,
                 "config_cancel": config_dialog.hide,
                 "config_save": config_dialog.save,
+                "config_play_list_edit_col0": lambda w,path,txt: (config_dialog.list_edit(self.config_play, path, 0, txt)),
+                "config_play_list_edit_col1": lambda w,path,txt: (config_dialog.list_edit(self.config_play, path, 1, txt)),
+                "config_record_list_edit_col0": lambda w,path,txt: (config_dialog.list_edit(self.config_record, path, 0, txt)),
+                "config_record_list_edit_col1": lambda w,path,txt: (config_dialog.list_edit(self.config_record, path, 1, txt)),
+                # else
                 "update_categories": self.update_categories,
                 "update_favicons": self.update_favicons,
                 "app_state": self.app_state,
@@ -197,6 +206,7 @@ class StreamTunerTwo(gtk.Builder):
                # "menu_bugreport": lambda w: BugReport(),
                 "menu_copy": self.menu_copy,
                 "delete_entry": self.delete_entry,
+                # search dialog
                 "quicksearch_set": search.quicksearch_set,
                 "search_open": search.menu_search,
                 "search_go": search.start,
@@ -204,6 +214,7 @@ class StreamTunerTwo(gtk.Builder):
                 "search_google": search.google,
                 "search_cancel": search.cancel,
                 "true": lambda w,*args: True,
+                # win_streamedit
                 "streamedit_open": streamedit.open,
                 "streamedit_save": streamedit.save,
                 "streamedit_new": streamedit.new,
@@ -214,10 +225,6 @@ class StreamTunerTwo(gtk.Builder):
             gui_startup(99/100.0)
             self.win_streamtuner2.show()
             
-            # WHY DON'T YOU WANT TO WORK?!
-            #self.shoutcast.gtk_list.set_enable_search(True)
-            #self.shoutcast.gtk_list.set_search_column(4)
-
 
           
 
@@ -243,13 +250,7 @@ class StreamTunerTwo(gtk.Builder):
                 
         # returns the currently selected directory/channel object
         def channel(self):
-            #try:
-                return self.channels[self.current_channel]
-            #except Exception,e:
-            #    print(e)
-            #    self.notebook_channels.set_current_page(0)
-            #    self.current_channel = "bookmarks"
-            #    return self.channels["bookmarks"]
+            return self.channels[self.current_channel]
 
             
         def current_channel_gtk(self):
@@ -307,13 +308,13 @@ class StreamTunerTwo(gtk.Builder):
             row = self.row()
             if row:
                 self.channel().play(row)
-                favicon.download_playing(row)
+                [hook(row) for hook in self.hooks["play"]]
 
 
         # streamripper
         def on_record_clicked(self, widget):
             row = self.row()
-            action.record(row.get("url"), "audio/mp3", "url/direct", row=row)
+            action.record(row.get("url"), row.get("format", "audio/mpeg"), "url/direct", row=row)
 
 
         # browse stream
@@ -426,7 +427,7 @@ class StreamTunerTwo(gtk.Builder):
                 mygtk.do(lambda:self.statusbar.pop(sbar_cid))
             # progressbar
             if (type(text)==float):
-                if (text >= 999/1000):  # completed
+                if (text >= 999.0/1000):  # completed
                     mygtk.do(lambda:self.progress.hide())
                 else:  # show percentage
                     mygtk.do(lambda:self.progress.show() or self.progress.set_fraction(text))
@@ -442,13 +443,8 @@ class StreamTunerTwo(gtk.Builder):
         # load plugins from /usr/share/streamtuner2/channels/
         def load_plugin_channels(self):
 
-            # find plugin files
-            ls = os.listdir(conf.share + "/channels/")
-            ls = [fn[:-3] for fn in ls if re.match("^[a-z][\w\d_]+\.py$", fn)]
-            
-            # resort with tab order
-            order = [module.strip() for module in conf.channel_order.lower().replace(".","_").replace("-","_").split(",")]
-            ls = [module for module in (order) if (module in ls)] + [module for module in (ls) if (module not in order)]
+            # find and order plugin files
+            ls = channels.module_list()
 
             # step through
             for module in ls:
@@ -483,7 +479,6 @@ class StreamTunerTwo(gtk.Builder):
 
             # default plugins
             conf.add_plugin_defaults(self.channels["bookmarks"].config, "bookmarks")
-            #conf.add_plugin_defaults(self.channels["shoutcast"].config, "shoutcast")
 
 
         # store window/widget states (sizes, selections, etc.)
@@ -592,7 +587,6 @@ class search (auxiliary_window):
         def cancel(self, *args):
             self.search_dialog.hide()
             return True  # stop any other gtk handlers
-            #self.search_dialog.hide() #if conf.hide_searchdialog
             
             
         # perform search
@@ -707,21 +701,13 @@ class streamedit (auxiliary_window):
 
         # show stream data editing dialog
         def open(self, mw):
-            row = main.row()
-            for name in ("title", "playing", "genre", "homepage", "url", "favicon", "format", "extra"):
-                w = main.get_widget("streamedit_" + name) 
-                if w:
-                    w.set_text((str(row.get(name)) if row.get(name) else ""))
+            config_dialog.load_config(main.row(), "streamedit_")
             self.win_streamedit.show()
 
 
         # copy widget contents to stream
         def save(self, w):
-            row = main.row()
-            for name in ("title", "playing", "genre", "homepage", "url", "favicon", "format", "extra"):
-               w = main.get_widget("streamedit_" + name)
-               if w:
-                   row[name] = w.get_text()
+            config_dialog.save_config(main.row(), "streamedit_")
             main.channel().save()
             self.cancel(w)
 
@@ -729,7 +715,7 @@ class streamedit (auxiliary_window):
         # add a new list entry, update window
         def new(self, w):
             s = main.channel().stations()
-            s.append({"title":"new", "url":"", "format":"audio/mp3", "genre":"", "listeners":1});
+            s.append({"title":"new", "url":"", "format":"audio/mpeg", "genre":"", "listeners":1});
             main.channel().switch() # update display
             main.channel().gtk_list.get_selection().select_path(str(len(s)-1)); # set cursor to last row
             self.open(w)
@@ -751,85 +737,105 @@ streamedit = streamedit()
 class config_dialog (auxiliary_window):
 
 
-        # display win_config, pre-fill text fields from global conf. object
+        # Display win_config, pre-fill text fields from global conf. object
         def open(self, widget):
-            self.add_plugins()
-            self.apply(conf.__dict__, "config_", 0)
-            #self.win_config.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#443399'))
-            self.combobox_theme()
+            if self.first_open:
+                self.add_plugins()
+                self.combobox_theme()
+                self.first_open = 0
+                self.win_config.resize(565, 625)
+            self.load_config(conf.__dict__, "config_")
+            self.load_config(conf.plugins, "config_plugins_")
             self.win_config.show()
+        first_open = 1
 
-
+        # Hide window
         def hide(self, *args):
             self.win_config.hide()
             return True
 
         
-        # set/load values between gtk window and conf. dict
-        def apply(self, config, prefix="config_", save=0):
+        # Load values from conf. store into gtk widgets
+        def load_config(self, config, prefix="config_"):
             for key,val in config.items():
-                # map non-alphanumeric chars from config{} to underscores in according gtk widget names
-                id = re.sub("[^\w]", "_", key)
-                w = main.get_widget(prefix + id)
-                __print__(dbg.CONF, "config", ("save" if save else "load"), prefix+id, w, val)
-                # recurse into dictionaries, transform: conf.play.audio/mp3 => conf.play_audio_mp3
-                if (type(val) == dict):
-                    self.apply(val, prefix + id + "_", save)
-                # load or set gtk.Entry text field
-                elif (w and save and type(w)==gtk.Entry):
-                    config[key] = w.get_text()
-                elif (w and type(w)==gtk.Entry):
-                    w.set_text(str(val))
-                elif (w and save):
-                    config[key] = w.get_active()
-                elif (w):
-                    w.set_active(bool(val))
-            pass
+                w = main.get_widget(prefix + key)
+                if w:
+                    # input field
+                    if type(w) is gtk.Entry:
+                        w.set_text(str(val))
+                    # checkmark
+                    elif type(w) is gtk.CheckButton:
+                        w.set_active(bool(val))
+                    # dropdown
+                    elif type(w) is ComboBoxText:
+                        w.set_default(val)
+                    # list
+                    elif type(w) is gtk.ListStore:
+                        w.clear()
+                        for k,v in val.items():
+                            w.append([k, v, True])
+                        w.append(["", "", True])
+                __print__(dbg.CONF, "config load", prefix+key, val, type(w))
+
+        # Store gtk widget valus back into conf. dict
+        def save_config(self, config, prefix="config_", save=0):
+            for key,val in config.items():
+                w = main.get_widget(prefix + key)
+                if w:
+                    # text
+                    if type(w) is gtk.Entry:
+                        config[key] = w.get_text()
+                    # pre-defined text
+                    elif type(w) is ComboBoxText:
+                        config[key] = w.get_active_text()
+                    # boolean
+                    elif type(w) is gtk.CheckButton:
+                        config[key] = w.get_active()
+                    # dict
+                    elif type(w) is gtk.ListStore:
+                        config[key] = {}
+                        for row in w:
+                            if row[0] and row[1]:
+                                config[key][row[0]] = row[1]
+                __print__(dbg.CONF, "config save", prefix+key, val)
 
+        
+        # Generic Gtk callback to update ListStore when entries get edited
+        def list_edit(self, liststore, path, column, new_text):
+            liststore[path][column] = new_text
+            # The signal_connect() dict actually prepares individual lambda functions
+            # to bind the correct ListStore and column id.
+            
 
-        # fill combobox
+        # list of Gtk themes in dropdown
         def combobox_theme(self):
-           # self.theme.combo_box_new_text()
             # find themes
             themedirs = (conf.share+"/themes", conf.dir+"/themes", "/usr/share/themes")
             themes = ["no theme"]
             [[themes.append(e) for e in os.listdir(dir)] for dir in themedirs if os.path.exists(dir)]
             __print__(dbg.STAT, themes)
-            # prepare liststore
-            store = gtk.ListStore(gobject.TYPE_STRING)
-            self.theme.set_model(store)
-            cell = gtk.CellRendererText()
-            self.theme.pack_start(cell, True)
-            self.theme.add_attribute(cell, "text", 0)
-            # add to combobox
-            for num,themename in enumerate(themes):
-                 store.append([themename])
-                 if conf.theme == themename:
-                     self.theme.set_active(num)
-            # erase this function, so it only ever gets called once
-            self.combobox_theme = lambda: None
+            # add dropdown
+            main.widgets["theme"] = ComboBoxText(themes)
+            self.theme_cb_placeholder.pack_start(self.theme)
+            self.theme_cb_placeholder.pack_end(mygtk.label(""))
 
 
         # retrieve currently selected value
         def apply_theme(self):
-            if self.theme.get_active() >= 0:
-                conf.theme = self.theme.get_model()[ self.theme.get_active()][0]
-                main.load_theme()
+            conf.theme = self.theme.get_active_text()
+            main.load_theme()
 
 
         # add configuration setting definitions from plugins
-        once = 0
         def add_plugins(self):
-            if self.once:
-                return
 
-            for name,enabled in conf.plugins.items():
+            for name,meta in channels.module_meta().items():
 
                 # add plugin load entry
                 if name:
-                    label = ("enable ⎗ %s channel" if self.channels.get(name) else "use ⎗ %s plugin")
-                    cb =  gtk.ToggleButton(label=label % name)
-                    self.add_( "config_plugins_"+name, cb )#, label=None, color="#ddd" )
+                    cb = gtk.CheckButton(name)
+                    cb.get_children()[0].set_markup("<b>%s</b> <i>(%s)</i> %s\n<small>%s</small>" % (meta["title"], meta["type"], meta.get("version", ""), meta["description"]))
+                    self.add_( "config_plugins_"+name, cb )
 
                 # look up individual plugin options, if loaded
                 if self.channels.get(name) or self.features.get(name):
@@ -837,43 +843,40 @@ class config_dialog (auxiliary_window):
                     for opt in c.config:
 
                         # default values are already in conf[] dict (now done in conf.add_plugin_defaults)
+                        color = opt.get("color", None)
                             
-                        # display checkbox or text entry
+                        # display checkbox
                         if opt["type"] == "boolean":
                             cb = gtk.CheckButton(opt["description"])
-                            #cb.set_line_wrap(True)
-                            self.add_( "config_"+opt["name"], cb )
+                            self.add_( "config_"+opt["name"], cb, color=color )
+                        # drop down list
+                        elif opt["type"] == "select":
+                            cb = ComboBoxText(ComboBoxText.parse_options(opt["select"])) # custom mygtk widget
+                            self.add_( "config_"+opt["name"], cb, opt["description"], color )
+                        # text entry
                         else:
-                            self.add_( "config_"+opt["name"], gtk.Entry(), opt["description"] )
+                            self.add_( "config_"+opt["name"], gtk.Entry(), opt["description"], color )
 
                 # spacer 
                 self.add_( "filler_pl_"+name, gtk.HSeparator() )
-            self.once = 1
 
 
-        # put gtk widgets into config dialog notebook
+        # Put config widgets into config dialog notebook
         def add_(self, id, w, label=None, color=""):
             w.set_property("visible", True)
             main.widgets[id] = w
             if label:
-                w.set_width_chars(10)
-                label = gtk.Label(label)
-                label.set_property("visible", True)
-                label.set_line_wrap(True) 
-                label.set_size_request(250, -1)
-                vbox = gtk.HBox(homogeneous=False, spacing=10)
-                vbox.set_property("visible", True)
-                vbox.pack_start(w, expand=False, fill=False)
-                vbox.pack_start(label, expand=True, fill=True)
-                w = vbox
+                if type(w) is gtk.Entry:
+                    w.set_width_chars(11)
+                w = mygtk.hbox(w, mygtk.label(label))
             if color:
                 w = mygtk.bg(w, color)
             self.plugin_options.pack_start(w)
-
         
         # save config
         def save(self, widget):
-            self.apply(conf.__dict__, "config_", 1)
+            self.save_config(conf.__dict__, "config_")
+            self.save_config(conf.plugins, "config_plugins_")
             self.apply_theme()
             conf.save(nice=1)
             self.hide()
@@ -930,10 +933,9 @@ class bookmarks(GenericChannel):
 
 
         # desc
-        api = "streamtuner2"
         module = "bookmarks"
         title = "bookmarks"
-        version = 4/10
+        version = 0.4
         base_url = "file:.config/streamtuner2/bookmarks.json"
         listformat = "*/*"
 
@@ -1040,7 +1042,7 @@ class bookmarks(GenericChannel):
             # This step is most likely redundant, but prevents accidently re-rewriting
             # stations that are in two channels (=duplicates with different PLS urls).
             check = {"http//": "[row]"}
-            check = dict((row["url"],row) for row in fav)
+            check = dict((row.get("url", "http//"),row) for row in fav)
             # walk through all channels/streams
             for chname,channel in main.channels.items():
                 for cat,streams in channel.streams.items():
@@ -1144,8 +1146,6 @@ def gui_startup(p=0/100.0, msg="streamtuner2 is starting"):
 #-- run main                                ---------------------------------------------
 if __name__ == "__main__":
 
-    #-- global configuration settings
-    "conf = Config()"       # already happened with "from config import conf"
 
     # graphical
     if len(sys.argv) < 2 or "--gtk3" in sys.argv:
diff --git a/streamtuner2.png b/streamtuner2.png
index 6c9f53c..b22c998 100644
Binary files a/streamtuner2.png and b/streamtuner2.png differ

-- 
streamtuner2 packaging



More information about the pkg-multimedia-commits mailing list