Mercurial > audlegacy
changeset 3183:bcf611cf5ae2 trunk
lastfm radio GUI
author | Cristi Magherusan <majeru@atheme-project.org> |
---|---|
date | Sat, 28 Jul 2007 01:27:59 +0300 |
parents | 384cb84c968f |
children | 564359ff9304 |
files | src/audacious/ui_lastfm.c |
diffstat | 1 files changed, 365 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/audacious/ui_lastfm.c Fri Jul 27 03:16:09 2007 +0200 +++ b/src/audacious/ui_lastfm.c Sat Jul 28 01:27:59 2007 +0300 @@ -1,5 +1,368 @@ -#include <glib.h> +#include <gtk/gtk.h> +#include <glib/gi18n.h> +#include <gdk/gdkkeysyms.h> +#include "configdb.h" +#include "playback.h" + +#define DEBUG 1 +typedef struct { + gchar *username, + *session; +}last_fm; + +typedef struct +{ + gchar *artist, + *title; +} +track_data; + +last_fm *login_data=NULL; +Playlist *current_playlist=NULL; +TitleInput *info = NULL; +GtkWidget *lastfm_url_entry, *lastfm_label,*artist_label,*title_label,*album_label, *gui_window=NULL; + +gpointer open_url(gpointer url) +{ + gchar*s=g_new0(gchar,20); + VFSFile* fd = vfs_fopen((gchar*)url,"r"); + if(fd) + { + vfs_fgets(s,20,fd); + g_print("Got data: '%s'\n",s); + vfs_fclose(fd); + } + g_free(s); + g_free(url); + return NULL; +} +void command(gchar *comm) +{ + /* get the session from mowgli*/ + if(login_data->session) + { + g_free(login_data->session); + login_data->session=NULL; + } + login_data->session = g_strdup(mowgli_global_storage_get("lastfm_session_id")); + gchar *url=g_strdup_printf("http://ws.audioscrobbler.com/radio/control.php?session=%s&command=%s&debug=0",login_data->session,comm); + g_thread_create(open_url,url,FALSE,NULL); + if(!g_str_has_prefix(comm,"love")) + g_thread_create((gpointer)playback_initiate,NULL,FALSE,NULL); +return; + +} +static void change_track_data_cb(gpointer track, gpointer unused) +{ + gchar **inf, + **t, + *alb, + *tr; + tr=((track_data*)track)->title; + + if(tr==NULL) + return ; +#if DEBUG + g_print("New Track: %s \n",tr); +#endif + if(g_str_has_prefix(tr,"lastfm://")) + return; + + if(g_strrstr(tr,"Neighbour")!=NULL) + { + gchar *temp=g_strdup_printf("lastfm://user/%s/neighbours", login_data->username); + gtk_entry_set_text(GTK_ENTRY(lastfm_url_entry),temp); + g_free(temp); + } + if(g_strrstr(tr,"Personal")!=NULL) + { + gchar *temp=g_strdup_printf("lastfm://user/%s/personal", login_data->username); + gtk_entry_set_text(GTK_ENTRY(lastfm_url_entry),temp); + g_free(temp); + } + + inf = g_strsplit(tr," - ",2); + if(inf[0]==NULL || inf[1]==NULL) + return; + gchar* artist_markup=g_strdup_printf("<b>Artist:</b> %s" ,inf[0]); + gtk_label_set_markup(GTK_LABEL(artist_label),artist_markup); + g_free(artist_markup); + + t = g_strsplit(inf[1], g_strrstr(inf[1],"("),2); + alb = g_strdup(mowgli_global_storage_get("lastfm_album")); + + gchar* title_markup=g_strdup_printf("<b>Title:</b> %s" ,t[0]); + gtk_label_set_markup( GTK_LABEL(title_label),title_markup); + g_free(title_markup); + + gchar* album_markup=g_strdup_printf("<b>Album:</b> %s" ,alb); + gtk_label_set_markup( GTK_LABEL(album_label),album_markup); + g_free(album_markup); + + g_strfreev(inf); + g_strfreev(t); + g_free(alb); + g_free(tr); + + return ; +} + +static void show_login_error_dialog(void) +{ + const gchar *markup = + N_("<b><big>Couldn't find your lastfm login data.</big></b>\n\n" + "Check if your Scrobbler's plugin login settings are configured properly.\n"); + + GtkWidget *dialog = + gtk_message_dialog_new_with_markup(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _(markup)); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + + + +void init_last_fm(void) +{ + login_data = g_new0(last_fm,1); + login_data->username = NULL; + login_data->session = NULL; + ConfigDb *cfg = NULL; + + if ((cfg = bmp_cfg_db_open()) != NULL) + { + login_data->username=NULL; + bmp_cfg_db_get_string(cfg, "audioscrobbler","username", + &login_data->username); + if(login_data->username==NULL) + show_login_error_dialog(); + g_free(cfg); + } + + current_playlist = g_new0(Playlist,1); + current_playlist = playlist_get_active(); + track_data * tr=g_new0(track_data,1); + tr->title =NULL; + hook_associate( "playlist set info" , change_track_data_cb ,tr); + +} + +/*event callback functions*/ + +gboolean love_press_callback(GtkWidget *love) +{ + command("love"); + return FALSE; +} + +gboolean skip_press_callback(GtkWidget *skip) +{ + command("skip"); + return FALSE; +} +gboolean ban_press_callback(GtkWidget *ban) +{ + command("ban"); + return FALSE; +} + + +gboolean add_press_callback(GtkWidget *love) +{ + gchar *text=NULL; + gint poz=0; + text = g_strdup(gtk_entry_get_text(GTK_ENTRY(lastfm_url_entry))); + poz = playlist_get_length(current_playlist); + playlist_add_url(current_playlist, text); + sleep(1); + playlist_set_position(current_playlist, poz); + playback_initiate(); + g_free(text); + return FALSE; +} + +gboolean neighbours_press_callback(GtkWidget *love) +{ + gchar *temp=g_strdup_printf("lastfm://user/%s/neighbours", login_data->username); + gtk_entry_set_text(GTK_ENTRY(lastfm_url_entry),temp); + g_free(temp); + return FALSE; +} + +gboolean personal_press_callback(GtkWidget *love) +{ + gchar *per=g_strdup_printf("lastfm://user/%s/personal", login_data->username); + gtk_entry_set_text(GTK_ENTRY(lastfm_url_entry),per); + g_free(per); + return FALSE; +} + +gboolean delete_window_callback(GtkWidget *window) +{ + gtk_widget_destroy(window); + window=NULL; + return FALSE; +} +static gboolean keypress_callback(GtkWidget * widget, GdkEventKey * event, gpointer data) +{ +switch (event->keyval) + { + case GDK_Escape: + gtk_widget_hide_all(widget); + break; + default: + return FALSE; + } +return TRUE; +} + + +GtkWidget *ui_lastfm_create(void) +{ + GtkWidget *window; + GtkWidget *box1,*box2,*vboxw,*vbox1,*vbox2,*v_hbox1,*v_hbox2,*labelbox; + GtkWidget *love,*ban,*skip,*add,*neighbours,*personal; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(window), N_("Audacious last.fm radio tuner")); + lastfm_label = gtk_label_new_with_mnemonic(N_("Station:")); + title_label = gtk_label_new(NULL); + artist_label = gtk_label_new(NULL); + album_label = gtk_label_new(NULL); + lastfm_url_entry = gtk_entry_new(); + gtk_editable_set_editable (GTK_EDITABLE(lastfm_url_entry),TRUE); + gchar* artist_markup=g_strdup("<b>Artist:</b>"); + gtk_label_set_markup(GTK_LABEL(artist_label),artist_markup); + g_free(artist_markup); + + gchar* title_markup=g_strdup("<b>Title:</b>"); + gtk_label_set_markup( GTK_LABEL(title_label),title_markup); + g_free(title_markup); + + gchar* album_markup=g_strdup_printf("<b>Album:</b>"); + gtk_label_set_markup( GTK_LABEL(album_label),album_markup); + g_free(album_markup); + + love = gtk_button_new_with_label (N_("Love")); + ban = gtk_button_new_with_label (N_("Ban")); + skip = gtk_button_new_with_label (N_("Skip")); + add = gtk_button_new_with_label (N_("Tune in")); + + neighbours = gtk_button_new_with_label(N_("Neighbours' radio")); + personal = gtk_button_new_with_label(N_("Personal radio")); + + box1 = gtk_hbox_new(FALSE,1); + box2 = gtk_hbox_new(FALSE,1); + + vboxw = gtk_vbox_new(FALSE,1); + + vbox1 = gtk_vbox_new(FALSE,1); + vbox2 = gtk_vbox_new(FALSE,1); + + v_hbox1 = gtk_vbox_new(FALSE,1); + v_hbox2 = gtk_hbox_new(FALSE,1); + labelbox = gtk_vbox_new(FALSE,1); + + gtk_misc_set_alignment(GTK_MISC(artist_label),0,0); + gtk_misc_set_alignment(GTK_MISC(title_label),0,0); + gtk_misc_set_alignment(GTK_MISC(album_label),0,0); + + gtk_box_pack_start(GTK_BOX(vboxw),box1,FALSE,TRUE,1); + gtk_box_pack_end(GTK_BOX(vboxw),box2,TRUE,TRUE,1); + + gtk_box_pack_start(GTK_BOX(box1),lastfm_label,FALSE,TRUE,1); + gtk_box_pack_start(GTK_BOX(box1),lastfm_url_entry,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(box1),add,FALSE,TRUE,1); + + gtk_box_set_spacing(GTK_BOX(box1),2); + gtk_container_set_border_width(GTK_CONTAINER(box1),2); + + gtk_box_pack_start(GTK_BOX(box2),vbox1,FALSE,TRUE,1); + gtk_box_pack_start(GTK_BOX(box2),vbox2,TRUE,TRUE,1); + + gtk_box_pack_start(GTK_BOX(vbox1),neighbours,FALSE,TRUE,3); + gtk_box_pack_start(GTK_BOX(vbox1),personal,FALSE,TRUE,3); + gtk_box_set_spacing(GTK_BOX(vbox1),2); + gtk_container_set_border_width(GTK_CONTAINER(vbox1),2); + + gtk_box_pack_start(GTK_BOX(vbox2),v_hbox1,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(vbox2),v_hbox2,TRUE,TRUE,1); + + gtk_box_pack_start(GTK_BOX(v_hbox1),artist_label,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(v_hbox1),title_label,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(v_hbox1),album_label,TRUE,TRUE,1); + gtk_box_set_spacing(GTK_BOX(v_hbox1),2); + gtk_container_set_border_width(GTK_CONTAINER(v_hbox1),2); + + + gtk_box_pack_start(GTK_BOX(v_hbox2),love,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(v_hbox2),skip,TRUE,TRUE,1); + gtk_box_pack_start(GTK_BOX(v_hbox2),ban,TRUE,TRUE,1); + gtk_box_set_spacing(GTK_BOX(v_hbox1),2); + gtk_container_set_border_width(GTK_CONTAINER(v_hbox1),2); + + + + gtk_container_add (GTK_CONTAINER (window), vboxw); + + g_signal_connect (G_OBJECT (love), "button_press_event",G_CALLBACK (love_press_callback), NULL); + g_signal_connect (G_OBJECT (add), "button_press_event",G_CALLBACK (add_press_callback), NULL); + g_signal_connect (G_OBJECT (ban), "button_press_event",G_CALLBACK (ban_press_callback), NULL); + g_signal_connect (G_OBJECT (skip), "button_press_event",G_CALLBACK (skip_press_callback), NULL); + g_signal_connect (G_OBJECT (neighbours), "button_press_event",G_CALLBACK (neighbours_press_callback), NULL); + g_signal_connect (G_OBJECT (personal), "button_press_event",G_CALLBACK (personal_press_callback), NULL); + g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (gtk_widget_hide_all), window); + g_signal_connect (G_OBJECT (window), "key_press_event",G_CALLBACK(keypress_callback), NULL); + + gtk_widget_set_size_request(GTK_WIDGET(window),400,124); + gtk_window_set_resizable(GTK_WINDOW(window),FALSE); + gtk_widget_show_all(gui_window); + return window; +} + +static void no_lastfm_plugin_dialog(void) +{ + const gchar *markup = + N_("<b><big>The lastfm radio plugin could not be found.</big></b>\n\n" + "Check if the AudioScrobbler plugin was compiled in\n"); + + GtkWidget *dialog = + gtk_message_dialog_new_with_markup(NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _(markup)); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + + + void ui_lastfm(void) { -g_print("lastfm gui stub\n"); +/*if(!mowgli_global_storage_get("lastfm_loaded")) + { + no_lastfm_plugin_dialog(); + return; + } +*/ +init_last_fm(); +if(!gui_window) + { + if((gui_window = ui_lastfm_create())!=NULL); + gtk_widget_show_all(gui_window); +#if 0 /*here should be set the artist, title and album labels at the first run, because it isn't captured by the hook*/ + gchar* current_title = playlist_get_songtitle(current_playlist,playlist_get_position(current_playlist)); + if(current_title) + change_track_data_cb(current_title,NULL); +#endif + } +else + gtk_widget_show_all(gui_window); + } +