aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/leoslyrics
diff options
context:
space:
mode:
authorAndreas Obergrusberger <tradiaz@yahoo.de>2007-01-03 20:12:16 +0000
committerAndreas Obergrusberger <tradiaz@yahoo.de>2007-01-03 20:12:16 +0000
commit6d9b28ec69212a2542ab2958ed0b012c124dbc07 (patch)
tree17cb3f8bb8b8a3f6e0bf824202148dc326a9f25c /plugins/leoslyrics
parentb454d1517608a8f137723c6c5080bbcb29e7329c (diff)
downloadmpd-6d9b28ec69212a2542ab2958ed0b012c124dbc07.tar.gz
mpd-6d9b28ec69212a2542ab2958ed0b012c124dbc07.tar.xz
mpd-6d9b28ec69212a2542ab2958ed0b012c124dbc07.zip
added a plugin system for lyrics sources
git-svn-id: https://svn.musicpd.org/ncmpc/branches/tradiaz@5217 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to '')
-rw-r--r--plugins/leoslyrics/Makefile.am43
-rw-r--r--plugins/leoslyrics/easy_download.c89
-rw-r--r--plugins/leoslyrics/easy_download.h31
-rw-r--r--plugins/leoslyrics/lyrics_leoslyrics.c158
4 files changed, 321 insertions, 0 deletions
diff --git a/plugins/leoslyrics/Makefile.am b/plugins/leoslyrics/Makefile.am
new file mode 100644
index 000000000..4eb76f3ee
--- /dev/null
+++ b/plugins/leoslyrics/Makefile.am
@@ -0,0 +1,43 @@
+AM_CPPFLAGS =\
+ $(GLIB_CFLAGS)\
+ $(GTHREAD_CFLAGS)\
+ $(libcurl_CFLAGS)\
+ -I../../src
+
+###----
+
+plugin_headers =\
+ ../src_lyrics.h\
+ ../screen_lyrics.h\
+ ../easy_download.h\
+ ../options.h
+
+###-----
+
+ncmpc_modulesdir = @plugindir@
+
+ncmpc_modules_LTLIBRARIES = libleoslyrics.la
+
+### libleoslyrics
+
+libleoslyrics_la_LIBADD =\
+ $(GLIB_LIBS)\
+ $(libcurl_LIBS)
+
+libleoslyrics_la_headers =\
+ easy_download.h\
+ $(plugins_headers)
+
+libleoslyrics_la_SOURCES =\
+ easy_download.c\
+ lyrics_leoslyrics.c\
+ $(libleoslyrics_la_headers)
+
+install:
+ @$(MAKE)
+ mkdir -p ${DESTDIR}${libdir}
+ if test -f .libs/libleoslyrics.so; then cp .libs/libleoslyrics.so ${ncmpc_modulesdir}/lyrics_leoslyrics.so; fi
+
+uninstall:
+ @$(MAKE)
+ rm -f ${ncmpc_modulesdir}/lyrics_leoslyrics.so
diff --git a/plugins/leoslyrics/easy_download.c b/plugins/leoslyrics/easy_download.c
new file mode 100644
index 000000000..83616cf87
--- /dev/null
+++ b/plugins/leoslyrics/easy_download.c
@@ -0,0 +1,89 @@
+/* by Qball
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include "ncmpc.h"
+
+#ifdef ENABLE_LYRICS_SCREEN
+
+#include <curl/curl.h>
+#include "easy_download.h"
+
+static size_t write_data(void *buffer, size_t size,
+ size_t nmemb, easy_download_struct *dld)
+{
+ if(dld->data == NULL)
+ {
+ dld->size = 0;
+ }
+ dld->data = g_realloc(dld->data,(gulong)(size*nmemb+dld->size));
+
+ memset(&(dld->data)[dld->size], '\0', (size*nmemb));
+ memcpy(&(dld->data)[dld->size], buffer, size*nmemb);
+
+ dld->size += size*nmemb;
+ if(dld->size >= dld->max_size && dld->max_size > 0)
+ {
+ return 0;
+ }
+ return size*nmemb;
+}
+
+int easy_download(char *url,easy_download_struct *dld,
+ curl_progress_callback cb)
+{
+ CURL *curl = NULL;
+ int res;
+ if(!dld) return 0;
+ easy_download_clean(dld);
+ /* initialize curl */
+ curl = curl_easy_init();
+ if(!curl) return 0;
+ /* set uri */
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ /* set callback data */
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, dld);
+ /* set callback function */
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+ curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
+ curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, cb);
+ /* run */
+ res = curl_easy_perform(curl);
+ /* cleanup */
+ curl_easy_cleanup(curl);
+ if(!res)
+ {
+ return 1;
+ }
+ if(dld->data) g_free(dld->data);
+ return 0;
+}
+
+void easy_download_clean(easy_download_struct *dld)
+{
+ if(dld->data)g_free(dld->data);
+ dld->data = NULL;
+ dld->size = 0;
+ dld->max_size = -1;
+}
+
+#endif
diff --git a/plugins/leoslyrics/easy_download.h b/plugins/leoslyrics/easy_download.h
new file mode 100644
index 000000000..92dc22e9e
--- /dev/null
+++ b/plugins/leoslyrics/easy_download.h
@@ -0,0 +1,31 @@
+/*
+ * by Qball
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <curl/curl.h>
+
+typedef struct _easy_download_struct{
+ char *data;
+ int size;
+ int max_size;
+
+}easy_download_struct;
+
+
+int easy_download(char *url,easy_download_struct *dld,
+ curl_progress_callback cb);
+void easy_download_clean(easy_download_struct *dld);
diff --git a/plugins/leoslyrics/lyrics_leoslyrics.c b/plugins/leoslyrics/lyrics_leoslyrics.c
new file mode 100644
index 000000000..47aabe10b
--- /dev/null
+++ b/plugins/leoslyrics/lyrics_leoslyrics.c
@@ -0,0 +1,158 @@
+#include "src_lyrics.h"
+#include "easy_download.h"
+#include <expat.h>
+#include <string.h>
+#include "options.h"
+
+#define LEOSLYRICS_SEARCH_URL "http://api.leoslyrics.com/api_search.php?auth=ncmpc&artist=%s&songtitle=%s"
+#define LEOSLYRICS_CONTENT_URL "http://api.leoslyrics.com/api_lyrics.php?auth=ncmpc&hid=%s"
+#define CREDITS "Lyrics provided by www.LeosLyrics.com"
+
+char *hid;
+XML_Parser parser, contentp;
+
+int check_dl_progress(void *clientp, double dltotal, double dlnow,
+ double ultotal, double ulnow)
+{
+ if(g_timer_elapsed(dltime, NULL) >= options.lyrics_timeout || lock == 4)
+ {
+ formed_text_init(&lyr_text);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+static void check_content(void *data, const char *name, const char **atts)
+{
+ if(strstr(name, "text") != NULL)
+ {
+
+ result |= 16;
+ }
+}
+
+
+static void check_search_response(void *data, const char *name,
+ const char **atts)
+{
+ if(strstr(name, "response") != NULL)
+ {
+ result |=2;
+ return;
+ }
+
+ if(result & 4)
+ {
+ if(strstr(name, "result") != NULL)
+ {
+ if(strstr(atts[2], "hid") != NULL)
+ {
+ hid = atts[3];
+ }
+
+ if(strstr(atts[2], "exactMatch") != NULL)
+ {
+ result |= 8;
+ }
+ }
+ }
+
+}
+
+static void end_tag(void *data, const char *name)
+{
+ //hmmmmmm
+}
+
+ static void check_search_success(void *userData, const XML_Char *s, int len)
+ {
+ if(result & 2) //lets first check whether we're right
+ { //we don't really want to search in the wrong string
+ if(strstr((char*) s, "SUCCESS"))
+ {
+ result |=4;
+ }
+ }
+ }
+
+static void fetch_text(void *userData, const XML_Char *s, int len)
+{
+ if(result & 16)
+ {
+ add_text_line(&lyr_text, s, len);
+ }
+}
+
+/*int deregister_lyr_leoslyrics ()
+{
+
+}*/
+
+int check_lyr_leoslyrics(char *artist, char *title, char *url)
+{
+ char url_avail[256];
+
+ //this replacess the whitespaces with '+'
+ g_strdelimit(artist, " ", '+');
+ g_strdelimit(title, " ", '+');
+
+ //we insert the artist and the title into the url
+ snprintf(url_avail, 512, LEOSLYRICS_SEARCH_URL, artist, title);
+
+ //download that xml!
+ easy_download_struct lyr_avail = {NULL, 0,-1};
+
+ g_timer_start(dltime);
+ if(!easy_download(url_avail, &lyr_avail, check_dl_progress)) return -1;
+ g_timer_stop(dltime);
+
+ //we gotta parse that stuff with expat
+ parser = XML_ParserCreate(NULL);
+ XML_SetUserData(parser, NULL);
+
+ XML_SetElementHandler(parser, check_search_response, end_tag);
+ XML_SetCharacterDataHandler(parser, check_search_success);
+ XML_Parse(parser, lyr_avail.data, strlen(lyr_avail.data), 0);
+ XML_ParserFree(parser);
+
+ if(!(result & 4)) return -1; //check whether lyrics found
+ snprintf(url, 512, LEOSLYRICS_CONTENT_URL, hid);
+
+ return 0;
+}
+
+int get_lyr_leoslyrics(char *artist, char *title)
+{
+ char url_hid[256];
+ if(dltime == NULL) dltime = g_timer_new();
+
+ if(check_lyr_leoslyrics(artist, title, url_hid) != 0) return -1;
+
+ easy_download_struct lyr_content = {NULL, 0,-1};
+ g_timer_continue(dltime);
+ if(!(easy_download(url_hid, &lyr_content, check_dl_progress))) return -1;
+ g_timer_stop(dltime);
+
+ contentp = XML_ParserCreate(NULL);
+ XML_SetUserData(contentp, NULL);
+ XML_SetElementHandler(contentp, check_content, end_tag);
+ XML_SetCharacterDataHandler(contentp, fetch_text);
+ XML_Parse(contentp, lyr_content.data, strlen(lyr_content.data), 0);
+ XML_ParserFree(contentp);
+
+ return 0;
+
+}
+#if SRC_LYR_LEOSLYRICS == plugin
+int register_me (src_lyr *source_descriptor)
+{
+ source_descriptor->check_lyr = check_lyr_leoslyrics;
+ source_descriptor->get_lyr = get_lyr_leoslyrics;
+
+ source_descriptor->name = "Leoslyrics";
+ source_descriptor->description = "powered by http://www.leoslyrics.com";
+}
+#endif