? lib/rb-cover.c
? lib/rb-cover.h
? widgets/rb-album-cover.c
? widgets/rb-album-cover.h
? widgets/rb-shell-coverdownloader.c
? widgets/rb-shell-coverdownloader.h
? widgets/rb-shell-coverselect.c
? widgets/rb-shell-coverselect.h
Index: data/rhythmbox.schemas
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/rhythmbox.schemas,v
retrieving revision 1.50
diff -u -u -r1.50 rhythmbox.schemas
--- data/rhythmbox.schemas	24 Sep 2005 14:19:15 -0000	1.50
+++ data/rhythmbox.schemas	7 Oct 2005 04:15:51 -0000
@@ -357,5 +357,82 @@
 	<long>Name other computers will see your music shared as</long>
 	</locale>
       </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/ui/cover_hidden</key>
+	<applyto>/apps/rhythmbox/ui/cover_hidden</applyto>
+	<owner>rhythmbox</owner>
+	<type>bool</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Album cover visibility</short>
+	<long>If true, the album cover is hidden.</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/ui/amazon_cover_size</key>
+	<applyto>/apps/rhythmbox/ui/amazon_cover_size</applyto>
+	<owner>rhythmbox</owner>
+	<type>int</type>
+	<default>1</default>
+	<locale name="C">
+	<short>Size of covers to download from amazon</short>
+	<long>0 means small cover, 1 medium, and 2 large.</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/cover_amazon</key>
+	<applyto>/apps/rhythmbox/cover_amazon</applyto>
+	<owner>rhythmbox</owner>
+	<type>bool</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Enables the research of an album cover on amazon</short>
+	<long>When enabled, Rhythmbox automatically search for a cover on amazon</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/cover_local</key>
+	<applyto>/apps/rhythmbox/cover_local</applyto>
+	<owner>rhythmbox</owner>
+	<type>bool</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Enables the research of a local cover</short>
+	<long>When enabled, Rhythmbox automatically search for a cover in the directory of the playing song</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/cover_size</key>
+	<applyto>/apps/rhythmbox/cover_size</applyto>
+	<owner>rhythmbox</owner>
+	<type>int</type>
+	<default>170</default>
+	<locale name="C">
+	<short>The size of the album cover</short>
+	<long>Give the size of the cover shown when a song is played</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/cover_tree_hidden</key>
+	<applyto>/apps/rhythmbox/cover_tree_hidden</applyto>
+	<owner>rhythmbox</owner>
+	<type>bool</type>
+	<default>0</default>
+	<locale name="C">
+	<short>Hide the covers in the albums treeviewn</short>
+	<long>When enabled, Rhythmbox hide the covers in the albums treeview</long>
+	</locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/cover_amazon_country</key>
+	<applyto>/apps/rhythmbox/cover_amazon_country</applyto>
+	<owner>rhythmbox</owner>
+	<type>string</type>
+	<default>com</default>
+	<locale name="C">
+	<short>The amazon country to use to get the covers</short>
+	<long>You can search for your cover on amazon.com .fr .de .uk or .ca to have more accurate results</long>
+	</locale>
+      </schema>
     </schemalist>
 </gconfschemafile>
Index: data/glade/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/glade/Makefile.am,v
retrieving revision 1.17
diff -u -u -r1.17 Makefile.am
--- data/glade/Makefile.am	1 Oct 2005 14:32:04 -0000	1.17
+++ data/glade/Makefile.am	7 Oct 2005 04:15:51 -0000
@@ -1,6 +1,9 @@
 ## arch-tag: Automake rules for glade XML files
 
-glade_DATA =	general-prefs.glade	  	\
+glade_DATA =	cover-prefs.glade		\
+		cover-progress.glade		\
+		cover-select.glade		\
+		general-prefs.glade	  	\
 		library-prefs.glade	  	\
 		song-info.glade			\
 		song-info-multiple.glade	\
Index: data/ui/rhythmbox-ui.xml
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/ui/rhythmbox-ui.xml,v
retrieving revision 1.22
diff -u -u -r1.22 rhythmbox-ui.xml
--- data/ui/rhythmbox-ui.xml	6 Sep 2005 07:15:32 -0000	1.22
+++ data/ui/rhythmbox-ui.xml	7 Oct 2005 04:15:51 -0000
@@ -39,6 +39,7 @@
       <menuitem name="ViewSmallDisplayMenu" action="ViewSmallDisplay"/>
       <separator name="ViewSep1"/>
       <menuitem name="ViewSourceListMenu" action="ViewSourceList"/>
+      <menuitem name="ViewCoverMenu" action="ViewCover"/>
       <menuitem name="ViewBrowserMenu" action="ViewBrowser"/>
       <menuitem name="ViewStatusbarMenu" action="ViewStatusbar"/>
       <separator name="ViewSep2"/>
@@ -87,6 +88,40 @@
     <separator/>
     <menuitem name="PropertiesLibraryPopup" action="MusicProperties"/>
   </popup>
+  <popup name="LibraryGenreViewPopup">
+    <menuitem name="CoverGenreGetLocalPopup" action="CoverGenreGetLocal"/>
+    <menuitem name="CoverGenreGetAmazonPopup" action="CoverGenreGetAmazon"/>
+    <separator/>
+    <menuitem name="CoverGenreRemovePopup" action="CoverGenreRemove"/>
+  </popup>
+
+  <popup name="LibraryArtistViewPopup">
+    <menuitem name="CoverArtistGetLocalPopup" action="CoverArtistGetLocal"/>
+    <menuitem name="CoverArtistGetAmazonPopup" action="CoverArtistGetAmazon"/>
+    <separator/>
+    <menuitem name="CoverArtistRemovePopup" action="CoverArtistRemove"/>
+  </popup>
+
+  <popup name="LibraryAlbumViewPopup">
+    <menuitem name="CoverAlbumGetLocalPopup" action="CoverAlbumGetLocal"/>
+    <menuitem name="CoverAlbumGetAmazonPopup" action="CoverAlbumGetAmazon"/>
+    <separator/>
+    <menuitem name="CoverAlbumRemovePopup" action="CoverAlbumRemove"/>
+  </popup>
+
+  <popup name="LibrarySingleAlbumViewPopup">
+    <menuitem name="CoverSingleAlbumGetLocalPopup" action="CoverSingleAlbumGetLocal"/>
+    <menuitem name="CoverSingleAlbumGetAmazonPopup" action="CoverSingleAlbumGetAmazon"/>
+    <separator/>
+    <menuitem name="CoverDoNotSearch" action="CoverDoNotSearch"/>
+    <separator/>
+    <menuitem name="CoverSingleAlbumRemovePopup" action="CoverSingleAlbumRemove"/>
+  </popup>
+
+  <popup name="LibrarySingleAlbumViewPopupNotSearch">
+    <menuitem name="CoverDoNotSearch" action="CoverDoNotSearch"/>
+  </popup>
+
 
   <popup name="PlaylistViewPopup">
     <menuitem name="CopyPlaylistPopup" action="EditCopy"/>
Index: lib/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/Makefile.am,v
retrieving revision 1.42
diff -u -u -r1.42 Makefile.am
--- lib/Makefile.am	28 Sep 2005 14:28:25 -0000	1.42
+++ lib/Makefile.am	7 Oct 2005 04:15:51 -0000
@@ -5,6 +5,8 @@
 librb_la_SOURCES =					\
 	rb-debug.c					\
 	rb-debug.h					\
+	rb-cover.c					\
+	rb-cover.h					\
 	rb-file-helpers.c				\
 	rb-file-helpers.h				\
 	rb-glade-helpers.c				\
Index: lib/rb-preferences.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-preferences.h,v
retrieving revision 1.17
diff -u -u -r1.17 rb-preferences.h
--- lib/rb-preferences.h	24 Sep 2005 14:19:16 -0000	1.17
+++ lib/rb-preferences.h	7 Oct 2005 04:15:51 -0000
@@ -40,6 +40,13 @@
 #define CONF_STATE_PLAY_ORDER	CONF_PREFIX "/state/play_order"
 #define CONF_STATE_VOLUME	CONF_PREFIX "/state/volume"
 #define CONF_STATE_BURN_DEVICE	CONF_PREFIX "/state/burn_device"
+#define CONF_UI_COVER_HIDDEN CONF_PREFIX "/ui/cover_hidden"
+#define CONF_COVER_LOCAL CONF_PREFIX "/cover_local"
+#define CONF_COVER_AMAZON CONF_PREFIX "/cover_amazon"
+#define CONF_COVER_TREE_HIDDEN CONF_PREFIX "/cover_tree_hidden"
+#define CONF_COVER_AMAZON_COUNTRY CONF_PREFIX "/cover_amazon_country"
+#define CONF_UI_AMAZON_COVER_SIZE CONF_PREFIX "/ui/amazon_cover_size"
+#define CONF_COVER_SIZE CONF_PREFIX "/cover_size"
 
 G_END_DECLS
 
Index: po/POTFILES.in
===================================================================
RCS file: /cvs/gnome/rhythmbox/po/POTFILES.in,v
retrieving revision 1.59
diff -u -u -r1.59 POTFILES.in
--- po/POTFILES.in	29 Sep 2005 17:51:47 -0000	1.59
+++ po/POTFILES.in	7 Oct 2005 04:15:51 -0000
@@ -6,6 +6,9 @@
 daapsharing/rb-daap-sharing.c
 daapsharing/rb-daap-src.c
 data/GNOME_Rhythmbox.server.in
+data/glade/cover-prefs.glade
+data/glade/cover-progress.glade
+data/glade/cover-select.glade
 data/glade/create-playlist.glade
 data/glade/druid.glade
 data/glade/general-prefs.glade
@@ -21,6 +24,7 @@
 data/ui/rhythmbox-ui.xml
 iradio/rb-new-station-dialog.c
 iradio/rb-station-properties-dialog.c
+lib/rb-cover.c
 lib/rb-file-helpers.c
 metadata/rb-metadata-gst.c
 player/rb-player-gst.c
@@ -60,8 +64,11 @@
 widgets/rb-entry-view.c
 widgets/rb-header.c
 widgets/rb-load-failure-dialog.c
+widgets/rb-property-view.c
 widgets/rb-query-creator.c
 widgets/rb-query-creator-properties.c
 widgets/rb-search-entry.c
+widgets/rb-shell-coverdownloader.c
+widgets/rb-shell-coverselect.c
 widgets/rb-song-display-box.c
 widgets/rb-song-info.c
Index: rhythmdb/rhythmdb-property-model.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb-property-model.c,v
retrieving revision 1.21
diff -u -u -r1.21 rhythmdb-property-model.c
--- rhythmdb/rhythmdb-property-model.c	25 Aug 2005 02:47:32 -0000	1.21
+++ rhythmdb/rhythmdb-property-model.c	7 Oct 2005 04:15:52 -0000
@@ -29,6 +29,9 @@
 #include "rb-debug.h"
 #include "gsequence.h"
 #include "rb-tree-dnd.h"
+#include <gdk/gdkpixbuf.h>
+#include "rb-cover.h"
+#include "rb-file-helpers.h"
 
 static void rhythmdb_property_model_tree_model_init (GtkTreeModelIface *iface);
 static void rhythmdb_property_model_drag_source_init (RbTreeDragSourceIface *iface);
@@ -63,8 +66,9 @@
 static void rhythmdb_property_model_delete (RhythmDBPropertyModel *model,
 					    RhythmDBEntry *entry);
 static void rhythmdb_property_model_insert_prop (RhythmDBPropertyModel *model,
-							 const char *propstr,
-							 const char *sort_key);
+						 const char *propstr,
+						 const char *sort_key,
+						 const char *artist);
 static void rhythmdb_property_model_delete_prop (RhythmDBPropertyModel *model,
 							 const char *propstr);
 static GtkTreeModelFlags rhythmdb_property_model_get_flags (GtkTreeModel *model);
@@ -126,6 +130,7 @@
 typedef struct {
 	char *name;
 	char *sort_key;
+	char *artist;
 	guint refcount;
 } RhythmDBPropertyModelEntry;
 
@@ -138,6 +143,8 @@
 	RhythmDBPropType propid;
 	RhythmDBPropType sort_propid;
 
+	gchar *various_artists;
+
 	guint stamp;
 
 	GPtrArray *query;
@@ -388,6 +395,9 @@
 	model->priv->all = g_mem_chunk_alloc (model->priv->property_memchunk);
 	model->priv->all->name = g_strdup (_("All"));
 	model->priv->all->sort_key = NULL;
+	model->priv->all->artist = NULL;
+
+	model->priv->various_artists = _("Various Artists");
 }
 
 static void
@@ -412,6 +422,7 @@
 		RhythmDBPropertyModelEntry *prop = g_sequence_ptr_get_data (ptr);
 		g_free (prop->name);
 		g_free (prop->sort_key);
+		g_free (prop->artist);
 	}
 
 	g_mem_chunk_destroy (model->priv->property_memchunk);
@@ -479,19 +490,23 @@
 {
 	char *propstr;
 	char *sort_key;
+	char *artist;
 
 	propstr = g_strdup (rhythmdb_entry_get_string (entry, model->priv->propid));
 	sort_key = g_strdup (rhythmdb_entry_get_string (entry, model->priv->sort_propid));
+	artist = g_strdup (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST));
 
-	rhythmdb_property_model_insert_prop (model, propstr, sort_key);
+	rhythmdb_property_model_insert_prop (model, propstr, sort_key, artist);
 	g_free (propstr);
-	g_free (sort_key);	
+	g_free (sort_key);
+	g_free (artist);
 }
 
 static void
 rhythmdb_property_model_insert_prop (RhythmDBPropertyModel *model,
 				     const char *propstr,
-				     const char *sort_key)
+				     const char *sort_key,
+				     const char *artist)
 {
 	RhythmDBPropertyModelEntry *prop;
 	GtkTreeIter iter;
@@ -501,12 +516,20 @@
 	if ((ptr = g_hash_table_lookup (model->priv->reverse_map, propstr))) {
 		prop = g_sequence_ptr_get_data (ptr);
 		prop->refcount++;
+
+		/* if we have multiple artists for the same album, just say "Various Artists" */
+		if (strcmp (prop->artist, artist) != 0) {
+			g_free (prop->artist);
+			prop->artist = g_strdup (model->priv->various_artists);
+		}
+
 		return;
 	}
 
 	prop = g_mem_chunk_alloc (model->priv->property_memchunk);
 	prop->name = g_strdup (propstr);
 	prop->sort_key = g_strdup (sort_key);
+	prop->artist = g_strdup (artist);
 	prop->refcount = 1;
 
 	iter.stamp = model->priv->stamp;
@@ -561,6 +584,7 @@
 	g_hash_table_remove (model->priv->reverse_map, prop->name);
 	g_free (prop->name);
 	g_free (prop->sort_key);
+	g_free (prop->artist);
 	g_mem_chunk_free (model->priv->property_memchunk, prop);
 	return;
 }
@@ -603,6 +627,12 @@
 		return G_TYPE_STRING;
 	case 1:
 		return G_TYPE_BOOLEAN;
+	case 2:
+		return G_TYPE_STRING;
+	case 3:
+		return GDK_TYPE_PIXBUF;
+	case 4:
+		return G_TYPE_INT;
 	default:
 		g_assert_not_reached ();
 		return G_TYPE_INVALID;
@@ -664,6 +694,9 @@
 	RhythmDBPropertyModel *model = RHYTHMDB_PROPERTY_MODEL (tree_model);
 	RhythmDBPropertyModelEntry *prop;
 
+	gchar *cover_path;
+	GdkPixbuf *cover;
+
 	g_return_if_fail (!g_sequence_ptr_is_end (iter->user_data));
 	g_return_if_fail (model->priv->stamp == iter->stamp);
 
@@ -678,6 +711,18 @@
 			g_value_init (value, G_TYPE_BOOLEAN);
 			g_value_set_boolean (value, TRUE);
 			break;
+		case 2:
+			g_value_init (value, G_TYPE_STRING);
+			g_value_set_string (value, model->priv->all->name);
+			break;
+		case 3:
+			g_value_init (value, GDK_TYPE_PIXBUF);
+			g_value_set_object (value, NULL);
+			break;
+		case 4:
+			g_value_init (value, G_TYPE_INT);
+			g_value_set_int (value, 0);
+			break;
 		default:
 			g_assert_not_reached ();
 		}
@@ -693,6 +738,31 @@
 		case 1:
 			g_value_init (value, G_TYPE_BOOLEAN);
 			g_value_set_boolean (value, prop == model->priv->all);
+			break;
+		case 2:
+			g_value_init (value, G_TYPE_STRING);
+			g_value_set_string (value, prop->artist);
+			break;
+		case 3:
+			g_value_init (value, GDK_TYPE_PIXBUF);
+
+			cover_path = rb_cover_make_cover_path (prop->artist, prop->name, SMALL_COVER);
+
+			if (rb_uri_exists (cover_path)) {
+				/* The small cover exists, we show it */
+				cover = gdk_pixbuf_new_from_file_at_size (cover_path, TREE_COVER_SIZE, TREE_COVER_SIZE, NULL);
+			} else {
+				/* There is no cover, we show a transparent picture */
+				cover = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, TREE_COVER_SIZE, TREE_COVER_SIZE);
+				gdk_pixbuf_fill (cover, 0xffffff00);
+			}
+			g_free (cover_path);
+			g_value_set_object (value, cover);
+			g_object_unref (G_OBJECT (cover));
+			break;
+		case 4:
+			g_value_init (value, G_TYPE_INT);
+			g_value_set_int (value, prop->refcount);
 			break;
 		default:
 			g_assert_not_reached ();
Index: rhythmdb/rhythmdb-property-model.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb-property-model.h,v
retrieving revision 1.9
diff -u -u -r1.9 rhythmdb-property-model.h
--- rhythmdb/rhythmdb-property-model.h	25 Aug 2005 02:47:32 -0000	1.9
+++ rhythmdb/rhythmdb-property-model.h	7 Oct 2005 04:15:52 -0000
@@ -43,6 +43,9 @@
 {
 	RHYTHMDB_PROPERTY_MODEL_COLUMN_TITLE,
 	RHYTHMDB_PROPERTY_MODEL_COLUMN_PRIORITY,
+	RHYTHMDB_PROPERTY_MODEL_COLUMN_ARTIST,
+	RHYTHMDB_PROPERTY_MODEL_COLUMN_PIXBUF,
+	RHYTHMDB_PROPERTY_MODEL_COLUMN_COUNT,
 	RHYTHMDB_PROPERTY_MODEL_COLUMN_LAST,
 } RhythmDBPropertyModelColumn;
 
Index: shell/rb-shell-player.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-player.c,v
retrieving revision 1.173
diff -u -u -r1.173 rb-shell-player.c
--- shell/rb-shell-player.c	5 Oct 2005 17:13:24 -0000	1.173
+++ shell/rb-shell-player.c	7 Oct 2005 04:15:55 -0000
@@ -230,6 +230,8 @@
 	guint gconf_play_order_id;
 	guint gconf_state_id;
 
+	RBAlbumCover *album_cover;
+
 	gboolean mute;
 	float pre_mute_volume;
 };
@@ -239,6 +241,7 @@
 	PROP_0,
 	PROP_SOURCE,
 	PROP_DB,
+	PROP_ALBUMCOVER,
 	PROP_UI_MANAGER,
 	PROP_ACTION_GROUP,
 	PROP_PLAY_ORDER,
@@ -380,6 +383,14 @@
 							      "GtkActionGroup object",
 							      GTK_TYPE_ACTION_GROUP,
 							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+	g_object_class_install_property (object_class,
+					 PROP_ALBUMCOVER,
+					 g_param_spec_object ("album-cover",
+							      "RBAlbumCover",
+							      "RBAlbumCover object",
+							      RB_TYPE_ALBUM_COVER,
+							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 	/* If you change these, be sure to update the CORBA interface
 	 * in rb-remote-bonobo.c! */
 	g_object_class_install_property (object_class,
@@ -793,6 +804,7 @@
 
 		rb_shell_player_sync_with_selected_source (player);
 		rb_shell_player_sync_buttons (player);
+		rb_album_cover_set_source (player->priv->album_cover, player->priv->selected_source);
 
 		if (player->priv->selected_source != NULL) {
 			RBEntryView *songs = rb_source_get_entry_view (player->priv->selected_source);
@@ -832,6 +844,9 @@
 			 G_CALLBACK (rb_shell_player_entry_changed_cb),
 			 player, 0);
 		break;
+	case PROP_ALBUMCOVER:
+		player->priv->album_cover = g_value_get_object (value);
+		break;
 	case PROP_ACTION_GROUP:
 		player->priv->actiongroup = g_value_get_object (value);
 		break;
@@ -871,6 +886,9 @@
 	case PROP_DB:
 		g_value_set_object (value, player->priv->db);
 		break;
+	case PROP_ALBUMCOVER:
+		g_value_set_object (value, player->priv->album_cover);
+		break;
 	case PROP_ACTION_GROUP:
 		g_value_set_object (value, player->priv->actiongroup);
 		break;
@@ -928,12 +946,14 @@
 
 RBShellPlayer *
 rb_shell_player_new (RhythmDB *db, GtkUIManager *mgr, 
-		     GtkActionGroup *actiongroup)
+		     GtkActionGroup *actiongroup,
+		     RBAlbumCover *album_cover)
 {
 	return g_object_new (RB_TYPE_SHELL_PLAYER,			       
 			     "ui-manager", mgr,
 			     "action-group", actiongroup,
 			     "db", db,
+			     "album-cover", album_cover,
 			     NULL);
 }
 
@@ -1129,6 +1149,8 @@
 
 	rb_entry_view_set_playing_entry (songs, entry);
 
+	rb_album_cover_set_playing_entry (player->priv->album_cover, entry);
+
 	rb_debug ("Success!");
 	/* clear error on successful playback */
 	g_free (entry->playback_error);
@@ -1972,6 +1994,7 @@
 				 "%s", error->message);
 		g_error_free (error);
 	}
+	rb_album_cover_set_playing_entry (player->priv->album_cover, NULL);
 }
 
 gboolean
Index: shell/rb-shell-player.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-player.h,v
retrieving revision 1.32
diff -u -u -r1.32 rb-shell-player.h
--- shell/rb-shell-player.h	28 Aug 2005 11:56:54 -0000	1.32
+++ shell/rb-shell-player.h	7 Oct 2005 04:15:55 -0000
@@ -27,6 +27,7 @@
 #include "rb-source.h"
 #include "rb-player.h"
 #include "rhythmdb.h"
+#include "rb-album-cover.h"
 
 #ifndef __RB_SHELL_PLAYER_H
 #define __RB_SHELL_PLAYER_H
@@ -76,7 +77,8 @@
 
 RBShellPlayer *		rb_shell_player_new		(RhythmDB *db,
 							 GtkUIManager *mgr,
-							 GtkActionGroup *actiongroup);
+							 GtkActionGroup *actiongroup,
+							 RBAlbumCover *album_cover);
 
 void			rb_shell_player_set_selected_source	(RBShellPlayer *shell_player,
 								 RBSource *player);
Index: shell/rb-shell-preferences.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-preferences.c,v
retrieving revision 1.46
diff -u -u -r1.46 rb-shell-preferences.c
--- shell/rb-shell-preferences.c	26 Sep 2005 16:44:54 -0000	1.46
+++ shell/rb-shell-preferences.c	7 Oct 2005 04:15:57 -0000
@@ -348,8 +348,26 @@
 }
 #endif /* WITH_DAAP_SUPPORT */
 
+static void
+rb_shell_preferences_append_cover_config (RBShellPreferences *prefs,
+					  RBAlbumCover *album_cover)
+{
+	GtkWidget *widget;
+
+	g_return_if_fail (RB_IS_SHELL_PREFERENCES (prefs));
+
+	widget = rb_album_cover_get_config_widget (album_cover);
+	if (widget)
+		gtk_notebook_append_page (GTK_NOTEBOOK (prefs->priv->notebook),
+					  widget,
+					  gtk_label_new ("Covers"));
+	else
+		rb_debug ("No config widget for the covers");
+}
+
 GtkWidget *
-rb_shell_preferences_new (GList *views)
+rb_shell_preferences_new (GList *views,
+			  RBAlbumCover *album_cover)
 {
 	RBShellPreferences *shell_preferences;
 
@@ -371,6 +389,9 @@
 #ifdef WITH_DAAP_SUPPORT
 	add_daap_preferences (shell_preferences);
 #endif /* WITH_DAAP_SUPPORT */
+
+	rb_shell_preferences_append_cover_config (shell_preferences,
+						  album_cover);
 
 	return GTK_WIDGET (shell_preferences);
 }
Index: shell/rb-shell-preferences.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-preferences.h,v
retrieving revision 1.7
diff -u -u -r1.7 rb-shell-preferences.h
--- shell/rb-shell-preferences.h	3 Sep 2003 01:28:19 -0000	1.7
+++ shell/rb-shell-preferences.h	7 Oct 2005 04:15:57 -0000
@@ -21,6 +21,7 @@
 
 #include <gtk/gtkdialog.h>
 #include "rb-preferences.h"
+#include "rb-album-cover.h"
 
 #ifndef __RB_SHELL_PREFERENCES_H
 #define __RB_SHELL_PREFERENCES_H
@@ -50,7 +51,8 @@
 
 GType      rb_shell_preferences_get_type (void);
 
-GtkWidget *rb_shell_preferences_new      (GList *views);
+GtkWidget *rb_shell_preferences_new      (GList *views,
+					  RBAlbumCover *album_cover);
 
 G_END_DECLS
 
Index: shell/rb-shell.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.c,v
retrieving revision 1.338
diff -u -u -r1.338 rb-shell.c
--- shell/rb-shell.c	28 Sep 2005 14:28:25 -0000	1.338
+++ shell/rb-shell.c	7 Oct 2005 04:15:57 -0000
@@ -77,6 +77,8 @@
 #include "rb-shell-preferences.h"
 #include "rb-playlist-source.h"
 #include "eel-gconf-extensions.h"
+#include "rb-album-cover.h"
+#include "rb-cover.h"
 
 static void rb_shell_class_init (RBShellClass *klass);
 static void rb_shell_remote_proxy_init (RBRemoteProxyIface *iface);
@@ -177,15 +179,21 @@
  				   RBShell *shell);
 static void rb_shell_view_sourcelist_changed_cb (GtkAction *action,
 						 RBShell *shell);
+static void rb_shell_view_cover_changed_cb (GtkAction *action,
+					    RBShell *shell);
 static void rb_shell_view_smalldisplay_changed_cb (GtkAction *action,
 						 RBShell *shell);
 static void rb_shell_load_complete_cb (RhythmDB *db, RBShell *shell);
-static void rb_shell_sync_sourcelist_visibility (RBShell *shell);
+static void rb_shell_sync_sourcelist_cover_visibility (RBShell *shell);
 static void rb_shell_sync_smalldisplay (RBShell *shell);
 static void sourcelist_visibility_changed_cb (GConfClient *client,
 					      guint cnxn_id,
 					      GConfEntry *entry,
 					      RBShell *shell);
+static void cover_visibility_changed_cb (GConfClient *client,
+					 guint cnxn_id,
+					 GConfEntry *entry,
+					 RBShell *shell);
 static void smalldisplay_changed_cb (GConfClient *client,
 				     guint cnxn_id,
 				     GConfEntry *entry,
@@ -288,6 +296,8 @@
 	GtkWidget *sourcelist;
 	GtkWidget *notebook;
 	GtkWidget *hsep;
+	GtkWidget *left_vbox;
+	GtkWidget *album_cover;
 
 	GList *sources;
 	GHashTable *sources_hash;
@@ -333,6 +343,7 @@
 	guint sourcelist_visibility_notify_id;
 	guint smalldisplay_notify_id;
 	guint paned_changed_notify_id;
+	guint cover_hidden_notify_id;
 };
 
 static GtkActionEntry rb_shell_actions [] =
@@ -388,6 +399,9 @@
 	{ "ViewSourceList", NULL, N_("Source _List"), "<control>L",
 	  N_("Change the visibility of the source list"),
 	  G_CALLBACK (rb_shell_view_sourcelist_changed_cb), TRUE },
+	{ "ViewCover", NULL, N_("Album _Cover"), "<control>U",
+	  N_("Change the visibility of the album cover"),
+	  G_CALLBACK (rb_shell_view_cover_changed_cb), TRUE },
 	{ "ViewSmallDisplay", NULL, N_("_Small Display"), "<control>D",
 	  N_("Make the main window smaller"),
 	  G_CALLBACK (rb_shell_view_smalldisplay_changed_cb),
@@ -760,6 +774,7 @@
 	eel_gconf_notification_remove (shell->priv->sourcelist_visibility_notify_id);
 	eel_gconf_notification_remove (shell->priv->smalldisplay_notify_id);
 	eel_gconf_notification_remove (shell->priv->paned_changed_notify_id);
+	eel_gconf_notification_remove (shell->priv->cover_hidden_notify_id);
 
 	rb_debug ("shutting down DB");
 	rhythmdb_shutdown (shell->priv->db);
@@ -884,9 +899,12 @@
 	/* initialize shell services */
 	rb_debug ("shell: initializing shell services");
 
+	shell->priv->album_cover = rb_album_cover_new ();
+
 	shell->priv->player_shell = rb_shell_player_new (shell->priv->db,
 							 shell->priv->ui_manager,
-							 shell->priv->actiongroup);
+							 shell->priv->actiongroup,
+							 RB_ALBUM_COVER (shell->priv->album_cover));
 	g_signal_connect_object (G_OBJECT (shell->priv->player_shell),
 				 "playing-source-changed",
 				 G_CALLBACK (rb_shell_playing_source_changed_cb),
@@ -926,6 +944,8 @@
 				 G_CALLBACK (source_selected_cb), shell, 0);
 
 	vbox = gtk_vbox_new (FALSE, 4);
+	shell->priv->left_vbox = gtk_vbox_new (FALSE, 0);
+
 	shell->priv->notebook = gtk_notebook_new ();
 	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (shell->priv->notebook), FALSE);
 	gtk_notebook_set_show_border (GTK_NOTEBOOK (shell->priv->notebook), FALSE);
@@ -938,9 +958,16 @@
 	gtk_box_pack_start_defaults (GTK_BOX (vbox), shell->priv->notebook);
 
 	gtk_paned_pack1 (GTK_PANED (shell->priv->paned), 
-			 shell->priv->sourcelist, TRUE, TRUE);
+			 shell->priv->left_vbox, TRUE, TRUE);
 	gtk_paned_pack2 (GTK_PANED (shell->priv->paned), vbox, TRUE, TRUE);
 
+	gtk_box_pack_start (GTK_BOX (shell->priv->left_vbox),
+			    shell->priv->sourcelist,
+			    TRUE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (shell->priv->left_vbox),
+			    shell->priv->album_cover,
+			    FALSE, FALSE, 0);
+
 	vbox = gtk_vbox_new (FALSE, 0);
 	gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
  	gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (shell->priv->player_shell), FALSE, TRUE, 0);	
@@ -966,9 +993,13 @@
 		eel_gconf_notification_add (CONF_STATE_PANED_POSITION,
 				    (GConfClientNotifyFunc) paned_changed_cb,
 				    shell);
+	shell->priv->cover_hidden_notify_id =
+		eel_gconf_notification_add (CONF_UI_COVER_HIDDEN,
+					    (GConfClientNotifyFunc) cover_visibility_changed_cb,
+					    shell);
 
 	rb_debug ("shell: syncing with gconf");
-	rb_shell_sync_sourcelist_visibility (shell);
+	rb_shell_sync_sourcelist_cover_visibility (shell);
 
 	shell->priv->load_error_dialog = rb_load_failure_dialog_new ();
 	shell->priv->show_db_errors = FALSE;
@@ -1064,7 +1095,7 @@
 		g_timeout_add (10000, (GSourceFunc) idle_save_rhythmdb, shell->priv->db);
 #endif
 	}
-	
+
 	rb_debug ("shell: syncing window state");
 	rb_shell_sync_paned (shell);
 	gtk_widget_show_all (GTK_WIDGET (shell->priv->tray_icon));
@@ -1078,7 +1109,10 @@
 		rb_druid_show (druid);
 		g_object_unref (G_OBJECT (druid));
 	}
-	
+
+	/* Update the amazon covers older than 3 months (see Amazon Web Services Licensing Agreement)*/
+	g_thread_create ((GThreadFunc) rb_cover_update_amazon_covers, NULL, FALSE, NULL);
+
 	rb_statusbar_sync_state (shell->priv->statusbar);
 	rb_shell_sync_smalldisplay (shell);
 
@@ -1607,6 +1641,14 @@
 }
 
 static void
+rb_shell_view_cover_changed_cb (GtkAction *action,
+				RBShell *shell)
+{
+	eel_gconf_set_boolean (CONF_UI_COVER_HIDDEN,
+			       !gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+}
+
+static void
 rb_shell_view_sourcelist_changed_cb (GtkAction *action,
 				     RBShell *shell)
 {
@@ -1718,7 +1760,8 @@
 		          RBShell *shell)
 {
 	if (shell->priv->prefs == NULL) {
-		shell->priv->prefs = rb_shell_preferences_new (shell->priv->sources);
+		shell->priv->prefs = rb_shell_preferences_new (shell->priv->sources,
+							       RB_ALBUM_COVER (shell->priv->album_cover));
 
 		gtk_window_set_transient_for (GTK_WINDOW (shell->priv->prefs),
 					      GTK_WINDOW (shell->priv->window));
@@ -1875,22 +1918,42 @@
 }
 
 static void
-rb_shell_sync_sourcelist_visibility (RBShell *shell)
+rb_shell_sync_sourcelist_cover_visibility (RBShell *shell)
 {
-	gboolean visible;
-	GtkAction *action;
+	gboolean sourcelist_visible;
+	gboolean cover_visible;
 
-	visible = !eel_gconf_get_boolean (CONF_UI_SOURCELIST_HIDDEN);
+	GtkAction *sourcelist_action;
+	GtkAction *cover_action;
 
-	if (visible)
+	sourcelist_visible = !eel_gconf_get_boolean (CONF_UI_SOURCELIST_HIDDEN);
+	cover_visible = !eel_gconf_get_boolean (CONF_UI_COVER_HIDDEN);
+	sourcelist_visible = !eel_gconf_get_boolean (CONF_UI_SOURCELIST_HIDDEN);
+
+	if (sourcelist_visible)
 		gtk_widget_show (GTK_WIDGET (shell->priv->sourcelist));
 	else
 		gtk_widget_hide (GTK_WIDGET (shell->priv->sourcelist));
 
-	action = gtk_action_group_get_action (shell->priv->actiongroup,
-					      "ViewSourceList");
-	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
-				      visible);
+	sourcelist_action = gtk_action_group_get_action (shell->priv->actiongroup,
+					      		 "ViewSourceList");
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (sourcelist_action),
+				      sourcelist_visible);
+
+	if (cover_visible)
+		gtk_widget_show (GTK_WIDGET (shell->priv->album_cover));
+	else
+		gtk_widget_hide (GTK_WIDGET (shell->priv->album_cover));
+
+	cover_action = gtk_action_group_get_action (shell->priv->actiongroup,
+					      		 "ViewCover");
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (cover_action),
+				      cover_visible);
+
+	if (cover_visible || sourcelist_visible)
+		gtk_widget_show (GTK_WIDGET (shell->priv->left_vbox));
+	else
+		gtk_widget_hide (GTK_WIDGET (shell->priv->left_vbox));
 }
 
 static void
@@ -1936,7 +1999,17 @@
 				  RBShell *shell)
 {
 	rb_debug ("sourcelist visibility changed"); 
-	rb_shell_sync_sourcelist_visibility (shell);
+	rb_shell_sync_sourcelist_cover_visibility (shell);
+}
+
+static void
+cover_visibility_changed_cb (GConfClient *client,
+			     guint cnxn_id,
+			     GConfEntry *entry,
+			     RBShell *shell)
+{
+	rb_debug ("cover visibility changed"); 
+	rb_shell_sync_sourcelist_cover_visibility (shell);
 }
 
 static void
@@ -1969,6 +2042,7 @@
 		}
 		gtk_paned_set_position (GTK_PANED (shell->priv->paned),
 					pos);
+		eel_gconf_set_integer (CONF_COVER_SIZE, pos);
 	}
 }
 
Index: sources/rb-library-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.c,v
retrieving revision 1.120
diff -u -u -r1.120 rb-library-source.c
--- sources/rb-library-source.c	27 Sep 2005 11:30:24 -0000	1.120
+++ sources/rb-library-source.c	7 Oct 2005 04:15:57 -0000
@@ -45,6 +45,8 @@
 #include "rb-song-info.h"
 #include "rb-search-entry.h"
 #include "rb-preferences.h"
+#include "rb-shell-coverdownloader.h"
+#include "rb-cover.h"
 
 typedef enum
 {
@@ -133,7 +135,30 @@
 					      GtkSelectionData *data,
 					      guint info, guint time,
 					      RBLibrarySource *source);
-
+static void rb_library_source_cmd_get_genre_cover_local (GtkAction *action,
+							  RBShell *shell);
+static void rb_library_source_cmd_get_genre_cover_amazon (GtkAction *action,
+							  RBShell *shell);
+static void rb_library_source_cmd_remove_genre_cover (GtkAction *action,
+						      RBShell *shell);
+static void rb_library_source_cmd_get_artist_cover_local (GtkAction *action,
+							  RBShell *shell);
+static void rb_library_source_cmd_get_artist_cover_amazon (GtkAction *action,
+							   RBShell *shell);
+static void rb_library_source_cmd_remove_artist_cover (GtkAction *action,
+						       RBShell *shell);
+static void rb_library_source_cmd_get_album_cover_local (GtkAction *action,
+							  RBShell *shell);
+static void rb_library_source_cmd_get_album_cover_amazon (GtkAction *action,
+							  RBShell *shell);
+static void rb_library_source_cmd_remove_album_cover (GtkAction *action,
+						      RBShell *shell);
+static void rb_library_source_cmd_get_album_single_cover_local (GtkAction *action,
+								RBShell *shell);
+static void rb_library_source_cmd_get_album_single_cover_amazon (GtkAction *action,
+								 RBShell *shell);
+static void rb_library_source_cmd_do_not_search_album_cover (GtkAction *action,
+							     RBShell *shell);
 
 #define CONF_UI_LIBRARY_DIR CONF_PREFIX "/ui/library"
 #define CONF_UI_LIBRARY_BROWSER_VIEWS CONF_PREFIX "/ui/library/browser_views"
@@ -195,6 +220,14 @@
 	guint browser_view_notify_id;
 };
 
+enum
+{
+	COVER_CHANGED,
+	LAST_SIGNAL
+};
+
+static guint rb_library_source_signals[LAST_SIGNAL] = { 0 };
+
 static GtkActionEntry rb_library_source_actions [] =
 {
 	{ "LibrarySrcChooseGenre", NULL, N_("Browse This _Genre"), NULL,
@@ -205,7 +238,54 @@
 	  G_CALLBACK (rb_library_source_cmd_choose_artist) },
 	{ "LibrarySrcChooseAlbum", NULL, N_("Browse This A_lbum"), NULL,
 	  N_("Set the browser to view only this album"),
-	  G_CALLBACK (rb_library_source_cmd_choose_album) }
+	  G_CALLBACK (rb_library_source_cmd_choose_album) },
+
+	{ "CoverGenreGetLocal", GTK_STOCK_ADD, N_("Get the covers of this genres _locally"), NULL,
+	  N_("Find a cover on your hard disk"),
+	  G_CALLBACK (rb_library_source_cmd_get_genre_cover_local) },
+	{ "CoverGenreGetAmazon", GTK_STOCK_ADD, N_("Get the covers of this genres from _Amazon"), NULL,
+	  N_("Download the cover from Amazon"),
+	  G_CALLBACK (rb_library_source_cmd_get_genre_cover_amazon) },
+	{ "CoverGenreRemove", GTK_STOCK_DELETE, N_("_Delete the covers of this genres"), NULL,
+	  N_("Delete the selected covers"),
+	  G_CALLBACK (rb_library_source_cmd_remove_genre_cover) },
+
+	{ "CoverArtistGetLocal", GTK_STOCK_ADD, N_("Get the covers of this artists _locally"), NULL,
+	  N_("Find a cover on your hard disk"),
+	  G_CALLBACK (rb_library_source_cmd_get_artist_cover_local) },
+	{ "CoverArtistGetAmazon", GTK_STOCK_ADD, N_("Get the covers of this artists from _Amazon"), NULL,
+	  N_("Download the cover from Amazon"),
+	  G_CALLBACK (rb_library_source_cmd_get_artist_cover_amazon) },
+	{ "CoverArtistRemove", GTK_STOCK_DELETE, N_("_Delete the covers of this artists"), NULL,
+	  N_("Delete the selected covers"),
+	  G_CALLBACK (rb_library_source_cmd_remove_artist_cover) },
+
+	{ "CoverAlbumGetLocal", GTK_STOCK_ADD, N_("Get the covers of this albums _locally"), NULL,
+	  N_("Find a cover on your hard disk"),
+	  G_CALLBACK (rb_library_source_cmd_get_album_cover_local) },
+	{ "CoverAlbumGetAmazon", GTK_STOCK_ADD, N_("Get the covers of this albums from _Amazon"), NULL,
+	  N_("Download the cover from Amazon"),
+	  G_CALLBACK (rb_library_source_cmd_get_album_cover_amazon) },
+	{ "CoverAlbumRemove", GTK_STOCK_DELETE, N_("_Delete the covers of this albums"), NULL,
+	  N_("Delete the selected covers"),
+	  G_CALLBACK (rb_library_source_cmd_remove_album_cover) },
+
+	{ "CoverSingleAlbumGetLocal", GTK_STOCK_ADD, N_("Choose the cover for this album _locally"), NULL,
+	  N_("Find a cover on your hard disk"),
+	  G_CALLBACK (rb_library_source_cmd_get_album_single_cover_local) },
+	{ "CoverSingleAlbumGetAmazon", GTK_STOCK_ADD, N_("Choose the cover for this album on _Amazon"), NULL,
+	  N_("Download the cover from Amazon"),
+	  G_CALLBACK (rb_library_source_cmd_get_album_single_cover_amazon) },
+	{ "CoverSingleAlbumRemove", GTK_STOCK_DELETE, N_("_Delete the cover of this album"), NULL,
+	  N_("Delete the selected covers"),
+	  G_CALLBACK (rb_library_source_cmd_remove_album_cover) }
+};
+
+static GtkToggleActionEntry rb_library_source_toggle_actions [] =
+{
+	{ "CoverDoNotSearch", NULL, N_("_Do not search for this cover"), NULL,
+	  N_("Choose if a cover must be searched or not"),
+	  G_CALLBACK (rb_library_source_cmd_do_not_search_album_cover), FALSE}
 };
 
 static const GtkTargetEntry songs_view_drag_types[] = {{  "text/uri-list", 0, 0 }};
@@ -310,6 +390,16 @@
 							      CONF_STATE_LIBRARY_SORTING,
 							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
+	rb_library_source_signals[COVER_CHANGED] =
+		g_signal_new ("cover_changed",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (RBLibrarySourceClass, cover_changed),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE,
+			      0);
+
 }
 
 static void
@@ -470,6 +560,64 @@
 }
 
 static void
+rb_library_source_genres_show_popup_cb (RBPropertyView *view,
+				        gboolean is_single,
+					RBLibrarySource *source)
+{
+	_rb_source_show_popup (RB_SOURCE (source), "/LibraryGenreViewPopup");
+}
+
+static void
+rb_library_source_artists_show_popup_cb (RBPropertyView *view,
+				         gboolean is_single,
+					 RBLibrarySource *source)
+{
+	_rb_source_show_popup (RB_SOURCE (source), "/LibraryArtistViewPopup");
+}
+
+static void
+rb_library_source_albums_show_popup_cb (RBPropertyView *view,
+				        gboolean is_single,
+					RBLibrarySource *source)
+{
+	if (is_single) {
+		GtkAction *action;
+		GList *selected_artists_albums, *temp;
+		gchar *artist;
+		gchar *album;
+
+		action = gtk_action_group_get_action (source->priv->action_group,
+						      "CoverDoNotSearch");
+
+		selected_artists_albums = rb_property_view_get_selected_artists_albums (source->priv->albums);
+
+		temp = selected_artists_albums;
+
+		album = (gchar *) temp->data;
+		if (!album)
+			return;
+		temp = temp->next;
+		artist = (gchar *) temp->data;
+		if (!artist)
+			return;
+
+		if (rb_cover_get_do_not_search (artist, album)) {
+			gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+						      TRUE);
+			_rb_source_show_popup (RB_SOURCE (source), "/LibrarySingleAlbumViewPopupNotSearch");
+		} else {
+			gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+						      FALSE);
+			_rb_source_show_popup (RB_SOURCE (source), "/LibrarySingleAlbumViewPopup");
+		}
+		g_list_foreach (selected_artists_albums, (GFunc) g_free, NULL);
+		g_list_free (selected_artists_albums);
+	} else {
+		_rb_source_show_popup (RB_SOURCE (source), "/LibraryAlbumViewPopup");
+	}
+}
+
+static void
 register_action_group (RBLibrarySource *source)
 {
 	GtkUIManager *uimanager;
@@ -500,6 +648,10 @@
 				      rb_library_source_actions,
 				      G_N_ELEMENTS (rb_library_source_actions),
 				      shell);
+	gtk_action_group_add_toggle_actions (source->priv->action_group, 
+					     rb_library_source_toggle_actions,
+					     G_N_ELEMENTS (rb_library_source_toggle_actions),
+					     shell);
 	gtk_ui_manager_insert_action_group (uimanager, 
 					    source->priv->action_group, 0);
 	g_object_unref (G_OBJECT (uimanager));
@@ -580,6 +732,9 @@
 	g_signal_connect_object (G_OBJECT (source->priv->genres),
 				 "property-selection-reset", G_CALLBACK (genres_selection_reset_cb),
 				 source, 0);
+	g_signal_connect_object (G_OBJECT (source->priv->genres),
+				 "show_popup", G_CALLBACK (rb_library_source_genres_show_popup_cb),
+				 source, 0);
 
 	gtk_box_pack_start_defaults (GTK_BOX (source->priv->browser), GTK_WIDGET (source->priv->genres));
 
@@ -594,6 +749,9 @@
 	g_signal_connect_object (G_OBJECT (source->priv->artists),
 				 "property-selection-reset", G_CALLBACK (artists_selection_reset_cb),
 				 source, 0);
+	g_signal_connect_object (G_OBJECT (source->priv->artists),
+				 "show_popup", G_CALLBACK (rb_library_source_artists_show_popup_cb),
+				 source, 0);
 
 	gtk_box_pack_start_defaults (GTK_BOX (source->priv->browser), GTK_WIDGET (source->priv->artists));
 
@@ -608,6 +766,9 @@
 	g_signal_connect_object (G_OBJECT (source->priv->albums),
 				 "property-selection-reset", G_CALLBACK (albums_selection_reset_cb),
 				 source, 0);
+	g_signal_connect_object (G_OBJECT (source->priv->albums),
+				 "show_popup", G_CALLBACK (rb_library_source_albums_show_popup_cb),
+				 source, 0);
 
 	gtk_box_pack_start_defaults (GTK_BOX (source->priv->browser), GTK_WIDGET (source->priv->albums));
 	gtk_paned_pack1 (GTK_PANED (source->priv->paned), source->priv->browser, FALSE, FALSE);
@@ -1639,3 +1800,275 @@
 	rb_source_receive_drag (RB_SOURCE (source), selection_data);
 }
 
+void 
+rb_library_source_refresh_albumview (RBLibrarySource *source)
+{
+	gtk_widget_queue_draw (GTK_WIDGET (source->priv->albums));
+}
+
+static void 
+rb_library_source_get_covers_end (RBLibrarySource *source)
+{
+	rb_library_source_refresh_albumview (source);
+	g_signal_emit (G_OBJECT (source), rb_library_source_signals[COVER_CHANGED], 0);
+}
+
+static void
+get_genre_cover (RBShell *shell,
+		 guint operation)
+{
+	RBLibrarySource *source;
+	GtkWidget *coverdownloader;
+
+	g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
+	coverdownloader = rb_shell_coverdownloader_new (source->priv->db);
+
+	rb_shell_coverdownloader_get_covers_from_genres (RB_SHELL_COVERDOWNLOADER (coverdownloader),
+							 source,
+							 source->priv->selected_genres,
+							 operation);
+	gtk_widget_destroy (coverdownloader);
+	rb_library_source_get_covers_end (source);
+}
+
+static void 
+rb_library_source_cmd_get_genre_cover_local (GtkAction *action,
+					     RBShell *shell)
+{
+	get_genre_cover (shell, GET_LOCAL_COVERS);
+}
+
+static void 
+rb_library_source_cmd_get_genre_cover_amazon (GtkAction *action,
+					      RBShell *shell)
+{
+	get_genre_cover (shell, GET_AMAZON_COVERS);
+}
+
+static void 
+rb_library_source_cmd_remove_genre_cover (GtkAction *action,
+					  RBShell *shell)
+{
+	GtkWidget *dialog;
+	gint retval = GTK_RESPONSE_NO;
+
+	dialog = gtk_message_dialog_new (NULL,
+					GTK_DIALOG_MODAL,
+					GTK_MESSAGE_QUESTION,
+					GTK_BUTTONS_YES_NO,
+					_("Are you sure that you want to remove all the covers of the selected genres?"));
+	retval = gtk_dialog_run (GTK_DIALOG(dialog));
+	gtk_widget_destroy (dialog);
+	if (retval != GTK_RESPONSE_YES)
+		return;
+
+	get_genre_cover (shell, REMOVE_COVERS);
+}
+
+static void
+get_artist_cover (RBShell *shell,
+		  guint operation)
+{
+	GtkWidget *coverdownloader;
+	RBLibrarySource *source;
+
+	g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
+	coverdownloader = rb_shell_coverdownloader_new (source->priv->db);
+
+	if (source->priv->selected_artists)
+		rb_shell_coverdownloader_get_covers_from_artists (RB_SHELL_COVERDOWNLOADER (coverdownloader),
+								  source,
+								  source->priv->selected_artists,
+								  operation);
+	else
+		rb_shell_coverdownloader_get_covers_from_genres (RB_SHELL_COVERDOWNLOADER (coverdownloader),
+								 source,
+								 source->priv->selected_genres,
+								 operation);
+	gtk_widget_destroy (coverdownloader);
+	rb_library_source_get_covers_end (source);
+}
+
+static void 
+rb_library_source_cmd_get_artist_cover_local (GtkAction *action,
+					      RBShell *shell)
+{
+	get_artist_cover (shell, GET_LOCAL_COVERS);
+}
+
+static void 
+rb_library_source_cmd_get_artist_cover_amazon (GtkAction *action,
+					       RBShell *shell)
+{
+	get_artist_cover (shell, GET_AMAZON_COVERS);
+}
+
+static void 
+rb_library_source_cmd_remove_artist_cover (GtkAction *action,
+					   RBShell *shell)
+{
+	GtkWidget *dialog;
+	gint retval = GTK_RESPONSE_NO;
+
+	dialog = gtk_message_dialog_new (NULL,
+					GTK_DIALOG_MODAL,
+					GTK_MESSAGE_QUESTION,
+					GTK_BUTTONS_YES_NO,
+					_("Are you sure that you want to remove all the covers of the selected artists?"));
+
+	retval = gtk_dialog_run (GTK_DIALOG (dialog));
+
+	switch (retval)
+	{
+	case GTK_RESPONSE_YES:
+		get_artist_cover (shell, REMOVE_COVERS);
+		break;
+	default:
+		break;
+	}
+	gtk_widget_destroy (dialog);
+}
+
+static void
+get_album_cover (RBShell *shell,
+		 guint operation)
+{
+	GtkWidget *coverdownloader;
+	RBLibrarySource *source;
+
+	g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
+	coverdownloader = rb_shell_coverdownloader_new (source->priv->db);
+
+	if (source->priv->selected_albums) {
+		GList *selected_artists_albums;
+		selected_artists_albums = rb_property_view_get_selected_artists_albums (source->priv->albums);
+
+		rb_shell_coverdownloader_get_covers_from_albums (RB_SHELL_COVERDOWNLOADER (coverdownloader),
+								 source,
+								 selected_artists_albums,
+								 operation);
+		g_list_foreach (selected_artists_albums, (GFunc) g_free, NULL);
+		g_list_free (selected_artists_albums);
+	} else {
+		get_artist_cover (shell, operation);
+	}
+	gtk_widget_destroy (coverdownloader);
+	rb_library_source_get_covers_end (source);
+}
+
+static void 
+rb_library_source_cmd_get_album_cover_local (GtkAction *action,
+					     RBShell *shell)
+{
+	get_album_cover (shell, GET_LOCAL_COVERS);
+}
+
+static void 
+rb_library_source_cmd_get_album_cover_amazon (GtkAction *action,
+					      RBShell *shell)
+{
+	get_album_cover (shell, GET_AMAZON_COVERS);
+}
+
+static void 
+rb_library_source_cmd_remove_album_cover (GtkAction *action,
+					  RBShell *shell)
+{
+	GtkWidget *dialog;
+	gint retval = GTK_RESPONSE_NO;
+
+	dialog = gtk_message_dialog_new (NULL,
+					GTK_DIALOG_MODAL,
+					GTK_MESSAGE_QUESTION,
+					GTK_BUTTONS_YES_NO,
+					_("Are you sure that you want to remove all the covers of the selected albums?"));
+	retval = gtk_dialog_run (GTK_DIALOG(dialog));
+	gtk_widget_destroy (dialog);
+	if (retval != GTK_RESPONSE_YES)
+		return;
+
+	get_album_cover (shell, REMOVE_COVERS);
+}
+
+static void
+get_album_single_cover (RBShell *shell,
+			guint operation)
+{
+	GList *selected_artists_albums, *temp;
+	gchar *artist;
+	gchar *album;
+	RBLibrarySource *source;
+	GtkWidget *coverdownloader;
+
+	g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
+
+	coverdownloader = rb_shell_coverdownloader_new (source->priv->db);
+
+	selected_artists_albums = rb_property_view_get_selected_artists_albums (source->priv->albums);
+
+	temp = selected_artists_albums;
+
+	album = (gchar *) temp->data;
+	if (!album)
+		return;
+	temp = temp->next;
+	artist = (gchar *) temp->data;
+	if (!artist)
+		return;
+
+	rb_shell_coverdownloader_get_single_cover (RB_SHELL_COVERDOWNLOADER (coverdownloader),
+						   source,
+						   artist, album,
+						   operation);
+
+	g_list_foreach (selected_artists_albums, (GFunc) g_free, NULL);
+	g_list_free (selected_artists_albums);
+
+	gtk_widget_destroy (coverdownloader);
+	rb_library_source_get_covers_end (source);
+}
+
+static void 
+rb_library_source_cmd_get_album_single_cover_local (GtkAction *action,
+						    RBShell *shell)
+{
+	get_album_single_cover (shell, GET_LOCAL_COVERS);
+}
+
+static void 
+rb_library_source_cmd_get_album_single_cover_amazon (GtkAction *action,
+						     RBShell *shell)
+{
+	get_album_single_cover (shell, GET_AMAZON_COVERS);
+}
+
+static void
+rb_library_source_cmd_do_not_search_album_cover (GtkAction *action,
+						 RBShell *shell)
+{
+	GList *selected_artists_albums, *temp;
+	gchar *artist;
+	gchar *album;
+	RBLibrarySource *source;
+
+	g_object_get (G_OBJECT (shell), "selected-source", &source, NULL);
+
+	selected_artists_albums = rb_property_view_get_selected_artists_albums (source->priv->albums);
+
+	temp = selected_artists_albums;
+
+	album = (gchar *) temp->data;
+	if (!album)
+		return;
+	temp = temp->next;
+	artist = (gchar *) temp->data;
+	if (!artist)
+		return;
+
+	rb_cover_remove_cover (artist, album);
+	rb_cover_set_do_not_search (artist, album, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+	g_signal_emit (G_OBJECT (source), rb_library_source_signals[COVER_CHANGED], 0);
+
+	g_list_foreach (selected_artists_albums, (GFunc) g_free, NULL);
+	g_list_free (selected_artists_albums);
+}
Index: sources/rb-library-source.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.h,v
retrieving revision 1.15
diff -u -u -r1.15 rb-library-source.h
--- sources/rb-library-source.h	9 Sep 2005 05:16:42 -0000	1.15
+++ sources/rb-library-source.h	7 Oct 2005 04:15:57 -0000
@@ -25,7 +25,7 @@
 #include <gtk/gtkwindow.h>
 #include <gtk/gtkactiongroup.h>
 
-#include "rb-shell.h"
+#include "../shell/rb-shell.h"
 #include "rb-source.h"
 #include "rhythmdb.h"
 
@@ -52,6 +52,7 @@
 	RBSourceClass parent;
 
 	const char *	(*impl_get_paned_key)		(RBLibrarySource *source);
+	void		(*cover_changed)		(RBLibrarySource *source);
 } RBLibrarySourceClass;
 
 GType		rb_library_source_get_type	(void);
@@ -64,6 +65,8 @@
 						     GtkActionGroup *uimgr);
 
 const char *	rb_library_source_get_paned_key	(RBLibrarySource *source);
+
+void 		rb_library_source_refresh_albumview (RBLibrarySource *source);
 
 G_END_DECLS
 
Index: widgets/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/Makefile.am,v
retrieving revision 1.21
diff -u -u -r1.21 Makefile.am
--- widgets/Makefile.am	23 Aug 2005 17:35:27 -0000	1.21
+++ widgets/Makefile.am	7 Oct 2005 04:15:57 -0000
@@ -7,6 +7,8 @@
 	eel-gconf-extensions.h				\
 	rb-song-display-box.c				\
 	rb-song-display-box.h				\
+	rb-album-cover.c				\
+	rb-album-cover.h				\
 	rb-entry-view.c					\
 	rb-entry-view.h					\
 	rb-property-view.c				\
@@ -39,6 +41,10 @@
 	rb-rating.h					\
 	rb-rating-helper.c				\
 	rb-rating-helper.h				\
+	rb-shell-coverdownloader.c			\
+	rb-shell-coverdownloader.h			\
+	rb-shell-coverselect.c				\
+	rb-shell-coverselect.h				\
 	rb-query-creator.c				\
 	rb-query-creator.h				\
 	rb-query-creator-private.h			\
Index: widgets/rb-property-view.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/rb-property-view.c,v
retrieving revision 1.32
diff -u -u -r1.32 rb-property-view.c
--- widgets/rb-property-view.c	28 Sep 2005 14:28:26 -0000	1.32
+++ widgets/rb-property-view.c	7 Oct 2005 04:15:57 -0000
@@ -23,6 +23,7 @@
 
 #include <gtk/gtktreeselection.h>
 #include <gtk/gtkcellrenderertext.h>
+#include <gtk/gtkcellrendererpixbuf.h>
 #include <gtk/gtkiconfactory.h>
 #include <gtk/gtktooltips.h>
 #include <gdk/gdkkeysyms.h>
@@ -39,6 +40,8 @@
 #include "rhythmdb-property-model.h"
 #include "rb-stock-icons.h"
 #include "eel-gconf-extensions.h"
+#include "rb-preferences.h"
+#include "rb-cover.h"
 
 static void rb_property_view_class_init (RBPropertyViewClass *klass);
 static void rb_property_view_init (RBPropertyView *view);
@@ -64,6 +67,13 @@
 static void rb_property_view_post_row_deleted_cb (GtkTreeModel *model,
 						  GtkTreePath *path,
 						  RBPropertyView *view);
+static gboolean rb_property_view_button_press_cb (GtkTreeView *treeview,
+						  GdkEventButton *event,
+						  RBPropertyView *view);
+static void rb_property_view_covertree_visible_changed_cb (GConfClient *client,
+							   guint cnxn_id,
+							   GConfEntry *entry,
+							   GtkTreeView *treeview);
 
 struct RBPropertyViewPrivate
 {
@@ -91,6 +101,7 @@
 	PROPERTIES_SELECTED,
 	PROPERTY_ACTIVATED,
 	SELECTION_RESET,
+	SHOW_POPUP,
 	LAST_SIGNAL
 };
 
@@ -103,6 +114,15 @@
 	PROP_MODEL,
 };
 
+enum 
+{
+	TEXT_COLUMN,
+	ISALL_COLUMN,
+	DATA_COLUMN,
+	COVER_COLUMN,
+	N_COLUMN
+};
+
 static GObjectClass *parent_class = NULL;
 
 static guint rb_property_view_signals[LAST_SIGNAL] = { 0 };
@@ -242,6 +262,17 @@
 			      g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE,
 			      0); 
+
+	rb_property_view_signals[SHOW_POPUP] =
+		g_signal_new ("show_popup",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (RBPropertyViewClass, show_popup),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__BOOLEAN,
+			      G_TYPE_NONE,
+			      1,
+			      G_TYPE_BOOLEAN);
 }
 
 static void
@@ -466,16 +497,48 @@
 				 GtkTreeModel *tree_model, GtkTreeIter *iter,
 				 RBPropertyView *view)
 {
-	char *str;
 	gboolean bold;
 
-	gtk_tree_model_get (GTK_TREE_MODEL (tree_model), iter, 0, &str,
-			    1, &bold, -1);
-	
-	g_object_set (G_OBJECT (renderer), "text", str,
-		      "weight", G_UNLIKELY (bold) ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
-		      NULL);
-	g_free (str);
+	if (view->priv->propid == RHYTHMDB_PROP_ALBUM
+	    && gtk_tree_view_column_get_visible (gtk_tree_view_get_column (GTK_TREE_VIEW (view->priv->treeview), 1)) == TRUE)
+	{
+		char *name, *artist;
+		int songs;
+
+		gtk_tree_model_get (GTK_TREE_MODEL (tree_model), iter,
+				    0, &name, 1, &bold, 2, &artist, 4, &songs, -1);
+
+		if (!bold)
+		{
+			char *markup;
+			char *songs_text = g_strdup_printf (ngettext ("%d song", "%d songs", songs), songs);
+			markup = g_markup_printf_escaped ("%s\n<span size=\"smaller\">%s <u>%s</u> (%s)</span>",
+							  name, _("by"), artist, songs_text);
+			g_object_set (G_OBJECT (renderer), "markup", markup,
+				      "weight", PANGO_WEIGHT_NORMAL, NULL);
+			g_free (markup);
+			g_free (songs_text);
+		}
+		else
+		{
+			g_object_set (G_OBJECT (renderer), "text", name,
+				      "weight", PANGO_WEIGHT_BOLD, NULL);
+		}
+		g_free (name);
+		g_free (artist);
+	}
+	else
+	{
+		char *str;
+
+		gtk_tree_model_get (GTK_TREE_MODEL (tree_model), iter, 0, &str,
+				    1, &bold, -1);
+
+		g_object_set (G_OBJECT (renderer), "text", str,
+			      "weight", G_UNLIKELY (bold) ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
+			      NULL);
+		g_free (str);
+	}
 }
 
 static GObject *
@@ -512,6 +575,11 @@
 			         G_CALLBACK (rb_property_view_selection_changed_cb),
 			         view,
 				 0);
+	g_signal_connect_object (G_OBJECT (view->priv->treeview),
+			         "button_press_event",
+			         G_CALLBACK (rb_property_view_button_press_cb),
+			         view,
+				 0);
 
 	gtk_container_add (GTK_CONTAINER (view), view->priv->treeview);
 
@@ -526,10 +594,28 @@
 						 view, NULL);
 	gtk_tree_view_column_set_title (column, view->priv->title);
 	gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
-
+	gtk_tree_view_column_set_expand (column, TRUE);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (view->priv->treeview),
 				     column);
 
+	if (view->priv->propid == RHYTHMDB_PROP_ALBUM) {
+		renderer = gtk_cell_renderer_pixbuf_new ();
+		column = gtk_tree_view_column_new_with_attributes (_("Cover"), 
+								  renderer, 
+								  "pixbuf", 
+								  COVER_COLUMN, NULL);	
+		gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
+		gtk_tree_view_column_set_fixed_width (column, TREE_COVER_SIZE + 30);
+		gtk_tree_view_column_set_spacing (column, 0);
+		gtk_tree_view_append_column (GTK_TREE_VIEW (view->priv->treeview), 
+					     column);
+		gtk_tree_view_column_set_visible (column,
+						  !eel_gconf_get_boolean (CONF_COVER_TREE_HIDDEN));
+		eel_gconf_notification_add (CONF_COVER_TREE_HIDDEN,
+					    (GConfClientNotifyFunc) rb_property_view_covertree_visible_changed_cb,
+					    GTK_TREE_VIEW (view->priv->treeview)); 
+	}
+
 	return G_OBJECT (view);
 }
 
@@ -638,3 +724,160 @@
 	}
 }
 
+static gboolean
+harvest_entries (GtkTreeModel *model,
+		 GtkTreePath *path,
+		 GtkTreeIter *iter,
+		 void **data)
+{
+	GList **list = (GList **) data;
+	gchar *label;
+	GValue label_value = {0};
+
+	gtk_tree_model_get_value (model, iter, TEXT_COLUMN, &label_value);
+	label = (gchar *) g_value_get_string (&label_value);
+
+	*list = g_list_append (*list, label);
+
+	return FALSE;
+}
+
+static GList *
+rb_property_view_get_selected_entries (RBPropertyView *view)
+{
+	GList *list = NULL;
+
+	gtk_tree_selection_selected_foreach (view->priv->selection,
+					     (GtkTreeSelectionForeachFunc) harvest_entries,
+					     (gpointer) &list);
+
+	return list;
+}
+
+static void
+rb_property_view_select_entry (RBPropertyView *view,
+			       gchar *label)
+{
+	GtkTreeIter iter;
+
+	if (label == NULL)
+		return;
+
+	g_signal_handlers_block_by_func (G_OBJECT (view->priv->selection),
+					 G_CALLBACK (rb_property_view_selection_changed_cb),
+					 view);
+
+	gtk_tree_selection_unselect_all (view->priv->selection);
+	g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
+					   G_CALLBACK (rb_property_view_selection_changed_cb),
+					   view);
+
+	if (rhythmdb_property_model_iter_from_string (view->priv->prop_model,
+						label,
+						&iter)) {
+		gtk_tree_selection_select_iter (view->priv->selection, &iter);
+	}
+}
+
+static gboolean
+rb_property_view_button_press_cb (GtkTreeView *treeview,
+				  GdkEventButton *event,
+				  RBPropertyView *view)
+{
+	if (event->button == 3) {
+		GtkTreePath *path;
+
+		gtk_tree_view_get_path_at_pos (treeview, event->x, event->y, &path, NULL, NULL, NULL);
+		if (path != NULL) {
+			GList *selected;
+			GValue label_value = {0};
+			gchar *label;
+			GtkTreeModel *treemodel;
+			GtkTreeIter iter;
+			gboolean is_all;
+
+			treemodel = GTK_TREE_MODEL (view->priv->prop_model);
+			
+			gtk_tree_model_get_iter (treemodel, &iter, path);
+
+			gtk_tree_model_get (treemodel, &iter, ISALL_COLUMN, &is_all, -1);
+			if (is_all) {
+				g_signal_handlers_block_by_func (G_OBJECT (view->priv->selection),
+								 G_CALLBACK (rb_property_view_selection_changed_cb),
+								 view);
+
+				gtk_tree_model_get_iter_first (treemodel, &iter);
+				gtk_tree_selection_unselect_all (view->priv->selection);
+				g_signal_handlers_unblock_by_func (G_OBJECT (view->priv->selection),
+								   G_CALLBACK (rb_property_view_selection_changed_cb),
+								   view);
+
+				gtk_tree_selection_select_iter (view->priv->selection, &iter);
+			}
+				
+			gtk_tree_model_get_value (treemodel, &iter,
+						  0, &label_value);
+
+			label = (gchar *) g_value_get_string (&label_value);
+
+			selected = rb_property_view_get_selected_entries (view);
+
+			if (!g_list_find_custom (selected, label, (GCompareFunc) strcmp))
+				rb_property_view_select_entry (view, label);
+			
+			g_free (label);
+			g_list_free (selected);
+
+			g_signal_emit (G_OBJECT (view), rb_property_view_signals[SHOW_POPUP], 0,
+				       (gtk_tree_selection_count_selected_rows (view->priv->selection) == 1 && !is_all));
+
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+GList *
+rb_property_view_get_selected_artists_albums (RBPropertyView *view)
+{
+	gchar *artist;
+	gchar *album;
+	GList *selected_rows, *tem;
+	GList *artists_albums = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	GValue artist_value = {0};
+	GValue album_value = {0};
+
+	selected_rows = gtk_tree_selection_get_selected_rows (view->priv->selection, &model);
+	for (tem = selected_rows; tem; tem = tem->next) {
+		g_assert (gtk_tree_model_get_iter (model, &iter, tem->data));
+		gtk_tree_model_get_value (model, &iter, TEXT_COLUMN, &artist_value);
+		gtk_tree_model_get_value (model, &iter, DATA_COLUMN, &album_value);
+		artist = (gchar *) g_value_get_string (&artist_value);
+		album = (gchar *) g_value_get_string (&album_value);
+
+		artists_albums = g_list_append (artists_albums,
+						g_strdup (artist));
+		artists_albums = g_list_append (artists_albums,
+						g_strdup (album));
+		g_value_unset (&artist_value);
+		g_value_unset (&album_value);
+	}
+
+	g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL);
+	g_list_free (selected_rows);
+
+	return artists_albums;
+}
+
+static void
+rb_property_view_covertree_visible_changed_cb (GConfClient *client,
+					       guint cnxn_id,
+					       GConfEntry *entry,
+					       GtkTreeView *treeview)
+{
+	gtk_tree_view_column_set_visible (gtk_tree_view_get_column (treeview, 1),
+					  !eel_gconf_get_boolean (CONF_COVER_TREE_HIDDEN));
+}
Index: widgets/rb-property-view.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/widgets/rb-property-view.h,v
retrieving revision 1.11
diff -u -u -r1.11 rb-property-view.h
--- widgets/rb-property-view.h	3 Feb 2004 06:25:19 -0000	1.11
+++ widgets/rb-property-view.h	7 Oct 2005 04:15:57 -0000
@@ -56,6 +56,7 @@
 	void (*properties_selected)	(RBPropertyView *view, GList *properties);
 	void (*property_activated)	(RBPropertyView *view, const char *name);
 	void (*selection_reset)		(RBPropertyView *view);
+	void (*show_popup)              (RBPropertyView *view);
 } RBPropertyViewClass;
 
 GType		rb_property_view_get_type		(void);
@@ -77,6 +78,8 @@
 							 RhythmDBPropertyModel *model);
 
 guint		rb_property_view_get_num_properties	(RBPropertyView *view);
+
+GList 		*rb_property_view_get_selected_artists_albums (RBPropertyView *view);
 
 G_END_DECLS
 
