rendered paste body#include <gtk/gtk.h>#include "gui.h"#include "playlist.h"#include "statusbox.h"#include "coverart_wizard.h"enum { CA_NAME_COL, CA_PIX_COL, CA_TYPE_COL, CA_PTR_COL, CA_N_COLS};/* This is the dumbest thing i've ever done */typedef struct{ void *p1; void *p2; void *p3; void *p4; void *p5; int i1; int i2;}misc;void populate_artview(GtkButton *button,gpointer data){ GUI_SESSION *g = data; GtkTreeStore *store = g->artstore; gboolean rv; printf("data1 = %p\n",data); GtkTreeIter iter; GtkTreePath *path; /* Remove any existing rows */ rv = gtk_tree_model_get_iter_first(store,&iter); while(rv == TRUE){ rv = gtk_tree_store_remove(store,&iter); } int i,j; GtkTreeIter iter2; char *img_data; size_t img_size; GdkPixbuf *pix_buf; GdkPixbuf *pix_tbuf; unsigned short rvi; for(i=0;i<g->a_size;i++){ gtk_tree_store_append(store, &iter,NULL); gtk_tree_store_set(store, &iter, CA_NAME_COL,g->artist_lib[i]->name, CA_TYPE_COL,ARTIST, CA_PTR_COL,g->artist_lib[i], -1); for(j=0;j<g->artist_lib[i]->album_count;j++){ if(g->artist_lib[i]->album[j]->has_art){ printf("%s has art\n",g->artist_lib[i]->name); rvi = LIBRARY_get_image_blob(0, g->artist_lib[i]->album[j]->id, &img_data,&img_size); if(rvi){ printf("image fetch error:\m"); }else { pix_tbuf = vgdk_pixbuf_new_from_memory( img_data,img_size); free(img_data); pix_buf = vgdk_pixbuf_scale_keep_ratio( pix_tbuf,0,100); g_object_unref(pix_tbuf); } } gtk_tree_store_append(store,&iter2,&iter); gtk_tree_store_set(store,&iter2, CA_NAME_COL,g->artist_lib[i]->album[j]->name, CA_TYPE_COL,ALBUM, CA_PTR_COL,g->artist_lib[i]->album[j], CA_PIX_COL,(rvi) ? NULL : pix_buf, -1); if(!rvi){ g_object_unref(pix_buf); path = gtk_tree_model_get_path (store,&iter); gtk_tree_view_expand_row(g->artview,path,TRUE); gtk_tree_path_free(path); } rvi =1; } } }void *do_fetch_art(void *data){ misc *m = data; GUI_SESSION *g = m->p1; GtkTreePath *path = m->p3; GtkWidget *button = m->p4; int type = m->i1; GtkTreeIter iter; gboolean rv; if(type == ARTIST){ LASTFM_ARTIST_INFO *artist; LIBRARY_artist_metadata *artist_met = m->p2; artist = LASTFM_artist_get_info(g->amatory->lastfm_session, artist->name); if(artist->image_size ==0 ){ LASTFM_free_artist_info(artist); goto no_art; } LIBRARY_add_image_blob(artist_met->id,0,artist->image, artist->image_size); LASTFM_print_artist_info(stdout,artist); GdkPixbuf *tpix = vgdk_pixbuf_new_from_memory(artist->image, artist->image_size); GdkPixbuf *pix = vgdk_pixbuf_scale_keep_ratio(tpix,0,100); LASTFM_free_artist_info(artist); g_object_unref(tpix); artist_met->has_art = 1; gdk_threads_enter(); rv = gtk_tree_model_get_iter(g->artstore,&iter,path); gtk_tree_store_set(g->artstore,&iter,CA_PIX_COL,pix,-1); gdk_threads_leave(); }else if(type == ALBUM){ LASTFM_ALBUM_INFO *album; LIBRARY_album_metadata *album_met = m->p2; album = LASTFM_album_get_info(g->amatory->lastfm_session, album_met->tracks[0]->artist->name,album_met->name); if(album->image_size == 0){ LASTFM_free_album_info(album); goto no_art; } LIBRARY_add_image_blob(0,album_met->id,album->image, album->image_size); LASTFM_print_album_info(stdout,album); GdkPixbuf *tpix = vgdk_pixbuf_new_from_memory(album->image, album->image_size); GdkPixbuf *pix = vgdk_pixbuf_scale_keep_ratio(tpix,0,100); LASTFM_free_album_info(album); g_object_unref(tpix); album_met->has_art = 1; gdk_threads_enter(); rv = gtk_tree_model_get_iter(g->artstore,&iter,path); gtk_tree_store_set(g->artstore,&iter,CA_PIX_COL,pix,-1); gdk_threads_leave(); } no_art: gdk_threads_enter(); gtk_widget_set_sensitive(button,TRUE); gdk_threads_leave(); gtk_tree_path_free(path); free(m); return;}void on_fetch_clicked(GtkWidget *button, gpointer data){ GUI_SESSION *g = data; gboolean rv; GtkTreeSelection *select; GtkTreeIter iter; gtk_widget_set_sensitive(button,FALSE); select = gtk_tree_view_get_selection(g->artview); rv = gtk_tree_selection_get_selected (select,& g->artstore, &iter); if(rv == FALSE){ return; } gpointer ptr; int type; gtk_tree_model_get (g->artstore, &iter,CA_TYPE_COL,&type,CA_PTR_COL,&ptr,-1); if(type == ARTIST){ gtk_widget_show(g->progress_bar); misc *m = malloc(sizeof(misc)); pthread_t tid; m->p1 = g; m->p2 = ptr; m->p3 = gtk_tree_model_get_path(g->artstore,&iter); m->p4 = button; m->i1 = type; gtk_widget_show(g->progress_bar); g->amatory->lastfm_session->fraction = 0; g->update_progress_bar_handler_id = gdk_threads_add_timeout_full( G_PRIORITY_DEFAULT,100,update_progress_bar_handler, g,NULL); pthread_create(&tid,NULL,do_fetch_art,m); }else if(type == ALBUM){ misc *m = malloc(sizeof(misc)); pthread_t tid; m->p1 = g; m->p2 = ptr; m->p3 = gtk_tree_model_get_path(g->artstore,&iter); m->p4 = button; m->i1 = type; gtk_widget_show(g->progress_bar); g->amatory->lastfm_session->fraction = 0; g->update_progress_bar_handler_id = gdk_threads_add_timeout_full( G_PRIORITY_DEFAULT,100,update_progress_bar_handler, g,NULL); pthread_create(&tid,NULL,do_fetch_art,m); }else{ printf("Invalid Type:%i\n",type); } no_art: //gtk_widget_hide(g->progress_bar); return; }GtkWidget *create_artview(GUI_SESSION *g){ GtkTreeStore *store = gtk_tree_store_new(CA_N_COLS, G_TYPE_STRING, // Artist or Album name GDK_TYPE_PIXBUF, // album or artist art G_TYPE_INT, // flag whether its an artist or album G_TYPE_POINTER); // Artist or Album id GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view),TRUE);// gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),// GTK_SELECTION_MULTIPLE); /* Text Renderer */ GtkCellRenderer *text_renderer = gtk_cell_renderer_text_new(); g_object_set (text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, "size-points",10.0,NULL); /* Text Column */ GtkTreeViewColumn *column; column = gtk_tree_view_column_new_with_attributes( "Artist / Album", text_renderer, "text", 0, NULL); gtk_tree_view_column_set_resizable (column,TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); /* Pix Renderer */ GtkCellRenderer *pix_renderer = gtk_cell_renderer_pixbuf_new(); /* Pix Column */ column = gtk_tree_view_column_new_with_attributes( "Art",pix_renderer, "pixbuf",1,NULL); gtk_tree_view_column_set_resizable (column,TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); g->artstore = store; g->artview = view; return view;}int run_coverart_wizard(GUI_SESSION *g){ GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); GdkGeometry gdkGeometry; gdkGeometry.min_width= 800; gdkGeometry.min_height = 600; gtk_window_set_geometry_hints(GTK_WINDOW(window), window, &gdkGeometry, GDK_HINT_MIN_SIZE); GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL); GtkWidget *view = create_artview(g); gtk_container_add(GTK_CONTAINER(scroll), view); GtkWidget *box =gtk_vbox_new(FALSE,0); GtkWidget *button_box = gtk_hbox_new(FALSE,0); GtkWidget *db_button = gtk_button_new_with_label("Load Database"); GtkWidget *fetch_button = gtk_button_new_with_label("Fetch Selected"); g_signal_connect(db_button,"clicked",G_CALLBACK(populate_artview),g); g_signal_connect(fetch_button,"clicked",G_CALLBACK(on_fetch_clicked),g); gtk_box_pack_start(GTK_BOX(box),scroll,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(button_box),db_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(button_box),fetch_button,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(box),button_box,FALSE,TRUE,0); gtk_container_add(GTK_CONTAINER(window),box); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_widget_destroy),window); gtk_widget_show_all(window); return 0;}