Index: totem-pl-parser.h
===================================================================
--- totem-pl-parser.h	(revision 3953)
+++ totem-pl-parser.h	(working copy)
@@ -59,7 +59,7 @@
 
 	/* signals */
 	void (*entry) (TotemPlParser *parser, const char *uri,
-		       const char *title, const char *genre);
+		       GHashTable *metadata);
 	void (*playlist_start) (TotemPlParser *parser, const char *title);
 	void (*playlist_end) (TotemPlParser *parser, const char *title);
 };
Index: test-parser.c
===================================================================
--- test-parser.c	(revision 3953)
+++ test-parser.c	(working copy)
@@ -70,15 +70,26 @@
 			"/home/hadess/test/file.m3u");
 }
 #endif
+
 static void
-entry_added (TotemPlParser *parser, const char *uri, const char *title,
-		const char *genre, gpointer data)
+entry_metadata_foreach (const char *key,
+			const char *value,
+			gpointer data)
 {
-	g_print ("added URI '%s' with title '%s' genre '%s'\n", uri,
-			title ? title : "empty", genre ? genre : "empty");
+	if (g_ascii_strcasecmp (key, "url") == 0)
+		return;
+	g_print ("\t%s = %s\n", key, value);
 }
 
 static void
+entry_added (TotemPlParser *parser, const char *uri,
+	     GHashTable *metadata, gpointer data)
+{
+	g_print ("added URI '%s'\n", uri);
+	g_hash_table_foreach (metadata, (GHFunc) entry_metadata_foreach, NULL);
+}
+
+static void
 test_parsing_real (TotemPlParser *pl, const char *url)
 {
 	TotemPlParserResult res;
Index: totem-pl-parser-qt.c
===================================================================
--- totem-pl-parser-qt.c	(revision 3956)
+++ totem-pl-parser-qt.c	(working copy)
@@ -49,22 +49,31 @@
 					    gpointer data)
 {
 	char *contents = NULL;
-	const char *split_char;
+	gboolean dos_mode = FALSE;
+	char *volume, *autoplay;
 	int size;
 	char **lines;
 
 	if (gnome_vfs_read_entire_file (url, &size, &contents) != GNOME_VFS_OK)
 		return TOTEM_PL_PARSER_RESULT_ERROR;
 
-	if (strstr(contents,"\x0d") == NULL)
-		split_char = "\n"; 
-	else
-		split_char = "\x0d\n";
+	if (strstr(contents,"\x0d") != NULL)
+		dos_mode = TRUE;
 
-	lines = g_strsplit (contents, split_char, 0);
-	g_free (contents);
+	lines = g_strsplit (contents, dos_mode ? "\x0d\n" : "\n", 0);
 
-	totem_pl_parser_add_one_url (parser, lines[0] + strlen ("RTSPtext"), NULL);
+	volume = totem_pl_parser_read_ini_line_string_with_sep
+		(lines, "volume", dos_mode, "=");
+	autoplay = totem_pl_parser_read_ini_line_string_with_sep
+		(lines, "autoplay", dos_mode, "=");
+
+	totem_pl_parser_add_url (parser,
+				 "url", lines[0] + strlen ("RTSPtext"),
+				 "volume", volume,
+				 "autoplay", autoplay,
+				 NULL);
+	g_free (volume);
+	g_free (autoplay);
 	g_strfreev (lines);
 
 	return TOTEM_PL_PARSER_RESULT_SUCCESS;
Index: totemplparser-marshal.list
===================================================================
--- totemplparser-marshal.list	(revision 3953)
+++ totemplparser-marshal.list	(working copy)
@@ -1 +1,2 @@
 VOID:STRING,STRING,STRING
+VOID:STRING,POINTER
Index: totem-pl-parser.c
===================================================================
--- totem-pl-parser.c	(revision 3953)
+++ totem-pl-parser.c	(working copy)
@@ -163,8 +163,8 @@
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (TotemPlParserClass, entry),
 			      NULL, NULL,
-			      totemplparser_marshal_VOID__STRING_STRING_STRING,
-			      G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+			      totemplparser_marshal_VOID__STRING_POINTER,
+			      G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER);
 	totem_pl_parser_table_signals[PLAYLIST_START] =
 		g_signal_new ("playlist-start",
 			      G_TYPE_FROM_CLASS (klass),
@@ -682,6 +682,14 @@
 				     "Base URL of the item to be added", NULL,
 				     G_PARAM_READABLE & G_PARAM_WRITABLE);
 	g_param_spec_pool_insert (parser->priv->pspec_pool, pspec, TOTEM_TYPE_PL_PARSER);
+	pspec = g_param_spec_string ("volume", "volume",
+				     "Default playback volume (in percents)", NULL,
+				     G_PARAM_READABLE & G_PARAM_WRITABLE);
+	g_param_spec_pool_insert (parser->priv->pspec_pool, pspec, TOTEM_TYPE_PL_PARSER);
+	pspec = g_param_spec_string ("autoplay", "autoplay",
+				     "Whether or not to autoplay the stream", NULL,
+				     G_PARAM_READABLE & G_PARAM_WRITABLE);
+	g_param_spec_pool_insert (parser->priv->pspec_pool, pspec, TOTEM_TYPE_PL_PARSER);
 }
 
 static void
@@ -718,10 +726,12 @@
 {
 	const char *name;
 	char *title, *url, *genre, *base;
+	GHashTable *metadata;
 
 	title = url = genre = base = NULL;
 
 	g_object_ref (G_OBJECT (parser));
+	metadata = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 
 	name = first_property_name;
 
@@ -737,7 +747,7 @@
 
 		if (!pspec) {
 			g_warning ("Unknown property '%s'", name);
-			break;
+			continue;
 		}
 
 		g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
@@ -747,34 +757,28 @@
 			break;
 		}
 
-		if (strcmp (name, "url") == 0) {
+		if (strcmp (name, "url") == 0)
 			url = g_value_dup_string (&value);
-		} else if (strcmp (name, "title") == 0) {
-			title = g_value_dup_string (&value);
-		} else if (strcmp (name, "genre") == 0) {
-			genre = g_value_dup_string (&value);
-		} else if (strcmp (name, "base") == 0) {
-			base = g_value_dup_string (&value);
-		}
 
+		/* Add other values to the metadata hashtable */
+		g_hash_table_insert (metadata, g_strdup (name), g_value_dup_string (&value));
+
 		g_value_unset (&value);
 		name = va_arg (var_args, char*);
 	}
 
-	g_assert (url != NULL);
-
 	if (parser->priv->disable_unsafe != FALSE) {
 		//FIXME fix this! 396710
 	}
 
-	g_signal_emit (G_OBJECT (parser), totem_pl_parser_table_signals[ENTRY],
-		       0, url, title, genre);
+	if (g_hash_table_size (metadata) > 0 || url != NULL) {
+		g_signal_emit (G_OBJECT (parser), totem_pl_parser_table_signals[ENTRY],
+			       0, url, metadata);
+	}
 
+	g_hash_table_destroy (metadata);
+
 	g_free (url);
-	g_free (title);
-	g_free (genre);
-	g_free (base);
-
 	g_object_unref (G_OBJECT (parser));
 }
 
