Mercurial > audlegacy-plugins
changeset 990:238055a6cb8f trunk
[svn] - remove support for hatena music as hatena ceased their musical profile service.
author | yaz |
---|---|
date | Tue, 01 May 2007 07:03:49 -0700 |
parents | 84bef123b22e |
children | 67cf9a1e3dc5 |
files | ChangeLog src/scrobbler/Makefile src/scrobbler/configure.c src/scrobbler/gerpok.c src/scrobbler/hatena.c src/scrobbler/hatena.h src/scrobbler/plugin.c src/scrobbler/scrobbler.c |
diffstat | 8 files changed, 20 insertions(+), 1032 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Mon Apr 30 22:03:19 2007 -0700 +++ b/ChangeLog Tue May 01 07:03:49 2007 -0700 @@ -1,3 +1,11 @@ +2007-05-01 05:03:19 +0000 William Pitcock <nenolod@sacredspiral.co.uk> + revision [2118] + - provide full metadata from the file's tuple when performing the transcode + + trunk/src/filewriter/vorbis.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + + 2007-05-01 04:57:35 +0000 William Pitcock <nenolod@sacredspiral.co.uk> revision [2116] - add configure interface
--- a/src/scrobbler/Makefile Mon Apr 30 22:03:19 2007 -0700 +++ b/src/scrobbler/Makefile Tue May 01 07:03:49 2007 -0700 @@ -21,10 +21,9 @@ md5.c \ scrobbler.c \ gerpok.c \ - hatena.c \ plugin.c -CFLAGS += $(PICFLAGS) $(GTK_CFLAGS) $(GLIB_CFLAGS) $(PANGO_CFLAGS) $(BEEP_DEFINES) $(CURL_CFLAGS) -I../../intl -I../.. +CFLAGS += $(PICFLAGS) $(GTK_CFLAGS) $(GLIB_CFLAGS) $(PANGO_CFLAGS) $(BEEP_DEFINES) $(CURL_CFLAGS) -I../../intl -I../.. -Wall OBJECTS = ${SOURCES:.c=.o}
--- a/src/scrobbler/configure.c Mon Apr 30 22:03:19 2007 -0700 +++ b/src/scrobbler/configure.c Tue May 01 07:03:49 2007 -0700 @@ -23,7 +23,7 @@ #include "configure.h" -GtkWidget *entry1, *entry2, *ge_entry1, *ge_entry2, *ha_entry1, *ha_entry2, *cfgdlg; +GtkWidget *entry1, *entry2, *ge_entry1, *ge_entry2, *cfgdlg; static char *hexify(char *pass, int len) { @@ -50,17 +50,14 @@ const char *pwd = gtk_entry_get_text(GTK_ENTRY(entry2)); const char *ge_uid = gtk_entry_get_text(GTK_ENTRY(ge_entry1)); const char *ge_pwd = gtk_entry_get_text(GTK_ENTRY(ge_entry2)); - const char *ha_uid = gtk_entry_get_text(GTK_ENTRY(ha_entry1)); - const char *ha_pwd = gtk_entry_get_text(GTK_ENTRY(ha_entry2)); if ((cfgfile = bmp_cfg_db_open())) { md5_state_t md5state; - unsigned char md5pword[16], ge_md5pword[16], ha_md5pword[16]; + unsigned char md5pword[16], ge_md5pword[16]; bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "username", (char *)uid); bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "ge_username", (char *)ge_uid); - bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "ha_username", (char *)ha_uid); if (pwd != NULL && pwd[0] != '\0') { @@ -80,15 +77,6 @@ hexify((char*)ge_md5pword, sizeof(ge_md5pword))); } - if (ha_pwd != NULL && ha_pwd[0] != '\0') - { - md5_init(&md5state); - md5_append(&md5state, (unsigned const char *)ha_pwd, strlen(ha_pwd)); - md5_finish(&md5state, ha_md5pword); - bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "ha_password", - hexify((char*)ha_md5pword, sizeof(ha_md5pword))); - } - bmp_cfg_db_close(cfgfile); } } @@ -199,47 +187,6 @@ gtk_label_set_use_markup (GTK_LABEL (label1), TRUE); gtk_notebook_append_page(GTK_NOTEBOOK(notebook1), GTK_WIDGET(align1), label1); - - // hatena - align1 = gtk_alignment_new(0, 0, 0, 0); - gtk_widget_show (align1); - gtk_alignment_set_padding(GTK_ALIGNMENT(align1), 0, 0, 12, 0); - - table1 = gtk_table_new (2, 2, FALSE); - gtk_widget_show (table1); - gtk_container_add(GTK_CONTAINER(align1), table1); - gtk_table_set_row_spacings (GTK_TABLE(table1), 6); - gtk_table_set_col_spacings (GTK_TABLE(table1), 6); - - label2 = gtk_label_new (_("Username:")); - gtk_widget_show (label2); - gtk_table_attach_defaults (GTK_TABLE (table1), label2, 0, 1, 2, 3); - gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment (GTK_MISC (label2), 1, 0.5); - - label3 = gtk_label_new (_("Password:")); - gtk_widget_show (label3); - gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 3, 4, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_label_set_justify (GTK_LABEL (label3), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment (GTK_MISC (label3), 1, 0.5); - - ha_entry1 = gtk_entry_new (); - gtk_widget_show (ha_entry1); - gtk_table_attach_defaults (GTK_TABLE (table1), ha_entry1, 1, 2, 2, 3); - - ha_entry2 = gtk_entry_new (); - gtk_entry_set_visibility(GTK_ENTRY(ha_entry2), FALSE); - gtk_widget_show (ha_entry2); - gtk_table_attach_defaults (GTK_TABLE (table1), ha_entry2, 1, 2, 3, 4); - g_signal_connect(ha_entry2, "changed", (GCallback) saveconfig, NULL); - - label1 = gtk_label_new (_("<b>Hatena</b>")); - gtk_label_set_use_markup (GTK_LABEL (label1), TRUE); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook1), GTK_WIDGET(align1), label1); - - // common gtk_box_pack_start (GTK_BOX (vbox2), notebook1, TRUE, TRUE, 6); @@ -269,14 +216,7 @@ g_free(username); username = NULL; } - // hatena - bmp_cfg_db_get_string(db, "audioscrobbler", "ha_username", - &username); - if (username) { - gtk_entry_set_text(GTK_ENTRY(ha_entry1), username); - g_free(username); - username = NULL; - } + bmp_cfg_db_close(db); }
--- a/src/scrobbler/gerpok.c Mon Apr 30 22:03:19 2007 -0700 +++ b/src/scrobbler/gerpok.c Tue May 01 07:03:49 2007 -0700 @@ -161,12 +161,14 @@ return item; } +#if 0 static item_t *q_peek(void) { if (q_nitems == 0) return NULL; return q_queue; } +#endif static item_t *q_peekall(int rewind) {
--- a/src/scrobbler/hatena.c Mon Apr 30 22:03:19 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,909 +0,0 @@ -#include "settings.h" - -#include <pthread.h> -#include <limits.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <curl/curl.h> -#include <stdio.h> -#include "fmt.h" -#include "md5.h" -#include "scrobbler.h" -#include "config.h" -#include <glib.h> - -#include <audacious/titlestring.h> -#include <audacious/util.h> - -#define SCROBBLER_HS_URL "http://music.hatelabo.jp/trackauth" -#define SCROBBLER_CLI_ID "aud" -#define SCROBBLER_HS_WAIT 1800 -#define SCROBBLER_SB_WAIT 10 -#define SCROBBLER_VERSION "1.1" -#define SCROBBLER_IMPLEMENTATION "0.1" /* This is the implementation, not the player version. */ -#define SCROBBLER_SB_MAXLEN 1024 -#define CACHE_SIZE 1024 - -#define HATENA_SUBMIT_INTERVAL 60 - -/* Scrobblerbackend for xmms plugin, first draft */ - -static int hatena_sc_hs_status, - hatena_sc_hs_timeout, - hatena_sc_hs_errors, - hatena_sc_sb_errors, - hatena_sc_bad_users, - hatena_sc_submit_interval = HATENA_SUBMIT_INTERVAL, - hatena_sc_submit_timeout, - hatena_sc_srv_res_size, - hatena_sc_giveup, - hatena_sc_major_error_present; - -static char *hatena_sc_submit_url, - *hatena_sc_username = NULL, - *hatena_sc_password = NULL, - *hatena_sc_challenge_hash, - hatena_sc_response_hash[33], - *hatena_sc_srv_res, - hatena_sc_curl_errbuf[CURL_ERROR_SIZE], - *hatena_sc_major_error; - -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 hatena_sc_throw_error(char *errortxt) -{ - hatena_sc_major_error_present = 1; - if(hatena_sc_major_error == NULL) - hatena_sc_major_error = strdup(errortxt); - - return; -} - -int hatena_sc_catch_error(void) -{ - return hatena_sc_major_error_present; -} - -char *hatena_sc_fetch_error(void) -{ - return hatena_sc_major_error; -} - -void hatena_sc_clear_error(void) -{ - hatena_sc_major_error_present = 0; - if(hatena_sc_major_error != NULL) - free(hatena_sc_major_error); - hatena_sc_major_error = NULL; - - return; -} - -static size_t hatena_sc_store_res(void *ptr, size_t size, - size_t nmemb, - void *stream __attribute__((unused))) -{ - int len = size * nmemb; - - hatena_sc_srv_res = realloc(hatena_sc_srv_res, hatena_sc_srv_res_size + len + 1); - memcpy(hatena_sc_srv_res + hatena_sc_srv_res_size, - ptr, len); - hatena_sc_srv_res_size += len; - return len; -} - -static void hatena_sc_free_res(void) -{ - if(hatena_sc_srv_res != NULL) - free(hatena_sc_srv_res); - hatena_sc_srv_res = NULL; - hatena_sc_srv_res_size = 0; -} - -static int hatena_sc_parse_hs_res(void) -{ - char *interval; - - if (!hatena_sc_srv_res_size) { - pdebug("No reply from server", DEBUG); - return -1; - } - *(hatena_sc_srv_res + hatena_sc_srv_res_size) = 0; - - if (!strncmp(hatena_sc_srv_res, "FAILED ", 7)) { - - /* Throwing a major error, just in case */ - /* hatena_sc_throw_error(fmt_vastr("%s", hatena_sc_srv_res)); - hatena_sc_hs_errors++; */ - pdebug(fmt_vastr("error: %s", hatena_sc_srv_res), DEBUG); - - return -1; - } - - if (!strncmp(hatena_sc_srv_res, "UPDATE ", 7)) { - - hatena_sc_submit_url = strchr(strchr(hatena_sc_srv_res, '\n') + 1, '\n') + 1; - *(hatena_sc_submit_url - 1) = 0; - hatena_sc_submit_url = strdup(hatena_sc_submit_url); - hatena_sc_challenge_hash = strchr(hatena_sc_srv_res, '\n') + 1; - *(hatena_sc_challenge_hash - 1) = 0; - hatena_sc_challenge_hash = strdup(hatena_sc_challenge_hash); - - /* Throwing major error. Need to alert client to update. */ - hatena_sc_throw_error(fmt_vastr("Please update Audacious.\n" - "Update available at: http://audacious-media-player.org")); - pdebug(fmt_vastr("update client: %s", hatena_sc_srv_res + 7), DEBUG); - - /* - * Russ isn't clear on whether we can submit with a not-updated - * client. Neither is RJ. I use what we did before. - */ - hatena_sc_giveup = -1; - return -1; - } - if (!strncmp(hatena_sc_srv_res, "UPTODATE\n", 9)) { - hatena_sc_bad_users = 0; - - hatena_sc_submit_url = strchr(strchr(hatena_sc_srv_res, '\n') + 1, '\n') + 1; - *(hatena_sc_submit_url - 1) = 0; - hatena_sc_submit_url = strdup(hatena_sc_submit_url); - hatena_sc_challenge_hash = strchr(hatena_sc_srv_res, '\n') + 1; - *(hatena_sc_challenge_hash - 1) = 0; - hatena_sc_challenge_hash = strdup(hatena_sc_challenge_hash); - - return 0; - } - if(!strncmp(hatena_sc_srv_res, "BADUSER", 7)) { - /* Throwing major error. */ - hatena_sc_throw_error("Incorrect username/password.\n" - "Please fix in configuration."); - pdebug("incorrect username/password", DEBUG); - - interval = strstr(hatena_sc_srv_res, "INTERVAL"); - if(!interval) - { - pdebug("missing INTERVAL", DEBUG); - } - else - { - *(interval - 1) = 0; - hatena_sc_submit_interval = strtol(interval + 8, NULL, 10); - } - - return -1; - } - - pdebug(fmt_vastr("unknown server-reply '%s'", hatena_sc_srv_res), DEBUG); - return -1; -} - -static void hexify(char *pass, int len) -{ - char *bp = hatena_sc_response_hash; - char hexchars[] = "0123456789abcdef"; - int i; - - memset(hatena_sc_response_hash, 0, sizeof(hatena_sc_response_hash)); - - for(i = 0; i < len; i++) { - *(bp++) = hexchars[(pass[i] >> 4) & 0x0f]; - *(bp++) = hexchars[pass[i] & 0x0f]; - } - *bp = 0; - - return; -} - -static int hatena_sc_handshake(void) -{ - int status; - char buf[4096]; - CURL *curl; - - snprintf(buf, sizeof(buf), "%s/?hs=true&p=%s&c=%s&v=%s&u=%s", - SCROBBLER_HS_URL, SCROBBLER_VERSION, - SCROBBLER_CLI_ID, SCROBBLER_IMPLEMENTATION, hatena_sc_username); - - curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); - curl_easy_setopt(curl, CURLOPT_URL, buf); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - hatena_sc_store_res); - memset(hatena_sc_curl_errbuf, 0, sizeof(hatena_sc_curl_errbuf)); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, hatena_sc_curl_errbuf); - curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, SC_CURL_TIMEOUT); - status = curl_easy_perform(curl); - curl_easy_cleanup(curl); - - hatena_sc_hs_timeout = time(NULL) + SCROBBLER_HS_WAIT; - - if (status) { - pdebug(hatena_sc_curl_errbuf, DEBUG); - hatena_sc_hs_errors++; - hatena_sc_free_res(); - return -1; - } - - if (hatena_sc_parse_hs_res()) { - hatena_sc_hs_errors++; - hatena_sc_free_res(); - return -1; - } - - if (hatena_sc_challenge_hash != NULL) { - md5_state_t md5state; - unsigned char md5pword[16]; - - md5_init(&md5state); - /*pdebug(fmt_vastr("Pass Hash: %s", hatena_sc_password), DEBUG);*/ - md5_append(&md5state, (unsigned const char *)hatena_sc_password, - strlen(hatena_sc_password)); - /*pdebug(fmt_vastr("Challenge Hash: %s", hatena_sc_challenge_hash), DEBUG);*/ - md5_append(&md5state, (unsigned const char *)hatena_sc_challenge_hash, - strlen(hatena_sc_challenge_hash)); - md5_finish(&md5state, md5pword); - hexify((char*)md5pword, sizeof(md5pword)); - /*pdebug(fmt_vastr("Response Hash: %s", hatena_sc_response_hash), DEBUG);*/ - } - - hatena_sc_hs_errors = 0; - hatena_sc_hs_status = 1; - - hatena_sc_free_res(); - - pdebug(fmt_vastr("submiturl: %s - interval: %d", - hatena_sc_submit_url, hatena_sc_submit_interval), DEBUG); - - return 0; -} - -static int hatena_sc_parse_sb_res(void) -{ - char *ch, *ch2; - - if (!hatena_sc_srv_res_size) { - pdebug("No response from server", DEBUG); - return -1; - } - *(hatena_sc_srv_res + hatena_sc_srv_res_size) = 0; - - if (!strncmp(hatena_sc_srv_res, "OK", 2)) { - if ((ch = strstr(hatena_sc_srv_res, "INTERVAL"))) { - hatena_sc_submit_interval = strtol(ch + 8, NULL, 10); - pdebug(fmt_vastr("got new interval: %d", - hatena_sc_submit_interval), DEBUG); - } - - pdebug(fmt_vastr("submission ok: %s", hatena_sc_srv_res), DEBUG); - - return 0; - } - - if (!strncmp(hatena_sc_srv_res, "BADAUTH", 7)) { - if ((ch = strstr(hatena_sc_srv_res, "INTERVAL"))) { - hatena_sc_submit_interval = strtol(ch + 8, NULL, 10); - pdebug(fmt_vastr("got new interval: %d", - hatena_sc_submit_interval), DEBUG); - } - - pdebug("incorrect username/password", DEBUG); - - hatena_sc_giveup = 0; - - /* - * We obviously aren't authenticated. The server might have - * lost our handshake status though, so let's try - * re-handshaking... This might not be proper. - * (we don't give up) - */ - hatena_sc_hs_status = 0; - - if(hatena_sc_challenge_hash != NULL) - free(hatena_sc_challenge_hash); - if(hatena_sc_submit_url != NULL) - free(hatena_sc_submit_url); - - hatena_sc_challenge_hash = hatena_sc_submit_url = NULL; - hatena_sc_bad_users++; - - if(hatena_sc_bad_users > 2) - { - pdebug("3 BADAUTH returns on submission. Halting " - "submissions until login fixed.", DEBUG) - hatena_sc_throw_error("Incorrect username/password.\n" - "Please fix in configuration."); - } - - return -1; - } - - if (!strncmp(hatena_sc_srv_res, "FAILED", 6)) { - - /* This could be important. (Such as FAILED - Get new plugin) */ - /*hatena_sc_throw_error(fmt_vastr("%s", hatena_sc_srv_res));*/ - - pdebug(hatena_sc_srv_res, DEBUG); - - return -1; - } - - if (!strncmp(hatena_sc_srv_res, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">", 50)) { - ch = strstr(hatena_sc_srv_res, "<TITLE>"); - ch2 = strstr(hatena_sc_srv_res, "</TITLE>"); - if (ch != NULL && ch2 != NULL) { - ch += strlen("<TITLE>"); - *ch2 = '\0'; - - pdebug(fmt_vastr("HTTP Error (%d): '%s'", - atoi(ch), ch + 4), DEBUG); -// *ch2 = '<'; // needed? --yaz - } - - return -1; - } - - pdebug(fmt_vastr("unknown server-reply %s", hatena_sc_srv_res), DEBUG); - - return -1; -} - -static gchar *hatena_sc_itemtag(char c, int n, char *str) -{ - static char buf[SCROBBLER_SB_MAXLEN]; - snprintf(buf, SCROBBLER_SB_MAXLEN, "&%c[%d]=%s", c, n, str); - return buf; -} - -#define cfa(f, l, n, v) \ -curl_formadd(f, l, CURLFORM_COPYNAME, n, \ - CURLFORM_PTRCONTENTS, v, CURLFORM_END) - -static int hatena_sc_generateentry(GString *submission) -{ - int i; - item_t *item; - - i = 0; -#ifdef ALLOW_MULTIPLE - q_peekall(1); - while ((item = q_peekall(0)) && i < 10) { -#else - item = q_peek(); -#endif - if (!item) - return i; - - g_string_append(submission,hatena_sc_itemtag('a',i,I_ARTIST(item))); - g_string_append(submission,hatena_sc_itemtag('t',i,I_TITLE(item))); - g_string_append(submission,hatena_sc_itemtag('l',i,I_LEN(item))); - g_string_append(submission,hatena_sc_itemtag('i',i,I_TIME(item))); - g_string_append(submission,hatena_sc_itemtag('m',i,I_MB(item))); - g_string_append(submission,hatena_sc_itemtag('b',i,I_ALBUM(item))); - - pdebug(fmt_vastr("a[%d]=%s t[%d]=%s l[%d]=%s i[%d]=%s m[%d]=%s b[%d]=%s", - i, I_ARTIST(item), - i, I_TITLE(item), - i, I_LEN(item), - i, I_TIME(item), - i, I_MB(item), - i, I_ALBUM(item)), DEBUG); -#ifdef ALLOW_MULTIPLE - i++; - } -#endif - - return i; -} - -static int hatena_sc_submitentry(gchar *entry) -{ - CURL *curl; - /* struct HttpPost *post = NULL , *last = NULL; */ - int status; - GString *submission; - - curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); - curl_easy_setopt(curl, CURLOPT_URL, hatena_sc_submit_url); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - hatena_sc_store_res); - curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT); - curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - /*cfa(&post, &last, "debug", "failed");*/ - - /*pdebug(fmt_vastr("Username: %s", hatena_sc_username), DEBUG);*/ - submission = g_string_new("u="); - g_string_append(submission,(gchar *)hatena_sc_username); - - /*pdebug(fmt_vastr("Response Hash: %s", hatena_sc_response_hash), DEBUG);*/ - g_string_append(submission,"&s="); - g_string_append(submission,(gchar *)hatena_sc_response_hash); - - g_string_append(submission, entry); - - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (char *)submission->str); - memset(hatena_sc_curl_errbuf, 0, sizeof(hatena_sc_curl_errbuf)); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, hatena_sc_curl_errbuf); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, SC_CURL_TIMEOUT); - - /* - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, SCROBBLER_SB_WAIT); - */ - - status = curl_easy_perform(curl); - - curl_easy_cleanup(curl); - - g_string_free(submission,TRUE); - - if (status) { - pdebug(hatena_sc_curl_errbuf, DEBUG); - hatena_sc_sb_errors++; - hatena_sc_free_res(); - return -1; - } - - if (hatena_sc_parse_sb_res()) { - hatena_sc_sb_errors++; - hatena_sc_free_res(); - pdebug(fmt_vastr("Retrying in %d secs, %d elements in queue", - hatena_sc_submit_interval, q_len()), DEBUG); - return -1; - } - hatena_sc_free_res(); - return 0; -} - -static void hatena_sc_handlequeue(GMutex *mutex) -{ - GString *submitentry; - int nsubmit; - int wait; - - if(hatena_sc_submit_timeout < time(NULL) && hatena_sc_bad_users < 3) - { - submitentry = g_string_new(""); - - g_mutex_lock(mutex); - - nsubmit = hatena_sc_generateentry(submitentry); - - g_mutex_unlock(mutex); - - if (nsubmit > 0) - { - pdebug(fmt_vastr("Number submitting: %d", nsubmit), DEBUG); - pdebug(fmt_vastr("Submission: %s", submitentry->str), DEBUG); - - if(!hatena_sc_submitentry(submitentry->str)) - { - g_mutex_lock(mutex); - -#ifdef ALLOW_MULTIPLE - q_free(); -#else - q_get(); -#endif - /* - * This should make sure that the queue doesn't - * get submitted multiple times on a nasty - * segfault... - */ - dump_queue(); - - g_mutex_unlock(mutex); - - hatena_sc_sb_errors = 0; - } - if(hatena_sc_sb_errors) - { - if(hatena_sc_sb_errors < 5) - /* Retry after 1 min */ - wait = 60; - else - wait = /* hatena_sc_submit_interval + */ - ( ((hatena_sc_sb_errors - 5) < 7) ? - (60 << (hatena_sc_sb_errors-5)) : - 7200 ); - - hatena_sc_submit_timeout = time(NULL) + wait; - - pdebug(fmt_vastr("Error while submitting. " - "Retrying after %d seconds.", wait), - DEBUG); - } - } - - g_string_free(submitentry, TRUE); - } -} - -static void read_cache(void) -{ - FILE *fd; - char buf[PATH_MAX], *cache = NULL, *ptr1, *ptr2; - int cachesize, written, i = 0; - item_t *item; - - cachesize = written = 0; - - snprintf(buf, sizeof(buf), "%s/hatenaqueue.txt", audacious_get_localdir()); - - if (!(fd = fopen(buf, "r"))) - return; - pdebug(fmt_vastr("Opening %s", buf), DEBUG); - while(!feof(fd)) - { - cachesize += CACHE_SIZE; - cache = realloc(cache, cachesize + 1); - written += fread(cache + written, 1, CACHE_SIZE, fd); - cache[written] = '\0'; - } - fclose(fd); - ptr1 = cache; - while(ptr1 < cache + written - 1) - { - char *artist, *title, *len, *time, *album, *mb; - - pdebug("Pushed:", DEBUG); - ptr2 = strchr(ptr1, ' '); - artist = calloc(1, ptr2 - ptr1 + 1); - strncpy(artist, ptr1, ptr2 - ptr1); - ptr1 = ptr2 + 1; - ptr2 = strchr(ptr1, ' '); - title = calloc(1, ptr2 - ptr1 + 1); - strncpy(title, ptr1, ptr2 - ptr1); - ptr1 = ptr2 + 1; - ptr2 = strchr(ptr1, ' '); - len = calloc(1, ptr2 - ptr1 + 1); - strncpy(len, ptr1, ptr2 - ptr1); - ptr1 = ptr2 + 1; - ptr2 = strchr(ptr1, ' '); - time = calloc(1, ptr2 - ptr1 + 1); - strncpy(time, ptr1, ptr2 - ptr1); - ptr1 = ptr2 + 1; - ptr2 = strchr(ptr1, ' '); - album = calloc(1, ptr2 - ptr1 + 1); - strncpy(album, ptr1, ptr2 - ptr1); - ptr1 = ptr2 + 1; - ptr2 = strchr(ptr1, '\n'); - if(ptr2 != NULL) - *ptr2 = '\0'; - mb = calloc(1, strlen(ptr1) + 1); - strncpy(mb, ptr1, strlen(ptr1)); - if(ptr2 != NULL) - *ptr2 = '\n'; - /* Why is our save printing out CR/LF? */ - ptr1 = ptr2 + 1; - - item = q_put2(artist, title, len, time, album, mb); - pdebug(fmt_vastr("a[%d]=%s t[%d]=%s l[%d]=%s i[%d]=%s m[%d]=%s b[%d]=%s", - i, I_ARTIST(item), - i, I_TITLE(item), - i, I_LEN(item), - i, I_TIME(item), - i, I_MB(item), - i, I_ALBUM(item)), DEBUG); - free(artist); - free(title); - free(len); - free(time); - free(album); - free(mb); - - i++; - } - pdebug("Done loading cache.", DEBUG); - free(cache); -} - -static void dump_queue(void) -{ - FILE *fd; - item_t *item; - char *home, buf[PATH_MAX]; - - /*pdebug("Entering dump_queue();", DEBUG);*/ - - if (!(home = getenv("HOME"))) - { - pdebug("No HOME directory found. Cannot dump queue.", DEBUG); - return; - } - - snprintf(buf, sizeof(buf), "%s/hatenaqueue.txt", audacious_get_localdir()); - - if (!(fd = fopen(buf, "w"))) - { - pdebug(fmt_vastr("Failure opening %s", buf), DEBUG); - return; - } - - pdebug(fmt_vastr("Opening %s", buf), DEBUG); - - q_peekall(1); - - while ((item = q_peekall(0))) { - fprintf(fd, "%s %s %s %s %s %s\n", - I_ARTIST(item), - I_TITLE(item), - I_LEN(item), - I_TIME(item), - I_ALBUM(item), - I_MB(item)); - } - - fclose(fd); -} - -/* This was made public */ - -void hatena_sc_cleaner(void) -{ - if(hatena_sc_submit_url != NULL) - free(hatena_sc_submit_url); - if(hatena_sc_username != NULL) - free(hatena_sc_username); - if(hatena_sc_password != NULL) - free(hatena_sc_password); - if(hatena_sc_challenge_hash != NULL) - free(hatena_sc_challenge_hash); - if(hatena_sc_srv_res != NULL) - free(hatena_sc_srv_res); - if(hatena_sc_major_error != NULL) - free(hatena_sc_major_error); - dump_queue(); - q_free(); - pdebug("scrobbler shutting down", DEBUG); -} - -static void hatena_sc_checkhandshake(void) -{ - int wait; - - if (!hatena_sc_username || !hatena_sc_password) - return; - - if (hatena_sc_hs_status) - return; - if (hatena_sc_hs_timeout < time(NULL)) - { - hatena_sc_handshake(); - - if(hatena_sc_hs_errors) - { - if(hatena_sc_hs_errors < 5) - /* Retry after 60 seconds */ - wait = 60; - else - wait = /* hatena_sc_submit_interval + */ - ( ((hatena_sc_hs_errors - 5) < 7) ? - (60 << (hatena_sc_hs_errors-5)) : - 7200 ); - hatena_sc_hs_timeout = time(NULL) + wait; - pdebug(fmt_vastr("Error while handshaking. Retrying " - "after %d seconds.", wait), DEBUG); - } - } -} - -/**** Public *****/ - -/* Called at session startup*/ - -void hatena_sc_init(char *uname, char *pwd) -{ - hatena_sc_hs_status = hatena_sc_hs_timeout = hatena_sc_hs_errors = hatena_sc_submit_timeout = - hatena_sc_srv_res_size = hatena_sc_giveup = hatena_sc_major_error_present = - hatena_sc_bad_users = hatena_sc_sb_errors = 0; - hatena_sc_submit_interval = 100; - - hatena_sc_submit_url = hatena_sc_username = hatena_sc_password = hatena_sc_srv_res = - hatena_sc_challenge_hash = hatena_sc_major_error = NULL; - hatena_sc_username = strdup(uname); - hatena_sc_password = strdup(pwd); - read_cache(); - pdebug("scrobbler starting up", DEBUG); -} - -void hatena_sc_addentry(GMutex *mutex, TitleInput *tuple, int len) -{ - g_mutex_lock(mutex); - q_put(tuple, len); - /* - * This will help make sure the queue will be saved on a nasty - * segfault... - */ - dump_queue(); - g_mutex_unlock(mutex); -} - -/* Call periodically from the plugin */ -int hatena_sc_idle(GMutex *mutex) -{ - hatena_sc_checkhandshake(); - if (hatena_sc_hs_status) - hatena_sc_handlequeue(mutex); - - return hatena_sc_giveup; -}
--- a/src/scrobbler/hatena.h Mon Apr 30 22:03:19 2007 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#ifndef HATENA_H -#define HATENA_H 1 - -#include "audacious/titlestring.h" - -int hatena_sc_idle(GMutex *); -void hatena_sc_init(char *, char *); -void hatena_sc_addentry(GMutex *, TitleInput *, int); -void hatena_sc_cleaner(void); -int hatena_sc_catch_error(void); -char *hatena_sc_fetch_error(void); -void hatena_sc_clear_error(void); -#endif
--- a/src/scrobbler/plugin.c Mon Apr 30 22:03:19 2007 -0700 +++ b/src/scrobbler/plugin.c Tue May 01 07:03:49 2007 -0700 @@ -24,7 +24,6 @@ #include "scrobbler.h" #include "gerpok.h" -#include "hatena.h" #include "gtkstuff.h" #include "config.h" #include "fmt.h" @@ -43,7 +42,7 @@ static void cleanup(void); static void *xs_thread(void *); static void *hs_thread(void *); -static int sc_going, ge_going, ha_going; +static int sc_going, ge_going; static GtkWidget *cfgdlg; static GMutex *m_scrobbler; @@ -69,11 +68,9 @@ { char *username = NULL, *password = NULL; char *ge_username = NULL, *ge_password = NULL; - char *ha_username = NULL, *ha_password = NULL; ConfigDb *cfgfile; sc_going = 1; ge_going = 1; - ha_going = 1; GError **moo = NULL; cfgdlg = create_cfgdlg(); @@ -88,10 +85,6 @@ &ge_username); bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "ge_password", &ge_password); - bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "ha_username", - &ha_username); - bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "ha_password", - &ha_password); bmp_cfg_db_close(cfgfile); } @@ -123,20 +116,6 @@ g_free(ge_password); } - if ((!ha_username || !ha_password) || (!*ha_username || !*ha_password)) - { - pdebug("username/password not found - not starting Hatena support", - DEBUG); - ha_going = 0; - } - else - { - hatena_sc_init(ha_username, ha_password); - - g_free(ha_username); - g_free(ha_password); - } - m_scrobbler = g_mutex_new(); hs_mutex = g_mutex_new(); xs_mutex = g_mutex_new(); @@ -148,7 +127,6 @@ pdebug(fmt_vastr("Error creating scrobbler thread: %s", moo), DEBUG); sc_going = 0; ge_going = 0; - ha_going = 0; return; } @@ -157,7 +135,6 @@ pdebug(fmt_vastr("Error creating handshake thread: %s", moo), DEBUG); sc_going = 0; ge_going = 0; - ha_going = 0; return; } @@ -171,14 +148,13 @@ prefswin_page_destroy(cfgdlg); - if (!sc_going && !ge_going && ! ha_going) + if (!sc_going && !ge_going) return; pdebug("about to lock mutex", DEBUG); g_mutex_lock(m_scrobbler); pdebug("locked mutex", DEBUG); sc_going = 0; ge_going = 0; - ha_going = 0; g_mutex_unlock(m_scrobbler); pdebug("joining threads", DEBUG); @@ -201,7 +177,6 @@ sc_cleaner(); gerpok_sc_cleaner(); - hatena_sc_cleaner(); } static gboolean ishttp(const char *a) @@ -459,12 +434,6 @@ gerpok_sc_clear_error(); } - if(hatena_sc_catch_error()) - { - errorbox_show(hatena_sc_fetch_error()); - hatena_sc_clear_error(); - } - /* Check for ability to submit */ dosubmit = get_song_status(); @@ -513,8 +482,6 @@ tuple->performer, tuple->track_name), DEBUG); sc_addentry(m_scrobbler, tuple, dosubmit.len/1000); - hatena_sc_addentry(m_scrobbler, tuple, - dosubmit.len/1000); } else pdebug("tuple does not contain an artist or a title, not submitting.", DEBUG); @@ -523,7 +490,7 @@ sleeptime.tv_sec += XS_SLEEP; g_mutex_lock(m_scrobbler); - run = (sc_going != 0 || ge_going != 0 || ha_going != 0); + run = (sc_going != 0 || ge_going != 0); g_mutex_unlock(m_scrobbler); g_mutex_lock(xs_mutex); @@ -559,16 +526,8 @@ g_mutex_unlock(m_scrobbler); } - if(hatena_sc_idle(m_scrobbler)) - { - pdebug("Giving up due to fatal error", DEBUG); - g_mutex_lock(m_scrobbler); - ha_going = 0; - g_mutex_unlock(m_scrobbler); - } - g_mutex_lock(m_scrobbler); - run = (sc_going != 0 || ge_going != 0 || ha_going != 0); + run = (sc_going != 0 || ge_going != 0); g_mutex_unlock(m_scrobbler); if(run) {