/* the Music Player Daemon (MPD) * (c)2003 by Warren Dukes (shank@mercury.chem.pitt.edu) * This project's homepage is: http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "ls.h" #include "command.h" #include "playlist.h" #include "path.h" #include "myfprintf.h" #include <sys/types.h> #include <sys/stat.h> #include <sys/param.h> #include <dirent.h> #include <stdio.h> #include <string.h> #include <stdlib.h> char * dupAndStripPlaylistSuffix(char * file) { int size = strlen(file)-strlen(PLAYLIST_FILE_SUFFIX)-1; char * ret = malloc(size+1); strncpy(ret,file,size); ret[size] = '\0'; return ret; } int ls(FILE * fp, char * dirname) { DIR * dir; char cwd[2]; char c; struct stat st; struct dirent * ent; char s[MAXPATHLEN+1]; cwd[0] = '.'; cwd[1] = '\0'; if(dirname==NULL) dirname=cwd; if((dir = opendir(rmp2amp(dirname)))==NULL) { myfprintf(fp,"%s problems opening directory\n",COMMAND_RESPOND_ERROR); return -1; } while((ent = readdir(dir))) { if(ent->d_name[0]=='.') continue; /* hide hidden stuff */ sprintf(s,"%s/%s/%s",musicDir,dirname,ent->d_name); if(stat(s,&st)==0) { c = 0; if(S_ISDIR(st.st_mode)) c = 'd'; else if(isMusic(s)) c = 'm'; if(c && dirname==cwd) { myfprintf(fp,"%c \"%s\"\n",c,ent->d_name); } else if(c) { myfprintf(fp,"%c \"%s/%s\"\n",c,dirname,ent->d_name); } } } closedir(dir); return 0; } int lsPlaylists(FILE * fp, char * path) { DIR * dir; struct stat st; struct dirent * ent; char * dup; char s[MAXPATHLEN+1]; List * list = NULL; ListNode * node = NULL; char * actualPath = rpp2app(path); int actlen = strlen(actualPath)+1; int maxlen = MAXPATHLEN-actlen; int suflen = strlen(PLAYLIST_FILE_SUFFIX)+1; int suff; if(actlen>MAXPATHLEN-1) return 0; if((dir = opendir(actualPath))==NULL) return 0; s[MAXPATHLEN] = '\0'; strcpy(s,actualPath); strcat(s,"/"); while((ent = readdir(dir))) { dup = ent->d_name; if(dup[0]!='.' && (suff=strlen(dup)-suflen)>0 && dup[suff]=='.' && strcmp(dup+suff+1,PLAYLIST_FILE_SUFFIX)==0) { strncpy(s+actlen,ent->d_name,maxlen); if(stat(s,&st)==0) { if(S_ISREG(st.st_mode)) { if(list==NULL) list = makeList(NULL); dup = strdup(ent->d_name); dup[suff] = '\0'; insertInList(list,dup,NULL); free(dup); } } } } closedir(dir); if(list) { sortList(list); dup = malloc(strlen(path)+2); strcpy(dup,path); while(dup[strlen(dup)-1]=='/') dup[strlen(dup)-1] = '\0'; if(strlen(dup)) strcat(dup,"/"); node = list->firstNode; while(node!=NULL) { myfprintf(fp,"playlist: %s%s\n",dup,node->key); node = node->nextNode; } freeList(list); free(dup); } return 0; } time_t isMusic(char * file) { time_t ret = 0; #ifdef HAVE_OGG if((ret = isOgg(file))>0) return ret; #endif #ifdef HAVE_FLAC if((ret = isFlac(file))>0) return ret; #endif #ifdef HAVE_MAD if((ret = isMp3(file)>0)) return ret; #endif #ifdef HAVE_AUDIOFILE if((ret = isWave(file)>0)) return ret; #endif return ret; } time_t isPlaylist(char * file) { struct stat st; char * actualFile = file; char * temp = NULL; if(actualFile[0]!='/') actualFile = rpp2app(file); if(stat(actualFile,&st)==0) { if(S_ISREG(st.st_mode)) { char * dup; char * cLast; char * cNext; int ret = 0; dup = strdup(file); cNext = cLast = strtok(dup,"."); while((cNext = strtok(NULL,"."))) cLast = cNext; if(cLast && 0==strcmp(cLast,PLAYLIST_FILE_SUFFIX)) { ret = st.st_mtime; } free(dup); if(temp) free(temp); return ret; } } if(temp) free(temp); return 0; } time_t isWave(char * file) { struct stat st; char * actualFile = file; if(actualFile[0]!='/') actualFile = rmp2amp(file); if(stat(actualFile,&st)==0) { if(S_ISREG(st.st_mode)) { char * dup; char * cLast; char * cNext; int ret = 0; dup = strdup(file); cNext = cLast = strtok(dup,"."); while((cNext = strtok(NULL,"."))) cLast = cNext; if(cLast && 0==strcasecmp(cLast,"wav")) { ret = st.st_mtime; } free(dup); return ret; } else return 0; } return 0; } time_t isFlac(char * file) { struct stat st; char * actualFile = file; if(actualFile[0]!='/') actualFile = rmp2amp(file); if(stat(actualFile,&st)==0) { if(S_ISREG(st.st_mode)) { char * dup; char * cLast; char * cNext; int ret = 0; dup = strdup(file); cNext = cLast = strtok(dup,"."); while((cNext = strtok(NULL,"."))) cLast = cNext; if(cLast && 0==strcasecmp(cLast,"flac")) { ret = st.st_mtime; } free(dup); return ret; } else return 0; } return 0; } time_t isOgg(char * file) { struct stat st; char * actualFile = file; if(actualFile[0]!='/') actualFile = rmp2amp(file); if(stat(actualFile,&st)==0) { if(S_ISREG(st.st_mode)) { char * dup; char * cLast; char * cNext; int ret = 0; dup = strdup(file); cNext = cLast = strtok(dup,"."); while((cNext = strtok(NULL,"."))) cLast = cNext; if(cLast && 0==strcasecmp(cLast,"ogg")) { ret = st.st_mtime; } free(dup); return ret; } else return 0; } return 0; } time_t isMp3(char * file) { struct stat st; char * actualFile = file; if(actualFile[0]!='/') actualFile = rmp2amp(file); if(stat(actualFile,&st)==0) { if(S_ISREG(st.st_mode)) { char * dup; char * cLast; char * cNext; int ret = 0; dup = strdup(file); cNext = cLast = strtok(dup,"."); while((cNext = strtok(NULL,"."))) cLast = cNext; if(cLast && 0==strcasecmp(cLast,"mp3")) { ret = st.st_mtime; } free(dup); return ret; } else return 0; } return 0; } time_t isDir(char * name) { struct stat st; if(stat(rmp2amp(name),&st)==0) { if(S_ISDIR(st.st_mode)) return st.st_mtime; } return 0; }