X-Git-Url: http://royale.zerezo.com/git/?p=FAPG;a=blobdiff_plain;f=fapg.c;h=0c72af8f2d1518b186b02a76084ce645f8846c01;hp=176c495c31fc058eb9c5494cd3845841cb88221f;hb=HEAD;hpb=02dbbe8a7969f09a693027db1c3739c07dde7d02 diff --git a/fapg.c b/fapg.c index 176c495..d205eec 100644 --- a/fapg.c +++ b/fapg.c @@ -43,9 +43,10 @@ #define MP3_BASE 1024 #define OGG_BASE 1024*10 -#define MAX 1024*200 /* 200ko for ID3 with JPEG images in it */ +#define MAX 1024*250 /* 250ko for ID3 with JPEG images in it */ +#define MAX_ITEM 1024 -#define FORMAT_M3U 0 +#define FORMAT_M3U 0 /* "0" is not a good choice for debugging, but OK for a default */ #define FORMAT_PLS 1 #define FORMAT_HTML 2 #define FORMAT_RSS 3 @@ -74,9 +75,9 @@ unsigned char buffer[MAX]; int counter = 0; -unsigned char artist[1024]; -unsigned char title[1024]; -unsigned char genrebuf[1024]; +unsigned char artist[MAX_ITEM]; +unsigned char title[MAX_ITEM]; +unsigned char genrebuf[MAX_ITEM]; unsigned char genre = 0; int duration; #define MP2ENC 1 @@ -259,6 +260,23 @@ void mywebputstr(const char *c) } } +void utf16toutf8(char *c,int n) +{ + /* check whether the we need to convert UTF-16 to UTF-8 strings */ + if ( ( c[0] != '\377' ) || ( c[1] != '\376' ) ) { return; } + /* only continue here, if the first 2 letters are 0xfffe * + * c references an UTF-16 input, where latin letters are * + * separated by zero bytes, which we need to eliminate */ + int i=0; --n; + for(int j=2; (j> can't open pipe >%s< !\n", command); - free(command); return; } fgets(buffer, 1020, pipe); @@ -693,7 +710,7 @@ void parse_mp3(unsigned char *file) fprintf(stderr, "Debug >> parsing mp3 : %s\n", file); /* read header */ - if((fic = fopen(file, "r")) == NULL) { + if((fic = fopen(file, "rb")) == NULL) { fprintf(stderr, "Warning >> can't open file : %s\n", file); return; } @@ -733,10 +750,12 @@ void parse_mp3(unsigned char *file) if(*c == 0) break; if(strncmp(c, "TT2", 3) == 0) { + utf16toutf8(c+7,size); strncpy(title, c + 7, size - 1); title[size - 1] = '\0'; } if(strncmp(c, "TP1", 3) == 0) { + utf16toutf8(c+7,size); strncpy(artist, c + 7, size - 1); artist[size - 1] = '\0'; } @@ -756,10 +775,12 @@ void parse_mp3(unsigned char *file) if(*c == 0) break; if(strncmp(c, "TIT2", 4) == 0) { + utf16toutf8(c+11,size); strncpy(title, c + 11, size - 1); title[size - 1] = '\0'; } if(strncmp(c, "TPE1", 4) == 0) { + utf16toutf8(c+11,size); strncpy(artist, c + 11, size - 1); artist[size - 1] = '\0'; } @@ -769,6 +790,9 @@ void parse_mp3(unsigned char *file) /* genre=atoi(&genrebuf[1]); */ genre = atoi(c + 12); } + if(strncmp(c, "TLEN", 4) == 0) { + duration = atoi(c + 11) / 1000; + } c += size + 10; } } @@ -862,6 +886,13 @@ void parse_ogg(unsigned char *file) title[size - 6] = '\0'; c += size; } + if(strncasecmp(c, "ALBUM ARTIST=", 13) == 0) { + // ignore tag + size = + *(c - 4) + (*(c - 3) << 8) + (*(c - 2) << 16) + + (*(c - 1) << 24); + c += size; + } if(strncasecmp(c, "ARTIST=", 7) == 0) { size = *(c - 4) + (*(c - 3) << 8) + (*(c - 2) << 16) + @@ -1329,12 +1360,10 @@ void parse_file(unsigned char *newpath, unsigned char * original_path) counter++; switch (format) { case FORMAT_M3U: - if(duration != -1) { - printf("#EXTINF:%d,", duration); - if(strlen(artist) != 0) - printf("%s - ", artist); - printf("%s%s", title, eol); - } + printf("#EXTINF:%d,", duration); + if(strlen(artist) != 0) + printf("%s - ", artist); + printf("%s%s", title, eol); print_path(newpath); printf("%s", eol); break; @@ -1455,7 +1484,7 @@ void parse_directory(unsigned char *path, unsigned char * original_path) { int i, n; struct dirent **namelist; - unsigned char newpath[PATH_MAX]; + unsigned char *newpath = NULL; struct stat infos; if(debug) @@ -1475,10 +1504,14 @@ void parse_directory(unsigned char *path, unsigned char * original_path) return; } for(i = 0; i < n; i++) { - snprintf(newpath, PATH_MAX, "%s/%s", path, namelist[i]->d_name); + int pathlen = strlen(path)+strlen(namelist[i]->d_name)+2; + newpath = malloc(pathlen); + snprintf(newpath, pathlen, "%s/%s", path, namelist[i]->d_name); if(stat(newpath, &infos) != 0) { fprintf(stderr, "Warning >> can't stat entry : %s\n", newpath); + free(newpath); + newpath = NULL; continue; } if(recursive && S_ISDIR(infos.st_mode) @@ -1492,6 +1525,8 @@ void parse_directory(unsigned char *path, unsigned char * original_path) } free(namelist[i]); } + newpath = NULL; + free(newpath); free(namelist); } @@ -1575,13 +1610,17 @@ int main(int argc, char **argv) sprintf(pwd, "%s/", pwd_source); if(fromstdin) { - unsigned char path[PATH_MAX]; + char *path = NULL; int i; - while(fgets(path, PATH_MAX, stdin)) { - for(i = 0; i < PATH_MAX; i++) + size_t pathlen; + + while(-1 != getline(&path, &pathlen, stdin)) { + for(i = 0; i < pathlen; i++) if(path[i] == '\r' || path[i] == '\n') path[i] = '\0'; if (i <= 0) { + free(path); + path = NULL; continue; } @@ -1591,6 +1630,8 @@ int main(int argc, char **argv) } parse_directory(path, pwd); + free(path); + path = NULL; } } else for(; optind < argc; optind++) {