4 * Created on: 2009-10-05
8 #include "jamendo_api.h"
9 #include "http_utils.h"
11 static const gchar * const GET_API = "http://api.jamendo.com/get2/";
13 typedef gpointer (*NodeParseFunc)(xmlNode*);
14 static GList* xml_query(gchar* query, NodeParseFunc node_parse_func);
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);
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);
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);
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);
41 GList* jamendo_search_for_user_playlist(const gchar* user) {
42 //TODO: implement playlists support
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);
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);
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);
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);
73 * Helper function for XML query parsing
75 static GList* xml_query(gchar* query, NodeParseFunc node_parse_func) {
76 GList *parsed_list = NULL;
78 gchar* uri = g_strdup_printf("%s%s", GET_API, query);
79 xmlDocPtr doc = http_get_xml(uri);
82 xmlNode *root_node = xmlDocGetRootElement(doc);
83 if (root_node->type == XML_ELEMENT_NODE && g_strcmp0((gchar*) root_node->name, "data") == 0) {
85 for (child_node = root_node->children; child_node; child_node = child_node->next) {
86 gpointer parsed_object = node_parse_func(child_node);
88 parsed_list = g_list_append(parsed_list, parsed_object);