*** mcrec.cpp.orig Mon Jul 28 21:15:26 2003 --- mcrec.cpp Sun Aug 31 13:33:28 2003 *************** *** 23,29 **** * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! #define VERSION "0.17" #include "SigHandler.h" #include "Remuxer.h" --- 23,30 ---- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! #define VERSION "0.17barf" ! #define DIRECTORY_PROTECTION 0755 #include "SigHandler.h" #include "Remuxer.h" *************** *** 153,158 **** --- 154,162 ---- char recvbuf[1500]; char *p_act; int rest; + bool do_directories = false; // Store resulting files in directories + bool do_xml = false; // Create XML-Files with song data + bool simple_filenames = false; // only C-identifier chars in filenames #define SONGDBNAME "mcrec.songdb" SongDB *mcrecsongdb; *************** *** 1208,1219 **** //### replacecritchars replaces characters not usable for filenames ! void replacecritchars(char *workstring) { char *ptr; ptr = workstring; while (*ptr != '\0') { switch(*ptr) { case '?': --- 1212,1233 ---- //### replacecritchars replaces characters not usable for filenames ! void ! replacecritchars(char *workstring) { char *ptr; ptr = workstring; while (*ptr != '\0') { + if (simple_filenames) { + if (! ( + ((*ptr >= '0') && (*ptr <= '9')) + || ((*ptr >= 'A') && (*ptr <= 'Z')) + || ((*ptr >= 'a') && (*ptr <= 'z')) + )) + *ptr = '_'; + + } else { switch(*ptr) { case '?': *************** *** 1225,1276 **** case '"': *ptr = '\''; break; } ptr++; } } //### finish_file does all this fancy filename setting, moving, removing stuff //### void finish_file(char * filename) { ! FILE *song; ! char *newname, *newfile, *dbname; struct stat mcstat; - int namelen; int i; char filenum[4]; int currfs; if (mysonginfo.valid) { - namelen = strlen(basedir) + strlen(progname) + - strlen(mysonginfo.artist1) + strlen(mysonginfo.track) + 21; - newname = (char *)malloc(namelen); - - namelen = strlen(mysonginfo.artist1) + strlen(mysonginfo.track) + 8; - newfile = (char *)malloc(namelen); - strcpy(newname, basedir); strcat(newname, "finished/"); ! if (stat(newname, &mcstat) != 0) ! mkdir(newname, 0777); ! strcat(newname, progname); ! if (stat(newname, &mcstat) != 0) ! mkdir(newname, 0777); strcat(newname, "/"); ! strcpy(newfile, mysonginfo.artist1); ! strcat(newfile, " - "); ! strcat(newfile, mysonginfo.track); ! dbname = strdup(newfile); ! strcat(newfile, "."); ! strcat(newfile, extension); ! replacecritchars(newfile); ! strcat(newname, newfile); song = fopen(filename, "a"); fwrite(&id3, sizeof(id3), 1, song); --- 1239,1345 ---- case '"': *ptr = '\''; break; } + } ptr++; } } + char * + strcat_careful(char *dest, const char *src) + { + char *p = dest + strlen(dest); + strcat(dest, src); + replacecritchars(p); + return dest; + } + + void + check_mkdir(const char *dir) + { + struct stat mcstat; + printf("Checking for directory %s...", dir); + if (stat(dir, &mcstat) != 0) { + printf("No, creating\n"); + mkdir(dir, DIRECTORY_PROTECTION); + } else + printf("Yes\n"); + } + + char * + namify(const char *in) + { + static char outname[1000]; + const char *p; + char *q; + for (p = in, q = outname; *p; p++, q++) + switch (*p) { + case '&': + *q = '&'; + *++q = 'a'; + *++q = 'm'; + *++q = 'p'; + *++q = ';'; + break; + case '<': + *q = '&'; + *++q = 'l'; + *++q = 't'; + *++q = ';'; + break; + case '>': + *q = '&'; + *++q = 'g'; + *++q = 't'; + *++q = ';'; + break; + default: + *q = *p; + } + *q = '\0'; + return outname; + } //### finish_file does all this fancy filename setting, moving, removing stuff //### void finish_file(char * filename) { ! const int STRINGSIZE = 10000; ! FILE *song, *xml_file; ! char xml_filename[STRINGSIZE]; ! char newname[STRINGSIZE], dbname[STRINGSIZE]; struct stat mcstat; int i; char filenum[4]; int currfs; if (mysonginfo.valid) { strcpy(newname, basedir); strcat(newname, "finished/"); ! check_mkdir(newname); + strcat_careful(newname, progname); + check_mkdir(newname); strcat(newname, "/"); ! if (do_directories) { ! strcat_careful(newname, mysonginfo.artist1); ! strcat(newname, "/"); ! check_mkdir(newname); ! strcat_careful(newname, strlen(mysonginfo.album) > 0 ? mysonginfo.album : "unknown_album"); ! strcat(newname, "/"); ! check_mkdir(newname); ! strcat_careful(newname, mysonginfo.track); ! } else { ! strcat_careful(newname, mysonginfo.artist1); ! strcat_careful(newname, " - "); ! strcat_careful(newname, mysonginfo.track); ! } ! strcat(dbname, newname); ! strcat(newname, "."); ! strcat(newname, extension); song = fopen(filename, "a"); fwrite(&id3, sizeof(id3), 1, song); *************** *** 1285,1299 **** { logprintf("file already in recorddb. removing file.\n"); unlink(filename); - free(dbname); - free(newname); - free(newfile); return; } else mcrecsongdb->addentry(dbname, currfs); } - free(dbname); if (stat(newname, &mcstat) == 0) { --- 1354,1364 ---- *************** *** 1301,1317 **** { logprintf("file of same name and size found. removing dublicate.\n"); unlink(filename); - free(newname); - free(newfile); return; } ! newname[strlen(newname)-4] = '\0'; i = 1; while(true) { sprintf(filenum, "_%02d", i); strcat(newname, filenum); ! strcat(newname, ".mp2"); if (stat(newname, &mcstat) != 0) break; else --- 1366,1381 ---- { logprintf("file of same name and size found. removing dublicate.\n"); unlink(filename); return; } ! newname[strlen(newname)-(strlen(extension)+1)] = '\0'; i = 1; while(true) { sprintf(filenum, "_%02d", i); strcat(newname, filenum); ! strcat(newname, "."); ! strcat(newname, extension); if (stat(newname, &mcstat) != 0) break; else *************** *** 1327,1336 **** } logprintf("finished recording...\nmoving file to: %s\n", newname); - rename(filename, newname); ! free(newname); ! free(newfile); } } --- 1391,1446 ---- } logprintf("finished recording...\nmoving file to: %s\n", newname); rename(filename, newname); ! ! if (do_xml) { ! strcpy(xml_filename, newname); ! xml_filename[strlen(newname) - (strlen(extension) + 1)] = '\0'; ! strcat(xml_filename, ".xml"); ! xml_file = fopen(xml_filename, "w"); ! if (xml_file) { ! logprintf("creating XML file %s\n", xml_filename); ! fprintf(xml_file, ! "\n" ! "\n"); ! time_t t; ! time(&t); ! struct tm *the_tm = localtime(&t); ! fprintf(xml_file, ! " \n", ! the_tm->tm_year + 1900, ! the_tm->tm_mon + 1, ! the_tm->tm_mday, ! the_tm->tm_hour, ! the_tm->tm_min); ! fprintf(xml_file, " %s\n", progname, dbprogname); ! fprintf(xml_file, " %s\n", namify(mysonginfo.artist1)); ! if (strlen(mysonginfo.artist2) > 0) ! fprintf(xml_file, " %s\n", namify(mysonginfo.artist2)); ! fprintf(xml_file, " %s\n", namify(mysonginfo.track)); ! fprintf(xml_file, " \n"); ! fprintf(xml_file, " %s\n", namify(mysonginfo.album)); ! fprintf(xml_file, " %s\n", namify(mysonginfo.year)); ! fprintf(xml_file, " \n", namify(mysonginfo.label)); ! fprintf(xml_file, " \n"); ! fprintf(xml_file, " \n"); ! ! char *the_basename = strrchr(newname, '/') + 1; ! the_basename[strlen(the_basename) - strlen(extension) - 1] = '\0'; ! fprintf(xml_file, " %s\n", the_basename); ! *(the_basename - 1) = '\0'; ! ! fprintf(xml_file, " %s\n", ! namify(newname)+strlen(basedir) ! +strlen("finished/")+strlen(progname)+1); ! fprintf(xml_file, " %s\n", extension); ! fprintf(xml_file, " \n"); ! fprintf(xml_file, "\n"); ! fclose(xml_file); ! } ! ! ! } } } *************** *** 1573,1579 **** --- 1683,1696 ---- } else if (!strcmp("-nort", argv[i])) { no_rt_prio = true; + } else if (!strcmp("-dirs", argv[i])) { + do_directories = true; + + } else if (!strcmp("-x", argv[i])) { + do_xml = true; + } else if (!strcmp("-f", argv[i])) { + simple_filenames = true; } else { fprintf(stderr, "unknown option '%s'\n", argv[i]); *************** *** 1594,1600 **** "-nort do not try to enable realtime-scheduling for AV reader thread\n" "-n relative nice-level of AV reader thread if -nort (default: -10)\n" "-d debug messages\n" ! "\n" ); return -1; } --- 1711,1719 ---- "-nort do not try to enable realtime-scheduling for AV reader thread\n" "-n relative nice-level of AV reader thread if -nort (default: -10)\n" "-d debug messages\n" ! "-dirs store finished files hierarchically in a file system\n" ! "-x generate XML-Files with song information\n" ! "-f restrict filenames to characters [a-zA-Z0-9_]\n" ); return -1; } *************** *** 1669,1675 **** strncat(fname_mpp, fname_output, 1000); strncat(fname_mpp, fname_apid, 1000); strcat(fname_mpp, fname_mpg_num); ! strcat(fname_mpp, ".mp2"); FILE * file_mpp = 0; --- 1788,1795 ---- strncat(fname_mpp, fname_output, 1000); strncat(fname_mpp, fname_apid, 1000); strcat(fname_mpp, fname_mpg_num); ! strcat(fname_mpp, "."); ! strcat(fname_mpp, extension); FILE * file_mpp = 0; *************** *** 1868,1874 **** strncat(fname_mpp, fname_apid, 1000); sprintf(fname_mpg_num, "%d", fname_mpg_counter); strcat(fname_mpp, fname_mpg_num); ! strcat(fname_mpp, ".mp2"); if ( (file_mpp = fopen(fname_mpp,"w")) == NULL ) { --- 1988,1995 ---- strncat(fname_mpp, fname_apid, 1000); sprintf(fname_mpg_num, "%d", fname_mpg_counter); strcat(fname_mpp, fname_mpg_num); ! strcat(fname_mpp, "."); ! strcat(fname_mpp, extension); if ( (file_mpp = fopen(fname_mpp,"w")) == NULL ) {