diff options
Diffstat (limited to 'src/playlist.c')
-rw-r--r-- | src/playlist.c | 179 |
1 files changed, 106 insertions, 73 deletions
diff --git a/src/playlist.c b/src/playlist.c index 580116260..de71f77a7 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -1337,7 +1337,64 @@ int savePlaylist(FILE * fp, char * utf8file) { return 0; } -int loadPlaylist(FILE * fp, char * utf8file) { +int getPlaylistCurrentSong() { + if(playlist.current >= 0 && playlist.current < playlist.length) { + return playlist.order[playlist.current]; + } + + return -1; +} + +unsigned long getPlaylistVersion() { + return playlist.version; +} + +int getPlaylistLength() { + return playlist.length; +} + +int seekSongInPlaylist(FILE * fp, int song, float time) { + int i = song; + + if(song<0 || song>=playlist.length) { + commandError(fp, ACK_ERROR_NO_EXIST, + "song doesn't exist: \"%i\"", song); + return -1; + } + + if(playlist.random) for(i=0;song!=playlist.order[i];i++); + + clearPlayerError(); + playlist_stopOnError = 1; + playlist_errorCount = 0; + + if(playlist_state == PLAYLIST_STATE_PLAY) { + if(playlist.queued>=0) { + lockPlaylistInteraction(); + clearPlayerQueue(); + unlockPlaylistInteraction(); + } + } + else if(playPlaylistOrderNumber(fp,i)<0) return -1; + + if(playlist.current!=i) { + if(playPlaylistOrderNumber(fp,i)<0) return -1; + } + + return playerSeek(fp, playlist.songs[playlist.order[i]], time); +} + +int seekSongInPlaylistById(FILE * fp, int id, float time) { + checkSongId(id); + + return seekSongInPlaylist(fp, playlist.idToPosition[id], time); +} + +int getPlaylistSongId(int song) { + return playlist.positionToId[song]; +} + +static int PlaylistIterFunc(FILE * fp, char * utf8file, void (*IterFunc)(FILE *fp, char *utf8_file, char **errored_File)) { FILE * fileP; char s[MAXPATHLEN+1]; int slength = 0; @@ -1361,14 +1418,14 @@ int loadPlaylist(FILE * fp, char * utf8file) { else { free(rfile); commandError(fp, ACK_ERROR_NO_EXIST, - "playlist \"%s\" not found", utf8file); + "playlist \"%s\" not found", utf8file); return -1; } while(!(fileP = fopen(actualFile,"r")) && errno==EINTR); if(fileP==NULL) { commandError(fp, ACK_ERROR_SYSTEM, - "problems opening file \"%s\"", utf8file); + "problems opening file \"%s\"", utf8file); return -1; } @@ -1391,9 +1448,9 @@ int loadPlaylist(FILE * fp, char * utf8file) { strncat(s,temp,MAXPATHLEN-parentlen-1); if(strlen(s)>=MAXPATHLEN) { commandError(fp, - ACK_ERROR_PLAYLIST_LOAD, - "\"%s\" too long", - temp); + ACK_ERROR_PLAYLIST_LOAD, + "\"%s\" too long", + temp); free(temp); while(fclose(fileP) && errno==EINTR); if(erroredFile) free(erroredFile); @@ -1404,34 +1461,20 @@ int loadPlaylist(FILE * fp, char * utf8file) { slength = 0; temp = fsCharsetToUtf8(s); if(!temp) continue; - temp = strdup(temp); - if(commentCharFound && !getSongFromDB(temp) - && !isRemoteUrl(temp)) + /* Needed to make a copy? */ + if(!commentCharFound) { + temp = strdup(temp); + IterFunc(fp, temp, &erroredFile); + free(temp); } - else if((addToPlaylist(stderr, temp, 0))<0) { - /* for windows compatibilit, convert slashes */ - char * temp2 = strdup(temp); - char * p = temp2; - while(*p) { - if(*p=='\\') *p = '/'; - p++; - } - if((addToPlaylist(stderr, temp2, 0))<0) { - if(!erroredFile) { - erroredFile = strdup(temp); - } - } - free(temp2); - } - free(temp); } else if(slength==MAXPATHLEN) { s[slength] = '\0'; commandError(fp, ACK_ERROR_PLAYLIST_LOAD, - "line in \"%s\" is too long", utf8file); + "line in \"%s\" is too long", utf8file); ERROR("line \"%s\" in playlist \"%s\" is too long\n", - s, utf8file); + s, utf8file); while(fclose(fileP) && errno==EINTR); if(erroredFile) free(erroredFile); return -1; @@ -1443,7 +1486,7 @@ int loadPlaylist(FILE * fp, char * utf8file) { if(erroredFile) { commandError(fp, ACK_ERROR_PLAYLIST_LOAD, - "can't add file \"%s\"", erroredFile); + "can't add file \"%s\"", erroredFile); free(erroredFile); return -1; } @@ -1451,59 +1494,49 @@ int loadPlaylist(FILE * fp, char * utf8file) { return 0; } -int getPlaylistCurrentSong() { - if(playlist.current >= 0 && playlist.current < playlist.length) { - return playlist.order[playlist.current]; - } - - return -1; -} -unsigned long getPlaylistVersion() { - return playlist.version; +static void PlaylistInfoPrintInfo(FILE *fp, char *utf8file, char **erroredfile) { + Song * song = getSongFromDB(utf8file); + if(song) { + printSongInfo(fp, song); + } + else { + myfprintf(fp,"file:%s\n",utf8file); + } } - -int getPlaylistLength() { - return playlist.length; +static void PlaylistInfoPrint(FILE *fp, char *utf8file, char **erroredfile) { + myfprintf(fp,"file:%s\n",utf8file); } -int seekSongInPlaylist(FILE * fp, int song, float time) { - int i = song; - - if(song<0 || song>=playlist.length) { - commandError(fp, ACK_ERROR_NO_EXIST, - "song doesn't exist: \"%i\"", song); - return -1; - } - - if(playlist.random) for(i=0;song!=playlist.order[i];i++); - - clearPlayerError(); - playlist_stopOnError = 1; - playlist_errorCount = 0; - - if(playlist_state == PLAYLIST_STATE_PLAY) { - if(playlist.queued>=0) { - lockPlaylistInteraction(); - clearPlayerQueue(); - unlockPlaylistInteraction(); +static void PlaylistLoadIterFunc(FILE *fp, char *temp, char **erroredFile) { + if(!getSongFromDB(temp) && !isRemoteUrl(temp)) + { + + } + else if((addToPlaylist(stderr, temp, 0))<0) { + /* for windows compatibilit, convert slashes */ + char * temp2 = strdup(temp); + char * p = temp2; + while(*p) { + if(*p=='\\') *p = '/'; + p++; } + if((addToPlaylist(stderr, temp2, 0))<0) { + if(!*erroredFile) { + *erroredFile = strdup(temp); + } + } + free(temp2); } - else if(playPlaylistOrderNumber(fp,i)<0) return -1; - - if(playlist.current!=i) { - if(playPlaylistOrderNumber(fp,i)<0) return -1; - } - - return playerSeek(fp, playlist.songs[playlist.order[i]], time); } -int seekSongInPlaylistById(FILE * fp, int id, float time) { - checkSongId(id); - - return seekSongInPlaylist(fp, playlist.idToPosition[id], time); +int PlaylistInfo(FILE * fp, char * utf8file, int detail) { + if(detail) { + return PlaylistIterFunc(fp, utf8file, PlaylistInfoPrintInfo); + } + return PlaylistIterFunc(fp, utf8file, PlaylistInfoPrint) ; } -int getPlaylistSongId(int song) { - return playlist.positionToId[song]; +int loadPlaylist(FILE * fp, char * utf8file) { + return PlaylistIterFunc(fp, utf8file, PlaylistLoadIterFunc); } |