? ChangeLog.new
? backends
? compile
? bindings/Makefile
? bindings/Makefile.in
? bindings/python/Makefile
? bindings/python/Makefile.in
? metadata/rhythmbox-metadata
? metadata/test-metadata
? plugins/Makefile
? plugins/Makefile.in
? plugins/audioscrobbler/Makefile
? plugins/audioscrobbler/Makefile.in
? plugins/audioscrobbler/audioscrobbler.rb-plugin
? plugins/sample/Makefile
? plugins/sample/Makefile.in
? plugins/sample-python/Makefile
? plugins/sample-python/Makefile.in
? shell/rb-playlist-manager-glue.h
Index: Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/Makefile.am,v
retrieving revision 1.47
diff -p -u -r1.47 Makefile.am
--- Makefile.am	11 Mar 2006 05:02:21 -0000	1.47
+++ Makefile.am	17 Mar 2006 15:55:14 -0000
@@ -6,7 +6,7 @@ DISTCHECK_CONFIGURE_FLAGS = --disable-sc
 distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
 
 SUBDIRS = macros lib metadata player rhythmdb widgets sources iradio podcast remote \
-	daapsharing plugins bindings shell data po help tests doc
+	daapsharing backends plugins bindings shell data po help tests doc
 
 EXTRA_DIST = 			\
 	autogen.sh		\
Index: configure.ac
===================================================================
RCS file: /cvs/gnome/rhythmbox/configure.ac,v
retrieving revision 1.217
diff -p -u -r1.217 configure.ac
--- configure.ac	13 Mar 2006 21:24:45 -0000	1.217
+++ configure.ac	17 Mar 2006 15:55:14 -0000
@@ -52,6 +52,7 @@ PKG_CHECK_MODULES(RHYTHMBOX,				\
 		  libgnomeui-2.0			\
 		  libglade-2.0				\
 		  gnome-vfs-2.0 >= $GNOME_VFS_REQS	\
+		  gnome-media-profiles			\
 		  gnome-vfs-module-2.0)
 
 PKG_CHECK_MODULES(TOTEM_PLPARSER, totem-plparser >= $TOTEM_PLPARSER_REQS, have_totem_plparser=yes, have_totem_plparser=no)
@@ -857,6 +858,8 @@ po/Makefile.in
 tests/Makefile
 doc/Makefile
 doc/reference/Makefile
+backends/Makefile
+backends/gstreamer/Makefile
 ])
 
 AC_MSG_NOTICE([Rhythmbox was configured with the following options:])
Index: data/rhythmbox.schemas
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/rhythmbox.schemas,v
retrieving revision 1.66
diff -p -u -r1.66 rhythmbox.schemas
--- data/rhythmbox.schemas	1 Mar 2006 03:12:43 -0000	1.66
+++ data/rhythmbox.schemas	17 Mar 2006 15:55:15 -0000
@@ -38,6 +38,39 @@
         </locale>
       </schema>
       <schema>
+        <key>/schemas/apps/rhythmbox/library_layout_path</key>
+        <applyto>/apps/rhythmbox/library_layout_path</applyto>
+        <owner>rhythmbox</owner>
+        <type>string</type>
+        <default>%aa/%at</default>
+        <locale name="C">
+          <short>Directory heirarchy of library</short>
+          <long>The path used to store track in, under the chosen library. Various substitutions are done</long>
+        </locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/library_layout_filename</key>
+        <applyto>/apps/rhythmbox/library_layout_filename</applyto>
+        <owner>rhythmbox</owner>
+        <type>string</type>
+        <default>%tb - %tt</default>
+        <locale name="C">
+          <short>File name of tracks</short>
+          <long>The path used to store track in, under the chosen library. Various substitutions are done</long>
+        </locale>
+      </schema>
+      <schema>
+        <key>/schemas/apps/rhythmbox/library_preferred_format</key>
+        <applyto>/apps/rhythmbox/library_preferred_format</applyto>
+        <owner>rhythmbox</owner>
+        <type>string</type>
+        <default>cdlossy</default>
+        <locale name="C">
+          <short>id of gnome-media audio profile</short>
+          <long>The ID of the preferred gnome audio profile, used for ripping CDs</long>
+        </locale>
+      </schema>
+      <schema>
         <key>/schemas/apps/rhythmbox/monitor_library</key>
         <applyto>/apps/rhythmbox/monitor_library</applyto>
         <owner>rhythmbox</owner>
Index: data/glade/general-prefs.glade
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/glade/general-prefs.glade,v
retrieving revision 1.12
diff -p -u -r1.12 general-prefs.glade
--- data/glade/general-prefs.glade	18 Feb 2006 06:56:17 -0000	1.12
+++ data/glade/general-prefs.glade	17 Mar 2006 15:55:15 -0000
@@ -28,6 +28,190 @@
       <property name="spacing">18</property>
 
       <child>
+	<widget class="GtkVBox" id="vbox14">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label22">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Browser Views</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox16">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label23">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox17">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="browser_views_label">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">8</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkVBox" id="vbox15">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkRadioButton" id="library_browser_views_radio">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Artists and albums</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">True</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="library_browser_views_radio">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Genres and artists</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkRadioButton" id="library_browser_views_radio">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">G_enres, artists and albums</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+
+      <child>
 	<widget class="GtkVBox" id="vbox2">
 	  <property name="visible">True</property>
 	  <property name="homogeneous">False</property>
Index: data/glade/library-prefs.glade
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/glade/library-prefs.glade,v
retrieving revision 1.11
diff -p -u -r1.11 library-prefs.glade
--- data/glade/library-prefs.glade	28 Feb 2006 10:31:22 -0000	1.11
+++ data/glade/library-prefs.glade	17 Mar 2006 15:55:15 -0000
@@ -40,195 +40,6 @@
 	  <property name="spacing">18</property>
 
 	  <child>
-	    <widget class="GtkVBox" id="vbox9">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">6</property>
-
-	      <child>
-		<widget class="GtkLabel" id="browser_views_label">
-		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">Browser Views</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkHBox" id="hbox12">
-		  <property name="visible">True</property>
-		  <property name="homogeneous">False</property>
-		  <property name="spacing">0</property>
-
-		  <child>
-		    <widget class="GtkLabel" id="label16">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes"></property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		      <property name="width_chars">-1</property>
-		      <property name="single_line_mode">False</property>
-		      <property name="angle">0</property>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">False</property>
-		      <property name="fill">False</property>
-		    </packing>
-		  </child>
-
-		  <child>
-		    <widget class="GtkHBox" id="hbox13">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkLabel" id="label17">
-			  <property name="visible">True</property>
-			  <property name="label" translatable="yes"></property>
-			  <property name="use_underline">False</property>
-			  <property name="use_markup">False</property>
-			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">False</property>
-			  <property name="selectable">False</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">8</property>
-			  <property name="ypad">0</property>
-			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			  <property name="width_chars">-1</property>
-			  <property name="single_line_mode">False</property>
-			  <property name="angle">0</property>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkVBox" id="vbox10">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">6</property>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="library_browser_views_radio">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">_Artists and albums</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">True</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <signal name="toggled" handler="rb_library_source_browser_views_activated_cb" last_modification_time="Sun, 26 Jan 2003 20:03:41 GMT"/>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton2">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">_Genres and artists</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">library_browser_views_radio</property>
-			      <signal name="toggled" handler="rb_library_source_browser_views_activated_cb" last_modification_time="Sun, 26 Jan 2003 20:03:48 GMT"/>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkRadioButton" id="radiobutton3">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">G_enres, artists and albums</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			      <property name="group">library_browser_views_radio</property>
-			      <signal name="toggled" handler="rb_library_source_browser_views_activated_cb" last_modification_time="Sun, 26 Jan 2003 20:03:56 GMT"/>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">False</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		    <packing>
-		      <property name="padding">0</property>
-		      <property name="expand">True</property>
-		      <property name="fill">True</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">False</property>
-	    </packing>
-	  </child>
-
-	  <child>
 	    <widget class="GtkVBox" id="vbox11">
 	      <property name="visible">True</property>
 	      <property name="homogeneous">False</property>
@@ -466,32 +277,305 @@
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
-	      <property name="expand">True</property>
-	      <property name="fill">True</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
 	    </packing>
 	  </child>
 
 	  <child>
-	    <widget class="GtkAlignment" id="alignment2">
+	    <widget class="GtkVBox" id="vbox13">
 	      <property name="visible">True</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xscale">1</property>
-	      <property name="yscale">1</property>
-	      <property name="top_padding">0</property>
-	      <property name="bottom_padding">0</property>
-	      <property name="left_padding">0</property>
-	      <property name="right_padding">0</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
 
 	      <child>
-		<placeholder/>
+		<widget class="GtkLabel" id="library_structure_label">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Library Structure</property>
+		  <property name="use_underline">True</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox17">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label23">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">    </property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkTable" id="table1">
+		      <property name="visible">True</property>
+		      <property name="n_rows">5</property>
+		      <property name="n_columns">2</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">6</property>
+		      <property name="column_spacing">6</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label24">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Folder _Heirarchy:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label25">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_File Name:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label26">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Example Path:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label27">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Preferred Format:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">4</property>
+			  <property name="bottom_attach">5</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="example_path_label">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">Artist/Artist - Album/Artist (Album) - 01 - Title.ogg</property>
+			  <property name="use_underline">False</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			  <property name="width_chars">-1</property>
+			  <property name="single_line_mode">False</property>
+			  <property name="angle">0</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHBox" id="layout_path_menu_box">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHBox" id="layout_filename_menu_box">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkHBox" id="preferred_format_menu_box">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <placeholder/>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">4</property>
+			  <property name="bottom_attach">5</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
 	      </child>
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
-	      <property name="expand">False</property>
-	      <property name="fill">False</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
 	    </packing>
+	  </child>
+
+	  <child>
+	    <placeholder/>
 	  </child>
 	</widget>
       </child>
Index: data/ui/rhythmbox-ui.xml
===================================================================
RCS file: /cvs/gnome/rhythmbox/data/ui/rhythmbox-ui.xml,v
retrieving revision 1.49
diff -p -u -r1.49 rhythmbox-ui.xml
--- data/ui/rhythmbox-ui.xml	12 Mar 2006 23:00:59 -0000	1.49
+++ data/ui/rhythmbox-ui.xml	17 Mar 2006 15:55:15 -0000
@@ -203,7 +203,7 @@
   </popup>
   
   <popup name="AudioCdSourcePopup">
-    <menuitem name="AudioCdSourcePopupImportCd" action="MusicImportCD"/>
+    <menuitem name="AudioCdSourcePopupCopyAllTracks" action="RemovableSourceCopyAllTracks"/>
     <menuitem name="AudioCdSourcePopupEjectCd" action="RemovableSourceEject"/>
   </popup>
 
Index: lib/rb-glade-helpers.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-glade-helpers.c,v
retrieving revision 1.4
diff -p -u -r1.4 rb-glade-helpers.c
--- lib/rb-glade-helpers.c	30 Nov 2005 07:18:29 -0000	1.4
+++ lib/rb-glade-helpers.c	17 Mar 2006 15:55:15 -0000
@@ -114,6 +114,12 @@ void
 rb_glade_boldify_label (GladeXML *xml, const char *name)
 {
 	GtkLabel *label = GTK_LABEL (glade_xml_get_widget (xml, name));
+
+	if (label == NULL) {
+		g_warning ("widget '%s' not found", name);
+		return;
+	}
+
 	/* this way is probably better, but for some reason doesn't work with
 	 * labels with mnemonics.
 
Index: lib/rb-marshal.list
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-marshal.list,v
retrieving revision 1.13
diff -p -u -r1.13 rb-marshal.list
--- lib/rb-marshal.list	9 Dec 2005 12:18:15 -0000	1.13
+++ lib/rb-marshal.list	17 Mar 2006 15:55:15 -0000
@@ -10,4 +10,5 @@ VOID:POINTER,INT,POINTER
 VOID:INT,POINTER
 VOID:POINTER,INT,POINTER,POINTER
 VOID:BOOLEAN,BOOLEAN
+VOID:INT,INT
 
Index: lib/rb-preferences.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-preferences.h,v
retrieving revision 1.28
diff -p -u -r1.28 rb-preferences.h
--- lib/rb-preferences.h	11 Mar 2006 05:02:22 -0000	1.28
+++ lib/rb-preferences.h	17 Mar 2006 15:55:15 -0000
@@ -29,8 +29,6 @@ G_BEGIN_DECLS
 
 #define CONF_FIRST_TIME CONF_PREFIX   "/first_time_flag"
 #define CONF_GRACE_PERIOD CONF_PREFIX "/grace_period"
-#define CONF_LIBRARY_LOCATION	CONF_PREFIX "/library_locations"
-#define CONF_MONITOR_LIBRARY	CONF_PREFIX "/monitor_library"
 #define CONF_UI_DIR               CONF_PREFIX "/ui"
 #define CONF_UI_STATUSBAR_HIDDEN  CONF_PREFIX "/ui/statusbar_hidden"
 #define CONF_UI_TOOLBAR_HIDDEN  CONF_PREFIX "/ui/toolbar_hidden"
@@ -57,6 +55,13 @@ G_BEGIN_DECLS
 #define CONF_DAAP_SHARE_NAME       CONF_PREFIX "/sharing/share_name"
 #define CONF_DAAP_SHARE_PASSWORD   CONF_PREFIX "/sharing/share_password"
 #define CONF_DAAP_REQUIRE_PASSWORD CONF_PREFIX "/sharing/require_password"
+
+#define CONF_LIBRARY_LOCATION	CONF_PREFIX "/library_locations"
+#define CONF_MONITOR_LIBRARY	CONF_PREFIX "/monitor_library"
+#define CONF_LIBRARY_STRIP_CHARS	CONF_PREFIX "/library_strip_chars"
+#define CONF_LIBRARY_LAYOUT_PATH	CONF_PREFIX "/library_layout_path"
+#define CONF_LIBRARY_LAYOUT_FILENAME	CONF_PREFIX "/library_layout_filename"
+#define CONF_LIBRARY_PREFERRED_FORMAT	CONF_PREFIX "/library_preferred_format"
 
 #define CONF_PLUGINS_PREFIX	CONF_PREFIX "/plugins"
 #define CONF_PLUGIN_ACTIVE_KEY	CONF_PLUGINS_PREFIX "/%s/active"
Index: lib/rb-util.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-util.c,v
retrieving revision 1.19
diff -p -u -r1.19 rb-util.c
--- lib/rb-util.c	7 Feb 2006 13:19:56 -0000	1.19
+++ lib/rb-util.c	17 Mar 2006 15:55:15 -0000
@@ -667,3 +667,51 @@ rb_collate_hash_table_values (GHashTable
 
 	return list;
 }
+
+/*
+ * hacked up version of gnome_vfs_uri_list_parse,
+ * that it doesn't strip #s and and returns strings. 
+ */
+
+GList *
+rb_uri_list_parse (const char *uri_list)
+{
+	const gchar *p, *q;
+	gchar *retval;
+	GList *result = NULL;
+
+	g_return_val_if_fail (uri_list != NULL, NULL);
+
+	p = uri_list;
+
+	while (p != NULL) {
+		while (g_ascii_isspace (*p))
+			p++;
+
+		q = p;
+		while ((*q != '\0')
+		       && (*q != '\n')
+		       && (*q != '\r'))
+			q++;
+
+		if (q > p) {
+			q--;
+			while (q > p
+			       && g_ascii_isspace (*q))
+				q--;
+
+			retval = g_malloc (q - p + 2);
+			strncpy (retval, p, q - p + 1);
+			retval[q - p + 1] = '\0';
+
+			if (retval != NULL)
+				result = g_list_prepend (result, retval);
+		}
+		p = strchr (p, '\n');
+		if (p != NULL)
+			p++;
+	}
+
+	return g_list_reverse (result);
+}
+
Index: lib/rb-util.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/lib/rb-util.h,v
retrieving revision 1.15
diff -p -u -r1.15 rb-util.h
--- lib/rb-util.h	7 Feb 2006 13:19:56 -0000	1.15
+++ lib/rb-util.h	17 Mar 2006 15:55:15 -0000
@@ -59,6 +59,8 @@ GList* rb_string_list_copy (GList *list)
 GList* rb_collate_hash_table_keys (GHashTable *table);
 GList* rb_collate_hash_table_values (GHashTable *table);
 
+GList* rb_uri_list_parse (const char *uri_list);
+
 G_END_DECLS
 
 #endif /* __RB_UTIL_H */
Index: podcast/rb-podcast-manager.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/podcast/rb-podcast-manager.c,v
retrieving revision 1.37
diff -p -u -r1.37 rb-podcast-manager.c
--- podcast/rb-podcast-manager.c	17 Mar 2006 14:01:28 -0000	1.37
+++ podcast/rb-podcast-manager.c	17 Mar 2006 15:55:15 -0000
@@ -143,8 +143,6 @@ static void rb_podcast_manager_get_prope
 		                                	 GValue *value,
                 		                	 GParamSpec *pspec);
 static void rb_podcast_manager_copy_post 		(RBPodcastManager *pd);
-static int rb_podcast_manager_mkdir_with_parents 	(const gchar *pathname,
-					  		 int mode);
 static gboolean rb_podcast_manager_sync_head_cb 	(gpointer data);
 static gboolean rb_podcast_manager_head_query_cb 	(GtkTreeModel *query_model,
 						   	 GtkTreePath *path, 
@@ -592,7 +590,7 @@ rb_podcast_manager_copy_post (RBPodcastM
 	g_free (conf_dir_name);
 
 	 if (!g_file_test (dir_name, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
-		if (rb_podcast_manager_mkdir_with_parents (dir_name, 0750) != 0) {
+		if (!g_mkdir_with_parents (dir_name, 0750)) {
 			rb_debug ("Error downloading podcast: could not create local dirs");
 			goto next_step;
 		}
@@ -684,62 +682,6 @@ next_step:
 
 	g_mutex_unlock (pd->priv->mutex_job);
 	gtk_idle_add ((GtkFunction) rb_podcast_manager_next_file , pd);	
-}
-
-
-static int
-rb_podcast_manager_mkdir_with_parents (const gchar *pathname,
-		   			int          mode)
-{
-  gchar *fn, *p;
-
-  if (pathname == NULL || *pathname == '\0')
-    {
-      return -1;
-    }
-
-  fn = g_strdup (pathname);
-
-  if (g_path_is_absolute (fn))
-    p = (gchar *) g_path_skip_root (fn);
-  else
-    p = fn;
-
-  do
-    {
-      while (*p && !G_IS_DIR_SEPARATOR (*p))
-	p++;
-      
-      if (!*p)
-	p = NULL;
-      else
-	*p = '\0';
-      
-      if (!g_file_test (fn, G_FILE_TEST_EXISTS))
-	{
-	  if (g_mkdir (fn, mode) == -1)
-	    {
-	      g_free (fn);
-	      return -1;
-	    }
-	}
-      else if (!g_file_test (fn, G_FILE_TEST_IS_DIR))
-	{
-	  g_free (fn);
-	  return -1;
-	}
-      if (p)
-	{
-	  *p++ = G_DIR_SEPARATOR;
-	  while (*p && G_IS_DIR_SEPARATOR (*p))
-	    p++;
-	}
-    }
-  while (p);
-
-  g_free (fn);
-
-  return 0;
 }
 
 gboolean
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/Makefile.am,v
retrieving revision 1.69
diff -p -u -r1.69 Makefile.am
--- shell/Makefile.am	11 Mar 2006 05:02:22 -0000	1.69
+++ shell/Makefile.am	17 Mar 2006 15:55:15 -0000
@@ -80,6 +80,7 @@ rhythmbox_LDADD =					\
 	librbshell.la					\
 	$(top_builddir)/sources/libsources.la	        \
 	$(top_builddir)/sources/libsourcesimpl.la	\
+ 	$(top_builddir)/backends/librbbackends.la       \
 	$(top_builddir)/iradio/librbiradio.la	        \
 	$(top_builddir)/podcast/librbpodcast.la	        \
 	$(top_builddir)/remote/librbremote.la	        \
@@ -138,6 +139,7 @@ INCLUDES = 						\
 	-I$(top_srcdir)/iradio                    	\
 	-I$(top_srcdir)/podcast                    	\
 	-I$(top_srcdir)/remote				\
+	-I$(top_srcdir)/backends			\
 	-I$(top_builddir)/remote			\
 	-I$(top_srcdir)/plugins				\
 	-DPIXMAP_DIR=\""$(datadir)/pixmaps"\"		\
Index: shell/rb-removable-media-manager.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-removable-media-manager.c,v
retrieving revision 1.19
diff -p -u -r1.19 rb-removable-media-manager.c
--- shell/rb-removable-media-manager.c	4 Mar 2006 22:37:39 -0000	1.19
+++ shell/rb-removable-media-manager.c	17 Mar 2006 15:55:15 -0000
@@ -46,6 +46,8 @@
 #include "rb-dialog.h"
 #include "rb-stock-icons.h"
 #include "rhythmdb.h"
+#include "rb-marshal.h"
+#include "rb-encoder.h"
 
 #ifndef HAVE_BURN_DRIVE_UNREF
 #define nautilus_burn_drive_unref nautilus_burn_drive_free
@@ -54,6 +56,7 @@
 static void rb_removable_media_manager_class_init (RBRemovableMediaManagerClass *klass);
 static void rb_removable_media_manager_init (RBRemovableMediaManager *mgr);
 static void rb_removable_media_manager_dispose (GObject *object);
+static void rb_removable_media_manager_finalize (GObject *object);
 static void rb_removable_media_manager_set_property (GObject *object,
 					      guint prop_id,
 					      const GValue *value,
@@ -67,6 +70,8 @@ static void rb_removable_media_manager_c
 						       RBRemovableMediaManager *manager);
 static void rb_removable_media_manager_cmd_eject_medium (GtkAction *action,
 					       RBRemovableMediaManager *mgr);
+static void rb_removable_media_manager_cmd_copy_tracks (GtkAction *action,
+							RBRemovableMediaManager *mgr);
 static void rb_removable_media_manager_set_uimanager (RBRemovableMediaManager *mgr, 
 					     GtkUIManager *uimanager);
 
@@ -84,6 +89,7 @@ static void  rb_removable_media_manager_
 				GnomeVFSVolume *volume, 
 				gpointer data);
 static void rb_removable_media_manager_scan (RBRemovableMediaManager *manager);
+static gboolean do_transfer (RBRemovableMediaManager *manager);
 
 typedef struct
 {
@@ -110,6 +116,11 @@ typedef struct
 	GList *cur_volume_list;
 
 	char *playing_uri;
+
+	GAsyncQueue *transfer_queue;
+	gboolean transfer_running;
+	gint transfer_total;
+	gint transfer_done;
 } RBRemovableMediaManagerPrivate;
 
 G_DEFINE_TYPE (RBRemovableMediaManager, rb_removable_media_manager, G_TYPE_OBJECT)
@@ -126,6 +137,7 @@ enum
 enum
 {
 	MEDIUM_ADDED,
+	TRANSFER_PROGRESS,
 	LAST_SIGNAL
 };
 
@@ -136,6 +148,9 @@ static GtkActionEntry rb_removable_media
 	{ "RemovableSourceEject", GNOME_MEDIA_EJECT, N_("_Eject"), NULL,
 	  N_("Eject this medium"),
 	  G_CALLBACK (rb_removable_media_manager_cmd_eject_medium) },
+	{ "RemovableSourceCopyAllTracks", GTK_STOCK_CDROM, N_("_Copy to library"), NULL,
+	  N_("Copy all tracks to the library"),
+	  G_CALLBACK (rb_removable_media_manager_cmd_copy_tracks) },
 	{ "MusicScanMedia", NULL, N_("_Scan Removable Media"), NULL,
 	  N_("Scan for new Removable Media"),
 	  G_CALLBACK (rb_removable_media_manager_cmd_scan_media) },
@@ -149,7 +164,7 @@ rb_removable_media_manager_class_init (R
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
 	object_class->dispose = rb_removable_media_manager_dispose;
-
+	object_class->finalize = rb_removable_media_manager_finalize;
 	object_class->set_property = rb_removable_media_manager_set_property;
 	object_class->get_property = rb_removable_media_manager_get_property;
 
@@ -186,6 +201,17 @@ rb_removable_media_manager_class_init (R
 			      G_TYPE_NONE,
 			      1, G_TYPE_OBJECT);
 
+	rb_removable_media_manager_signals[TRANSFER_PROGRESS] =
+		g_signal_new ("transfer-progress",
+			      RB_TYPE_REMOVABLE_MEDIA_MANAGER,
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (RBRemovableMediaManagerClass, transfer_progress),
+			      NULL, NULL,
+			      rb_marshal_VOID__INT_INT,
+			      G_TYPE_NONE,
+			      2, G_TYPE_INT, G_TYPE_INT);
+
+
 	g_type_class_add_private (klass, sizeof (RBRemovableMediaManagerPrivate));
 }
 
@@ -195,6 +221,7 @@ rb_removable_media_manager_init (RBRemov
 	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (mgr);
 
 	priv->volume_mapping = g_hash_table_new (NULL, NULL);
+	priv->transfer_queue = g_async_queue_new ();
 }
 
 static void
@@ -219,14 +246,6 @@ rb_removable_media_manager_dispose (GObj
 		g_list_free (priv->sources);
 		priv->sources = NULL;
 	}
-	if (priv->volume_mapping) {
-		g_hash_table_destroy (priv->volume_mapping);
-		priv->volume_mapping = NULL;
-	}
-	if (priv->cd_drive_mapping) {
-		g_hash_table_destroy (priv->cd_drive_mapping);
-		priv->cd_drive_mapping = NULL;
-	}
 
 	priv->disposed = TRUE;
 
@@ -234,6 +253,18 @@ rb_removable_media_manager_dispose (GObj
 }
 
 static void
+rb_removable_media_manager_finalize (GObject *object)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (object);
+
+	g_hash_table_destroy (priv->volume_mapping);
+	g_hash_table_destroy (priv->cd_drive_mapping);
+	g_async_queue_unref (priv->transfer_queue);
+	
+	G_OBJECT_CLASS (rb_removable_media_manager_parent_class)->finalize (object);
+}
+
+static void
 rb_removable_media_manager_set_property (GObject *object,
 				  guint prop_id,
 				  const GValue *value,
@@ -779,4 +810,161 @@ rb_removable_media_manager_scan (RBRemov
 		}
 	}
 	g_list_free (list);
+}
+
+
+
+/* Track transfer */
+
+typedef struct {
+	RBRemovableMediaManager *manager;
+	RhythmDBEntry *entry;
+	char *dest;
+	char *mime_type;
+	gboolean failed;
+	RBTranferCompleteCallback callback;
+	gpointer userdata;
+} TransferData;
+
+static gboolean
+emit_progress_idle (RBRemovableMediaManager *mgr)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (mgr);
+
+	g_signal_emit (G_OBJECT (mgr), rb_removable_media_manager_signals[TRANSFER_PROGRESS], 0,
+		       g_atomic_int_get (&priv->transfer_done),
+		       g_atomic_int_get (&priv->transfer_total));
+	return FALSE;
+}
+
+static void
+error_cb (RBEncoder *encoder, GError *error, TransferData *data)
+{
+	rb_debug ("Error transferring track to %s: %s", data->dest, error->message);
+	rb_error_dialog (NULL, _("Error transferring track"), "%s", error->message);
+
+	data->failed = TRUE;
+	rb_encoder_cancel (encoder);
+}
+
+static void
+progress_cb (RBEncoder *encoder, TransferData *data, gint done)
+{
+	rb_debug ("transfer progress %s", done);
+}
+
+static void
+completed_cb (RBEncoder *encoder, TransferData *data)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (data->manager);
+
+	rb_debug ("completed transferring track to %s", data->dest);
+	if (!data->failed)
+		(data->callback) (data->entry, data->dest, data->userdata);
+
+	priv->transfer_running = FALSE;
+	g_atomic_int_inc (&priv->transfer_done);
+	g_idle_add ((GSourceFunc)emit_progress_idle, data->manager);
+	
+	do_transfer (data->manager);
+
+	g_object_unref (G_OBJECT (encoder));
+	g_free (data->dest);
+	g_free (data->mime_type);
+	g_free (data);
+}
+
+static gboolean
+do_transfer (RBRemovableMediaManager *manager)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (manager);
+	TransferData *data;
+	RBEncoder *encoder;
+	
+	if (priv->transfer_running)
+		return FALSE;
+
+	data = g_async_queue_try_pop (priv->transfer_queue);
+	if (data == NULL) {
+		g_atomic_int_set (&priv->transfer_total, 0);
+		g_atomic_int_set (&priv->transfer_done, 0);
+		return FALSE;
+	}
+
+	priv->transfer_running = TRUE;
+
+	encoder = rb_encoder_new ();
+	g_signal_connect (G_OBJECT (encoder),
+			  "error", G_CALLBACK (error_cb),
+			  data);
+	g_signal_connect (G_OBJECT (encoder),
+			  "progress", G_CALLBACK (progress_cb),
+			  data);
+	g_signal_connect (G_OBJECT (encoder),
+			  "completed", G_CALLBACK (completed_cb),
+			  data);
+	if (!rb_encoder_encode (encoder, data->entry, data->dest, NULL)) {
+		data->failed = TRUE;
+		completed_cb (encoder, data);
+	}
+
+	return FALSE;
+}
+
+void
+rb_removable_media_manager_queue_transfer (RBRemovableMediaManager *manager,
+					  RhythmDBEntry *entry,
+					  const char *dest,
+					  const char *mime_type,
+					  RBTranferCompleteCallback callback,
+					  gpointer userdata)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (manager);
+	TransferData *data;
+
+	data = g_new0 (TransferData, 1);
+	data->manager = manager;
+	data->entry = entry;
+	data->dest = g_strdup (dest);
+	data->mime_type = g_strdup (mime_type);
+	data->callback = callback;
+	data->userdata = userdata;
+
+	g_async_queue_push (priv->transfer_queue, data);
+	g_atomic_int_inc (&priv->transfer_total);
+	g_idle_add ((GSourceFunc)do_transfer, manager);
+	g_idle_add ((GSourceFunc)emit_progress_idle, manager);
+}
+
+static void
+copy_entry (RhythmDBQueryModel *model,
+	    GtkTreePath *path,
+	    GtkTreeIter *iter,
+	    GList **list)
+{
+	GList *l;
+	l = g_list_append (*list, rhythmdb_query_model_iter_to_entry (model, iter));
+	*list = l;
+	rb_debug ("%p", l);
+}
+
+static void
+rb_removable_media_manager_cmd_copy_tracks (GtkAction *action, RBRemovableMediaManager *mgr)
+{
+	RBRemovableMediaManagerPrivate *priv = REMOVABLE_MEDIA_MANAGER_GET_PRIVATE (mgr);
+	RBRemovableMediaSource *source;
+	RBLibrarySource *library;
+	RhythmDBQueryModel *model;
+	GList *list = NULL;
+
+	source = RB_REMOVABLE_MEDIA_SOURCE (priv->selected_source);
+	g_object_get (G_OBJECT (source), "query-model", &model, NULL);
+	g_object_get (G_OBJECT (priv->shell), "library-source", &library, NULL);
+
+	gtk_tree_model_foreach (GTK_TREE_MODEL (model), (GtkTreeModelForeachFunc)copy_entry, &list);
+	rb_source_paste (RB_SOURCE (library), list);
+	g_list_free (list);
+
+	g_object_unref (G_OBJECT (model));
+	g_object_unref (G_OBJECT (library));
 }
Index: shell/rb-removable-media-manager.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-removable-media-manager.h,v
retrieving revision 1.1
diff -p -u -r1.1 rb-removable-media-manager.h
--- shell/rb-removable-media-manager.h	11 Sep 2005 04:27:15 -0000	1.1
+++ shell/rb-removable-media-manager.h	17 Mar 2006 15:55:15 -0000
@@ -36,6 +36,12 @@ G_BEGIN_DECLS
 #define RB_IS_REMOVABLE_MEDIA_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), RB_TYPE_REMOVABLE_MEDIA_MANAGER))
 #define RB_REMOVABLE_MEDIA_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), RB_TYPE_REMOVABLE_MEDIA_MANAGER, RBRemovableMediaManagerClass))
 
+
+typedef void (*RBTranferCompleteCallback) (RhythmDBEntry *entry,
+					   const char *dest,
+					   gpointer userdata);
+				      
+
 typedef struct
 {
 	GObject parent;
@@ -46,7 +52,11 @@ typedef struct
 	GObjectClass parent_class;
 
 	/* signals */
-	void	(*medium_added) (RBSource *source);
+	void	(*medium_added)		(RBRemovableMediaManager *mgr,
+					 RBSource *source);
+	void	(*transfer_progress)	(RBRemovableMediaManager *mgr,
+					 gint done,
+					 gint total);
 } RBRemovableMediaManagerClass;
 
 
@@ -54,6 +64,13 @@ RBRemovableMediaManager* rb_removable_me
 GType			rb_removable_media_manager_get_type	(void);
 
 gboolean		rb_removable_media_manager_load_media	(RBRemovableMediaManager *mgr);
+
+void	rb_removable_media_manager_queue_transfer (RBRemovableMediaManager *mgr,
+						   RhythmDBEntry *entry,
+						   const char *dest,
+						   const char *mime_type,
+						   RBTranferCompleteCallback callback,
+						   gpointer userdata);
 
 G_END_DECLS
 
Index: shell/rb-shell-clipboard.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-clipboard.c,v
retrieving revision 1.40
diff -p -u -r1.40 rb-shell-clipboard.c
--- shell/rb-shell-clipboard.c	12 Mar 2006 02:04:45 -0000	1.40
+++ shell/rb-shell-clipboard.c	17 Mar 2006 15:55:15 -0000
@@ -425,7 +425,7 @@ rb_shell_clipboard_sync (RBShellClipboar
 	rb_debug ("syncing clipboard");
 	
 	if (g_list_length (clipboard->priv->entries) > 0)
-		can_paste = rb_source_can_cut (clipboard->priv->source);
+		can_paste = rb_source_can_paste (clipboard->priv->source);
 
 	if (have_selection) {
 		can_cut = rb_source_can_cut (clipboard->priv->source);
Index: shell/rb-shell-preferences.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-preferences.c,v
retrieving revision 1.57
diff -p -u -r1.57 rb-shell-preferences.c
--- shell/rb-shell-preferences.c	18 Feb 2006 06:56:17 -0000	1.57
+++ shell/rb-shell-preferences.c	17 Mar 2006 15:55:15 -0000
@@ -82,6 +82,8 @@ struct RBShellPreferencesPrivate
 	GtkWidget *quality_check;
 	GtkWidget *year_check;
 
+	GSList *browser_views_group;
+
 	gboolean loading;
 };
 
@@ -119,7 +121,7 @@ help_cb (GtkWidget *widget,
 static void
 rb_shell_preferences_init (RBShellPreferences *shell_preferences)
 {
-	GtkWidget *help;
+	GtkWidget *tmp;
 	GladeXML *xml;
 
 	shell_preferences->priv = RB_SHELL_PREFERENCES_GET_PRIVATE (shell_preferences);
@@ -136,10 +138,10 @@ rb_shell_preferences_init (RBShellPrefer
 	gtk_dialog_add_button (GTK_DIALOG (shell_preferences),
 			       GTK_STOCK_CLOSE,
 			       GTK_RESPONSE_CLOSE);
-	help = gtk_dialog_add_button (GTK_DIALOG (shell_preferences),
+	tmp = gtk_dialog_add_button (GTK_DIALOG (shell_preferences),
 			              GTK_STOCK_HELP,
 			              GTK_RESPONSE_HELP);
-	g_signal_connect_object (G_OBJECT (help), "clicked",
+	g_signal_connect_object (G_OBJECT (tmp), "clicked",
 				 G_CALLBACK (help_cb), shell_preferences, 0);
 	gtk_dialog_set_default_response (GTK_DIALOG (shell_preferences),
 					 GTK_RESPONSE_CLOSE);
@@ -187,6 +189,14 @@ rb_shell_preferences_init (RBShellPrefer
 	shell_preferences->priv->first_seen_check =
 		glade_xml_get_widget (xml, "first_seen_check");
 
+	/* browser options */
+	rb_glade_boldify_label (xml, "browser_views_label");
+
+	tmp = glade_xml_get_widget (xml, "library_browser_views_radio");
+	shell_preferences->priv->browser_views_group =
+		g_slist_reverse (g_slist_copy (gtk_radio_button_get_group 
+					       (GTK_RADIO_BUTTON (tmp))));
+
 	gtk_notebook_append_page (GTK_NOTEBOOK (shell_preferences->priv->notebook),
 				  glade_xml_get_widget (xml, "general_vbox"),
 				  gtk_label_new (_("General")));
@@ -533,6 +543,7 @@ static void
 rb_shell_preferences_sync (RBShellPreferences *shell_preferences)
 {
 	char *columns;
+	GSList  *list;
 
 	shell_preferences->priv->loading = TRUE;
 
@@ -577,6 +588,10 @@ rb_shell_preferences_sync (RBShellPrefer
 	}
 
 	g_free (columns);
+
+	list = g_slist_nth (shell_preferences->priv->browser_views_group,
+			    eel_gconf_get_integer (CONF_UI_BROWSER_VIEWS));
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (list->data), TRUE);
 
 	shell_preferences->priv->loading = FALSE;
 }
Index: shell/rb-shell.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell.c,v
retrieving revision 1.407
diff -p -u -r1.407 rb-shell.c
--- shell/rb-shell.c	12 Mar 2006 23:01:00 -0000	1.407
+++ shell/rb-shell.c	17 Mar 2006 15:55:15 -0000
@@ -151,6 +151,10 @@ static void rb_shell_druid_response_cb (
 static void rb_shell_playlist_added_cb (RBPlaylistManager *mgr, RBSource *source, RBShell *shell);
 static void rb_shell_playlist_created_cb (RBPlaylistManager *mgr, RBSource *source, RBShell *shell);
 static void rb_shell_medium_added_cb (RBRemovableMediaManager *mgr, RBSource *source, RBShell *shell);
+static void rb_shell_transfer_progress_cb (RBRemovableMediaManager *mgr,
+					   gint done,
+					   gint total,
+					   RBShell *shell);
 static void rb_shell_source_deleted_cb (RBSource *source, RBShell *shell);
 static void rb_shell_set_window_title (RBShell *shell, const char *window_title);
 static void rb_shell_set_elapsed (RBShell *shell, guint elapsed);
@@ -315,6 +319,7 @@ enum
 	PROP_WINDOW,
 	PROP_PREFS,
 	PROP_QUEUE_SOURCE,
+	PROP_LIBRARY_SOURCE,
 };
 
 /* prefs */
@@ -615,7 +620,7 @@ rb_shell_class_init (RBShellClass *klass
 					 g_param_spec_object ("removable-media-manager",
 						 	      "RBRemovableMediaManager",
 							      "RBRemovableMediaManager object",
-							      RB_TYPE_SHELL_PLAYER,
+							      RB_TYPE_REMOVABLE_MEDIA_MANAGER,
 							      G_PARAM_READABLE));
 	g_object_class_install_property (object_class,
 					 PROP_WINDOW,
@@ -638,6 +643,13 @@ rb_shell_class_init (RBShellClass *klass
 							      "Queue source", 
 							      RB_TYPE_PLAY_QUEUE_SOURCE,
 							      G_PARAM_READABLE));
+	g_object_class_install_property (object_class,
+					 PROP_LIBRARY_SOURCE,
+					 g_param_spec_object ("library-source", 
+							      "library-source", 
+							      "Library source", 
+							      RB_TYPE_LIBRARY_SOURCE,
+							      G_PARAM_READABLE));
 
 
 	g_type_class_add_private (klass, sizeof (RBShellPrivate));
@@ -800,6 +812,9 @@ rb_shell_get_property (GObject *object,
 	case PROP_QUEUE_SOURCE:
 		g_value_set_object (value, shell->priv->queue_source);
 		break;	
+	case PROP_LIBRARY_SOURCE:
+		g_value_set_object (value, shell->priv->library_source);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -1243,6 +1258,8 @@ rb_shell_constructor (GType type,
 
 	g_signal_connect_object (G_OBJECT (shell->priv->removable_media_manager), "medium_added",
 				 G_CALLBACK (rb_shell_medium_added_cb), shell, 0);
+	g_signal_connect_object (G_OBJECT (shell->priv->removable_media_manager), "transfer-progress",
+				 G_CALLBACK (rb_shell_transfer_progress_cb), shell, 0);
 
 	rb_debug ("shell: loading ui");
 	gtk_ui_manager_insert_action_group (shell->priv->ui_manager,
@@ -1715,6 +1732,19 @@ rb_shell_medium_added_cb (RBRemovableMed
 			  RBShell *shell)
 {
 	rb_shell_append_source (shell, source, NULL);
+}
+
+static void
+rb_shell_transfer_progress_cb (RBRemovableMediaManager *mgr,
+			       gint done,
+			       gint total,
+			       RBShell *shell)
+{
+	rb_debug ("transferred %d tracks out of %d", done, total);
+	if (total > 0)
+		rb_statusbar_set_progress (shell->priv->statusbar, ((double)(done)/total), _("Transferring tracks"));
+	else
+		rb_statusbar_set_progress (shell->priv->statusbar, 0.0, NULL);
 }
 
 static void
Index: sources/rb-audiocd-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-audiocd-source.c,v
retrieving revision 1.25
diff -p -u -r1.25 rb-audiocd-source.c
--- sources/rb-audiocd-source.c	11 Mar 2006 00:58:54 -0000	1.25
+++ sources/rb-audiocd-source.c	17 Mar 2006 15:55:15 -0000
@@ -92,6 +92,9 @@ rb_audiocd_source_class_init (RBAudioCdS
 	/* don't bother showing the browser/search bits */
 	source_class->impl_can_search = (RBSourceFeatureFunc) rb_false_function;
 	source_class->impl_can_browse = (RBSourceFeatureFunc) rb_false_function;
+	source_class->impl_can_paste = (RBSourceFeatureFunc) rb_false_function;
+	source_class->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
+	source_class->impl_can_copy = (RBSourceFeatureFunc) rb_true_function;
 
 	source_class->impl_show_popup = impl_show_popup;
 	source_class->impl_delete_thyself = impl_delete_thyself;
@@ -269,6 +272,7 @@ rb_audiocd_create_track_entry (RBAudioCd
 	entry_set_string_prop (db, entry, FALSE, RHYTHMDB_PROP_ARTIST, NULL);
 	entry_set_string_prop (db, entry, FALSE, RHYTHMDB_PROP_ALBUM, NULL);
 	entry_set_string_prop (db, entry, FALSE, RHYTHMDB_PROP_GENRE, NULL);
+	entry_set_string_prop (db, entry, FALSE, RHYTHMDB_PROP_MIMETYPE, "audio/x-raw-int");
 
 	rhythmdb_commit (db);
 	g_free (audio_path);
@@ -584,7 +588,7 @@ impl_get_ui_actions (RBSource *source)
 {
 	GList *actions = NULL;
 
-	actions = g_list_prepend (actions, "MusicImportCD");
+	actions = g_list_prepend (actions, "RemovableSourceCopyAllTracks");
 	actions = g_list_prepend (actions, "RemovableSourceEject");
 
 	return actions;
Index: sources/rb-library-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-library-source.c,v
retrieving revision 1.155
diff -p -u -r1.155 rb-library-source.c
--- sources/rb-library-source.c	14 Mar 2006 13:28:54 -0000	1.155
+++ sources/rb-library-source.c	17 Mar 2006 15:55:15 -0000
@@ -28,10 +28,11 @@
 #include <glib/gi18n.h>
 #include <libgnomevfs/gnome-vfs.h>
 #include <glade/glade.h>
+#include <profiles/gnome-media-profiles.h>
+#include <profiles/audio-profile-choose.h>
 
 #include "rb-source.h"
 #include "rb-library-source.h"
-
 #include "rhythmdb-query-model.h"
 #include "rb-property-view.h"
 #include "rb-glade-helpers.h"
@@ -47,6 +48,7 @@
 #include "rb-search-entry.h"
 #include "rb-preferences.h"
 #include "rb-shell-preferences.h"
+#include "rb-removable-media-manager.h"
 
 static void rb_library_source_class_init (RBLibrarySourceClass *klass);
 static void rb_library_source_init (RBLibrarySource *source);
@@ -88,15 +90,16 @@ static void rb_library_source_ui_pref_ch
 					       guint cnxn_id,
 					       GConfEntry *entry,
 					       RBLibrarySource *source); 
-static void rb_library_source_library_location_changed (GConfClient *client,
-							guint cnxn_id,
-							GConfEntry *entry,
-							RBLibrarySource *source);
+static void rb_library_source_library_pref_changed (GConfClient *client,
+						    guint cnxn_id,
+						    GConfEntry *entry,
+						    RBLibrarySource *source);
 static void rb_library_source_location_button_clicked_cb (GtkButton *button,
 							  RBLibrarySource *source);
 static void rb_library_source_state_prefs_sync (RBLibrarySource *source);
 static void rb_library_source_ui_prefs_sync (RBLibrarySource *source);
 static void rb_library_source_preferences_sync (RBLibrarySource *source);
+
 /* source methods */
 static const char *impl_get_browser_key (RBSource *source);
 static RBEntryView *impl_get_entry_view (RBSource *source);
@@ -111,9 +114,9 @@ static gboolean impl_receive_drag (RBSou
 static gboolean impl_show_popup (RBSource *source);
 static const char * impl_get_paned_key (RBLibrarySource *source);
 static GList *impl_get_search_actions (RBSource *source);
+static gboolean impl_can_paste (RBSource *asource);
+static void impl_paste (RBSource *source, GList *entries);
 
-void rb_library_source_browser_views_activated_cb (GtkWidget *widget,
-						 RBLibrarySource *source);
 static void songs_view_drag_data_received_cb (GtkWidget *widget,
 					      GdkDragContext *dc,
 					      gint x, gint y,
@@ -124,6 +127,13 @@ static void rb_library_source_watch_togg
 						RBLibrarySource *source);
 static void rb_library_source_do_query (RBLibrarySource *source,
 					gboolean subset);
+						
+static void rb_library_source_path_changed_cb (GtkComboBox *box,
+						RBLibrarySource *source);
+static void rb_library_source_filename_changed_cb (GtkComboBox *box,
+						   RBLibrarySource *source);
+static void rb_library_source_format_changed_cb (GtkWidget *widget,
+						 RBLibrarySource *source);
 
 #define CONF_UI_LIBRARY_DIR CONF_PREFIX "/ui/library"
 #define CONF_STATE_LIBRARY_DIR CONF_PREFIX "/state/library"
@@ -131,13 +141,33 @@ static void rb_library_source_do_query (
 #define CONF_STATE_PANED_POSITION CONF_PREFIX "/state/library/paned_position"
 #define CONF_STATE_SHOW_BROWSER   CONF_PREFIX "/state/library/show_browser"
 
+
+typedef struct {
+	char *title;
+	char *path;
+} LibraryPathElement;
+
+const LibraryPathElement library_layout_paths[] = {
+	{N_("Artist/Album"), "%aa/%at"},
+	{N_("Artist - Album"), "%aa - %at"},
+	{N_("Artist/Artist - Album"), "%aa/%aa - %at"},
+};
+const int num_library_layout_paths = G_N_ELEMENTS (library_layout_paths);
+
+const LibraryPathElement library_layout_filenames[] = {
+	{N_("Artist - Title"), "%ta - %tt"},
+	{N_("Track - Title"), "%tn - %tt"},
+	{N_("Artist - Track - Title"), "%ta - %tn - %tt"},
+	{N_("Artist (Album) - Track - Title"), "%ta (%at) - %tn - %tt"},
+};
+const int num_library_layout_filenames = G_N_ELEMENTS (library_layout_filenames);
+
 struct RBLibrarySourcePrivate
 {
 	RhythmDB *db;
 	
 	RBLibraryBrowser *browser;
 	GtkWidget *vbox;
-	GSList *browser_views_group;
 
 	GdkPixbuf *pixbuf;
 
@@ -161,6 +191,9 @@ struct RBLibrarySourcePrivate
 
 	GtkWidget *library_location_entry;
 	GtkWidget *watch_library_check;
+	GtkWidget *layout_path_menu;
+	GtkWidget *layout_filename_menu;
+	GtkWidget *preferred_format_menu;
 	
 	RhythmDBEntryType entry_type;
 
@@ -169,7 +202,7 @@ struct RBLibrarySourcePrivate
 	guint state_paned_notify_id;
 	guint state_browser_notify_id;
 	guint state_sorting_notify_id;
-	guint library_location_notify_id;
+	guint library_pref_notify_id;
 };
 
 #define RB_LIBRARY_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RB_TYPE_LIBRARY_SOURCE, RBLibrarySourcePrivate))
@@ -231,6 +264,7 @@ rb_library_source_class_init (RBLibraryS
 	source_class->impl_song_properties = impl_song_properties;
 	source_class->impl_can_pause = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
+	source_class->impl_can_paste = (RBSourceFeatureFunc) impl_can_paste;
 	source_class->impl_can_copy = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_can_delete = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_can_add_to_queue = (RBSourceFeatureFunc) rb_true_function;
@@ -241,6 +275,7 @@ rb_library_source_class_init (RBLibraryS
 	source_class->impl_receive_drag = impl_receive_drag;
 	source_class->impl_show_popup = impl_show_popup;
 	source_class->impl_get_search_actions = impl_get_search_actions;
+	source_class->impl_paste = impl_paste;
 
 	klass->impl_get_paned_key = impl_get_paned_key;
 	klass->impl_has_first_added_column = (RBLibrarySourceFeatureFunc) rb_true_function;
@@ -265,13 +300,15 @@ rb_library_source_class_init (RBLibraryS
 							      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
 	g_type_class_add_private (klass, sizeof (RBLibrarySourcePrivate));
+
+	gnome_media_profiles_init (gconf_client_get_default ());
 }
 
 static void
-rb_library_source_library_location_changed (GConfClient *client,
-					    guint cnxn_id,
-					    GConfEntry *entry,
-					    RBLibrarySource *source)
+rb_library_source_library_pref_changed (GConfClient *client,
+					guint cnxn_id,
+					GConfEntry *entry,
+					RBLibrarySource *source)
 {
 	if (source->priv->config_widget)
 		rb_library_source_preferences_sync (source);
@@ -352,7 +389,7 @@ rb_library_source_finalize (GObject *obj
 	rb_debug ("finalizing library source");
 	
 	eel_gconf_notification_remove (source->priv->ui_dir_notify_id);
-	eel_gconf_notification_remove (source->priv->library_location_notify_id);
+	eel_gconf_notification_remove (source->priv->library_pref_notify_id);
 	eel_gconf_notification_remove (source->priv->state_browser_notify_id);
 	eel_gconf_notification_remove (source->priv->state_paned_notify_id);
 	eel_gconf_notification_remove (source->priv->state_sorting_notify_id);
@@ -541,9 +578,9 @@ rb_library_source_constructor (GType typ
 	source->priv->ui_dir_notify_id =
 		eel_gconf_notification_add (CONF_UI_LIBRARY_DIR,
 				    (GConfClientNotifyFunc) rb_library_source_ui_pref_changed, source);
-	source->priv->library_location_notify_id =
-		eel_gconf_notification_add (CONF_LIBRARY_LOCATION,
-				    (GConfClientNotifyFunc) rb_library_source_library_location_changed, source);
+	source->priv->library_pref_notify_id =
+		eel_gconf_notification_add (CONF_PREFIX,
+				    (GConfClientNotifyFunc) rb_library_source_library_pref_changed, source);
 
 	source->priv->cached_all_query = rhythmdb_query_model_new_empty (source->priv->db);
 	rb_library_browser_set_model (source->priv->browser, source->priv->cached_all_query, TRUE);
@@ -767,6 +804,7 @@ impl_get_config_widget (RBSource *asourc
 	RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
 	GtkWidget *tmp;
 	GladeXML *xml;
+	int i;
 
 	if (source->priv->config_widget)
 		return source->priv->config_widget;
@@ -777,33 +815,62 @@ impl_get_config_widget (RBSource *asourc
 	xml = rb_glade_xml_new ("library-prefs.glade", "library_vbox", source);
 	source->priv->config_widget =
 		glade_xml_get_widget (xml, "library_vbox");
-	tmp = glade_xml_get_widget (xml, "library_browser_views_radio");
-	source->priv->browser_views_group =
-		g_slist_reverse (g_slist_copy (gtk_radio_button_get_group 
-					       (GTK_RADIO_BUTTON (tmp))));
 
 	source->priv->library_location_entry = glade_xml_get_widget (xml, "library_location_entry");
-	source->priv->watch_library_check = glade_xml_get_widget (xml, "watch_library_check");
 	tmp = glade_xml_get_widget (xml, "library_location_button");
 	g_signal_connect (G_OBJECT (tmp),
 			  "clicked",
 			  G_CALLBACK (rb_library_source_location_button_clicked_cb),
 			  asource);
-
-	rb_glade_boldify_label (xml, "browser_views_label");
-	rb_glade_boldify_label (xml, "library_location_label");
-	g_object_unref (G_OBJECT (xml));
-	
-	rb_library_source_preferences_sync (source);
 	g_signal_connect (G_OBJECT (source->priv->library_location_entry),
 			  "focus-out-event",
 			  G_CALLBACK (rb_library_source_library_location_cb),
 			  asource);
+
+	source->priv->watch_library_check = glade_xml_get_widget (xml, "watch_library_check");
 	g_signal_connect (G_OBJECT (source->priv->watch_library_check),
 			  "toggled",
 			  G_CALLBACK (rb_library_source_watch_toggled_cb),
 			  asource);
 
+	tmp = glade_xml_get_widget (xml, "layout_path_menu_box");
+	source->priv->layout_path_menu = gtk_combo_box_new_text ();
+	gtk_box_pack_start_defaults (GTK_BOX (tmp), source->priv->layout_path_menu);
+	g_signal_connect (G_OBJECT (source->priv->layout_path_menu),
+			  "changed",
+			  G_CALLBACK (rb_library_source_path_changed_cb),
+			  asource);
+	for (i = 0; i < num_library_layout_paths; i++) {
+		gtk_combo_box_append_text (GTK_COMBO_BOX (source->priv->layout_path_menu),
+					   _(library_layout_paths[i].title));
+	}
+
+	tmp = glade_xml_get_widget (xml, "layout_filename_menu_box");
+	source->priv->layout_filename_menu = gtk_combo_box_new_text ();
+	gtk_box_pack_start_defaults (GTK_BOX (tmp), source->priv->layout_filename_menu);
+	g_signal_connect (G_OBJECT (source->priv->layout_filename_menu),
+			  "changed",
+			  G_CALLBACK (rb_library_source_filename_changed_cb),
+			  asource);
+	for (i = 0; i < num_library_layout_filenames; i++) {
+		gtk_combo_box_append_text (GTK_COMBO_BOX (source->priv->layout_filename_menu),
+					   _(library_layout_filenames[i].title));
+	}
+
+	tmp = glade_xml_get_widget (xml, "preferred_format_menu_box");
+	source->priv->preferred_format_menu = gm_audio_profile_choose_new ();
+	gtk_box_pack_start_defaults (GTK_BOX (tmp), source->priv->preferred_format_menu);
+	g_signal_connect (G_OBJECT (source->priv->preferred_format_menu),
+			  "changed",
+			  G_CALLBACK (rb_library_source_format_changed_cb),
+			  asource);
+
+	rb_glade_boldify_label (xml, "library_location_label");
+	rb_glade_boldify_label (xml, "library_structure_label");
+	g_object_unref (G_OBJECT (xml));
+	
+	rb_library_source_preferences_sync (source);
+
 	return source->priv->config_widget;
 }
 
@@ -840,13 +907,12 @@ static void
 rb_library_source_preferences_sync (RBLibrarySource *source)
 {
 	GSList *list;
+	const char *str;
+	gint i;
 
 	rb_debug ("syncing pref dialog state");
 
-	list = g_slist_nth (source->priv->browser_views_group,
-			    eel_gconf_get_integer (CONF_UI_BROWSER_VIEWS));
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (list->data), TRUE);
-
+	/* library location */
 	list = eel_gconf_get_string_list (CONF_LIBRARY_LOCATION);
 
 	/* don't trigger the change notification */
@@ -879,8 +945,27 @@ rb_library_source_preferences_sync (RBLi
 	g_slist_foreach (list, (GFunc) g_free, NULL);
 	g_slist_free (list);
 
+	/* watch checkbox */
 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (source->priv->watch_library_check),
 				      eel_gconf_get_boolean (CONF_MONITOR_LIBRARY));
+
+	/* layout path */
+	str = eel_gconf_get_string (CONF_LIBRARY_LAYOUT_PATH);
+	for (i = 0; i < num_library_layout_paths; i++) {
+		if (strcmp (str, library_layout_paths[i].path) == 0)
+			gtk_combo_box_set_active (GTK_COMBO_BOX (source->priv->layout_path_menu), i);
+	}
+
+	/* layout filename */
+	str = eel_gconf_get_string (CONF_LIBRARY_LAYOUT_FILENAME);
+	for (i = 0; i < num_library_layout_filenames; i++) {
+		if (strcmp (str, library_layout_filenames[i].path) == 0)
+			gtk_combo_box_set_active (GTK_COMBO_BOX (source->priv->layout_filename_menu), i);
+	}
+
+	/* preferred format */
+	str = eel_gconf_get_string (CONF_LIBRARY_PREFERRED_FORMAT);
+	gm_audio_profile_choose_set_active (source->priv->preferred_format_menu, str);
 }
 
 static void
@@ -919,20 +1004,6 @@ rb_library_source_watch_toggled_cb (GtkT
 }
 
 
-void
-rb_library_source_browser_views_activated_cb (GtkWidget *widget,
-					    RBLibrarySource *source)
-{
-	int index;
-
-	if (source->priv->loading_prefs == TRUE)
-		return;
-
-	index = g_slist_index (source->priv->browser_views_group, widget);
-
-	eel_gconf_set_integer (CONF_UI_BROWSER_VIEWS, index);
-}
-
 static void
 impl_delete (RBSource *asource)
 {
@@ -1099,36 +1170,39 @@ static gboolean
 impl_receive_drag (RBSource *asource, GtkSelectionData *data)
 {
 	RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
-	GList *list, *uri_list, *i;
+	GList *list, *i;
+	GList *entries = NULL;
 
 	rb_debug ("parsing uri list");
-	list = gnome_vfs_uri_list_parse ((char *) data->data);
+	list = rb_uri_list_parse ((const char *) data->data);
 
-	if (list == NULL)
-		return FALSE;
-
-	uri_list = NULL;
-
-	for (i = list; i != NULL; i = g_list_next (i))
-		uri_list = g_list_prepend (uri_list, gnome_vfs_uri_to_string ((const GnomeVFSURI *) i->data, 0));
-
-	gnome_vfs_uri_list_free (list);
+	for (i = list; i != NULL; i = g_list_next (i)) {
+		if (i->data != NULL) {
+			char *uri = i->data;
+			RhythmDBEntry *entry;
 
-	if (uri_list == NULL)
-		return FALSE;
-	
-	rb_debug ("adding uris");
+			entry = rhythmdb_entry_lookup_by_location (source->priv->db, uri);
 
-	for (i = uri_list; i != NULL; i = i->next) {
-		char *uri = i->data;
+			if (entry == NULL) {
+				/* add to the library */
+				rhythmdb_add_uri (source->priv->db, uri);
+			} else {
+				/* add to list of entries to copy */
+				entries = g_list_prepend (entries, entry);
+			}
 
-		if (uri != NULL)
-			rhythmdb_add_uri (source->priv->db, uri);
+			g_free (uri);
+		}
+	}
 
-		g_free (uri);
+	if (entries) {
+		entries = g_list_reverse (entries);
+		if (rb_source_can_paste (asource))
+			rb_source_paste (asource, entries);
+		g_list_free (entries);
 	}
 
-	g_list_free (uri_list);
+	g_list_free (list);
 	return TRUE;
 }
 
@@ -1204,6 +1278,340 @@ rb_library_source_browser_changed_cb (RB
 	g_object_unref (G_OBJECT (query_model));
 	
 	rb_source_notify_filter_changed (RB_SOURCE (source));
+}
+
+static void
+rb_library_source_path_changed_cb (GtkComboBox *box, RBLibrarySource *source)
+{
+	const char *path;
+	gint index;
+
+	index = gtk_combo_box_get_active (box);
+	path = (index >= 0) ? library_layout_paths[index].path : "";
+	eel_gconf_set_string (CONF_LIBRARY_LAYOUT_PATH, path);
+}
+
+static void
+rb_library_source_filename_changed_cb (GtkComboBox *box, RBLibrarySource *source)
+{
+	const char *filename;
+	gint index;
+
+	index = gtk_combo_box_get_active (box);
+	filename = (index >= 0) ? library_layout_filenames[index].path : "";
+	eel_gconf_set_string (CONF_LIBRARY_LAYOUT_FILENAME, filename);
+}
+
+static void
+rb_library_source_format_changed_cb (GtkWidget *widget, RBLibrarySource *source)
+{
+	GMAudioProfile *profile;
+
+	profile = gm_audio_profile_choose_get_active (widget);
+	eel_gconf_set_string (CONF_LIBRARY_PREFERRED_FORMAT, gm_audio_profile_get_id (profile));
+}
+
+/**
+ * Perform magic on a path to make it safe.
+ *
+ * This will always replace '/' with ' ', and optionally make the file name
+ * shell-friendly. This involves removing [?*\ ] and replacing with '_'.  Also
+ * any leading periods are removed so that the files don't end up being hidden.
+ */
+static char*
+sanitize_path (const char* str)
+{
+  gchar *res = NULL;
+  gchar *s;
+
+  /* Skip leading periods, otherwise files disappear... */
+  while (*str == '.')
+    str++;
+  
+  s = g_strdup(str);
+  /* Replace path seperators with a hyphen */
+  g_strdelimit (s, "/", '-');
+  if (eel_gconf_get_boolean (CONF_LIBRARY_STRIP_CHARS)) {
+    /* Replace separators with a hyphen */
+    g_strdelimit (s, "\\:|", '-');
+    /* Replace all other weird characters to whitespace */
+    g_strdelimit (s, "*?&!\'\"$()`>{}", ' ');
+    /* Replace all whitespace with underscores */
+    /* TODO: I'd like this to compress whitespace aswell */
+    g_strdelimit (s, "\t ", '_');
+  }
+  res = g_filename_from_utf8(s, -1, NULL, NULL, NULL);
+  g_free(s);
+  return res ? res : g_strdup(str);
+}
+
+
+/**
+ * Parse a filename pattern and replace markers with values from a TrackDetails
+ * structure.
+ *
+ * Valid markers so far are:
+ * %at -- album title
+ * %aa -- album artist
+ * %aA -- album artist (lowercase)
+ * %as -- album artist sortname
+ * %aS -- album artist sortname (lowercase)
+ * %tn -- track number (i.e 8)
+ * %tN -- track number, zero padded (i.e 08)
+ * %tt -- track title
+ * %ta -- track artist
+ * %tA -- track artist (lowercase)
+ * %ts -- track artist sortname
+ * %tS -- track artist sortname (lowercase)
+ */
+static char*
+filepath_parse_pattern (const char* pattern, RhythmDBEntry *entry)
+{
+  /* p is the pattern iterator, i is a general purpose iterator */
+  const char *p, *i;
+  /* string is the output string, s is the iterator, t is a general string */
+  char *string, *s, *temp;
+  s = string = g_new0 (char, 256); /* TODO: bad hardcoding */
+
+  p = pattern;
+  while (*p) {
+    /* If not a % marker, copy and continue */
+    if (*p != '%') {
+      *s++ = *p++;
+      /* Explicit increment as we continue past the increment */
+      continue;
+    }
+    /* Is a % marker, go to next and see what to do */
+    switch (*++p) {
+    case '%':
+      /*
+       * Literal %
+       */
+      *s++ = '%';
+      break;
+    case 'a':
+      /*
+       * Album tag
+       */
+      switch (*++p) {
+      case 't':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'T':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ALBUM_FOLDED));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'a':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'A':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST_FOLDED));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      /*case 's':
+        i = temp = sanitize_path (track->album->artist_sortname);
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'S':
+	tmp = g_utf8_strdown (track->album->artist_sortname, -1);
+	i = temp = sanitize_path (tmp);
+	g_free(tmp);
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;*/
+      default:
+        *s++ = '%'; *s++ = 'a'; *s++ = *p;
+      }
+      break;
+    case 't':
+      /*
+       * Track tag
+       */
+      switch (*++p) {
+      case 't':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_TITLE));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'T':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_TITLE_FOLDED));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'a':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'A':
+        i = temp = sanitize_path (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_ARTIST_FOLDED));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      /*case 's':
+        i = temp = sanitize_path (track->artist_sortname);
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'S':
+	tmp = g_utf8_strdown (track->artist_sortname, -1);
+        i = temp = sanitize_path (tmp);
+	g_free(tmp);
+	while (*i) *s++ = *i++;
+	g_free (temp);
+	break;*/
+      case 'n':
+        /* Track number */
+        i = temp = g_strdup_printf ("%u", (guint)rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_TRACK_NUMBER));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      case 'N':
+        /* Track number, zero-padded */
+        i = temp = g_strdup_printf ("%02u", (guint)rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_TRACK_NUMBER));
+        while (*i) *s++ = *i++;
+        g_free (temp);
+        break;
+      default:
+        *s++ = '%'; *s++ = 't'; *s++ = *p;
+      }
+      break;
+    default:
+      *s++ = '%';
+      *s++ = *p;
+    }
+    ++p;
+  }
+  *s = '\0';
+  return string;
+}
+
+/**
+ * Build the absolute filename for the specified track.
+ *
+ * The base path is the extern variable 'base_path', the format to use
+ * is the extern variable 'file_pattern'. Free the result when you
+ * have finished with it.
+ *
+ * Stolen from Sound-Juicer
+ */
+static char*
+build_filename (RBLibrarySource *source, RhythmDBEntry *entry)
+{
+	GnomeVFSURI *uri, *new;
+	char *realfile, *realpath, *filename, *string;
+	char *extension;
+	GSList *list;
+
+
+	list = eel_gconf_get_string_list (CONF_LIBRARY_LOCATION);
+	if (list == NULL) {
+		/* emit warning */
+		return NULL;
+	}
+
+	uri = gnome_vfs_uri_new ((const char *)list->data);
+	g_slist_free (list);
+
+	realpath = filepath_parse_pattern (eel_gconf_get_string (CONF_LIBRARY_LAYOUT_PATH), entry);
+	new = gnome_vfs_uri_append_path (uri, realpath);
+	gnome_vfs_uri_unref (uri); uri = new;
+	g_free (realpath);
+
+	if (g_str_has_prefix (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_MIMETYPE), "audio/x-raw")) {
+		GMAudioProfile *profile;
+		profile = gm_audio_profile_lookup (eel_gconf_get_string (CONF_LIBRARY_PREFERRED_FORMAT));
+		extension = g_strdup (gm_audio_profile_get_extension (profile));
+	} else {
+		char *tmp;
+		
+		/* use the old extension. strip anything after a '?' for http/daap/etc */
+		extension = g_strdup (g_utf8_strrchr (rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION), -1, '.') + 1);
+
+		tmp = g_utf8_strchr (extension, -1, '?');
+		if (tmp)
+			*tmp = '\0';
+	}
+	
+	realfile = filepath_parse_pattern (eel_gconf_get_string (CONF_LIBRARY_LAYOUT_FILENAME), entry);
+	if (extension) {
+		filename = g_strdup_printf ("%s.%s", realfile, extension);
+		g_free (realfile);
+	} else {
+		filename = realfile;
+	}
+
+	new = gnome_vfs_uri_append_file_name (uri, filename);
+	gnome_vfs_uri_unref (uri); uri = new;
+	g_free (extension);
+	g_free (filename);
+
+	string = gnome_vfs_uri_to_string (uri, 0);
+	gnome_vfs_uri_unref (uri);
+	return string;
+}
+
+static gboolean
+impl_can_paste (RBSource *asource)
+{
+	GSList *list;
+
+	list = eel_gconf_get_string_list (CONF_LIBRARY_LOCATION);
+	if (list == NULL)
+		return FALSE;
+
+	g_slist_free (list);
+	return TRUE;
+}
+
+static void
+completed_cb (RhythmDBEntry *entry, const char *dest, RBLibrarySource *source)
+{
+	rhythmdb_add_uri (source->priv->db, dest);
+}
+
+static void
+impl_paste (RBSource *asource, GList *entries)
+{
+	RBLibrarySource *source = RB_LIBRARY_SOURCE (asource);
+	RBRemovableMediaManager *rm_mgr;
+	GList *l;
+	RBShell *shell;
+
+	g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+	g_object_get (G_OBJECT (shell), "removable-media-manager", &rm_mgr, NULL);
+	g_object_unref (G_OBJECT (shell));
+
+	for (l = entries; l != NULL; l = g_list_next (l)) {
+		RhythmDBEntry *entry = (RhythmDBEntry *)l->data;
+		RhythmDBEntryType entry_type;
+		char *dest;
+
+		entry_type = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_TYPE);
+		if (entry_type == RHYTHMDB_ENTRY_TYPE_IRADIO_STATION ||
+		    entry_type == RHYTHMDB_ENTRY_TYPE_PODCAST_FEED ||
+		    entry_type == RHYTHMDB_ENTRY_TYPE_PODCAST_POST)
+			continue;
+
+		dest = build_filename (source, entry);
+		if (dest == NULL) {
+			rb_debug ("could not create destination path for entry");
+			continue;
+		}
+
+		rb_removable_media_manager_queue_transfer (rm_mgr, entry,
+							  dest, NULL,
+							  (RBTranferCompleteCallback)completed_cb, source);
+	}
+
+	g_object_unref (G_OBJECT (rm_mgr));
 }
 
 static void
Index: sources/rb-removable-media-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-removable-media-source.c,v
retrieving revision 1.11
diff -p -u -r1.11 rb-removable-media-source.c
--- sources/rb-removable-media-source.c	9 Mar 2006 10:26:12 -0000	1.11
+++ sources/rb-removable-media-source.c	17 Mar 2006 15:55:15 -0000
@@ -87,7 +87,8 @@ rb_removable_media_source_class_init (RB
 
 	source_class->impl_delete_thyself = impl_delete_thyself;
 	source_class->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
-	source_class->impl_can_copy = (RBSourceFeatureFunc) rb_false_function;
+	source_class->impl_can_copy = (RBSourceFeatureFunc) rb_true_function;
+	source_class->impl_can_paste = (RBSourceFeatureFunc) rb_false_function;
 	source_class->impl_can_delete = (RBSourceFeatureFunc) rb_false_function;
 	source_class->impl_receive_drag = NULL;
 	source_class->impl_can_move_to_trash = (RBSourceFeatureFunc) rb_false_function;
Index: sources/rb-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-source.c,v
retrieving revision 1.61
diff -p -u -r1.61 rb-source.c
--- sources/rb-source.c	12 Mar 2006 23:01:00 -0000	1.61
+++ sources/rb-source.c	17 Mar 2006 15:55:16 -0000
@@ -127,6 +127,7 @@ rb_source_class_init (RBSourceClass *kla
 	klass->impl_can_rename = default_can_rename;
 	klass->impl_can_search = default_can_search;
 	klass->impl_can_cut = (RBSourceFeatureFunc) rb_false_function;
+	klass->impl_can_paste = (RBSourceFeatureFunc) rb_false_function;
 	klass->impl_can_delete = (RBSourceFeatureFunc) rb_false_function;
 	klass->impl_can_copy = (RBSourceFeatureFunc) rb_false_function;
 	klass->impl_can_add_to_queue = (RBSourceFeatureFunc) rb_false_function;
@@ -578,6 +579,14 @@ rb_source_can_cut (RBSource *source)
 	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
 
 	return klass->impl_can_cut (source);
+}
+
+gboolean
+rb_source_can_paste (RBSource *source)
+{
+	RBSourceClass *klass = RB_SOURCE_GET_CLASS (source);
+
+	return klass->impl_can_paste (source);
 }
 
 gboolean
Index: sources/rb-source.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-source.h,v
retrieving revision 1.39
diff -p -u -r1.39 rb-source.h
--- sources/rb-source.h	12 Mar 2006 23:01:00 -0000	1.39
+++ sources/rb-source.h	17 Mar 2006 15:55:16 -0000
@@ -90,6 +90,7 @@ struct _RBSourceClass
 	gboolean	(*impl_can_delete)	(RBSource *source);
 	gboolean	(*impl_can_move_to_trash) (RBSource *source);
 	gboolean	(*impl_can_copy)	(RBSource *source);
+	gboolean	(*impl_can_paste)	(RBSource *source);
 	gboolean	(*impl_can_add_to_queue)(RBSource *source);
 	
 	GList *		(*impl_cut)		(RBSource *source);
@@ -153,6 +154,7 @@ gboolean	rb_source_can_cut		(RBSource *s
 gboolean	rb_source_can_delete		(RBSource *source);
 gboolean	rb_source_can_move_to_trash	(RBSource *source);
 gboolean	rb_source_can_copy		(RBSource *source);
+gboolean	rb_source_can_paste		(RBSource *source);
 gboolean	rb_source_can_add_to_queue	(RBSource *source);
 
 GList *		rb_source_cut			(RBSource *source);
Index: sources/rb-sourcelist-model.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-sourcelist-model.c,v
retrieving revision 1.20
diff -p -u -r1.20 rb-sourcelist-model.c
--- sources/rb-sourcelist-model.c	27 Feb 2006 00:27:43 -0000	1.20
+++ sources/rb-sourcelist-model.c	17 Mar 2006 15:55:16 -0000
@@ -345,7 +345,7 @@ path_is_droppable (RBSourceListModel *mo
 		gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
 				    RB_SOURCELIST_MODEL_COLUMN_SOURCE, &source, -1);
 		
-		return rb_source_can_cut (source);
+		return rb_source_can_paste (source);
 
 	}
 	return FALSE;
Index: sources/rb-static-playlist-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-static-playlist-source.c,v
retrieving revision 1.16
diff -p -u -r1.16 rb-static-playlist-source.c
--- sources/rb-static-playlist-source.c	15 Mar 2006 09:16:44 -0000	1.16
+++ sources/rb-static-playlist-source.c	17 Mar 2006 15:55:16 -0000
@@ -126,7 +126,7 @@ rb_static_playlist_source_class_init (RB
 	object_class->finalize = rb_static_playlist_source_finalize;
 
 	source_class->impl_can_cut = (RBSourceFeatureFunc) rb_true_function;
-	source_class->impl_can_copy = (RBSourceFeatureFunc) rb_true_function;
+	source_class->impl_can_paste = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_can_delete = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_cut = impl_cut;
 	source_class->impl_paste = impl_paste;
