Also extract images / icons from nfts

This commit is contained in:
2025-04-10 12:57:34 +02:00
parent 9380e95126
commit 4813ad7c09
+39 -5
View File
@@ -19,6 +19,17 @@ static QString pathWithSlash(const QString &input) {
return input + '/';
}
static bool walk(QJsonObject &item, const QStringList &steps) {
for (const auto &step : steps) {
auto x = item[step];
if (!x.isObject())
return false;
item = x.toObject();
}
return true;
}
Processor::Processor(const QString &inDir, const QString &outDir)
: m_inDir(inDir),
m_outDir(pathWithSlash(outDir))
@@ -54,7 +65,10 @@ bool Processor::run()
QString path = m_outDir + source->hash + "/" + url.host() + url.path();
if (QFile::exists(path))
continue;
if (url.scheme() == "ipfs") {
// use the main gateway for download
url = QUrl(QString("https://ipfs.io/ipfs/%1").arg(resource.mid(7)));
}
if (url.scheme() == "http" || url.scheme() == "https") {
// schedule for download.
DownloadJob *job = new DownloadJob(&m_network);
@@ -151,10 +165,12 @@ void Processor::parseBCMR(const QString &path)
isTx = isTx && true;
isJson = 10;
}
if (isJson <= 1 && (k == ' ' || k == '\n' || k == '\r' || k == '\t'))
isJson = 1;
else if (isJson < 2 && k == '{')
if (k == ' ' || k == '\n' || k == '\r' || k == '\t') {
if (isJson < 1)
isJson = 1;
} else if (isJson < 2 && k == '{') {
isJson = 2;
}
else if (isJson == 2 && (k < 34 || k > 'z')) {
isJson = 10; // fail
}
@@ -208,7 +224,7 @@ void Processor::parseBCMR(const QString &path)
m_sources.push_back(me);
}
logInfo() << "Found BCMR for" << me->name;
logInfo() << "Found BCMR" << me->name << identity.key();
const auto uris_ = revision["uris"];
if (uris_.isObject()) {
const auto uris = uris_.toObject();
@@ -227,6 +243,24 @@ void Processor::parseBCMR(const QString &path)
MetaCategory *mc = fetchOrCreate(cat);
me->tokens.push_back(mc);
mc->owners.insert(me);
// walk all nfts and extract image and icon resource urls
auto types = token;
if (!walk(types, QStringList() << "nfts" << "parse" << "types"))
continue;
for (auto iter = types.begin(); iter != types.end(); ++iter) {
if (!iter->isObject())
continue;
auto uris = iter->toObject();
if (!walk(uris, QStringList() << "uris"))
continue;
auto image = uris["image"];
if (image.isString())
me->resources.insert(image.toString());
auto icon = uris["icon"];
if (icon.isString())
me->resources.insert(icon.toString());
}
}
}
}