Code

const pointers
[ncmpc.git] / src / lyrics_leoslyrics.c
1 #include "src_lyrics.h"
2 #include "easy_download.h"
3 #include <expat.h>
4 #include <string.h>
5 #include "options.h"
7 #define LEOSLYRICS_SEARCH_URL "http://api.leoslyrics.com/api_search.php?auth=ncmpc&artist=%s&songtitle=%s"
8 #define LEOSLYRICS_CONTENT_URL "http://api.leoslyrics.com/api_lyrics.php?auth=ncmpc&hid=%s"
9 #define CREDITS "Lyrics provided by www.LeosLyrics.com"
11 char *hid;
12 XML_Parser parser, contentp;
14 int check_dl_progress(void *clientp, double dltotal, double dlnow,
15                         double ultotal, double ulnow)
16 {
17         if(g_timer_elapsed(dltime, NULL) >= options.lyrics_timeout || lock == 4)
18         {       
19                 formed_text_init(&lyr_text);
20                 return -1;
21         }
23         return 0;
24 }       
28 static void check_content(void *data, const char *name, const char **atts)
29
30         if(strstr(name, "text") != NULL)
31         {
33                 result |= 16;
34         }
35 }
36         
38 static void check_search_response(void *data, const char *name,
39                  const char **atts)
40 {
41         if(strstr(name, "response") != NULL)
42         {
43         result |=2;
44         return;
45         }  
46             
47         if(result & 4)
48         {
49                 if(strstr(name, "result") != NULL)
50                 {
51                         if(strstr(atts[2], "hid") != NULL)
52                         {
53                                 hid = strdup (atts[3]);
54                         }
55         
56                         if(strstr(atts[2], "exactMatch") != NULL)
57                         {
58                                 result |= 8;
59                         }                       
60                 }
61         }
62                         
63 }
65 static void end_tag(void *data, const char *name)
66 {
67   //hmmmmmm             
68 }
70   static void check_search_success(void *userData, const XML_Char *s, int len)
71     {
72         if(result & 2)  //lets first check whether we're right
73         {               //we don't really want to search in the wrong string
74                 if(strstr((char*) s, "SUCCESS"))
75                 {
76                 result |=4;
77                 }
78         }       
79     }
81 static void fetch_text(void *userData, const XML_Char *s, int len) 
82 {
83         if(result & 16)
84         {
85                 if (s[0] == 13 ) return; //ignore any single carriage returns
86                 add_text_line(&lyr_text, s, len); 
87         }
88 }
90 /*int deregister_lyr_leoslyrics ()
91 {
92   
93 }*/
95 int check_lyr_leoslyrics(char *artist, char *title, char *url)
96 {
97         char url_avail[256];
98         CURL *curl = curl_easy_init ();
101         //this replacess the whitespaces with '+'
102         char *esc_title = curl_easy_escape (curl, title, 0);
103         char *esc_artist = curl_easy_escape (curl, artist, 0); 
104         //we insert the artist and the title into the url               
105         snprintf(url_avail, 512, LEOSLYRICS_SEARCH_URL, esc_artist, esc_title);
107         //download that xml!
108         easy_download_struct lyr_avail = {NULL, 0,-1};  
109         
110         g_timer_start(dltime);
111         if(!easy_download(url_avail, &lyr_avail, check_dl_progress)) return -1;
112         g_timer_stop(dltime);
114         //we gotta parse that stuff with expat
115         parser = XML_ParserCreate(NULL);
116         XML_SetUserData(parser, NULL);
117         
118         XML_SetElementHandler(parser, check_search_response, end_tag);
119         XML_SetCharacterDataHandler(parser, check_search_success);
120         XML_Parse(parser, lyr_avail.data, strlen(lyr_avail.data), 0);   
121         XML_ParserFree(parser); 
123         if(!(result & 4)) return -1; //check whether lyrics found
125         char *esc_hid = curl_easy_escape (curl, hid, 0);
126         free (hid);
128         snprintf(url, 512, LEOSLYRICS_CONTENT_URL, esc_hid);
130         return 0;
133 int get_lyr_leoslyrics(char *artist, char *title)
135         char url_hid[256];
136         if(dltime == NULL) dltime = g_timer_new();
138         if(check_lyr_leoslyrics(artist, title, url_hid) != 0) return -1;
139         
140         easy_download_struct lyr_content = {NULL, 0,-1};  
141         g_timer_continue(dltime);               
142         if(!(easy_download(url_hid, &lyr_content, check_dl_progress))) return -1;
143         g_timer_stop(dltime);
144         
145         contentp = XML_ParserCreate(NULL);
146         XML_SetUserData(contentp, NULL);
147         XML_SetElementHandler(contentp, check_content, end_tag);        
148         XML_SetCharacterDataHandler(contentp, fetch_text);
149         XML_Parse(contentp, lyr_content.data, strlen(lyr_content.data), 0);
150         XML_ParserFree(contentp);
152         return 0;
153         
155 int register_lyr_leoslyrics (src_lyr *source_descriptor)
156
157   source_descriptor->check_lyr = check_lyr_leoslyrics;
158   source_descriptor->get_lyr = get_lyr_leoslyrics;
159   
160   source_descriptor->name = "Leoslyrics";
161   source_descriptor->description = "powered by http://www.leoslyrics.com";