Support for fetching the content of a stored playlist (patch by qball), this adds listPlaylist and listPlaylistInfo
git-svn-id: https://svn.musicpd.org/mpd/trunk@3947 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
19021e9cc6
commit
09929b6f82
@ -53,6 +53,8 @@
|
||||
#define COMMAND_CLEAR "clear"
|
||||
#define COMMAND_SAVE "save"
|
||||
#define COMMAND_LOAD "load"
|
||||
#define COMMAND_LISTPLAYLIST "listPlaylist"
|
||||
#define COMMAND_LISTPLAYLISTINFO "listPlaylistInfo"
|
||||
#define COMMAND_LSINFO "lsinfo"
|
||||
#define COMMAND_RM "rm"
|
||||
#define COMMAND_PLAYLISTINFO "playlistinfo"
|
||||
@ -367,6 +369,16 @@ int handleLoad(FILE * fp, unsigned int * permission, int argArrayLength,
|
||||
{
|
||||
return loadPlaylist(fp,argArray[1]);
|
||||
}
|
||||
int handleListPlaylist(FILE * fp, unsigned int * permission, int argArrayLength,
|
||||
char ** argArray)
|
||||
{
|
||||
return PlaylistInfo(fp,argArray[1],0);
|
||||
}
|
||||
int handleListPlaylistInfo(FILE * fp, unsigned int * permission, int argArrayLength,
|
||||
char ** argArray)
|
||||
{
|
||||
return PlaylistInfo(fp,argArray[1], 1);
|
||||
}
|
||||
|
||||
int handleLsInfo(FILE * fp, unsigned int * permission, int argArrayLength,
|
||||
char ** argArray)
|
||||
@ -928,6 +940,8 @@ void initCommands() {
|
||||
addCommand(COMMAND_CLEAR ,PERMISSION_CONTROL, 0, 0,handleClear,NULL);
|
||||
addCommand(COMMAND_SAVE ,PERMISSION_CONTROL, 1, 1,handleSave,NULL);
|
||||
addCommand(COMMAND_LOAD ,PERMISSION_ADD, 1, 1,handleLoad,NULL);
|
||||
addCommand(COMMAND_LISTPLAYLIST,PERMISSION_READ, 1, 1,handleListPlaylist,NULL);
|
||||
addCommand(COMMAND_LISTPLAYLISTINFO,PERMISSION_READ, 1, 1,handleListPlaylistInfo,NULL);
|
||||
addCommand(COMMAND_LSINFO ,PERMISSION_READ, 0, 1,handleLsInfo,NULL);
|
||||
addCommand(COMMAND_RM ,PERMISSION_CONTROL, 1, 1,handleRm,NULL);
|
||||
addCommand(COMMAND_PLAYLISTINFO,PERMISSION_READ, 0, 1,handlePlaylistInfo,NULL);
|
||||
|
261
src/playlist.c
261
src/playlist.c
@ -1337,120 +1337,6 @@ int savePlaylist(FILE * fp, char * utf8file) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int loadPlaylist(FILE * fp, char * utf8file) {
|
||||
FILE * fileP;
|
||||
char s[MAXPATHLEN+1];
|
||||
int slength = 0;
|
||||
char * temp = strdup(utf8ToFsCharset(utf8file));
|
||||
char * rfile = malloc(strlen(temp)+strlen(".")+
|
||||
strlen(PLAYLIST_FILE_SUFFIX)+1);
|
||||
char * actualFile;
|
||||
char * parent = parentPath(temp);
|
||||
int parentlen = strlen(parent);
|
||||
char * erroredFile = NULL;
|
||||
int tempInt;
|
||||
int commentCharFound = 0;
|
||||
|
||||
strcpy(rfile,temp);
|
||||
strcat(rfile,".");
|
||||
strcat(rfile,PLAYLIST_FILE_SUFFIX);
|
||||
|
||||
free(temp);
|
||||
|
||||
if((actualFile = rpp2app(rfile)) && isPlaylist(actualFile)) free(rfile);
|
||||
else {
|
||||
free(rfile);
|
||||
commandError(fp, ACK_ERROR_NO_EXIST,
|
||||
"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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while((tempInt = fgetc(fileP))!=EOF) {
|
||||
s[slength] = tempInt;
|
||||
if(s[slength]=='\n' || s[slength]=='\0') {
|
||||
commentCharFound = 0;
|
||||
s[slength] = '\0';
|
||||
if(s[0]==PLAYLIST_COMMENT) {
|
||||
commentCharFound = 1;
|
||||
}
|
||||
if(strncmp(s,musicDir,strlen(musicDir))==0) {
|
||||
strcpy(s,&(s[strlen(musicDir)]));
|
||||
}
|
||||
else if(parentlen) {
|
||||
temp = strdup(s);
|
||||
memset(s,0,MAXPATHLEN+1);
|
||||
strcpy(s,parent);
|
||||
strncat(s,"/",MAXPATHLEN-parentlen);
|
||||
strncat(s,temp,MAXPATHLEN-parentlen-1);
|
||||
if(strlen(s)>=MAXPATHLEN) {
|
||||
commandError(fp,
|
||||
ACK_ERROR_PLAYLIST_LOAD,
|
||||
"\"%s\" too long",
|
||||
temp);
|
||||
free(temp);
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
if(erroredFile) free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
free(temp);
|
||||
}
|
||||
slength = 0;
|
||||
temp = fsCharsetToUtf8(s);
|
||||
if(!temp) continue;
|
||||
temp = strdup(temp);
|
||||
if(commentCharFound && !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);
|
||||
}
|
||||
free(temp);
|
||||
}
|
||||
else if(slength==MAXPATHLEN) {
|
||||
s[slength] = '\0';
|
||||
commandError(fp, ACK_ERROR_PLAYLIST_LOAD,
|
||||
"line in \"%s\" is too long", utf8file);
|
||||
ERROR("line \"%s\" in playlist \"%s\" is too long\n",
|
||||
s, utf8file);
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
if(erroredFile) free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
else if(s[slength]!='\r') slength++;
|
||||
}
|
||||
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
|
||||
if(erroredFile) {
|
||||
commandError(fp, ACK_ERROR_PLAYLIST_LOAD,
|
||||
"can't add file \"%s\"", erroredFile);
|
||||
free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int getPlaylistCurrentSong() {
|
||||
if(playlist.current >= 0 && playlist.current < playlist.length) {
|
||||
return playlist.order[playlist.current];
|
||||
@ -1507,3 +1393,150 @@ int seekSongInPlaylistById(FILE * fp, int id, float 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;
|
||||
char * temp = strdup(utf8ToFsCharset(utf8file));
|
||||
char * rfile = malloc(strlen(temp)+strlen(".")+
|
||||
strlen(PLAYLIST_FILE_SUFFIX)+1);
|
||||
char * actualFile;
|
||||
char * parent = parentPath(temp);
|
||||
int parentlen = strlen(parent);
|
||||
char * erroredFile = NULL;
|
||||
int tempInt;
|
||||
int commentCharFound = 0;
|
||||
|
||||
strcpy(rfile,temp);
|
||||
strcat(rfile,".");
|
||||
strcat(rfile,PLAYLIST_FILE_SUFFIX);
|
||||
|
||||
free(temp);
|
||||
|
||||
if((actualFile = rpp2app(rfile)) && isPlaylist(actualFile)) free(rfile);
|
||||
else {
|
||||
free(rfile);
|
||||
commandError(fp, ACK_ERROR_NO_EXIST,
|
||||
"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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while((tempInt = fgetc(fileP))!=EOF) {
|
||||
s[slength] = tempInt;
|
||||
if(s[slength]=='\n' || s[slength]=='\0') {
|
||||
commentCharFound = 0;
|
||||
s[slength] = '\0';
|
||||
if(s[0]==PLAYLIST_COMMENT) {
|
||||
commentCharFound = 1;
|
||||
}
|
||||
if(strncmp(s,musicDir,strlen(musicDir))==0) {
|
||||
strcpy(s,&(s[strlen(musicDir)]));
|
||||
}
|
||||
else if(parentlen) {
|
||||
temp = strdup(s);
|
||||
memset(s,0,MAXPATHLEN+1);
|
||||
strcpy(s,parent);
|
||||
strncat(s,"/",MAXPATHLEN-parentlen);
|
||||
strncat(s,temp,MAXPATHLEN-parentlen-1);
|
||||
if(strlen(s)>=MAXPATHLEN) {
|
||||
commandError(fp,
|
||||
ACK_ERROR_PLAYLIST_LOAD,
|
||||
"\"%s\" too long",
|
||||
temp);
|
||||
free(temp);
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
if(erroredFile) free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
free(temp);
|
||||
}
|
||||
slength = 0;
|
||||
temp = fsCharsetToUtf8(s);
|
||||
if(!temp) continue;
|
||||
/* Needed to make a copy? */
|
||||
if(!commentCharFound)
|
||||
{
|
||||
temp = strdup(temp);
|
||||
IterFunc(fp, temp, &erroredFile);
|
||||
free(temp);
|
||||
}
|
||||
}
|
||||
else if(slength==MAXPATHLEN) {
|
||||
s[slength] = '\0';
|
||||
commandError(fp, ACK_ERROR_PLAYLIST_LOAD,
|
||||
"line in \"%s\" is too long", utf8file);
|
||||
ERROR("line \"%s\" in playlist \"%s\" is too long\n",
|
||||
s, utf8file);
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
if(erroredFile) free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
else if(s[slength]!='\r') slength++;
|
||||
}
|
||||
|
||||
while(fclose(fileP) && errno==EINTR);
|
||||
|
||||
if(erroredFile) {
|
||||
commandError(fp, ACK_ERROR_PLAYLIST_LOAD,
|
||||
"can't add file \"%s\"", erroredFile);
|
||||
free(erroredFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
static void PlaylistInfoPrint(FILE *fp, char *utf8file, char **erroredfile) {
|
||||
myfprintf(fp,"file:%s\n",utf8file);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
int PlaylistInfo(FILE * fp, char * utf8file, int detail) {
|
||||
if(detail) {
|
||||
return PlaylistIterFunc(fp, utf8file, PlaylistInfoPrintInfo);
|
||||
}
|
||||
return PlaylistIterFunc(fp, utf8file, PlaylistInfoPrint) ;
|
||||
}
|
||||
|
||||
int loadPlaylist(FILE * fp, char * utf8file) {
|
||||
return PlaylistIterFunc(fp, utf8file, PlaylistLoadIterFunc);
|
||||
}
|
||||
|
@ -114,4 +114,7 @@ void playlistVersionChange();
|
||||
|
||||
int playlistChanges(FILE * fp, mpd_uint32 version);
|
||||
|
||||
int PlaylistInfo(FILE * fp, char * utf8file, int detail);
|
||||
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user