static void queue_song(ttk_menu_item *item) { mpd_InfoEntity entity; if (mpdc_tickle() < 0) return; mpd_sendSearchCommand(mpdz, (long)item->data, item->name); if (mpdz->error) { mpdc_tickle(); return; } while ((mpd_getNextInfoEntity_st(&entity, mpdz))) { int found = 1; mpd_Song *song = entity.info.song; if (entity.type != MPD_INFO_ENTITY_TYPE_SONG) { continue; } found &= (!current_song.artist || (song->artist && strcmp(current_song.artist,song->artist)==0)); found &= (!current_song.album || (song->album && strcmp(current_song.album, song->album) == 0)); found &= ((song->title ? (strcmp(item->name, song->title)==0) : 0) || strcmp(item->name, song->file)==0); if (found && song->file) { mpd_finishCommand(mpdz); mpd_sendAddCommand(mpdz, song->file); break; } } mpd_finishCommand(mpdz); }
/* should be called mpd_database_find */ MpdData * mpd_database_find(MpdObj *mi, int table, char *string, int exact) { MpdData *data = NULL; /* MpdData *artist = NULL; MpdData *album = NULL; */ mpd_InfoEntity *ent = NULL; if(!mpd_check_connected(mi)) { debug_printf(DEBUG_WARNING,"not connected\n"); return NULL; } if(mpd_lock_conn(mi)) { debug_printf(DEBUG_WARNING,"lock failed\n"); return NULL; } if(exact) { mpd_sendFindCommand(mi->connection,table,string); } else { mpd_sendSearchCommand(mi->connection, table,string); } while (( ent = mpd_getNextInfoEntity(mi->connection)) != NULL) { data = mpd_new_data_struct_append(data); /* mpd_sendSearch|Find only returns songs */ /* if(ent->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { data->type = MPD_DATA_TYPE_DIRECTORY; data->directory = ent->info.directory->path; ent->info.directory->path = NULL; } else*/ if (ent->type == MPD_INFO_ENTITY_TYPE_SONG) { data->type = MPD_DATA_TYPE_SONG; data->song = ent->info.song; ent->info.song = NULL; /* This is something the client can and should do */ /* if(data->song->artist != NULL) { int found = FALSE; if(artist != NULL) { MpdData *fartist = mpd_data_get_first(artist); do{ if( (fartist->type == MPD_DATA_TYPE_TAG) && (fartist->tag_type == MPD_TAG_ITEM_ARTIST)) { if(fartist->tag == NULL) { printf("crap this should'nt be \n"); } if(!strcmp(fartist->tag, data->song->artist)) { found = TRUE; } } fartist = mpd_data_get_next_real(fartist, FALSE); }while(fartist && !found); } if(!found) { artist= mpd_new_data_struct_append(artist); artist->type = MPD_DATA_TYPE_TAG; artist->tag_type = MPD_TAG_ITEM_ARTIST; artist->tag = strdup(data->song->artist); } } if(data->song->album != NULL) { int found = FALSE; if(album != NULL) { MpdData *falbum = mpd_data_get_first(album); do{ if( (falbum->type == MPD_DATA_TYPE_TAG) && (falbum->tag_type == MPD_TAG_ITEM_ALBUM)) { if(falbum->tag == NULL) { printf("crap this should'nt be \n"); } if(!strcmp(falbum->tag, data->song->album)) { found = TRUE; } } falbum = mpd_data_get_next_real(falbum, FALSE); }while(falbum && !found); } if(!found) { album = mpd_new_data_struct_append(album); album->type = MPD_DATA_TYPE_TAG; album->tag_type = MPD_TAG_ITEM_ALBUM; album->tag = strdup(data->song->album); } } */ } /* else if (ent->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { data->type = MPD_DATA_TYPE_PLAYLIST; data->playlist = ent->info.playlistFile->path; ent->info.playlistFile->path = NULL; } */ mpd_freeInfoEntity(ent); } mpd_finishCommand(mi->connection); /* unlock */ mpd_unlock_conn(mi); if(data == NULL) { return NULL; } data = mpd_data_get_first(data); /* prepend the album then artists*/ /* if(album != NULL) { if(data){ data = mpd_data_concatenate( album, data); }else{ data = album; } } if(artist != NULL) { if(data) { album = mpd_data_concatenate( artist, data ); }else{ data = artist; } } */ return mpd_data_get_first(data); }