Fallback to model file scanning if models.yml cannot be read

This commit is contained in:
Raphael Coeffic
2022-01-07 11:52:46 +01:00
parent 5be8724787
commit 01ca714312
2 changed files with 43 additions and 25 deletions
@@ -51,34 +51,27 @@ bool loadModelsListFromYaml(std::vector<CategoryData>& categories,
if (data.size() == 0)
return true;
try {
YAML::Node node = loadYamlFromByteArray(data);
if (!node.IsSequence()) return false;
YAML::Node node = loadYamlFromByteArray(data);
if (!node.IsSequence()) return false;
int modelIdx = 0;
for (const auto& cat : node) {
int modelIdx = 0;
for (const auto& cat : node) {
if (!cat.IsMap()) continue;
if (!cat.IsMap()) continue;
for (const auto& cat_map : cat) {
categories.push_back(cat_map.first.Scalar().c_str());
for (const auto& cat_map : cat) {
categories.push_back(cat_map.first.Scalar().c_str());
const auto& models = cat_map.second;
if (!models.IsSequence()) continue;
const auto& models = cat_map.second;
if (!models.IsSequence()) continue;
for (const auto& model : models) {
std::string filename, name;
model["filename"] >> filename;
model["name"] >> name;
modelFiles.push_back(
{filename, name, (int)categories.size() - 1, modelIdx++});
}
for (const auto& model : models) {
std::string filename, name;
model["filename"] >> filename;
model["name"] >> name;
modelFiles.push_back(
{filename, name, (int)categories.size() - 1, modelIdx++});
}
}
} catch (const std::runtime_error& e) {
qDebug() << "YAML::ParserException: " << e.what();
return false;
}
return true;
+28 -3
View File
@@ -254,9 +254,34 @@ bool CategorizedStorageFormat::loadYaml(RadioData & radioData)
QByteArray modelslistBuffer;
if (loadFile(modelslistBuffer, "MODELS/models.yml")) {
if (!loadModelsListFromYaml(radioData.categories, modelFiles, modelslistBuffer)) {
setError(tr("Can't load MODELS/models.yml"));
return false;
try {
if (!loadModelsListFromYaml(radioData.categories, modelFiles, modelslistBuffer)) {
setError(tr("Can't load MODELS/models.yml"));
return false;
}
} catch(const std::runtime_error& e) {
setError(tr("Can't load MODELS/models.yml") + ":\n" + QString(e.what()));
//return false;
//TODO: fall back to directory scan
std::list<std::string> filelist;
if (!getFileList(filelist)) {
return false;
}
// push default category
radioData.categories.push_back("Models");
const std::regex yml_regex("MODELS/(model[0-9]+\\.yml)");
for(const auto& f : filelist) {
std::smatch match;
if (std::regex_match(f, match, yml_regex)) {
if (match.size() == 2) {
std::ssub_match modelFile = match[1];
modelFiles.push_back({ modelFile.str(), "", 0, 0 });
}
}
}
}
} else {
// fetch "MODELS/modelXX.yml"