int mpd_playlist_queue_commit(MpdObj *mi) { if(mi->queue == NULL) { debug_printf(DEBUG_WARNING,"mi->queue is empty"); return MPD_PLAYLIST_QUEUE_EMPTY; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_WARNING,"not connected\n"); return MPD_NOT_CONNECTED; } if(mpd_lock_conn(mi)) { debug_printf(DEBUG_WARNING,"lock failed\n"); return MPD_LOCK_FAILED; } mpd_sendCommandListBegin(mi->connection); /* get first item */ mi->queue = mi->queue->first; while(mi->queue != NULL) { if(mi->queue->type == MPD_QUEUE_ADD) { if(mi->queue->path != NULL) { mpd_sendAddCommand(mi->connection, mi->queue->path); } } else if(mi->queue->type == MPD_QUEUE_LOAD) { if(mi->queue->path != NULL) { mpd_sendLoadCommand(mi->connection, mi->queue->path); } } else if (mi->queue->type == MPD_QUEUE_DELETE_ID) { if(mi->queue->id >= 0) { mpd_sendDeleteIdCommand(mi->connection, mi->queue->id); } } else if (mi->queue->type == MPD_QUEUE_DELETE_POS) { if(mi->queue->id >= 0) { mpd_sendDeleteCommand(mi->connection, mi->queue->id); } } mpd_queue_get_next(mi); } mpd_sendCommandListEnd(mi->connection); mpd_finishCommand(mi->connection); mpd_unlock_conn(mi); mpd_status_update(mi); return MPD_OK; }
MpdData * mpd_playlist_get_song_from_pos_range(MpdObj *mi, int start, int stop) { MpdData *data = NULL; int i; mpd_InfoEntity *ent = NULL; if(!mpd_check_connected(mi)) { debug_printf(DEBUG_ERROR, "Not Connected\n"); return NULL; } if(mpd_status_check(mi) != MPD_OK) { debug_printf(DEBUG_ERROR,"Failed grabbing status\n"); return NULL; } if(mpd_lock_conn(mi)) { return NULL; } /* Don't check outside playlist length */ if(!(stop < mi->status->playlistLength)) { stop = mi->status->playlistLength -1; } mpd_sendCommandListBegin(mi->connection); for(i=start; i <= stop; i++){ mpd_sendPlaylistInfoCommand(mi->connection, i); } mpd_sendCommandListEnd(mi->connection); while (( ent = mpd_getNextInfoEntity(mi->connection)) != NULL) { if(ent->type == MPD_INFO_ENTITY_TYPE_SONG) { data = mpd_new_data_struct_append(data); data->type = MPD_DATA_TYPE_SONG; data->song = ent->info.song; ent->info.song = NULL; } mpd_freeInfoEntity(ent); } mpd_finishCommand(mi->connection); if(mpd_unlock_conn(mi)) { /*TODO free entity. for now this can never happen */ return NULL; } return data; }
int cmd_add (int argc, char ** argv, mpd_Connection * conn ) { int i; mpd_sendCommandListBegin(conn); printErrorAndExit(conn); for(i=0;i<argc;i++) { printf("adding: %s\n", argv[i]); mpd_sendAddCommand(conn, charset_to_utf8(argv[i])); printErrorAndExit(conn); } mpd_sendCommandListEnd(conn); my_finishCommand(conn); return 0; }
int cmd_load ( int argc, char ** argv, mpd_Connection * conn ) { int i; char * sp; char * dp; mpd_InfoEntity * entity; mpd_PlaylistFile * pl; for(i=0;i<argc;i++) { sp = argv[i]; while((sp = strchr(sp,' '))) *sp = '_'; } mpd_sendLsInfoCommand(conn,""); printErrorAndExit(conn); while((entity = mpd_getNextInfoEntity(conn))) { if(entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { pl = entity->info.playlistFile; dp = sp = strdup(charset_from_utf8(pl->path)); while((sp = strchr(sp,' '))) *sp = '_'; for(i=0;i<argc;i++) { if(strcmp(dp,argv[i])==0) strcpy(argv[i], charset_from_utf8(pl->path)); } free(dp); mpd_freeInfoEntity(entity); } } my_finishCommand(conn); mpd_sendCommandListBegin(conn); printErrorAndExit(conn); for(i=0;i<argc;i++) { printf("loading: %s\n",argv[i]); mpd_sendLoadCommand(conn,charset_to_utf8(argv[i])); printErrorAndExit(conn); } mpd_sendCommandListEnd(conn); my_finishCommand(conn); return 0; }
int cmd_update ( int argc, char ** argv, mpd_Connection * conn) { const char * update = ""; int i = 0; mpd_sendCommandListBegin(conn); printErrorAndExit(conn); if(argc > 0) update = charset_to_utf8(argv[i]); do { mpd_sendUpdateCommand(conn, update); } while (++i < argc && (update = charset_to_utf8(argv[i])) != NULL); mpd_sendCommandListEnd(conn); printErrorAndExit(conn); mpd_finishCommand(conn); printErrorAndExit(conn); return 1; }
int cmd_crop(mpd_unused int argc, mpd_unused char **argv, mpd_Connection *conn) { mpd_Status *status = getStatus( conn ); int length = ( status->playlistLength - 1 ); if( status->playlistLength == 0 ) { mpd_freeStatus(status); DIE( "You have to have a playlist longer than 1 song in length to crop" ); } else if( status->state == 3 || status->state == 2 ) { /* If playing or paused */ mpd_sendCommandListBegin( conn ); printErrorAndExit( conn ); while( length >= 0 ) { if( length != status->song ) { mpd_sendDeleteCommand( conn, length ); printErrorAndExit( conn ); } length--; } mpd_sendCommandListEnd( conn ); my_finishCommand( conn ); mpd_freeStatus( status ); return ( 0 ); } else { mpd_freeStatus(status); DIE( "You need to be playing to crop the playlist\n" ); } }
int cmd_del ( int argc, char ** argv, mpd_Connection * conn ) { int i,j; char * s; char * t; char * t2; int range[2]; int songsDeleted = 0; int plLength = 0; char * songsToDel; mpd_Status * status; status = getStatus(conn); plLength = status->playlistLength; songsToDel = malloc(plLength); memset(songsToDel,0,plLength); for(i=0;i<argc;i++) { if(argv[i][0]=='#') s = &(argv[i][1]); else s = argv[i]; range[0] = strtol(s,&t,10); /* If argument is 0 current song and we're not stopped */ if(range[0] == 0 && strlen(s) == 1 && \ (status->state == MPD_STATUS_STATE_PLAY || status->state == MPD_STATUS_STATE_PAUSE)) range[0] = status->song+1; if(s==t) DIE("error parsing song numbers from: %s\n",argv[i]); else if(*t=='-') { range[1] = strtol(t+1,&t2,10); if(t+1==t2 || *t2!='\0') DIE("error parsing range from: %s\n",argv[i]); } else if(*t==')' || *t=='\0') range[1] = range[0]; else DIE("error parsing song numbers from: %s\n",argv[i]); if(range[0]<=0 || range[1]<=0) { if (range[0]==range[1]) DIE("song number must be positive: %i\n",range[0]); else DIE("song numbers must be positive: %i to %i\n",range[0],range[1]); } if(range[1]<range[0]) DIE("song range must be from low to high: %i to %i\n",range[0],range[1]); if(range[1]>plLength) DIE("song number does not exist: %i\n",range[1]); for(j=range[0];j<=range[1];j++) songsToDel[j-1] = 1; } mpd_sendCommandListBegin(conn); printErrorAndExit(conn); for(i=0;i<plLength;i++) { if(songsToDel[i]) { mpd_sendDeleteCommand(conn,i-songsDeleted); printErrorAndExit(conn); songsDeleted++; } } mpd_sendCommandListEnd(conn); my_finishCommand(conn); mpd_freeStatus(status); free(songsToDel); return 0; }