diff --git a/plugins/generic-player/rb-generic-player-source.c b/plugins/generic-player/rb-generic-player-source.c
index dd4ab99..89e2d00 100644
--- a/plugins/generic-player/rb-generic-player-source.c
+++ b/plugins/generic-player/rb-generic-player-source.c
@@ -177,20 +231,117 @@ rb_generic_player_source_constructor (GType type,
 	return G_OBJECT (source);
 }
 
+static char *
+get_is_audio_player_path (GnomeVFSVolume *volume)
+{
+	char *path = gnome_vfs_volume_get_activation_uri (volume);
+	char *file = g_build_filename (path, ".is_audio_player", NULL);
+	g_free (path);
+
+	if (rb_uri_is_local (file) && rb_uri_exists (file)) {
+		return file;
+	}
+
+	g_free (file);
+	return NULL;
+}
+
+static void
+set_playlist_formats (RBGenericPlayerSource *source, char **formats)
+{
+	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
+	int fmt;
+
+	priv->playlist_format_unknown = TRUE;
+	priv->playlist_format_m3u = FALSE;
+	priv->playlist_format_pls = FALSE;
+	for (fmt = 0; formats[fmt] != NULL; fmt++) {
+		char *format;
+		char *stripped;
+
+		format = g_strdup (formats[fmt]);
+		stripped = g_strstrip (format);
+
+		if (strcmp (stripped, "audio/x-mpegurl") == 0) {
+			priv->playlist_format_unknown = FALSE;
+			priv->playlist_format_m3u = TRUE;
+		} else if (strcmp (stripped, "audio/x-scpls") == 0) {
+			priv->playlist_format_unknown = FALSE;
+			priv->playlist_format_pls = TRUE;
+		} else {
+			rb_debug ("unrecognized playlist format: %s", stripped);
+		}
+
+		g_free (format);
+	}
+}
+
+static void
+debug_device_info (RBGenericPlayerSource *source, GnomeVFSVolume *volume, const char *what)
+{
+	char *dbg;
+	char *path;
+	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
+
+	path = gnome_vfs_volume_get_activation_uri (volume);
+	rb_debug ("device information for %s from %s", path, what);
+	g_free (path);
+
+	if (priv->audio_folders != NULL) {
+		dbg = g_strjoinv (", ", priv->audio_folders);
+		rb_debug ("audio folders: %s", dbg);
+		g_free (dbg);
+	} else {
+		rb_debug ("no audio folders set");
+	}
+
+	if (priv->output_mime_types != NULL) {
+		dbg = g_strjoinv (", ", priv->output_mime_types);
+		rb_debug ("output types: %s", dbg);
+		g_free (dbg);
+	} else {
+		rb_debug ("no output types set");
+	}
+
+	if (priv->playlist_format_unknown) {
+		rb_debug ("playlist format is unknown");
+	} else {
+		if (priv->playlist_format_m3u)
+			rb_debug ("M3U playlist format is supported");
+		if (priv->playlist_format_pls)
+			rb_debug ("PLS playlist format is supported");
+	}
+
+	if (priv->playlist_path != NULL) {
+		rb_debug ("playlist path: %s", priv->playlist_path);
+	} else {
+		rb_debug ("no playlist path is set");
+	}
+
+	if (priv->folder_depth == -1) {
+		rb_debug ("audio folder depth is not set");
+	} else {
+		rb_debug ("audio folder depth: %d", priv->folder_depth);
+	}
+}
+
 static void
 rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 {
-#if HAVE_HAL
-	GnomeVFSVolume *volume;
-	LibHalContext *ctx = get_hal_context ();
 	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
+	GnomeVFSVolume *volume;
+	char *is_audio_player;
+#ifdef HAVE_HAL
+	LibHalContext *ctx;
+#endif
+	g_object_get (source, "volume", &volume, NULL);
 
+#ifdef HAVE_HAL
+	ctx = get_hal_context ();
 	if (ctx != NULL) {
 		gchar *udi;
 
-		g_object_get (G_OBJECT (source), "volume", &volume, NULL);
 		udi = get_hal_udi_for_player (ctx, volume);
-		g_object_unref (G_OBJECT (volume));
 
 		if (udi != NULL) {
 			DBusError error;
@@ -203,13 +354,7 @@ rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 			proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.audio_folders", &error);
 			if (proplist) {
 				if (!dbus_error_is_set (&error)) {
-					char *dbg;
-
 					priv->audio_folders = g_strdupv (proplist);
-
-					dbg = g_strjoinv(", ", priv->audio_folders);
-					rb_debug ("got audio player folder list: %s", dbg);
-					g_free (dbg);
 				}
 				libhal_free_string_array (proplist);
 			}
@@ -220,13 +365,7 @@ rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 			proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.output_formats", &error);
 			if (proplist) {
 				if (!dbus_error_is_set (&error)) {
-					char *dbg;
-
 					priv->output_mime_types = g_strdupv (proplist);
-
-					dbg = g_strjoinv (", ", priv->output_mime_types);
-					rb_debug ("got output mime-type list: %s", dbg);
-					g_free (dbg);
 				}
 				libhal_free_string_array (proplist);
 			}
@@ -237,26 +376,8 @@ rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 			proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.playlist_format", &error);
 			if (proplist) {
 				if (!dbus_error_is_set (&error)) {
-					int fmt;
-					for (fmt = 0; proplist[fmt] != NULL; fmt++) {
-						if (strcmp (proplist[fmt], "audio/x-mpegurl") == 0) {
-							rb_debug ("device supports M3U playlists");
-							priv->playlist_format_unknown = FALSE;
-							priv->playlist_format_m3u = TRUE;
-						} else if (strcmp (proplist[fmt], "audio/x-scpls") == 0) {
-							rb_debug ("device supports PLS playlists");
-							priv->playlist_format_unknown = FALSE;
-							priv->playlist_format_pls = TRUE;
-						} else {
-							rb_debug ("unrecognized playlist format: %s", proplist[fmt]);
-						}
-					}
-				}
-
-				if (priv->playlist_format_unknown) {
-					rb_debug ("didn't find a playlist format");
+					set_playlist_formats (source, proplist);
 				}
-
 				libhal_free_string_array (proplist);
 			}
 			free_dbus_error ("getting playlist format", &error);
@@ -265,7 +386,6 @@ rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 			dbus_error_init (&error);
 			prop = libhal_device_get_property_string (ctx, udi, "portable_audio_player.playlist_path", &error);
 			if (prop && !dbus_error_is_set (&error)) {
-				rb_debug ("got playlist path: %s", prop);
 				priv->playlist_path = g_strdup (prop);
 				libhal_free_string (prop);
 			}
@@ -275,20 +395,100 @@ rb_generic_player_source_get_device_info (RBGenericPlayerSource *source)
 			dbus_error_init (&error);
 			value = libhal_device_get_property_int (ctx, udi, "portable_audio_player.folder_depth", &error);
 			if (!dbus_error_is_set (&error)) {
-				rb_debug ("got max folder depth %d", value);
 				priv->folder_depth = value;
 			}
 			free_dbus_error ("getting max folder depth", &error);
 
+			debug_device_info (source, volume, "HAL");
 		} else {
 			rb_debug ("no player info available (HAL doesn't recognise it as a player");
 		}
 		g_free (udi);
 	}
 	cleanup_hal_context (ctx);
-#else
-	rb_debug ("no player info available (no HAL)");
 #endif
+
+	/* allow HAL info to be overridden with .is_audio_player file */
+	is_audio_player = get_is_audio_player_path (volume);
+	if (is_audio_player != NULL) {
+		char *data = NULL;
+		gsize data_size = 0;
+		GnomeVFSResult result;
+
+		rb_debug ("reading .is_audio_player file %s", is_audio_player);
+		result = gnome_vfs_read_entire_file (is_audio_player, &data_size, &data);
+		if (result != GNOME_VFS_OK) {
+			/* can we sensibly report this anywhere? */
+			rb_debug ("error reading .is_audio_player file: %s", gnome_vfs_result_to_string (result));
+		} else {
+			GKeyFile *keyfile;
+			GError *error = NULL;
+			char *munged;
+			gsize munged_size;
+			const char *fake_group = "[xxx-rb-data]\n";
+			char *group;
+
+			/* prepend a group name to the file contents */
+			munged_size = data_size + strlen (fake_group);
+			munged = g_malloc0 (munged_size + 1);
+			strcpy (munged, fake_group);
+			memcpy (munged + strlen (fake_group), data, data_size);
+
+			keyfile = g_key_file_new ();
+			g_key_file_set_list_separator (keyfile, ',');
+			if (g_key_file_load_from_data (keyfile, munged, munged_size, G_KEY_FILE_NONE, &error) == FALSE) {
+				/* and this */
+				rb_debug ("error loading .is_audio_player file: %s", error->message);
+				g_error_free (error);
+			} else {
+				char *value;
+				char **list;
+
+				group = g_key_file_get_start_group (keyfile);
+				
+				list = g_key_file_get_string_list (keyfile, group, "audio_folders", NULL, NULL);
+				if (list != NULL) {
+					g_strfreev (priv->audio_folders);
+					priv->audio_folders = list;
+				}
+
+				list = g_key_file_get_string_list (keyfile, group, "output_formats", NULL, NULL);
+				if (list != NULL) {
+					g_strfreev (priv->output_mime_types);
+					priv->output_mime_types = list;
+				}
+				
+				list = g_key_file_get_string_list (keyfile, group, "playlist_formats", NULL, NULL);
+				if (list != NULL) {
+					set_playlist_formats (source, list);
+					g_strfreev (list);
+				}
+
+				value = g_key_file_get_string (keyfile, group, "playlist_path", NULL);
+				if (value != NULL) {
+					g_free (priv->playlist_path);
+					priv->playlist_path = value;
+				}
+
+				if (g_key_file_has_key (keyfile, group, "folder_depth", NULL)) {
+					priv->folder_depth = g_key_file_get_integer (keyfile, group, "folder_depth", NULL);
+				}
+				g_free (group);
+			}
+
+			g_key_file_free (keyfile);
+			g_free (munged);
+			
+			debug_device_info (source, volume, ".is_audio_player file");
+		}
+		g_free (data);
+
+		g_free (is_audio_player);
+	} else {
+		rb_debug ("no .is_audio_player file found on this device");
+	}
+
+	g_object_unref (volume);
 }
 
 static void
@@ -455,13 +676,10 @@ rb_generic_player_is_volume_player (GnomeVFSVolume *volume)
 
 	/* treat as audio player if ".is_audio_player" exists in the root of the volume  */
 	if (!result) {
-		char *path = gnome_vfs_volume_get_activation_uri (volume);
-		char *file = g_build_filename (path, ".is_audio_player", NULL);
+		char *path;
+		path = get_is_audio_player_path (volume);
+		result = (path != NULL);
 
-		if (rb_uri_is_local (file) && rb_uri_exists (file))
-			result = TRUE;
-
-		g_free (file);
 		g_free (path);
 	}
 
@@ -563,6 +781,7 @@ load_playlist_file (RBGenericPlayerSource *source,
 	TotemPlParser *parser;
 	HandlePlaylistEntryData *data;
 	RBShell *shell;
+	RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source);
 
 	g_object_get (G_OBJECT (source),
 		      "shell", &shell,
@@ -582,6 +801,14 @@ load_playlist_file (RBGenericPlayerSource *source,
 
 	parser = totem_pl_parser_new ();
 
+	/* ignore playlist formats we know the device doesn't support */
+	if (priv->playlist_format_unknown == FALSE) {
+		if (priv->playlist_format_m3u == FALSE)
+			totem_pl_parser_add_ignored_mimetype (parser, "audio/x-mpegurl");
+		if (priv->playlist_format_pls == FALSE)
+			totem_pl_parser_add_ignored_mimetype (parser, "audio/x-scpls");
+	}
+
 #if TOTEM_PL_PARSER_CHECK_VERSION(2,19,0)
 	g_signal_connect (parser,
 			  "entry-parsed", G_CALLBACK (handle_playlist_entry_cb),
@@ -624,11 +851,7 @@ visit_playlist_dirs (const gchar *rel_path,
 	playlist_path = rb_uri_append_path (main_path, rel_path);
 	g_free (main_path);
 
-	/* don't add playlists in formats we know the player can't handle  */
-	if ((g_str_has_suffix (playlist_path, ".m3u") && (priv->playlist_format_unknown || priv->playlist_format_m3u)) ||
-	   (g_str_has_suffix (playlist_path, ".pls") && (priv->playlist_format_unknown || priv->playlist_format_pls))) {
-		load_playlist_file (source, playlist_path, rel_path);
-	}
+	load_playlist_file (source, playlist_path, rel_path);
 	g_free (playlist_path);
 
 	return TRUE;
