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