On Thu, 2005-09-15 at 17:48 +0200, Ruben Vermeersch wrote:
> I've made a second version of the Last.fm (audioscrobbler) patch for
> rhythmbox. Improvements over the previous patch:
> 
>  * Converted to libsoup (which DAAP uses too), no longer depends on
>    libcurl (configure.ac has been updated for this too)
>  * Cleaner (less duplicated) code, by making all HTTP requests
>    asynchronously.
>  * Nicer preferences dialog (by "Doc" Livingstone)
>  * No longer fills stdout
> 
> And on top of it all, it even works! ;-)

This work fine for me.

I played around with this a bit the other day, and gnome-vfs-ified the
queue loading/saving functions, so I've attached that patch for that.


Cheers,

James "Doc" Livingston
--
> What's that word, it means you feel small and red, starts with an M?
Management. -- Simon Fraser replying to Peter da Silva in asr.
--- shell/rb-audioscrobbler.c   2005-09-16 01:18:34.000000000 +1000
+++ shell/rb-audioscrobbler.c   2005-09-16 03:21:41.000000000 +1000
@@ -1057,128 +1057,149 @@
 
 
 // Queue functions:
-static void
-rb_audioscrobbler_load_queue (RBAudioscrobbler *audioscrobbler)
-{
-       FILE *fd;
-       char *pathname;
-       char line[8192];
-       GSList *list = NULL, *l;
-       gchar **breaks, **breaks2;
 
-       pathname = g_build_filename (rb_dot_dir (), "audioscrobbler.queue", 
NULL);
+static AudioscrobblerEntry*
+rb_audioscrobbler_load_entry_from_string (const char *string)
+{
+       AudioscrobblerEntry *entry;
+       int i = 0;
+       char **breaks;
 
-       fd = fopen (pathname, "r");
+       entry = g_new0 (AudioscrobblerEntry, 1);
+       audioscrobbler_entry_init (entry);
 
-       rb_debug ("Loading saved Audioscrobbler queue from \"%s\"", pathname);
+       breaks = g_strsplit (string, "&", 6);
 
-       g_free (pathname);
+       for (i = 0; breaks[i] != NULL; i++) {
+               char **breaks2 = g_strsplit (breaks[i], "=", 2);
 
-       if (fd) {
-               while (fgets (line, sizeof (line), fd)) {
-                       list = g_slist_append (list, g_strdup (line));
+               if (breaks2[0] != NULL && breaks2[1] != NULL) {
+                       if (g_str_has_prefix (breaks2[0], "a")) {
+                               g_free (entry->artist);
+                               entry->artist = g_strdup (breaks2[1]);
+                       }
+                       if (g_str_has_prefix (breaks2[0], "t")) {
+                               g_free (entry->title);
+                               entry->title = g_strdup (breaks2[1]);
+                       }
+                       if (g_str_has_prefix (breaks2[0], "b")) {
+                               g_free (entry->album);
+                               entry->album = g_strdup (breaks2[1]);
+                       }
+                       if (g_str_has_prefix (breaks2[0], "m")) {
+                               g_free (entry->mbid);
+                               entry->mbid = g_strdup (breaks2[1]);
+                       }
+                       if (g_str_has_prefix (breaks2[0], "l")) {
+                               entry->length = atoi (breaks2[1]);
+                       }
+                       if (g_str_has_prefix (breaks2[0], "i")) {
+                               g_free (entry->timestamp);
+                               entry->timestamp = g_strdup (breaks2[1]);
+                       }
                }
-       } else {
-               rb_debug ("Unable to load Audioscrobbler queue from disk: %s", 
g_strerror (errno));
+
+               g_strfreev (breaks2);
        }
 
-       for (l = list; l; l = g_slist_next (l)) {
-               AudioscrobblerEntry *entry;
-               int i = 0;
+       g_strfreev (breaks);
 
-               if (l->data != NULL) {
-                       entry = g_new0 (AudioscrobblerEntry, 1);
-                       audioscrobbler_entry_init (entry);
-
-                       breaks = g_strsplit (g_strchomp (l->data), "&", 6);
-
-                       for (i = 0; breaks[i] != NULL; i++) {
-                               breaks2 = g_strsplit (breaks[i], "=", 2);
-
-                               if (breaks2[0] != NULL && breaks2[1] != NULL) {
-                                       if (g_str_has_prefix (breaks2[0], "a")) 
{
-                                               g_free (entry->artist);
-                                               entry->artist = g_strdup 
(breaks2[1]);
-                                       }
-                                       if (g_str_has_prefix (breaks2[0], "t")) 
{
-                                               g_free (entry->title);
-                                               entry->title = g_strdup 
(breaks2[1]);
-                                       }
-                                       if (g_str_has_prefix (breaks2[0], "b")) 
{
-                                               g_free (entry->album);
-                                               entry->album = g_strdup 
(breaks2[1]);
-                                       }
-                                       if (g_str_has_prefix (breaks2[0], "m")) 
{
-                                               g_free (entry->mbid);
-                                               entry->mbid = g_strdup 
(breaks2[1]);
-                                       }
-                                       if (g_str_has_prefix (breaks2[0], "l")) 
{
-                                               entry->length = atoi 
(breaks2[1]);
-                                       }
-                                       if (g_str_has_prefix (breaks2[0], "i")) 
{
-                                               g_free (entry->timestamp);
-                                               entry->timestamp = g_strdup 
(breaks2[1]);
-                                       }
-                               }
+       if (strcmp (entry->artist, "") == 0 || strcmp (entry->title, "") == 0) {
+               audioscrobbler_entry_free (entry);
+               entry = NULL;
+       }
 
-                               g_strfreev (breaks2);
-                       }
+       return entry;
+}
 
-                       g_strfreev (breaks);
+static gboolean
+rb_audioscrobbler_load_queue (RBAudioscrobbler *audioscrobbler)
+{
+       char *pathname;
+       GnomeVFSResult result;
+       char *data;
+       int size;
+
+       pathname = g_build_filename (rb_dot_dir (), "audioscrobbler.queue", 
NULL);
+       rb_debug ("Loading Audioscrobbler queue from \"%s\"", pathname);
+
+       result = gnome_vfs_read_entire_file (pathname, &size, &data);
+       g_free (pathname);
+       
+       /* do stuff */
+       if (result == GNOME_VFS_OK) {
+               char *start = data, *end;
+
+               /* scan along the file's data, turning each line into a string 
*/
+               while (start < (data + size)) {
+                       AudioscrobblerEntry *entry;
+
+                       /* find the end of the line, to terminate the string */
+                       end = g_utf8_strchr (start, -1, '\n');
+                       *end = 0;
 
-                       if (strcmp (entry->artist, "") != 0 &&
-                           strcmp (entry->title, "") != 0) {
-                               rb_debug ("Adding saved entry to queue (%s - 
%s)",
-                                       entry->artist, entry->title);
+                       entry = rb_audioscrobbler_load_entry_from_string 
(start);
+                       if (entry)
                                audioscrobbler->priv->queue = g_slist_append 
(audioscrobbler->priv->queue, entry);
-                       } else {
-                               audioscrobbler_entry_free (entry);
-                       }
+
+                       start = end + 1;
                }
        }
 
-       g_slist_foreach (list, (GFunc) g_free, NULL);
-       g_slist_free (list);
+       if (result != GNOME_VFS_OK) {
+               rb_debug ("Unable to load Audioscrobbler queue from disk: %s",
+                         gnome_vfs_result_to_string (result));
+       }
+
+       g_free (data);
+       return (result == GNOME_VFS_OK);
 }
 
-static int
+static gboolean
 rb_audioscrobbler_save_queue (RBAudioscrobbler *audioscrobbler)
 {
-       FILE *fd;
        char *pathname;
-       GSList *l;
-       AudioscrobblerEntry *entry;
-
-       l = audioscrobbler->priv->queue;
+       GnomeVFSHandle *handle;
+       GnomeVFSResult result;
 
        pathname = g_build_filename (rb_dot_dir (), "audioscrobbler.queue", 
NULL);
-
        rb_debug ("Saving Audioscrobbler queue to \"%s\"", pathname);
 
-       fd = fopen (pathname, "w+");
-
+       result = gnome_vfs_open (&handle, pathname, GNOME_VFS_OPEN_WRITE);
        g_free (pathname);
 
-       if (fd) {
-               for (; l; l = g_slist_next (l)) {
-                       entry = (AudioscrobblerEntry *) l->data;
-                       fprintf (fd, "a=%s&t=%s&b=%s&m=%s&l=%d&i=%s\n",
-                                entry->artist,
-                                entry->title,
-                                entry->album,
-                                entry->mbid,
-                                entry->length,
-                                entry->timestamp);
-               }
+       if (result == GNOME_VFS_OK)
+               result = gnome_vfs_seek (handle, GNOME_VFS_SEEK_END, 0);
 
-               fclose (fd);
+       if (result == GNOME_VFS_OK) {
+               GString *s = g_string_new (NULL);
+               GSList *l;
 
-               return 1;
-       } else {
-               rb_debug ("Unable to save Audioscrobbler queue to disk: %s", 
g_strerror (errno));
+               for (l = audioscrobbler->priv->queue; l; l = g_slist_next (l)) {
+                       AudioscrobblerEntry *entry;
+               
+                       entry = (AudioscrobblerEntry *) l->data;
+                       g_string_printf (s, "a=%s&t=%s&b=%s&m=%s&l=%d&i=%s\n",
+                                           entry->artist,
+                                           entry->title,
+                                           entry->album,
+                                           entry->mbid,
+                                           entry->length,
+                                           entry->timestamp);
+                       result = gnome_vfs_write (handle, s->str, s->len, NULL);
+                       if (result != GNOME_VFS_OK)
+                               break;
+               }
+               g_string_free (s, TRUE);
+       }
 
-               return 0;
+       if (result != GNOME_VFS_OK) {
+               rb_debug ("Unable to save Audioscrobbler queue to disk: %s",
+                         gnome_vfs_result_to_string (result));
        }
+
+       gnome_vfs_close (handle);
+       return (result == GNOME_VFS_OK);
 }
 
 static void

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
rhythmbox-devel mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/rhythmbox-devel

Reply via email to