From 9c59f0196804f348c93b5aebf3b76f118f596bb3 Mon Sep 17 00:00:00 2001 From: Qball Cow Date: Mon, 12 Jan 2009 13:48:24 +0100 Subject: [PATCH] Implement search integration --- src/magnatune.c | 54 +++++++++++++++++++++++++++++++++++++++--------------- src/magnatune.h | 2 +- src/plugin.c | 33 ++++++++++++++++++++++++++++----- 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/magnatune.c b/src/magnatune.c index 49c95dc..28de125 100644 --- a/src/magnatune.c +++ b/src/magnatune.c @@ -355,7 +355,7 @@ void magnatune_db_download_xml(ProgressCallback cb, gpointer data ) dld->max_size = -1; dld->data = NULL; dld->size = 0; - g_thread_create(magnatune_db_download_xml_thread, dld,FALSE, NULL); + g_thread_create((GThreadFunc)magnatune_db_download_xml_thread, dld,FALSE, NULL); } @@ -549,16 +549,34 @@ GList * magnatune_db_get_url_list(const char *wanted_genre,const char *wanted_ar return list; } +static int custcmp(const gchar *hay, const gchar *needle) +{ + int retv = -1; + gchar *sa1 = g_utf8_casefold(needle, -1); + gchar *sa = g_utf8_normalize(sa1,-1,G_NORMALIZE_ALL_COMPOSE); + gchar *sb1 = g_utf8_casefold(hay, -1); + gchar *sb = g_utf8_normalize(sb1,-1,G_NORMALIZE_ALL_COMPOSE); + retv = (strstr(sb, sa) == NULL); + g_free(sa1);g_free(sa); + g_free(sb1);g_free(sb); + return retv; +} - -MpdData* magnatune_db_get_song_list(const char *wanted_genre,const char *wanted_artist, const char *wanted_album) +MpdData* magnatune_db_get_song_list(const char *wanted_genre,const char *wanted_artist, const char *wanted_album, gboolean exact) { MpdData *data = NULL; axlNode * root; axlNode * cur; + int (*cmpfunc)(const char *hay, const char *needle); + if(exact) + { + cmpfunc = strcmp; + }else{ + cmpfunc = custcmp; + } /** check if there is data */ g_mutex_lock(mt_db_lock); - if(magnatune_xmldoc == NULL || wanted_genre == NULL) + if(magnatune_xmldoc == NULL ) { g_mutex_unlock(mt_db_lock); return NULL; @@ -597,20 +615,26 @@ MpdData* magnatune_db_get_song_list(const char *wanted_genre,const char *wanted_ cur2 = axl_node_get_next(cur2); } - if(genre && strstr(genre, wanted_genre)) - { - if(wanted_artist && wanted_album) { - if(!strcmp(wanted_artist,artist) && !strcmp(wanted_album, album)) { - add_urls = TRUE; - } - }else if(wanted_artist) { - if(!strcmp(wanted_artist, artist)) { - add_urls = TRUE; + add_urls = TRUE; + if(wanted_genre && add_urls) { + add_urls = FALSE; + if(genre) + { + int i=0; + gchar **str = g_strsplit(genre, ",", 0); + for(i=0; str && str[i];i++) + { + if(cmpfunc(str[i], wanted_genre) == 0) add_urls = TRUE; } - } else { - add_urls = TRUE; + if(str)g_strfreev(str); } } + if(wanted_album && add_urls) { + add_urls = (album && cmpfunc(album, wanted_album) == 0); + } + if(wanted_artist && add_urls) { + add_urls = (artist && cmpfunc(artist, wanted_artist) == 0); + } if(add_urls) { diff --git a/src/magnatune.h b/src/magnatune.h index 2c63d7b..cda7487 100644 --- a/src/magnatune.h +++ b/src/magnatune.h @@ -31,5 +31,5 @@ MpdData * magnatune_db_get_album_list(char *wanted_genre,char *wanted_artist); MpdData * magnatune_db_get_artist_list(char *genre); GList * magnatune_db_get_url_list(const char *wanted_genre,const char *wanted_artist, const char *wanted_album); -MpdData* magnatune_db_get_song_list(const char *wanted_genre,const char *wanted_artist, const char *wanted_album); +MpdData* magnatune_db_get_song_list(const char *wanted_genre,const char *wanted_artist, const char *wanted_album,gboolean exact); #endif diff --git a/src/plugin.c b/src/plugin.c index 12d14ac..5493cc0 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -247,7 +247,7 @@ static void magnatune_show_song_list(GtkTreeSelection *selection, gpointer user_ } } } - data = magnatune_db_get_song_list(genre, artist, album); + data = magnatune_db_get_song_list(genre, artist, album,TRUE); gmpc_mpddata_model_set_mpd_data(GMPC_MPDDATA_MODEL(mt_store), data); } @@ -534,7 +534,7 @@ static void magnatune_download_xml_callback(int download, int total,gpointer dat p->pb = data; p->download = download; p->total =total; - g_idle_add(magnatune_download_xml_callback_real, p); + g_idle_add((GSourceFunc)magnatune_download_xml_callback_real, p); } static int magnatune_download_xml_callback_real(Pass *p) @@ -577,14 +577,14 @@ static void magnatune_add(GtkWidget *cat_tree) { GtkTreePath *path = NULL; GtkTreeIter iter,child; - GtkTreeStore *pl3_tree = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(cat_tree)); + GtkListStore *pl3_tree = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(cat_tree)); gint pos = cfg_get_single_value_as_int_with_default(config, "magnatune","position",20); if(!cfg_get_single_value_as_int_with_default(config, "magnatune", "enable", TRUE)) return; debug_printf(DEBUG_INFO,"Adding at position: %i", pos); playlist3_insert_browser(&iter, pos); - gtk_list_store_set(pl3_tree, &iter, + gtk_list_store_set(GTK_LIST_STORE(pl3_tree), &iter, PL3_CAT_TYPE, plugin.id, PL3_CAT_TITLE, "Magnatune Browser", PL3_CAT_INT_ID, "", @@ -873,7 +873,7 @@ static int magnatune_button_handle_release_event_tag_add(GtkWidget *button, gpoi mpd_playlist_queue_commit(connection); if(list) { - g_list_foreach(list, g_free, NULL); + g_list_foreach(list, (GFunc)g_free, NULL); g_list_free(list); } if(genre) @@ -1034,6 +1034,28 @@ static void magnatune_destroy(void) gtk_widget_destroy(magnatune_vbox); } +static MpdData * magnatune_integrate_search(const int search_field, const gchar *query,GError **error) +{ + const gchar *genre = NULL, *artist=NULL, *album=NULL; + if(!magnatune_get_enabled()) return NULL; + switch(search_field){ + case MPD_TAG_ITEM_ARTIST: + artist = query; + break; + case MPD_TAG_ITEM_ALBUM: + album = query; + break; + case MPD_TAG_ITEM_GENRE: + genre = query; + break; + default: + g_set_error(error, 0,0, "This type of search query is not supported"); + return NULL; + break; + } + return magnatune_db_get_song_list(genre, artist, album,FALSE); +} + gmpcMetaDataPlugin magnatune_cover = { .get_priority = magnatune_fetch_cover_priority, .set_priority = magnatune_fetch_cover_priority_set, @@ -1047,6 +1069,7 @@ gmpcPlBrowserPlugin magnatune_gbp = { .selected = magnatune_selected, .unselected = magnatune_unselected, .cat_right_mouse_menu = magnatune_cat_menu_popup, + .integrate_search = magnatune_integrate_search }; int plugin_api_version = PLUGIN_API_VERSION; -- 2.11.4.GIT