[Rhythmbox-devel] ipod source patch



Hi,

Attached to this mail is a patch against CVS HEAD which makes rhythmbox
use libgpod to parse the iPod content. libgpod
( http://www.gtkpod.org/libgpod.html ) is a library based on gtkpod code
which will be used by gtkpod in future releases. Using it in rhythmbox
has the advantage of less code to maintain, but it adds an additional
external dependency, that's why I'm sending this mail before committing
this patch, to know if people have issue with that new dep.
Incidentally, the patch should make rhythmbox display (read-only) ipod
playlists.

Christophe
? =
? burner.Diff
? burner.diff
? burner.diuff
? conf11657.file
? playbin.diff
? playlist.diff
? queue-set.diff
? rb-ipod-source-libgpod.diff
? rb-ipod-source.c
? rhythmbox-audioscrobbler-libsoup-new-files.tar.bz2
? rhythmbox-gpod.diff
? treeview.diff
? data/glade/audioscrobbler-prefs.glade
? lib/md5.c
? lib/md5.h
? remote/dbus/rb-remote-dbus.loT
? shell/rb-audioscrobbler.c
? shell/rb-audioscrobbler.h
? sources/rb-audioscrobbler.c
Index: configure.ac
===================================================================
RCS file: /cvs/gnome/rhythmbox/configure.ac,v
retrieving revision 1.170
diff -u -r1.170 configure.ac
--- configure.ac	15 Sep 2005 12:10:48 -0000	1.170
+++ configure.ac	18 Sep 2005 18:07:00 -0000
@@ -71,6 +71,7 @@
 	if test x$enable_hal05 != xyes; then
 	   PKG_CHECK_MODULES(HAL, hal >= 0.2.92 hal < 0.5 gnome-vfs-2.0 >= 2.7.4, enable_hal02=yes, enable_hal02=no)
 	fi
+	PKG_CHECK_MODULES(IPOD, libgpod-1.0)
 	if test x$enable_hal05 == xyes || test x$enable_hal02 == xyes; then
   	  enable_hal=yes
 	else
@@ -88,6 +89,10 @@
 	      AC_DEFINE(HAVE_HAL_0_2, 1, [Define if you have HAL 0.2 or later])
 	   fi
 	fi
+	AC_SUBST(HAL_CFLAGS)
+	AC_SUBST(HAL_LIBS)
+	AC_SUBST(IPOD_CFLAGS)
+	AC_SUBST(IPOD_LIBS)
 fi			  
 AM_CONDITIONAL(USE_IPOD, test x"$enable_ipod" = xyes)
 
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/Makefile.am,v
retrieving revision 1.58
diff -u -r1.58 Makefile.am
--- shell/Makefile.am	15 Sep 2005 05:41:14 -0000	1.58
+++ shell/Makefile.am	18 Sep 2005 18:07:00 -0000
@@ -100,6 +100,11 @@
 
 endif
 
+if USE_IPOD
+rhythmbox_LDADD += $(IPOD_LIBS)
+endif
+
+
 # i hate link order problems
 rhythmbox_LDADD += $(top_builddir)/remote/librbremote.la
 
Index: sources/Makefile.am
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/Makefile.am,v
retrieving revision 1.24
diff -u -r1.24 Makefile.am
--- sources/Makefile.am	11 Sep 2005 03:05:11 -0000	1.24
+++ sources/Makefile.am	18 Sep 2005 18:07:00 -0000
@@ -1,5 +1,4 @@
 ## arch-tag: Automake rules for source object library
-
 noinst_LTLIBRARIES = libsources.la libsourcesimpl.la
 
 libsources_la_SOURCES = rb-source.c rb-source.h
@@ -47,9 +46,8 @@
 if USE_IPOD
 libsourcesimpl_la_SOURCES +=         \
 	rb-ipod-source.c             \
-	rb-ipod-source.h	     \
-	itunesdb.c		     \
-	itunesdb.h
+	rb-ipod-source.h
+INCLUDES += -I$(top_srcdir)/sources/ipod $(IPOD_CFLAGS)
 endif
 
 if USE_CD_BURNER
Index: sources/rb-ipod-source.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/sources/rb-ipod-source.c,v
retrieving revision 1.21
diff -u -r1.21 rb-ipod-source.c
--- sources/rb-ipod-source.c	11 Sep 2005 03:05:11 -0000	1.21
+++ sources/rb-ipod-source.c	18 Sep 2005 18:07:00 -0000
@@ -28,7 +28,6 @@
 #include <gtk/gtktreeview.h>
 #include <gtk/gtkicontheme.h>
 #include <string.h>
-#include "itunesdb.h"
 #include "rhythmdb.h"
 #include <libgnome/gnome-i18n.h>
 #ifdef HAVE_HAL
@@ -37,8 +36,10 @@
 #endif
 #include <libgnomevfs/gnome-vfs-volume.h>
 #include <libgnomevfs/gnome-vfs-volume-monitor.h>
+#include <gpod/itdb.h>
 #include "eel-gconf-extensions.h"
 #include "rb-ipod-source.h"
+#include "rb-playlist-source.h"
 #include "rb-stock-icons.h"
 #include "rb-debug.h"
 #include "rb-util.h"
@@ -48,9 +49,14 @@
 			       GObjectConstructParam *construct_properties);
 static void rb_ipod_source_dispose (GObject *object);
 
+static GObject *rb_ipod_source_constructor (GType type, guint n_construct_properties,
+			       GObjectConstructParam *construct_properties);
+static void rb_ipod_source_dispose (GObject *object);
+
 static gboolean impl_show_popup (RBSource *source);
 static void rb_ipod_load_songs (RBiPodSource *source);
 static gchar *rb_ipod_get_mount_path (GnomeVFSVolume *volume);
+static void impl_delete_thyself (RBSource *source);
 
 #ifdef HAVE_HAL
 static gboolean hal_udi_is_ipod (const char *udi);
@@ -58,7 +64,7 @@
 
 typedef struct
 {
-	iPodParser *parser;
+	Itdb_iTunesDB *ipod_db;
 	gchar *ipod_mount_path;
 } RBiPodSourcePrivate;
 
@@ -78,6 +84,7 @@
 	object_class->dispose = rb_ipod_source_dispose;
 
 	source_class->impl_show_popup = impl_show_popup;
+	source_class->impl_delete_thyself = impl_delete_thyself;
 
 	g_type_class_add_private (klass, sizeof (RBiPodSourcePrivate));
 }
@@ -109,10 +116,10 @@
 {
 	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (object);
 
-	if (priv->parser != NULL) {
-		ipod_parser_destroy (priv->parser);
-		priv->parser = NULL;
-	}
+ 	if (priv->ipod_db != NULL) {
+ 		itdb_free (priv->ipod_db);
+ 		priv->ipod_db = NULL;
+  	}
 
 	if (priv->ipod_mount_path) {
 		g_free (priv->ipod_mount_path);
@@ -159,52 +166,110 @@
 	g_value_unset (&value);
 }
 
-#define MAX_SONGS_LOADED_AT_ONCE 250
 
-static gboolean
-load_ipod_db_idle_cb (RBiPodSource *source)
+static char *
+ipod_path_to_uri (const char *mount_point, const char *ipod_path)
+{
+ 	char *rel_pc_path;
+ 	char *full_pc_path;
+ 	char *uri;
+	
+ 	rel_pc_path = g_strdup (ipod_path);	
+ 	itdb_filename_ipod2fs (rel_pc_path);
+ 	full_pc_path = g_build_filename (mount_point, rel_pc_path, NULL);
+ 	g_free (rel_pc_path);
+ 	uri = g_filename_to_uri (full_pc_path, NULL, NULL);
+ 	g_free (full_pc_path);
+ 	return uri;
+}
+
+static void
+add_rb_playlist (RBiPodSource *source, Itdb_Playlist *playlist)
 {
-	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
-	RhythmDBEntry *entry;
 	RBShell *shell;
-	RhythmDB *db;
-	int i;
-	RhythmDBEntryType entry_type;
+	RBSource *playlist_source;
+	GList *it;
+	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
+
+  	g_object_get (G_OBJECT (source), "shell", &shell, NULL);
 
-	g_object_get (G_OBJECT (source), "shell", &shell, NULL);
-	g_object_get (G_OBJECT (shell), "db", &db, NULL);
+	playlist_source = RB_SOURCE (g_object_new (RB_TYPE_PLAYLIST_SOURCE,
+						   "name", playlist->name,
+						   "shell", shell,
+						   "visibility", TRUE,
+						   "is-local", FALSE,
+						   NULL));
+
+	for (it = playlist->members; it != NULL; it = it->next) {
+		Itdb_Track *song;
+		char *filename;
+
+		song = (Itdb_Track *)it->data;
+ 		filename = ipod_path_to_uri (priv->ipod_mount_path, 
+ 					    song->ipod_path);
+		rb_playlist_source_add_location (RB_PLAYLIST_SOURCE (playlist_source),
+						 filename);
+		g_free (filename);
+	}
+
+	rb_shell_append_source (shell, playlist_source, RB_SOURCE (source));
 	g_object_unref (G_OBJECT (shell));
-	g_object_get (G_OBJECT (source), "entry-type", &entry_type, NULL);
+}
 
-	g_assert (db != NULL);
-	g_assert (priv->parser != NULL);
 
-	for (i = 0; i < MAX_SONGS_LOADED_AT_ONCE; i++) {
-		gchar *pc_path, *pc_vfs_path;
-		gchar *mount_path;
-		iPodItem *item;
-		iPodSong *song;
-		
-		item = ipod_get_next_item (priv->parser);
-		if ((item == NULL) || (item->type != IPOD_ITEM_SONG)) {
-			ipod_item_destroy (item);
-			ipod_parser_destroy (priv->parser);
-			priv->parser = NULL;
-			g_object_unref (G_OBJECT (db));
-			return FALSE;
+static void
+load_ipod_playlists (RBiPodSource *source)
+{
+	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
+	GList *it;
+
+	for (it = priv->ipod_db->playlists; it != NULL; it = it->next) {
+		Itdb_Playlist *playlist;
+
+		playlist = (Itdb_Playlist *)it->data;
+		if (playlist->type == ITDB_PL_TYPE_MPL) {
+			continue;
 		}
-		song = (iPodSong *)item->data;
-				
-		/* Set URI */
-		mount_path = priv->ipod_mount_path;
-		pc_path = itunesdb_get_track_name_on_ipod (mount_path, song);
-		pc_vfs_path = g_strdup_printf ("file://%s", pc_path);
-		g_free (pc_path);
-		entry = rhythmdb_entry_new (RHYTHMDB (db), 
-					    entry_type,
-					    pc_vfs_path);
-		g_free (pc_vfs_path);
+		if (playlist->is_spl) {
+			continue;
+		}
+
+		add_rb_playlist (source, playlist);
+	}
 
+}
+
+static gboolean
+load_ipod_db_idle_cb (RBiPodSource *source)
+{
+	RBShell *shell;
+	RhythmDB *db;
+ 	GList *it;
+	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
+  
+  	g_object_get (G_OBJECT (source), "shell", &shell, NULL);
+  	g_object_get (G_OBJECT (shell), "db", &db, NULL);
+  	g_object_unref (G_OBJECT (shell));
+  
+  	g_assert (db != NULL);
+ 	for (it = priv->ipod_db->tracks; it != NULL; it = it->next) {
+ 		Itdb_Track *song;
+ 		RhythmDBEntry *entry;
+		RhythmDBEntryType entry_type;
+ 		char *pc_path;
+
+ 		song = (Itdb_Track *)it->data;
+  		
+  		/* Set URI */
+		g_object_get (G_OBJECT (source), "entry-type", &entry_type, 
+			      NULL);
+
+ 		pc_path = ipod_path_to_uri (priv->ipod_mount_path, 
+ 					    song->ipod_path);
+  		entry = rhythmdb_entry_new (RHYTHMDB (db), entry_type,
+ 					    pc_path);
+ 		g_free (pc_path);
+  
 		rb_debug ("Adding %s from iPod", pc_path);
 
 		/* Set track number */
@@ -262,8 +327,7 @@
 			g_value_unset (&value);
 		}
 		
-		/* Set title */
-		
+		/* Set title */		
 		entry_set_string_prop (RHYTHMDB (db), entry, 
 				       RHYTHMDB_PROP_TITLE, song->title);
 		
@@ -278,13 +342,13 @@
 				       RHYTHMDB_PROP_GENRE, song->genre);
 		
 		rhythmdb_commit (RHYTHMDB (db));
-
-
-		ipod_item_destroy (item);
+	
 	}
 
+	load_ipod_playlists (source);
+
 	g_object_unref (G_OBJECT (db));
-	return TRUE;
+	return FALSE;
 }
 
 static void
@@ -295,10 +359,11 @@
 
 	g_object_get (G_OBJECT (source), "volume", &volume, NULL);
 	priv->ipod_mount_path = rb_ipod_get_mount_path (volume);
-	g_object_unref (G_OBJECT (volume));
-	priv->parser = ipod_parser_new (priv->ipod_mount_path);
 
-	g_idle_add ((GSourceFunc)load_ipod_db_idle_cb, source);
+ 	priv->ipod_db = itdb_parse (priv->ipod_mount_path, NULL);
+	if (priv->ipod_db != NULL) {
+		g_idle_add ((GSourceFunc)load_ipod_db_idle_cb, source);
+	}
 }
 
 static gchar *
@@ -458,4 +523,15 @@
 {
 	_rb_source_show_popup (RB_SOURCE (source), "/iPodSourcePopup");
 	return TRUE;
+}
+
+static void
+impl_delete_thyself (RBSource *source)
+{
+	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
+
+	itdb_free (priv->ipod_db);
+	priv->ipod_db = NULL;
+
+	RB_SOURCE_CLASS (rb_ipod_source_parent_class)->impl_delete_thyself (source);
 }

Attachment: signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]