diff -rupN streamtuner-0.99.99/src/plugins/live365/live365.c streamtuner-0.99.99-new/src/plugins/live365/live365.c
--- streamtuner-0.99.99/src/plugins/live365/live365.c	2004-12-19 11:27:03.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/live365/live365.c	2009-11-25 20:46:03.906432214 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2003, 2004 Jean-Yves Lefort
+ * Copyright (C) 2002-2005 Jean-Yves Lefort
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -59,7 +59,9 @@ typedef enum
 {
   ACCESS_ALL,
   ACCESS_VIP,
-  ACCESS_SUBSCRIPTION
+  ACCESS_SUBSCRIPTION,
+  ACCESS_SOLD_OUT,
+  ACCESS_UNKNOWN
 } Access;
 
 typedef struct
@@ -94,7 +96,8 @@ typedef struct
 {
   GList			**streams;
   Live365Stream		*stream;
-  Live365Stream		*finished_stream;
+  gboolean		first_page;
+  gboolean		looped;
   gboolean		has_next_page;
 } ReloadStreamsInfo;
 
@@ -263,13 +266,16 @@ stream_field_get_cb (Live365Stream *stre
 
     case FIELD_ACCESS_STRING:
       {
-	const char *str = NULL;
+	const char *str;
 
 	switch (stream->access)
 	  {
 	  case ACCESS_ALL:		str = _("All"); break;
 	  case ACCESS_VIP:		str = _("VIP"); break;
 	  case ACCESS_SUBSCRIPTION:	str = _("Subscription"); break;
+	  case ACCESS_SOLD_OUT:		str = _("Sold out"); break;
+	  case ACCESS_UNKNOWN:		str = _("Unknown"); break;
+	  default:			str = NULL; break;
 	  }
 
 	g_value_set_string(value, str);
@@ -707,14 +713,16 @@ reload_categories_body_cb (const char *l
   char *s1, *s2, *s3, *s4, *s5;
 
   if ((s1 = st_strstr_span(line, "<a href=\"/cgi-bin/directory"))
-      && (s2 = st_strstr_span(s1, "&genre="))
+      && (s2 = st_strstr_span(s1, "genre="))
       && (s3 = strchr(s2, '"'))
       && (s4 = st_strchr_span(s3, '>'))
       && (s5 = strstr(s4, "</a>")))
     {
       category = st_category_new();
       category->name = g_strndup(s2, s3 - s2);
-      category->label = st_sgml_ref_expand_len(s4, s5 - s4);
+      category->label = ! strcmp(category->name, "Recommendations")
+	? g_strdup(_("Recommendations"))
+	: st_sgml_ref_expand_len(s4, s5 - s4);
       category->url_postfix = g_strconcat(DIRECTORY_PREFIX, category->name, NULL);
     }
   else if ((s1 = st_strstr_span(line, "<a href=\"/genres/"))
@@ -755,6 +763,8 @@ reload_streams (STCategory *category, GL
 
   *streams = NULL;
   info.streams = streams;
+  info.first_page = TRUE;
+  info.looped = FALSE;
 
   session = st_transfer_session_new();
 
@@ -802,9 +812,11 @@ reload_streams (STCategory *category, GL
 	  if (status) /* only display warning if the transfer was otherwise correct */
 	    PARSE_ERROR;
 	}
+
+      info.first_page = FALSE;
     }
-  while (status && info.has_next_page
-	 && (stream_limit == -1 || received_streams < stream_limit));
+  while (status && info.has_next_page && ! info.looped
+	  && (stream_limit == -1 || received_streams < stream_limit));
 
   st_transfer_session_free(session);
 
@@ -818,6 +830,10 @@ reload_streams_body_cb (const char *line
   char *s1, *s2, *s3, *s4, *s5, *s6, *s7;
   char *word1, *word2, *word3;
 
+  /* if we have detected a loop, we just ignore the page */
+  if (info->looped)
+    return;
+
   if ((s1 = st_str_has_prefix_span(line, "<TD  CLASS=\"icon\""))
       && (s2 = st_strstr_span(s1, "DrawPlayIcon")))
     {
@@ -834,15 +850,18 @@ reload_streams_body_cb (const char *line
 	info->stream->access = ACCESS_VIP;
       else if (strstr(s2, "'SUBSCRIPTION'"))
 	info->stream->access = ACCESS_SUBSCRIPTION;
+      else if (strstr(s2, "'SOLD_OUT'"))
+	info->stream->access = ACCESS_SOLD_OUT;
       else
-	PARSE_ERROR;
-
-      info->finished_stream = NULL;
+	{
+	  PARSE_ERROR;
+	  info->stream->access = ACCESS_UNKNOWN;
+	}
     }
   else if ((s1 = st_str_has_prefix_span(line, "<TD  CLASS=\"title"))
-      && (s2 = st_strstr_span(s1, "href='"))
-      && (s3 = strstr(s2, "'>"))
-      && (s4 = strstr(s3, "</a>")))
+	   && (s2 = st_strstr_span(s1, "href='"))
+	   && (s3 = strstr(s2, "'>"))
+	   && (s4 = strstr(s3, "</a>")))
     {
       if (info->stream)
 	{
@@ -865,12 +884,19 @@ reload_streams_body_cb (const char *line
       else
 	PARSE_ERROR;
     }
-  else if ((s1 = st_strstr_span(line, "&station_id="))
-	   && (s2 = strchr(s1, '&')))
+  else if ((s1 = st_str_has_prefix_span(line, "<TD  CLASS=\"handle\""))
+	   && (s2 = st_strstr_span(s1, "ReadCookie("))
+	   && (s3 = st_strstr_span(s2, ", '"))
+	   && (s4 = strchr(s3, '\''))
+	   && (s5 = st_strstr_span(s4, "&station_id="))
+	   && (s6 = strchr(s5, '&')))
     {
       if (info->stream)
 	{
-	  word1 = g_strndup(s1, s2 - s1);
+	  g_free(info->stream->broadcaster);
+	  info->stream->broadcaster = st_sgml_ref_expand_len(s3, s4 - s3);
+
+	  word1 = g_strndup(s5, s6 - s5);
 	  if (st_str_like(word1, ST_NUMERIC))
 	    info->stream->station_id = atoi(word1);
 	  g_free(word1);
@@ -878,34 +904,23 @@ reload_streams_body_cb (const char *line
       else
 	PARSE_ERROR;
     }
-  else if ((s1 = st_strstr_span(line, "alt=\"More broadcaster info"))
-	   && (s2 = st_strchr_span(s1, '>'))
-	   && (s3 = strstr(s2, "</a>")))
-    {
-      if (info->stream)
-	{
-	  g_free(info->stream->broadcaster);
-	  info->stream->broadcaster = st_sgml_ref_expand_len(s2, s3 - s2);
-	}
-      else
-	PARSE_ERROR;
-    }
   else if ((s1 = st_str_has_prefix_span(line, "<TD  CLASS=\"connection\""))
 	   && (s2 = st_strchr_span(s1, '>'))
-	   && (s3 = strstr(s2, "<br>"))
-	   && ((s4 = strstr(s3, "<img src='/images/mp3pro"))
-	       || (s4 = strstr(s3, "</TD>"))))
+	   && (s3 = strchr(s2, '<')))
     {
       if (info->stream)
 	{
 	  word1 = st_sgml_ref_expand_len(s2, s3 - s2);
-	  s3 += 4; word2 = st_sgml_ref_expand_len(s3, s4 - s3);
-	  
+
 	  g_free(info->stream->audio);
-	  info->stream->audio = g_strdup_printf(g_str_has_prefix(s4, "</TD>") ? "%s %s" : "%s %s, MP3Pro", word2, word1);
 
-	  g_free(word1);
-	  g_free(word2);
+	  if (strstr(s3, "<img src='/images/mp3pro"))
+	    {
+	      info->stream->audio = g_strdup_printf("%s, MP3Pro", word1);
+	      g_free(word1);
+	    }
+	  else
+	    info->stream->audio = word1;
 	}
       else
 	PARSE_ERROR;
@@ -947,12 +962,17 @@ reload_streams_body_cb (const char *line
       else
 	PARSE_ERROR;
     }
-  else if (strstr(line, "TD  CLASS=\"tabledesc2\""))
+  else if ((s1 = st_strstr_span(line, "<TD  CLASS=\"desc\"")))
     {
       if (info->stream)
 	{
 	  if (info->stream->station_id)
 	    {
+	      if ((s2 = st_strstr_span(s1, "<a class='desc-link' href='"))
+		  && (s3 = st_strchr_span(s2, '>'))
+		  && (s4 = strstr(s3, "<BR>")))
+		info->stream->description = st_sgml_ref_expand_len(s3, s4 - s3);
+
 	      ((STStream *) info->stream)->name = g_strdup_printf("%i", info->stream->station_id);
 	      *(info->streams) = g_list_append(*(info->streams), info->stream);
 	    }
@@ -962,23 +982,23 @@ reload_streams_body_cb (const char *line
 	      stream_free_cb(info->stream, NULL);
 	    }
 
-	  info->finished_stream = info->stream;
 	  info->stream = NULL;
 	}
       else
 	PARSE_ERROR;
     }
-  else if ((s1 = st_strstr_span(line, "<a class='desc-link' href='"))
-	   && (s2 = st_strchr_span(s1, '>'))
-	   && (s3 = strstr(s2, "<BR>")))
+  else if ((s1 = st_strstr_span(line, "<TD class=\"pagination\""))
+	   && (s2 = st_strstr_span(s1, ">Showing "))
+	   && (s3 = strchr(s2, '-')))
     {
-      if (info->finished_stream)
+      word1 = g_strndup(s2, s3 - s2);
+      if (st_str_like(word1, ST_NUMERIC))
 	{
-	  info->finished_stream->description = st_sgml_ref_expand_len(s2, s3 - s2);
-	  info->finished_stream = NULL;
+	  int n = atoi(word1);
+	  if (n == 1 && ! info->first_page)
+	    info->looped = TRUE;
 	}
-      else
-	PARSE_ERROR;
+      g_free(word1);
     }
   else if (strstr(line, "Next</A>"))
     info->has_next_page = TRUE;
@@ -1410,8 +1430,8 @@ plugin_init (GError **err)
   init_handler();
 
   st_action_register("record-stream", _("Record a stream"), "xterm -e streamripper %q");
-  st_action_register("view-web", _("Open a web page"), "epiphany %q");
-  st_action_register("play-stream", _("Listen to a stream"), "xmms %q");
+  st_action_register("view-web", _("Open a web page"), "firefox %q");
+  st_action_register("play-stream", _("Listen to a stream"), "audacious %q");
 
   return TRUE;
 }
diff -rupN streamtuner-0.99.99/src/plugins/local/local.c streamtuner-0.99.99-new/src/plugins/local/local.c
--- streamtuner-0.99.99/src/plugins/local/local.c	2004-12-13 08:39:29.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/local/local.c	2009-11-25 20:46:33.310457862 +0100
@@ -1057,8 +1057,8 @@ plugin_init (GError **err)
 
   init_handler();
 
-  st_action_register("play-m3u", _("Listen to a .m3u file"), "xmms %q");
-  st_action_register("view-web", _("Open a web page"), "epiphany %q");
+  st_action_register("play-m3u", _("Listen to a .m3u file"), "audacious %q");
+  st_action_register("view-web", _("Open a web page"), "firefox %q");
 
   return TRUE;
 }
diff -rupN streamtuner-0.99.99/src/plugins/python/google-stations.py streamtuner-0.99.99-new/src/plugins/python/google-stations.py
--- streamtuner-0.99.99/src/plugins/python/google-stations.py	2004-12-18 09:29:30.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/python/google-stations.py	2009-11-25 20:46:59.610865740 +0100
@@ -166,7 +166,7 @@ def init ():
     if not ST.check_api_version(2, 0):
         raise RuntimeError, _("API version mismatch")
 
-    ST.action_register("view-web", _("Open a web page"), "epiphany %q")
+    ST.action_register("view-web", _("Open a web page"), "firefox %q")
 
     handler = GoogleStationsHandler()
     ST.handlers_add(handler)
diff -rupN streamtuner-0.99.99/src/plugins/python/pst-main.c streamtuner-0.99.99-new/src/plugins/python/pst-main.c
--- streamtuner-0.99.99/src/plugins/python/pst-main.c	2004-12-11 03:00:39.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/python/pst-main.c	2009-11-25 20:24:35.000000000 +0100
@@ -94,6 +94,7 @@ plugin_init (GError **err)
 {
   gboolean status = FALSE;
   PyObject *module;
+  char *argv[] = { "" };
 
   if (! check_api_version(err))
     return FALSE;
@@ -109,6 +110,7 @@ plugin_init (GError **err)
     }
 
   Py_Initialize();
+  PySys_SetArgv(G_N_ELEMENTS(argv), argv);
   PyEval_InitThreads();
 
   module = PyImport_AddModule("__main__");
diff -rupN streamtuner-0.99.99/src/plugins/python/punkcast.com.py streamtuner-0.99.99-new/src/plugins/python/punkcast.com.py
--- streamtuner-0.99.99/src/plugins/python/punkcast.com.py	2004-12-13 06:45:14.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/python/punkcast.com.py	2009-11-25 20:47:19.389076789 +0100
@@ -192,7 +192,7 @@ def init ():
     if not ST.check_api_version(2, 0):
         raise RuntimeError, _("API version mismatch")
     
-    ST.action_register("view-web", _("Open a web page"), "epiphany %q")
+    ST.action_register("view-web", _("Open a web page"), "firefox %q")
 
     handler = PunkcastComHandler()
     ST.handlers_add(handler)
diff -rupN streamtuner-0.99.99/src/plugins/shoutcast/shoutcast.c streamtuner-0.99.99-new/src/plugins/shoutcast/shoutcast.c
--- streamtuner-0.99.99/src/plugins/shoutcast/shoutcast.c	2004-12-19 16:21:00.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/shoutcast/shoutcast.c	2009-11-25 20:48:51.258619782 +0100
@@ -37,7 +37,7 @@
 
 /*** cpp *********************************************************************/
 
-#define SHOUTCAST_ROOT		"http://www.shoutcast.com/"
+#define SHOUTCAST_ROOT		"http://classic.shoutcast.com/"
 
 #define MAX_STREAMS_PER_PAGE	100 /* enforced by SHOUTcast */
 
@@ -91,6 +91,7 @@ typedef struct
 
   int			page;
   int			npages;
+  int			parse_genres;
 
   GNode			*parent_node;
   SHOUTcastStream	*stream;
@@ -516,6 +517,7 @@ reload_cb (STCategory *category,
 
       info.page = 0;
       info.npages = 0;
+      info.parse_genres = 0;
       info.parent_node = NULL;
       info.stream = NULL;
 
@@ -566,9 +568,18 @@ reload_body_cb (const char *line, gpoint
       info->stream->url_postfix = st_sgml_ref_expand_len(s1, s2 - s1);
     }
   else if (info->page < 2
-	   && (((s1 = st_str_has_prefix_span(line, "\t<OPTION VALUE=\""))
-		|| (s1 = st_str_has_prefix_span(line, "\t\t<OPTION VALUE=\"")))
-	       && (s2 = strstr(s1, "\">"))))
+	   && st_strstr_span(line, "<OPTION VALUE=\"TopTen\">"))
+    {
+      info->parse_genres = 1;
+    }
+  else if (info->page < 2 && info->parse_genres == 1
+	   && st_strstr_span(line, "</SELECT>"))
+    {
+      info->parse_genres = 0;
+    }
+  else if (info->page < 2 && info->parse_genres == 1
+	   && (s1 = st_strstr_span(line, "<OPTION VALUE=\""))
+	   && (s2 = strstr(s1, "\">")))
     {
       STCategory *category;
       GNode *node;
@@ -959,9 +970,9 @@ plugin_init (GError **err)
 
   init_handler();
   
-  st_action_register("play-m3u", _("Listen to a .m3u file"), "xmms %q");
+  st_action_register("play-m3u", _("Listen to a .m3u file"), "audaciuos %q");
   st_action_register("record-stream", _("Record a stream"), "xterm -e streamripper %q");
-  st_action_register("view-web", _("Open a web page"), "epiphany %q");
+  st_action_register("view-web", _("Open a web page"), "firefox %q");
 
   return TRUE;
 }
diff -rupN streamtuner-0.99.99/src/plugins/xiph/xiph.c streamtuner-0.99.99-new/src/plugins/xiph/xiph.c
--- streamtuner-0.99.99/src/plugins/xiph/xiph.c	2004-12-13 10:57:33.000000000 +0100
+++ streamtuner-0.99.99-new/src/plugins/xiph/xiph.c	2009-11-25 20:49:10.765024932 +0100
@@ -957,7 +957,7 @@ plugin_init (GError **err)
   init_handler();
 
   st_action_register("record-stream", _("Record a stream"), "xterm -e streamripper %q");
-  st_action_register("play-stream", _("Listen to a stream"), "xmms %q");
+  st_action_register("play-stream", _("Listen to a stream"), "audaious %q");
 
   return TRUE;
 }
diff -rupN streamtuner-0.99.99/src/streamtuner/st-action.c streamtuner-0.99.99-new/src/streamtuner/st-action.c
--- streamtuner-0.99.99/src/streamtuner/st-action.c	2004-12-18 10:56:42.000000000 +0100
+++ streamtuner-0.99.99-new/src/streamtuner/st-action.c	2009-11-25 20:43:48.400335415 +0100
@@ -123,8 +123,8 @@ st_action_init (void)
 {
   actions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 
-  st_action_register("view-web", _("Open a web page"), "epiphany %q");
-  st_action_register("view-ghelp", _("Open a GNOME help document"), "yelp %q");
+  st_action_register("view-web", _("Open a web page"), "firefox %q");
+  st_action_register("view-ghelp", _("Open a GNOME help document"), "firefox %q");
 }
 
 static void
diff -rupN streamtuner-0.99.99/src/streamtuner/st-preselections.c streamtuner-0.99.99-new/src/streamtuner/st-preselections.c
--- streamtuner-0.99.99/src/streamtuner/st-preselections.c	2004-12-13 10:57:52.000000000 +0100
+++ streamtuner-0.99.99-new/src/streamtuner/st-preselections.c	2009-11-25 20:49:51.192902988 +0100
@@ -390,9 +390,9 @@ st_preselections_init (void)
 {
   st_preselections_init_handler();
   
-  st_action_register("play-stream", _("Listen to a stream"), "xmms %q");
+  st_action_register("play-stream", _("Listen to a stream"), "audacious %q");
   st_action_register("record-stream", _("Record a stream"), "xterm -e streamripper %q");
-  st_action_register("view-web", _("Open a web page"), "epiphany %q");
+  st_action_register("view-web", _("Open a web page"), "firefox %q");
 }
 
 void
@@ -411,42 +411,6 @@ st_preselections_add_stock (void)
 	const char	*homepage;
 	const char	*url;
       } entries[] = {
-	{
-	  "Virgin Radio 1215AM",
-	  "Eclectic",
-	  "http://www.virginradio.co.uk/",
-	  "http://ogg.smgradio.com/vr160.ogg"
-	},
-	{
-	  "Virgin Radio Classic Rock",
-	  "Classic Rock",
-	  "http://www.virginradio.co.uk/",
-	  "http://ogg.smgradio.com/vc160.ogg"
-	},
-	{
-	  "The Virgin Radio Groove",
-	  "Soul",
-	  "http://www.virginradio.co.uk/",
-	  "http://ogg.smgradio.com/gr160.ogg"
-	},
-	{
-	  "Kill Radio",
-	  "Eclectic",
-	  "http://www.killradio.org/",
-	  "http://slaptech.net:8000/killradio64.mp3"
-	},
-	{
-	  "DFM Radio Television International",
-	  "Alternative, Experimental",
-	  "http://dfm.nu/",
-	  "http://194.109.209.34:8000/dfm_1"
-	},
-	{
-	  "Blazeradio",
-	  "Eclectic",
-	  "http://blazeradio.newsroom.uab.edu/",
-	  "http://blazeradio.newsroom.uab.edu:8000"
-	}
       };
 	    
       preselections = st_stream_store_new(st_preselections_handler);
