/* Karchnu : * * currentsong : affiche le morceau que vous écoutez dans le buffer courant * * Pour l'ajouter : make ; cp song.so ~/.weechat/plugins/ * Puis dans weechat : /plugin load song.so * */ #include #include #include #include #include #include #include #define TAILLE_BUFFER_CURRENT_SONG 100 #define TAILLE_OPTIONS 15 WEECHAT_PLUGIN_NAME("currentsong"); WEECHAT_PLUGIN_DESCRIPTION("Affiche la musique en cours en utilisant mpc"); WEECHAT_PLUGIN_AUTHOR("Karchnu "); WEECHAT_PLUGIN_VERSION("0.1"); WEECHAT_PLUGIN_LICENSE("GPL3"); struct t_weechat_plugin *weechat_plugin = NULL; int cb_currentsong_plugin(void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { /* pour que le compilateur C soit content */ (void) data; (void) buffer; (void) argv; int i,status; int p[2]; char **cmd; char *song; char *affichage; song = malloc(TAILLE_BUFFER_CURRENT_SONG * sizeof(char)); affichage = malloc((TAILLE_BUFFER_CURRENT_SONG + 10) * sizeof(char)); cmd = (char **) malloc(sizeof(char*) * argc+2); for(i = 0 ; i < argc +1 ; i++) cmd[i] = malloc(sizeof(char) * TAILLE_OPTIONS); cmd[i] = NULL; strcpy(cmd[0],"mpc"); // la commande strcpy(cmd[1],"current"); // la chanson courante if(argc >= 3) { if(strcmp("host", argv[1]) == 0) { strcpy(cmd[2], "-h"); strcpy(cmd[3], argv[2]); } } if(argc >= 4) { if(strcmp("port", argv[3]) == 0) { strcpy(cmd[4], "-p"); strcpy(cmd[5], argv[4]); cmd[6] = NULL; } } for(i = 0 ; i < TAILLE_BUFFER_CURRENT_SONG ; i++) song[i] = '\0'; for(i = 0 ; i < TAILLE_BUFFER_CURRENT_SONG + 10 ; i++) affichage[i] = '\0'; pipe(p); if(fork() == 0) { close(p[0]); close(0); close(2); dup2(p[1],1); execvp("mpc", cmd); } close(p[1]); read(p[0], song, TAILLE_BUFFER_CURRENT_SONG); close(p[0]); wait(&status); if(WEXITSTATUS(status) != 0) { for(i = 0 ; i < TAILLE_BUFFER_CURRENT_SONG ; i++) song[i] = '\0'; snprintf(song, TAILLE_BUFFER_CURRENT_SONG, "%s didn't work !!! Look at the options !",argv[0]); snprintf(affichage, TAILLE_BUFFER_CURRENT_SONG, "%s%s", weechat_prefix("error"),song); weechat_printf(buffer,affichage); return WEECHAT_RC_ERROR; } if(strcmp("",song) == 0) snprintf(affichage,TAILLE_BUFFER_CURRENT_SONG, "/me ! ♪"); else snprintf(affichage,TAILLE_BUFFER_CURRENT_SONG, "/me ♪ %s", song); //snprintf(affichage, TAILLE_BUFFER_CURRENT_SONG, //"/me ♪ %s%s", weechat_color ("_red"), song); //weechat_utf8_normalize(affichage, '?'); weechat_command(buffer,affichage); free(song); // :') for(i = 0 ; i < argc + 1 ; i++) free(cmd[i]); free(cmd); free(affichage); return WEECHAT_RC_OK; } int weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) { weechat_plugin = plugin; weechat_hook_command ("currentsong", "Affiche le morceau que vous écoutez", "[host [port ]]", "si mpd n'est pas en local : [host [port ]]", "host %(the_host) port %(the_port)", &cb_currentsong_plugin, NULL); return WEECHAT_RC_OK; } int weechat_plugin_end (struct t_weechat_plugin *plugin) { /* pour que le compilateur C soit content */ (void) plugin; return WEECHAT_RC_OK; }