X-Git-Url: http://royale.zerezo.com/git/?p=FAPG;a=blobdiff_plain;f=fapg.c;h=ea50917948a613876062e88d00a24cf54698b563;hp=0ec3835d01d5fac2383e97e50d8198dfcd972a91;hb=57a557c838aebd9b7fbd1344f6fcb86b7d5da7fd;hpb=e19d33dfba7f37810936ef2845a00b816ffed70f diff --git a/fapg.c b/fapg.c index 0ec3835..ea50917 100644 --- a/fapg.c +++ b/fapg.c @@ -38,7 +38,7 @@ #include #include "genres.h" -#define VERSION "0.36" +#define VERSION "0.37" #define MP3_BASE 1024 #define OGG_BASE 1024*10 #define MAX 1024*200 /* 200ko for ID3 with JPEG images in it */ @@ -53,6 +53,7 @@ unsigned char *hostname = "fritzserver.de"; // unsigned char *referal="/usr/local/bin/fapg-rss.sh"; unsigned char *referal = NULL; //int windows=0; +int fromstdin = 0; int recursive = 0; int avoidhlinked = 0; int separator = '/'; @@ -217,7 +218,7 @@ unsigned char *iso2web[256] = { void usage() { fprintf(stderr, - "Usage >> fapg [-b|--backslash] [-d|--debug] [-f|--format=m3u|pls|html|rss|pla] [-g|--genre=#:#:...] [-n|--nohardlink] [-o|--output=/path/to/file.m3u] [-p|--prefix=/the/prefix] [-r|--recursive] [-w|--windows] [-c|--command=] [-x|--exclude=#:#:...] /path/to/mp3/dir1 [/path/to/mp3/dir2 ...]\n"); + "Usage >> fapg [-b|--backslash] [-d|--debug] [-f|--format=m3u|pls|html|rss|pla] [-g|--genre=#:#:...] [-n|--nohardlink] [-o|--output=/path/to/file.m3u] [-p|--prefix=/the/prefix] [-r|--recursive] [-w|--windows] [-c|--command=] [-x|--exclude=#:#:...] [-s|--stdin] /path/to/mp3/dir1 [/path/to/mp3/dir2 ...]\n"); exit(1); } @@ -241,7 +242,7 @@ void mywebputstr(const char *c) void myplaputstr(const char *c) { while(*c != 0) { - if( *c == '/') + if(*c == '/') myplaputchar('\\'); /* translate slash to backslash */ else myplaputchar(*c); @@ -255,7 +256,10 @@ void myplaputstr(const char *c) void myputstr(const char *c) { while(*c != 0) { - myputchar(*c); + if(*c == '/') + putchar(separator); + else + myputchar(*c); c++; /* remove multiple slashes "//" when parsing a directory ending with a "/" */ while(*c == '/' && c[1] == '/') @@ -263,6 +267,24 @@ void myputstr(const char *c) } } +/* remove spaces at beginning and end of string */ +void trim(char *c) +{ + char *p; + /* remove spaces at beginning ... */ + while(*c == ' ') { + p = c; + while(*p != '\0') { + *p = *(p + 1); + p++; + } + } + /* ... and end of string */ + p = c + strlen(c); + while(--p > c && *p == ' ') + *p = '\0'; +} + void print_webpath(const char *path) { const char *c = path; @@ -356,10 +378,10 @@ void reference(const char *title) void parse_options(int argc, char **argv) { - static char const short_options[] = "c:bdf:g:lo:np:ruwx:"; + static char const short_options[] = "bc:df:g:lo:np:rsuwx:"; static struct option long_options[] = { {"backslash", no_argument, NULL, 'b'}, - {"command", required_argument, NULL, 'b'}, + {"command", required_argument, NULL, 'c'}, {"debug", no_argument, NULL, 'd'}, {"format", required_argument, NULL, 'f'}, {"genre", required_argument, NULL, 'g'}, @@ -367,6 +389,7 @@ void parse_options(int argc, char **argv) {"output", required_argument, NULL, 'o'}, {"prefix", required_argument, NULL, 'p'}, {"recursive", no_argument, NULL, 'r'}, + {"stdin", no_argument, NULL, 's'}, {"windows", no_argument, NULL, 'w'}, {"exclude", required_argument, NULL, 'x'} }; @@ -482,6 +505,9 @@ void parse_options(int argc, char **argv) } } break; + case 's': + fromstdin = 1; + break; default: usage(); } @@ -934,12 +960,13 @@ void parse_file(unsigned char *newpath) duration = -1; /* parse_wav(newpath); */ encoding = WAVENC; } - /* faketitle() */ + /* guesstitle() */ if((strlen(artist) == 0) && (strlen(title) == 0)) { // there are no tag infos read // use file name to state substitute it char *c = strrchr(newpath, separator); - if (c == NULL) c = newpath; + if(c == NULL) + c = newpath; strcpy(artist, ++c); // arbitrarily use the first '-' // to separate artist and title @@ -960,16 +987,21 @@ void parse_file(unsigned char *newpath) *c = ' '; for(c = title; (c = strchr(c, '_')) != NULL; c++) *c = ' '; + // trim spaces + trim(artist); + trim(title); } - /* faketitle() end */ + /* guesstitle() end */ if(duration != -2 && genrelist[genre]) { /* is it an audio file ? */ counter++; switch (format) { case 0: if(duration != -1) { - printf("#EXTINF:%d,%s - %s%s", duration, artist, title, - eol); + printf("#EXTINF:%d,", duration); + if(strlen(artist) != 0) + printf("%s - ", artist); + printf("%s%s", title, eol); } print_path(newpath); printf("%s", eol); @@ -977,8 +1009,10 @@ void parse_file(unsigned char *newpath) case 1: printf("File%d=", counter); print_path(newpath); - printf("%sTitle%d=%s - %s%s", eol, counter, artist, title, - eol); + printf("%sTitle%d=", eol, counter); + if(strlen(artist) != 0) + printf("%s - ", artist); + printf("%s%s", title, eol); if(duration != -1) printf("Length%d=%d%s", counter, duration, eol); break; @@ -1037,7 +1071,7 @@ void parse_file(unsigned char *newpath) printf("\t%s", eol); } break; - case 4: // printing output for Sansa players + case 4: // printing output for Sansa players myplaputstr("HARP, "); myplaputstr(newpath); myplaputstr(eol); @@ -1095,7 +1129,7 @@ int main(int argc, char **argv) winorunix = one2one; basemap = one2one; parse_options(argc, argv); - if(optind == argc) + if(optind == argc && !fromstdin) usage(); switch (format) { case 0: @@ -1138,15 +1172,25 @@ int main(int argc, char **argv) basemap = noand; } break; - case 4: + case 4: { eol = "\r\n"; - myplaputstr( "PLP PLAYLIST\r\nVERSION 1.20\r\n\r\n" ); + myplaputstr("PLP PLAYLIST\r\nVERSION 1.20\r\n\r\n"); } } - for(; optind < argc; optind++) { - parse_directory(argv[optind]); - } + if(fromstdin) { + unsigned char path[PATH_MAX]; + int i; + while(fgets(path, PATH_MAX, stdin)) { + for(i = 0; i < PATH_MAX; i++) + if(path[i] == '\r' || path[i] == '\n') + path[i] = '\0'; + parse_directory(path); + } + } else + for(; optind < argc; optind++) { + parse_directory(argv[optind]); + } switch (format) { case 1: printf("NumberOfEntries=%d%sVersion=2%s", counter, eol, eol);