Re: [Rhythmbox-devel] Update : Download and show albums covers



And here is a bigger patch cleaning some memory leaks. It's probably
better to review it carefully since I coded it quickly while browsing
the rb-album-cover.c source file. I removed the if (pointer) g_free
(pointer) tests since g_free (NULL) 'works' (ie it silently returns), so
the test isn't useful.
The "No Cover Found"/"Searching Cover" can't be bitmaps for i18n/a11y
reasons, maybe the best thing to do it to just hide the cover entry when
there is nothing to show?
The rb_album_cover_load_xml_async and   rb_album_cover_load_async
functions (and the various callbacks they use) are pretty similar, would
it help if gnome-vfs provided a gnome_vfs_read_entire_file_async
function (ie could such a function be used to simplify this code)? I
haven't looked at the code in detail, so maybe it's not that easy ;)

Christophe

Le samedi 11 décembre 2004 à 21:27 +0100, Christophe Fergeau a écrit :
> Hi,
> 
> I finally gave a try to your arch tree (I also added it to rb website
> development page, it will show up when the web site is synced with the
> content of the arch repo). All in all, it's working really nicely though
> I'm not a big fan of the UI decisions :-/ I also had to apply the small
> attached patch, otherwise it crashed when I tried to play a song.
> The bottom left part of rb window is too big to display an amazon cover,
> some look really fuzzy... 
> The "cover manager" should probably be integrated somehow with the song
> properties and extended to be a "fix my song tags using amazon" a bit
> like http://www.softpointer.com/images/TRAll.gif I'm not sure how to get
> that 100% right though since song properties are per song, and this
> "cover editor/tag fixer" would be per album. This is just food for
> thought anyway ;)
> Finally, I think I'd just grab the missing covers from amazon at startup
> without asking the user or requiring him to go to the cover editor.
> 
> All in all, excellent travail ;) , cheers,
> 
> Christophe
> 
> 
> Le jeudi 09 décembre 2004 à 16:47 +0100, Marc Pavot a écrit :
> > Hi,
> > 
> > I have made a lot of changes in my arch branch for the support of the 
> > album covers. It now works like this :
> > 
> > *When you play a song :
> > - It search a cover in ~/.gnome2/rhythmbox/covers
> > - If none is found, it search a cover in the directory of the song
> > - If none is found, it search a cover on amazon.com
> > - If a cover is found in one of this place, the cover is displayed and 
> > saved in ~/.gnome2/rhythmbox/covers.
> > 
> > *When you launch the cover manager (screenshot : 
> > http://perso.enst.fr/~pavot/Capture3.png
> > - It now shows all the covers found in ~/.gnome2/rhythmbox/covers with a 
> > tree structure (Artist/Album)
> > - You can :
> >        - Automatically get all the covers of an artist (or of all 
> > artists) from the directory of the albums.
> >        - Automatically download all the covers of an artist (or of all 
> > artists) from amazon.
> >        - Download a cover from amazon and select between different 
> > covers and different sizes if you only select one album.
> >        - Choose a cover for an album on your hard disk if you only 
> > select one album.
> > 
> > All your comments, ideas and bug reports are really welcome.
> > 
> > Marc
> > 
> > PS : my arch branch is here:
> > m pavot laposte net--2004
> > http://perso.enst.fr/~pavot/archive
> > 
> > 
> > _______________________________________________
> > rhythmbox-devel mailing list
> > rhythmbox-devel gnome org
> > http://mail.gnome.org/mailman/listinfo/rhythmbox-devel
> > 
> > 
> _______________________________________________
> rhythmbox-devel mailing list
> rhythmbox-devel gnome org
> http://mail.gnome.org/mailman/listinfo/rhythmbox-devel
* looking for m pavot laposte net--2004/rhythmbox--main--0.8--patch-17 to compare with
* comparing to m pavot laposte net--2004/rhythmbox--main--0.8--patch-17
M  widgets/rb-album-cover.c

* modified files

--- orig/widgets/rb-album-cover.c
+++ mod/widgets/rb-album-cover.c
@@ -53,10 +53,10 @@
 static char* rb_album_cover_find_local_image (RBAlbumCover* album_cover, 
 						const char *location);
 static void rb_album_cover_find_amazon_image (RBAlbumCover *album_cover, 
-					      char *artist, 
-					      char *album);
+					      const char *artist, 
+					      const char *album);
 static void rb_album_cover_load_xml_async (RBAlbumCover *album_cover, 
-			       char *xml_uri);
+					   const char *xml_uri);
 static void rb_album_cover_xml_open_cb (GnomeVFSAsyncHandle *handle,
 			    GnomeVFSResult result,
 			    RBAlbumCover *album_cover);
@@ -106,8 +106,7 @@
 rb_album_cover_save_cover_close_cb (GnomeVFSAsyncHandle *handle,
 			            GnomeVFSResult result, 
 			            RBAlbumCover *album_cover);
-			       
-					   					   
+
 struct RBAlbumCoverPrivate
 {	
 	GtkWidget *image;
@@ -227,15 +226,9 @@
 
 	rb_album_cover_set_nocover (album_cover);
 	
-	album_cover->priv->uri = NULL;
-	album_cover->priv->artist = "";
-	album_cover->priv->album = "";
-	album_cover->priv->uri_has_changed = FALSE;
-
-	album_cover->priv->size = 0;
+	album_cover->priv->artist = g_strdup ("");
+	album_cover->priv->album = g_strdup ("");
 	album_cover->priv->searching_cover = -1;
-	album_cover->priv->xmldata = NULL;
-	album_cover->priv->imagedata = NULL;
 }
 
 static void
@@ -250,12 +243,9 @@
 
 	g_return_if_fail (album_cover->priv != NULL);
 
-	if (album_cover->priv->uri) 
-		g_free (album_cover->priv->uri);
-	if (album_cover->priv->artist) 
-		g_free (album_cover->priv->artist);
-	if (album_cover->priv->album) 
-		g_free (album_cover->priv->album);
+	g_free (album_cover->priv->uri);
+	g_free (album_cover->priv->artist);
+	g_free (album_cover->priv->album);
 	g_free (album_cover->priv);
 
 	G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -280,28 +270,23 @@
 		/* Check if the uri has changed. If not, don't do anything :-) */
 		if (rb_album_cover_uris_equal (album_cover->priv->uri, uri)) 
 			return;
-		if (album_cover->priv->imagedata)
-			g_free (album_cover->priv->imagedata);
-		if (album_cover->priv->xmldata)
-			g_free (album_cover->priv->xmldata);
+		g_free (album_cover->priv->imagedata);
+		g_free (album_cover->priv->xmldata);
+		g_free (album_cover->priv->uri);
 		album_cover->priv->imagedata = NULL;
 		album_cover->priv->xmldata = NULL;
 		album_cover->priv->size = 0;
-		if (album_cover->priv->uri)
-			g_free (album_cover->priv->uri);
 		album_cover->priv->uri = g_strdup (uri);
 		album_cover->priv->uri_has_changed = TRUE;
 		break;
 	case PROP_ARTIST:
 		artist = g_value_get_string (value);
-		if (album_cover->priv->artist)
-			g_free (album_cover->priv->artist);
+		g_free (album_cover->priv->artist);
 		album_cover->priv->artist = g_strdup (artist);
 		break;
 	case PROP_ALBUM:
 		album = g_value_get_string (value);
-		if (album_cover->priv->album)
-			g_free (album_cover->priv->album);
+		g_free (album_cover->priv->album);
 		album_cover->priv->album = g_strdup (album);
 		break;
 	default:
@@ -334,8 +319,8 @@
 	}
 }
 
-GtkWidget 
-*rb_album_cover_new (void)
+GtkWidget *
+rb_album_cover_new (void)
 {
 	RBAlbumCover *album_cover;
 
@@ -419,10 +404,13 @@
 	g_object_set (G_OBJECT (album_cover), "artist", artist, NULL);
 	g_object_set (G_OBJECT (album_cover), "album", album, NULL);
 	
-	cover_home = g_strdup (rb_album_cover_make_cover_path (artist, album));
+	cover_home = rb_album_cover_make_cover_path (artist, album);
 	
-	if (rb_uri_exists(cover_home))
-		cover_uri = g_strdup (cover_home);
+	if (rb_uri_exists(cover_home)) {
+		cover_uri = cover_home;
+	} else { 
+		g_free (cover_home);
+	}
 
 	if (!cover_uri) {
 		if (!location) {
@@ -433,7 +421,6 @@
 	}	
 
 	if (!cover_uri) {
-		g_free (cover_uri);
 		rb_album_cover_find_amazon_image (album_cover, 
 						  artist,
 						  album);
@@ -507,26 +494,30 @@
 	
 static void 
 rb_album_cover_find_amazon_image (RBAlbumCover *album_cover, 
-					      char *artist, 
-					      char *album)
+				  const char *artist, 
+				  const char *album)
 {
 	char *xml_uri;
+	char *tmp;
 	
-	xml_uri =  g_strdup_printf ("%s %s", artist, album);
-
-	xml_uri = gnome_vfs_escape_path_string (xml_uri);
-
-	xml_uri = g_strdup_printf ("http://xml.amazon.com/onca/xml3?t=webservices-20&dev-t=D1EEUYQ7Y68BJ3&KeywordSearch=%s&mode=music&type=lite&page=1&f=xml";, xml_uri);
+	xml_uri = g_strdup_printf ("%s %s", artist, album);
+	tmp = gnome_vfs_escape_path_string (xml_uri);
+	g_free (xml_uri);
+	xml_uri = g_strdup_printf ("http://xml.amazon.com/onca/xml3?t=webservices-20&dev-t=D1EEUYQ7Y68BJ3&KeywordSearch=%s&mode=music&type=lite&page=1&f=xml";, tmp);
+	g_free (tmp);
 	
 	rb_album_cover_load_xml_async (album_cover, xml_uri);
+	g_free (xml_uri);
 }
 
 static void
 rb_album_cover_load_xml_async (RBAlbumCover *album_cover, 
-			       char *xml_uri)
+			       const char *xml_uri)
 {
 	GnomeVFSAsyncHandle *handle;
 	album_cover->priv->size = 0;
+	g_free (album_cover->priv->xmldata);
+	g_free (album_cover->priv->buffer);
 	album_cover->priv->xmldata = NULL;
 	album_cover->priv->buffer = NULL;
 	album_cover->priv->total_bytes_read = 0;
@@ -568,6 +559,7 @@
 {		
 	if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
 		g_free (album_cover->priv->buffer);
+		album_cover->priv->buffer = NULL;
 		rb_album_cover_set_nocover (album_cover);
 		gnome_vfs_async_close (handle, 
 				      (GnomeVFSAsyncCloseCallback) rb_album_cover_xml_close_cb, 
@@ -600,6 +592,7 @@
 	
 	if (result != GNOME_VFS_OK) {
 		g_free (album_cover->priv->buffer);
+		album_cover->priv->buffer = NULL;
 		rb_album_cover_set_nocover (album_cover);
 		return;
 	}
@@ -693,12 +686,13 @@
 		if (info->size < 900) tests = FALSE;  /*remove amazon empty cover*/
 		if (info->type != GNOME_VFS_FILE_TYPE_REGULAR) tests = FALSE;
 	} else tests = FALSE;
+
+	gnome_vfs_file_info_unref (info);
 	
 	if (!tests) {
 		rb_album_cover_set_nocover (album_cover);
 		return;
 	} 
-	gnome_vfs_file_info_unref (info);
 
 	gnome_vfs_async_open (&handle, album_cover->priv->uri, 
 			      GNOME_VFS_OPEN_READ, 
@@ -717,8 +711,7 @@
 		return;	
 	}
 	
-	if (album_cover->priv->buffer)
-		g_free (album_cover->priv->buffer);
+	g_free (album_cover->priv->buffer);
 	album_cover->priv->buffer = g_malloc0 (READ_CHUNK_SIZE);
 
 	gnome_vfs_async_read (handle,
@@ -738,6 +731,7 @@
 {
 	if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
 		g_free (album_cover->priv->buffer);
+		album_cover->priv->buffer = NULL;
 		rb_album_cover_set_nocover (album_cover);
 		gnome_vfs_async_close (handle, 
 				      (GnomeVFSAsyncCloseCallback) rb_album_cover_uri_close_cb, 
@@ -770,6 +764,7 @@
 
 	if (result != GNOME_VFS_OK) {
 		g_free (album_cover->priv->buffer);
+		album_cover->priv->buffer = NULL;
 		rb_album_cover_set_nocover (album_cover);
 		return;
 	}
@@ -843,8 +838,9 @@
 		 result = gnome_vfs_make_directory (cover_path, GNOME_VFS_PERM_USER_ALL
 								| GNOME_VFS_PERM_GROUP_READ
 								| GNOME_VFS_PERM_OTHER_READ);
+	g_free (cover_path);
 
-	cover_home = g_strdup (rb_album_cover_make_cover_path (album_cover->priv->artist, album_cover->priv->album));
+	cover_home = rb_album_cover_make_cover_path (album_cover->priv->artist, album_cover->priv->album);
 	
 	album_cover->priv->uri = g_strdup (cover_home);
 
@@ -860,6 +856,7 @@
                                         (GnomeVFSAsyncOpenCallback) rb_album_cover_save_cover_open_cb,
                                         album_cover);
 	}
+	g_free (cover_home);
 }
 
 static void
@@ -925,6 +922,10 @@
 				gchar *album)
 {	
 	char *cover_path;
-	cover_path = g_build_filename (rb_dot_dir (), "covers", g_strdup_printf ("%s-%s.jpg", artist, album), NULL);
+	char *filename;
+
+	filename = g_strdup_printf ("%s-%s.jpg", artist, album);
+	cover_path = g_build_filename (rb_dot_dir (), "covers", filename, NULL);
+	g_free (filename);
 	return cover_path;
 }



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]