1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-20 19:57:45 +00:00

Make Dalamud asset downloading more reliable

This uses the complete package which should prevent partial downloads.
In the future it should check for the hashes they give us.

(cherry picked from commit 51715ca3be)
This commit is contained in:
Joshua Goins 2024-02-24 11:48:02 -05:00
parent ccdf191393
commit dde9aeda55
2 changed files with 19 additions and 26 deletions

View file

@ -61,6 +61,7 @@ private:
int m_remoteDalamudAssetVersion = -1;
QJsonArray m_remoteDalamudAssetArray;
QString m_remoteDalamudDownloadUrl;
QString m_remoteDalamudAssetPackageUrl;
QString m_remoteCompatibilityToolVersion;
QString m_remoteDxvkToolVersion;
// TODO: hardcoded

View file

@ -130,6 +130,7 @@ QCoro::Task<bool> AssetUpdater::checkRemoteDalamudAssetVersion()
const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
m_remoteDalamudAssetVersion = doc.object()["version"_L1].toInt();
m_remoteDalamudAssetPackageUrl = doc.object()["packageUrl"_L1].toString();
m_remoteDalamudAssetArray = doc.object()["assets"_L1].toArray();
qInfo(ASTRA_LOG) << "Dalamud asset remote version" << m_remoteDalamudAssetVersion;
@ -265,36 +266,27 @@ QCoro::Task<bool> AssetUpdater::installDalamudAssets()
{
Q_EMIT launcher.stageChanged(i18n("Updating Dalamud assets..."));
QFutureSynchronizer<void> synchronizer;
const QNetworkRequest request = QNetworkRequest(QUrl(m_remoteDalamudAssetPackageUrl));
Utility::printRequest(QStringLiteral("GET"), request);
for (const auto &assetObject : m_remoteDalamudAssetArray) {
const QNetworkRequest assetRequest(QUrl(assetObject.toObject()["url"_L1].toString()));
Utility::printRequest(QStringLiteral("GET"), assetRequest);
const auto assetReply = launcher.mgr()->get(assetRequest);
const auto future = QtFuture::connect(assetReply, &QNetworkReply::finished).then([this, assetReply, assetObject] {
const QString fileName = assetObject.toObject()["fileName"_L1].toString();
const QString dirPath = fileName.left(fileName.lastIndexOf('/'_L1));
const QString path = m_dalamudAssetDir.absoluteFilePath(dirPath);
Utility::createPathIfNeeded(path);
QFile file(m_dalamudAssetDir.absoluteFilePath(assetObject.toObject()["fileName"_L1].toString()));
file.open(QIODevice::WriteOnly);
file.write(assetReply->readAll());
file.close();
});
synchronizer.addFuture(future);
}
co_await QtConcurrent::run([&synchronizer] {
synchronizer.waitForFinished();
});
const auto reply = launcher.mgr()->get(request);
co_await reply;
qInfo(ASTRA_LOG) << "Finished downloading Dalamud assets";
QFile file(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip")));
file.open(QIODevice::WriteOnly);
file.write(reply->readAll());
file.close();
if (!extractZip(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip")), m_dalamudAssetDir.absolutePath())) {
qCritical(ASTRA_LOG) << "Failed to install Dalamud assets";
Q_EMIT launcher.dalamudError(i18n("Failed to install Dalamud assets."));
co_return false;
}
// TODO: check for file hashes
m_profile.setDalamudAssetVersion(m_remoteDalamudAssetVersion);
Utility::writeVersion(m_dalamudAssetDir.absoluteFilePath(QStringLiteral("asset.ver")), QString::number(m_remoteDalamudAssetVersion));