Index: sources/rb-removable-media-source.c
===================================================================
--- sources/rb-removable-media-source.c	(revision 4845)
+++ sources/rb-removable-media-source.c	(working copy)
@@ -106,6 +106,8 @@ rb_removable_media_source_class_init (RB
 	browser_source_class->impl_get_paned_key = NULL;
 	browser_source_class->impl_has_drop_support = (RBBrowserSourceFeatureFunc) rb_false_function;
 
+	klass->impl_should_paste = (RBRemovableMediaSourceShouldPasteFunc) rb_true_function;
+
 	g_object_class_install_property (object_class,
 					 PROP_VOLUME,
 					 g_param_spec_object ("volume",
@@ -292,7 +294,8 @@ impl_paste (RBSource *source, GList *ent
 		entry_type = rhythmdb_entry_get_entry_type (entry);
 
 		if (entry_type == our_entry_type ||
-		    entry_type->category != RHYTHMDB_ENTRY_NORMAL) {
+		    entry_type->category != RHYTHMDB_ENTRY_NORMAL ||
+		    !rb_removable_media_source_should_paste (RB_REMOVABLE_MEDIA_SOURCE (source), entry)) {
 			goto impl_paste_end;
 		}
 
@@ -465,6 +468,15 @@ rb_removable_media_source_get_mime_types
 		return NULL;
 }
 
+gboolean
+rb_removable_media_source_should_paste (RBRemovableMediaSource *source,
+					RhythmDBEntry *entry)
+{
+	RBRemovableMediaSourceClass *klass = RB_REMOVABLE_MEDIA_SOURCE_GET_CLASS (source);
+
+	return klass->impl_should_paste (source, entry);
+}
+
 void
 rb_removable_media_source_track_added (RBRemovableMediaSource *source,
 				       RhythmDBEntry *entry,
Index: sources/rb-removable-media-source.h
===================================================================
--- sources/rb-removable-media-source.h	(revision 4845)
+++ sources/rb-removable-media-source.h	(working copy)
@@ -53,8 +53,13 @@ typedef struct
 						 RhythmDBEntry *entry,
 						 const char *uri,
 						 const char *mimetype);
+	gboolean	(*impl_should_paste)	(RBRemovableMediaSource *source,
+						 RhythmDBEntry *entry);
 } RBRemovableMediaSourceClass;
 
+typedef gboolean	(*RBRemovableMediaSourceShouldPasteFunc) (RBRemovableMediaSource *source,
+								  RhythmDBEntry *entry);
+
 GType			rb_removable_media_source_get_type	(void);
 
 char*		rb_removable_media_source_build_dest_uri 	(RBRemovableMediaSource *source,
@@ -66,6 +71,8 @@ void		rb_removable_media_source_track_ad
 								 const char *uri,
 								 const char *mimetype);
 GList *		rb_removable_media_source_get_mime_types	(RBRemovableMediaSource *source);
+gboolean	rb_removable_media_source_should_paste		(RBRemovableMediaSource *source,
+								 RhythmDBEntry *entry);
 
 G_END_DECLS
 
--- plugins/ipod/rb-ipod-source.c	2007/02/25 00:32:17	1.1
+++ plugins/ipod/rb-ipod-source.c	2007/02/25 01:37:26
@@ -71,6 +71,8 @@ static gboolean hal_udi_is_ipod (const c
 
 #ifdef ENABLE_IPOD_WRITING
 static GList * impl_get_mime_types (RBRemovableMediaSource *source);
+static gboolean impl_should_paste (RBRemovableMediaSource *source,
+				   RhythmDBEntry *entry);
 static gboolean impl_track_added (RBRemovableMediaSource *source,
 				  RhythmDBEntry *entry,
 				  const char *dest,
@@ -128,6 +130,7 @@ rb_ipod_source_class_init (RBiPodSourceC
 
 #ifdef ENABLE_IPOD_WRITING
 	source_class->impl_can_paste = (RBSourceFeatureFunc) rb_true_function;
+	rms_class->impl_should_paste = impl_should_paste;
 	rms_class->impl_track_added = impl_track_added;
 	rms_class->impl_build_dest_uri = impl_build_dest_uri;
 	rms_class->impl_get_mime_types = impl_get_mime_types;
@@ -1008,6 +1011,47 @@ request_artwork (RBiPodSource *isource,
 		artwork_notify_cb (db, entry, "rb:coverArt", metadata, isource);
 }
 
+struct EntriesForeachCheckMatchData {
+	gboolean should_paste;
+	RhythmDBEntry *entry_to_paste;
+};
+	
+static void
+entries_foreach_check_match (RhythmDB *db,
+			     RhythmDBEntry *entry_on_ipod,
+			     struct EntriesForeachCheckMatchData *data)
+{
+#define entries_match(prop) \
+	(0 == strcmp (rhythmdb_entry_get_string (entry_on_ipod, RHYTHMDB_PROP_ ## prop), \
+	              rhythmdb_entry_get_string (data->entry_to_paste, RHYTHMDB_PROP_ ## prop)))
+	data->should_paste = data->should_paste && !(entries_match(TITLE) && entries_match(ALBUM) && entries_match(ARTIST));
+#undef entries_match
+}
+
+static gboolean
+impl_should_paste (RBRemovableMediaSource *source,
+		   RhythmDBEntry *entry)
+{
+	RhythmDBEntryType entry_type;
+	RhythmDB *db;
+	RBShell *shell;
+	struct EntriesForeachCheckMatchData data;
+
+	g_object_get (source, "shell", &shell, NULL);
+	g_object_get (shell, "db", &db, NULL);
+	g_object_unref (shell);
+	g_object_get (source, "entry-type", &entry_type, NULL);
+	
+	data.entry_to_paste = entry;
+	data.should_paste = TRUE;
+	rhythmdb_entry_foreach_by_type (db, entry_type, (GFunc) entries_foreach_check_match, &data);
+	
+	g_boxed_free (RHYTHMDB_TYPE_ENTRY_TYPE, entry_type);
+	g_object_unref (db);
+
+	return data.should_paste;
+}
+
 static gboolean
 impl_track_added (RBRemovableMediaSource *source,
 		  RhythmDBEntry *entry,
