Cleanup.
[jamendo] / src / jamendo_api.c
1 /*
2  * jamendo_api.c
3  *
4  *  Created on: 2009-10-05
5  *      Author: marcin
6  */
7
8 #include "jamendo_api.h"
9 #include "http_utils.h"
10
11 static const gchar * const GET_API = "http://api.jamendo.com/get2/";
12
13 typedef gpointer (*NodeParseFunc)(xmlNode*);
14 static GList* xml_query(gchar* query, NodeParseFunc node_parse_func);
15
16 GList* jamendo_get_popular_albums_week() {
17         return xml_query("id+name+image+rating+artist_name/album/xml/?n=25&order=ratingweek_desc", (NodeParseFunc)album_new_from_xml);
18 }
19
20 GList* jamendo_search_for_albums_by_tag(const gchar* tag) {
21         gchar* query = g_strdup_printf("id+name+image+rating+artist_name/album/xml/?n=50&order=ratingweek_desc&tag_idstr=%s",tag);
22         GList* album_list = xml_query(query, (NodeParseFunc)album_new_from_xml);
23         g_free(query);
24         return album_list;
25 }
26
27 GList* jamendo_search_for_albums_by_artist(const gchar* artist_name) {
28         gchar* query = g_strdup_printf("id+name+image+rating+artist_name/album/xml/?n=50&order=ratingweek_desc&searchquery=%s",artist_name);
29         GList* album_list = xml_query(query, (NodeParseFunc)album_new_from_xml);
30         g_free(query);
31         return album_list;
32 }
33
34 GList* jamendo_search_for_user_starred_albums(const gchar* user) {
35         gchar* query = g_strdup_printf("id+name+image+rating+artist_name/album/xml/album_user_starred/?user_idstr=%s&n=all&order=rating_desc",user);
36         GList* album_list = xml_query(query, (NodeParseFunc)album_new_from_xml);
37         g_free(query);
38         return album_list;
39 }
40
41 GList* jamendo_search_for_user_playlist(const gchar* user) {
42         //TODO: implement playlists support
43         return NULL;
44 }
45
46 GList* jamendo_get_album_tracks(Album* album) {
47         gchar* query = g_strdup_printf("id+name+duration+rating+stream+artist_name/track/xml/track_album+album_artist/?album_id=%d",album->id);
48         GList *track_list = xml_query(query, (NodeParseFunc)track_new_from_xml);
49         g_free(query);
50         return track_list;
51 }
52
53 GList* jamendo_get_top_100() {
54         gchar* query = "id+name+duration+rating+stream+album_name+artist_name/track/xml/track_album+album_artist/?n=100&order=ratingweek_desc";
55         GList *track_list = xml_query(query, (NodeParseFunc)track_new_from_xml);
56         return track_list;
57 }
58
59 GList* jamendo_get_radios() {
60         gchar* query = "id+idstr+image/radio/xml/?id=4+5+6+7+8+9";
61         GList *radio_list = xml_query(query, (NodeParseFunc)radio_new_from_xml);
62         return radio_list;
63 }
64
65 GList* jamendo_get_radio_playlist(Radio* radio) {
66         gchar* query = g_strdup_printf("id+name+duration+rating+stream+artist_name/track/xml/radio_track_inradioplaylist+track_album+album_artist/?radio_id=%d&nshuffle=1&n=%d",radio->id,100);
67         GList *track_list = xml_query(query, (NodeParseFunc)track_new_from_xml);
68         g_free(query);
69         return track_list;
70 }
71
72 /*
73  * Helper function for XML query parsing
74  */
75 static GList* xml_query(gchar* query, NodeParseFunc node_parse_func) {
76         GList *parsed_list = NULL;
77
78         gchar* uri = g_strdup_printf("%s%s", GET_API, query);
79         xmlDocPtr doc = http_get_xml(uri);
80         g_free(uri);
81         if (doc) {
82                 xmlNode *root_node = xmlDocGetRootElement(doc);
83                 if (root_node->type == XML_ELEMENT_NODE && g_strcmp0((gchar*) root_node->name, "data") == 0) {
84                         xmlNode* child_node;
85                         for (child_node = root_node->children; child_node; child_node = child_node->next) {
86                                 gpointer parsed_object = node_parse_func(child_node);
87                                 if (parsed_object) {
88                                         parsed_list = g_list_append(parsed_list, parsed_object);
89                                 }
90                         }
91                 }
92         }
93
94         xmlFreeDoc(doc);
95         return parsed_list;
96 }