Mercurial > hg > sonic-annotator
comparison runner/main.cpp @ 265:0be716283c61 piper-nopiper
More error reporting updates
| author | Chris Cannam | 
|---|---|
| date | Wed, 23 Nov 2016 12:05:53 +0000 | 
| parents | 68dc2d99a5b1 | 
| children | bfad84d0bb1d | 
   comparison
  equal
  deleted
  inserted
  replaced
| 264:3e85b5370690 | 265:0be716283c61 | 
|---|---|
| 476 findSourcesRecursive(QString dirname, QStringList &addTo, int &found) | 476 findSourcesRecursive(QString dirname, QStringList &addTo, int &found) | 
| 477 { | 477 { | 
| 478 QDir dir(dirname); | 478 QDir dir(dirname); | 
| 479 | 479 | 
| 480 QString printable = dir.dirName().left(20); | 480 QString printable = dir.dirName().left(20); | 
| 481 cerr << "\rScanning \"" << printable << "\"..." | 481 SVCERR << "\rScanning \"" << printable << "\"..." | 
| 482 << QString(" ").left(20 - printable.length()) | 482 << QString(" ").left(20 - printable.length()) | 
| 483 << " [" << found << " audio file(s)]"; | 483 << " [" << found << " audio file(s)]"; | 
| 484 | 484 | 
| 485 QString extensions = AudioFileReaderFactory::getKnownExtensions(); | 485 QString extensions = AudioFileReaderFactory::getKnownExtensions(); | 
| 486 QStringList extlist = extensions.split(" ", QString::SkipEmptyParts); | 486 QStringList extlist = extensions.split(" ", QString::SkipEmptyParts); | 
| 503 expandPlaylists(QStringList sources) | 503 expandPlaylists(QStringList sources) | 
| 504 { | 504 { | 
| 505 QStringList expanded; | 505 QStringList expanded; | 
| 506 foreach (QString path, sources) { | 506 foreach (QString path, sources) { | 
| 507 if (QFileInfo(path).suffix().toLower() == "m3u") { | 507 if (QFileInfo(path).suffix().toLower() == "m3u") { | 
| 508 SVDEBUG << "Expanding m3u playlist file \"" << path << "\"" << endl; | |
| 508 ProgressPrinter retrievalProgress("Opening playlist file..."); | 509 ProgressPrinter retrievalProgress("Opening playlist file..."); | 
| 509 FileSource source(path, &retrievalProgress); | 510 FileSource source(path, &retrievalProgress); | 
| 510 if (!source.isAvailable()) { | 511 if (!source.isAvailable()) { | 
| 511 // Don't fail or throw an exception here, just keep | 512 // Don't fail or throw an exception here, just keep | 
| 512 // the file in the list -- it will be tested again | 513 // the file in the list -- it will be tested again | 
| 521 if (reader.isOK()) { | 522 if (reader.isOK()) { | 
| 522 vector<QString> files = reader.load(); | 523 vector<QString> files = reader.load(); | 
| 523 for (int i = 0; i < (int)files.size(); ++i) { | 524 for (int i = 0; i < (int)files.size(); ++i) { | 
| 524 expanded.push_back(files[i]); | 525 expanded.push_back(files[i]); | 
| 525 } | 526 } | 
| 527 SVDEBUG << "Done, m3u playlist references " | |
| 528 << files.size() << " file(s)" << endl; | |
| 526 } | 529 } | 
| 527 } else { | 530 } else { | 
| 528 // not a playlist | 531 // not a playlist | 
| 529 expanded.push_back(path); | 532 expanded.push_back(path); | 
| 530 } | 533 } | 
| 536 readSegmentBoundaries(QString url, | 539 readSegmentBoundaries(QString url, | 
| 537 Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries &boundaries) | 540 Vamp::HostExt::PluginSummarisingAdapter::SegmentBoundaries &boundaries) | 
| 538 { | 541 { | 
| 539 FileSource source(url); | 542 FileSource source(url); | 
| 540 if (!source.isAvailable()) { | 543 if (!source.isAvailable()) { | 
| 541 cerr << "File or URL \"" << url << "\" could not be retrieved" << endl; | 544 SVCERR << "File or URL \"" << url << "\" could not be retrieved" << endl; | 
| 542 return false; | 545 return false; | 
| 543 } | 546 } | 
| 544 source.waitForData(); | 547 source.waitForData(); | 
| 545 | 548 | 
| 546 QString filename = source.getLocalFilename(); | 549 QString filename = source.getLocalFilename(); | 
| 547 QFile file(filename); | 550 QFile file(filename); | 
| 548 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { | 551 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { | 
| 549 cerr << "File \"" << filename << "\" could not be read" << endl; | 552 SVCERR << "File \"" << filename << "\" could not be read" << endl; | 
| 550 return false; | 553 return false; | 
| 551 } | 554 } | 
| 552 | 555 | 
| 553 QTextStream in(&file); | 556 QTextStream in(&file); | 
| 554 int lineNo = 0; | 557 int lineNo = 0; | 
| 567 } | 570 } | 
| 568 if (!bits.empty()) { | 571 if (!bits.empty()) { | 
| 569 importantBit = bits[0]; | 572 importantBit = bits[0]; | 
| 570 } | 573 } | 
| 571 if (importantBit == QString()) { | 574 if (importantBit == QString()) { | 
| 572 cerr << "WARNING: Skipping line " << lineNo << " (no content found)" | 575 SVCERR << "WARNING: Skipping line " << lineNo << " (no content found)" | 
| 573 << endl; | 576 << endl; | 
| 574 continue; | 577 continue; | 
| 575 } | 578 } | 
| 576 bool good = false; | 579 bool good = false; | 
| 577 boundaries.insert(Vamp::RealTime::fromSeconds | 580 boundaries.insert(Vamp::RealTime::fromSeconds | 
| 578 (importantBit.toDouble(&good))); | 581 (importantBit.toDouble(&good))); | 
| 579 if (!good) { | 582 if (!good) { | 
| 580 cerr << "Unparseable or non-numeric segment boundary at line " | 583 SVCERR << "Unparseable or non-numeric segment boundary at line " | 
| 581 << lineNo << endl; | 584 << lineNo << endl; | 
| 582 return false; | 585 return false; | 
| 583 } | 586 } | 
| 584 } | 587 } | 
| 585 | 588 | 
| 1042 exit(2); | 1045 exit(2); | 
| 1043 } | 1046 } | 
| 1044 | 1047 | 
| 1045 for (set<string>::const_iterator i = requestedTransformListFiles.begin(); | 1048 for (set<string>::const_iterator i = requestedTransformListFiles.begin(); | 
| 1046 i != requestedTransformListFiles.end(); ++i) { | 1049 i != requestedTransformListFiles.end(); ++i) { | 
| 1050 SVDEBUG << "Reading transform list file \"" << *i << "\"" << endl; | |
| 1047 PlaylistFileReader reader(i->c_str()); | 1051 PlaylistFileReader reader(i->c_str()); | 
| 1048 if (reader.isOK()) { | 1052 if (reader.isOK()) { | 
| 1049 vector<QString> files = reader.load(); | 1053 vector<QString> files = reader.load(); | 
| 1050 for (int j = 0; j < (int)files.size(); ++j) { | 1054 for (int j = 0; j < (int)files.size(); ++j) { | 
| 1051 requestedTransformFiles.insert(files[j].toStdString()); | 1055 requestedTransformFiles.insert(files[j].toStdString()); | 
| 1052 } | 1056 } | 
| 1053 } else { | 1057 } else { | 
| 1054 cerr << myname << ": failed to read template list file \"" << *i << "\"" << endl; | 1058 SVCERR << myname << ": failed to read transform list file \"" << *i << "\"" << endl; | 
| 1055 exit(2); | 1059 exit(2); | 
| 1056 } | 1060 } | 
| 1057 } | 1061 } | 
| 1058 | 1062 | 
| 1059 QStringList sources; | 1063 QStringList sources; | 
| 1061 sources = otherArgs; | 1065 sources = otherArgs; | 
| 1062 } else { | 1066 } else { | 
| 1063 for (QStringList::const_iterator i = otherArgs.begin(); | 1067 for (QStringList::const_iterator i = otherArgs.begin(); | 
| 1064 i != otherArgs.end(); ++i) { | 1068 i != otherArgs.end(); ++i) { | 
| 1065 if (QDir(*i).exists()) { | 1069 if (QDir(*i).exists()) { | 
| 1066 cerr << "Directory found and recursive flag set, scanning for audio files..." << endl; | 1070 SVCERR << "Directory found and recursive flag set, scanning for audio files..." << endl; | 
| 1067 int found = 0; | 1071 int found = 0; | 
| 1068 findSourcesRecursive(*i, sources, found); | 1072 findSourcesRecursive(*i, sources, found); | 
| 1069 cerr << "\rDone, found " << found << " supported audio file(s) " << endl; | 1073 SVCERR << "\rDone, found " << found << " supported audio file(s) " << endl; | 
| 1070 } else { | 1074 } else { | 
| 1071 sources.push_back(*i); | 1075 sources.push_back(*i); | 
| 1072 } | 1076 } | 
| 1073 } | 1077 } | 
| 1074 } | 1078 } | 
| 1082 i != sources.end(); ++i) { | 1086 i != sources.end(); ++i) { | 
| 1083 try { | 1087 try { | 
| 1084 manager.addSource(*i, multiplex); | 1088 manager.addSource(*i, multiplex); | 
| 1085 } catch (const std::exception &e) { | 1089 } catch (const std::exception &e) { | 
| 1086 badSources.insert(*i); | 1090 badSources.insert(*i); | 
| 1087 cerr << "ERROR: Failed to process file \"" << i->toStdString() | 1091 SVCERR << "ERROR: Failed to process file \"" << i->toStdString() | 
| 1088 << "\": " << e.what() << endl; | 1092 << "\": " << e.what() << endl; | 
| 1089 if (force) { | 1093 if (force) { | 
| 1090 // print a note only if we have more files to process | 1094 // print a note only if we have more files to process | 
| 1091 QStringList::const_iterator j = i; | 1095 QStringList::const_iterator j = i; | 
| 1092 if (++j != sources.end()) { | 1096 if (++j != sources.end()) { | 
| 1093 cerr << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl; | 1097 SVCERR << "NOTE: \"--force\" option was provided, continuing (more errors may occur)" << endl; | 
| 1094 } | 1098 } | 
| 1095 } else { | 1099 } else { | 
| 1096 cerr << "NOTE: If you want to continue with processing any further files after an" << endl | 1100 SVCERR << "NOTE: If you want to continue with processing any further files after an" << endl | 
| 1097 << "error like this, use the --force option" << endl; | 1101 << "error like this, use the --force option" << endl; | 
| 1098 good = false; | 1102 good = false; | 
| 1099 break; | 1103 break; | 
| 1100 } | 1104 } | 
| 1101 } | 1105 } | 
| 1108 for (set<string>::const_iterator i = requestedTransformFiles.begin(); | 1112 for (set<string>::const_iterator i = requestedTransformFiles.begin(); | 
| 1109 i != requestedTransformFiles.end(); ++i) { | 1113 i != requestedTransformFiles.end(); ++i) { | 
| 1110 if (manager.addFeatureExtractorFromFile(i->c_str(), writers)) { | 1114 if (manager.addFeatureExtractorFromFile(i->c_str(), writers)) { | 
| 1111 haveFeatureExtractor = true; | 1115 haveFeatureExtractor = true; | 
| 1112 } else { | 1116 } else { | 
| 1113 cerr << "ERROR: Failed to add feature extractor from transform file \"" << *i << "\"" << endl; | 1117 SVCERR << "ERROR: Failed to add feature extractor from transform file \"" << *i << "\"" << endl; | 
| 1114 good = false; | 1118 good = false; | 
| 1115 } | 1119 } | 
| 1116 } | 1120 } | 
| 1117 | 1121 | 
| 1118 for (set<string>::const_iterator i = requestedDefaultTransforms.begin(); | 1122 for (set<string>::const_iterator i = requestedDefaultTransforms.begin(); | 
| 1119 i != requestedDefaultTransforms.end(); ++i) { | 1123 i != requestedDefaultTransforms.end(); ++i) { | 
| 1120 if (manager.addDefaultFeatureExtractor(i->c_str(), writers)) { | 1124 if (manager.addDefaultFeatureExtractor(i->c_str(), writers)) { | 
| 1121 haveFeatureExtractor = true; | 1125 haveFeatureExtractor = true; | 
| 1122 } else { | 1126 } else { | 
| 1123 cerr << "ERROR: Failed to add default feature extractor for transform \"" << *i << "\"" << endl; | 1127 SVCERR << "ERROR: Failed to add default feature extractor for transform \"" << *i << "\"" << endl; | 
| 1124 good = false; | 1128 good = false; | 
| 1125 } | 1129 } | 
| 1126 } | 1130 } | 
| 1127 | 1131 | 
| 1128 if (!haveFeatureExtractor) { | 1132 if (!haveFeatureExtractor) { | 
| 1129 cerr << myname << ": no feature extractors added" << endl; | 1133 SVCERR << myname << ": no feature extractors added" << endl; | 
| 1130 good = false; | 1134 good = false; | 
| 1131 } | 1135 } | 
| 1132 } | 1136 } | 
| 1133 | 1137 | 
| 1134 if (good) { | 1138 if (good) { | 
| 1143 for (int i = 0; i < (int)writers.size(); ++i) { | 1147 for (int i = 0; i < (int)writers.size(); ++i) { | 
| 1144 writers[i]->setNofM(1, 1); | 1148 writers[i]->setNofM(1, 1); | 
| 1145 } | 1149 } | 
| 1146 manager.extractFeaturesMultiplexed(goodSources); | 1150 manager.extractFeaturesMultiplexed(goodSources); | 
| 1147 } catch (const std::exception &e) { | 1151 } catch (const std::exception &e) { | 
| 1148 cerr << "ERROR: Feature extraction failed: " | 1152 SVCERR << "ERROR: Feature extraction failed: " | 
| 1149 << e.what() << endl; | 1153 << e.what() << endl; | 
| 1150 } | 1154 } | 
| 1151 } else { | 1155 } else { | 
| 1152 int n = 0; | 1156 int n = 0; | 
| 1153 for (QStringList::const_iterator i = goodSources.begin(); | 1157 for (QStringList::const_iterator i = goodSources.begin(); | 
