X-Git-Url: http://royale.zerezo.com/git/?p=FAPG;a=blobdiff_plain;f=fapg.c;h=ea50917948a613876062e88d00a24cf54698b563;hp=19eb30a6fb608ed8bc5f7a5eab482a633b1c3164;hb=refs%2Ftags%2Fv0.37;hpb=e2f3f82e0ae06d888512028fa1e9572082612807;ds=inline diff --git a/fapg.c b/fapg.c index 19eb30a..ea50917 100644 --- a/fapg.c +++ b/fapg.c @@ -1,7 +1,3 @@ -/* - * FAPG - */ -#define VERSION "0.35" /* * FAPG means Fast Audio Playlist Generator. * It is a tool to generate list of audio files (Wav, MP3, Ogg, etc) @@ -42,6 +38,7 @@ #include #include "genres.h" +#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 */ @@ -56,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 = '/'; @@ -220,12 +218,18 @@ unsigned char *iso2web[256] = { void usage() { fprintf(stderr, - "Usage >> fapg [-b|--backslash] [-d|--debug] [-f|--format=m3u|pls|html|rss] [-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); } #define mywebputchar(x) { fputs(iso2web[(unsigned char)winorunix[(unsigned char)x]], stdout); } #define myputchar(x) { putchar(basemap[(unsigned char)winorunix[(unsigned char)x]]); } +/* #define myplaputchar(x) { putchar(basemap[(unsigned char)winorunix[(unsigned char)x]]);putchar('\0');} */ +void myplaputchar(const char x) +{ + putchar(basemap[(unsigned char)winorunix[(unsigned char)x]]); + putchar('\0'); +} void mywebputstr(const char *c) { @@ -235,10 +239,27 @@ void mywebputstr(const char *c) } } +void myplaputstr(const char *c) +{ + while(*c != 0) { + if(*c == '/') + myplaputchar('\\'); /* translate slash to backslash */ + else + myplaputchar(*c); + c++; + /* remove multiple slashes "//" when parsing a directory ending with a "/" */ + while(*c == '/' && c[1] == '/') + 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] == '/') @@ -246,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; @@ -339,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'}, @@ -350,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'} }; @@ -381,6 +421,8 @@ void parse_options(int argc, char **argv) format = 2; else if(strcmp(optarg, "rss") == 0) format = 3; + else if(strcmp(optarg, "pla") == 0) + format = 4; else usage(); break; @@ -463,6 +505,9 @@ void parse_options(int argc, char **argv) } } break; + case 's': + fromstdin = 1; + break; default: usage(); } @@ -915,11 +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; strcpy(artist, ++c); // arbitrarily use the first '-' // to separate artist and title @@ -940,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); @@ -957,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; @@ -1017,6 +1071,11 @@ void parse_file(unsigned char *newpath) printf("\t%s", eol); } break; + case 4: // printing output for Sansa players + myplaputstr("HARP, "); + myplaputstr(newpath); + myplaputstr(eol); + break; } } } @@ -1070,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: @@ -1113,10 +1172,25 @@ int main(int argc, char **argv) basemap = noand; } break; + case 4: + { + eol = "\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);