diff src/scrobbler/scrobbler.c @ 344:03c1ae10bc8d trunk

[svn] - Merge audacious-scrobbler III, new features include: + Gerpok support + Better queue management
author nenolod
date Fri, 08 Dec 2006 19:31:43 -0800
parents 3da1b8942b8b
children 314b7ac7f771
line wrap: on
line diff
--- a/src/scrobbler/scrobbler.c	Fri Dec 08 17:52:54 2006 -0800
+++ b/src/scrobbler/scrobbler.c	Fri Dec 08 19:31:43 2006 -0800
@@ -7,11 +7,13 @@
 #include <stdio.h>
 #include "fmt.h"
 #include "md5.h"
-#include "queue.h"
 #include "scrobbler.h"
 #include "config.h"
+#include "settings.h"
 #include <glib.h>
 
+#include <audacious/titlestring.h>
+
 #define SCROBBLER_HS_URL "http://post.audioscrobbler.com"
 #define SCROBBLER_CLI_ID "aud"
 #define SCROBBLER_HS_WAIT 1800
@@ -45,6 +47,179 @@
 
 static void dump_queue();
 
+/**** Queue stuff ****/
+
+#define I_ARTIST(i) i->artist
+#define I_TITLE(i) i->title
+#define I_TIME(i) i->utctime
+#define I_LEN(i) i->len
+#define I_MB(i) i->mb
+#define I_ALBUM(i) i->album
+
+typedef struct {
+	char *artist,
+		*title,
+		*mb,
+		*album,
+		*utctime,
+		len[16];
+	int numtries;
+	void *next;
+} item_t;
+
+static item_t *q_queue = NULL;
+static item_t *q_queue_last = NULL;
+static int q_nitems;
+
+static void q_item_free(item_t *item)
+{
+	if (item == NULL)
+		return;
+	curl_free(item->artist);
+	curl_free(item->title);
+	curl_free(item->utctime);
+	curl_free(item->mb);
+	curl_free(item->album);
+	free(item);
+}
+
+static void q_put(TitleInput *tuple, int len)
+{
+	item_t *item;
+
+	item = malloc(sizeof(item_t));
+
+	item->artist = fmt_escape(tuple->performer);
+	item->title = fmt_escape(tuple->track_name);
+	item->utctime = fmt_escape(fmt_timestr(time(NULL), 1));
+	snprintf(item->len, sizeof(item->len), "%d", len);
+
+#ifdef NOTYET
+	if(tuple->mb == NULL)
+#endif
+		item->mb = fmt_escape("");
+#ifdef NOTYET
+	else
+		item->mb = fmt_escape((char*)tuple->mb);
+#endif
+
+	if(tuple->album_name == NULL)
+		item->album = fmt_escape("");
+	else
+		item->album = fmt_escape((char*)tuple->album_name);
+
+	q_nitems++;
+
+	item->next = NULL;
+
+	if(q_queue_last == NULL)
+		q_queue = q_queue_last = item;
+	else
+	{
+        	q_queue_last->next = item;
+		q_queue_last = item;
+	}
+}
+
+static item_t *q_put2(char *artist, char *title, char *len, char *time,
+		char *album, char *mb)
+{
+	char *temp = NULL;
+	item_t *item;
+
+	item = calloc(1, sizeof(item_t));
+	temp = fmt_unescape(artist);
+	item->artist = fmt_escape(temp);
+	curl_free(temp);
+	temp = fmt_unescape(title);
+	item->title = fmt_escape(temp);
+	curl_free(temp);
+	memcpy(item->len, len, sizeof(len));
+	temp = fmt_unescape(time);
+	item->utctime = fmt_escape(temp);
+	curl_free(temp);
+	temp = fmt_unescape(album);
+	item->album = fmt_escape(temp);
+	curl_free(temp);
+	temp = fmt_unescape(mb);
+	item->mb = fmt_escape(temp);
+	curl_free(temp);
+
+	q_nitems++;
+
+	item->next = NULL;
+	if(q_queue_last == NULL)
+		q_queue = q_queue_last = item;
+	else
+	{
+		q_queue_last->next = item;
+		q_queue_last = item;
+	}
+
+	return item;
+}
+
+static item_t *q_peek(void)
+{
+	if (q_nitems == 0)
+		return NULL;
+	return q_queue;
+}
+
+static item_t *q_peekall(int rewind)
+{
+	static item_t *citem = NULL;
+	item_t *temp_item;
+
+	if (rewind) {
+		citem = q_queue;
+		return NULL;
+	}
+
+	temp_item = citem;
+
+	if(citem != NULL)
+		citem = citem->next;
+
+	return temp_item;
+}
+
+static int q_get(void)
+{
+	item_t *item;
+
+	if (q_nitems == 0)
+		return 0;
+	
+	item = q_queue;
+
+	if(item == NULL)
+		return 0;
+
+	q_nitems--;
+	q_queue = q_queue->next;
+
+	q_item_free(item);
+
+	if (q_nitems == 0)
+	{
+		q_queue_last = NULL;
+		return 0;
+	}
+
+	return -1;
+}
+
+static void q_free(void)
+{
+	while (q_get());
+}
+
+static int q_len(void)
+{
+	return q_nitems;
+}
+
 /* Error functions */
 
 static void sc_throw_error(char *errortxt)