1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-23 21:07:45 +00:00

Use new banner API, bump referer

Fixes #7
This commit is contained in:
Joshua Goins 2024-06-29 19:57:16 -04:00
parent dfabcd6cd9
commit 8c956d96c2

View file

@ -397,62 +397,82 @@ QCoro::Task<> LauncherCore::fetchNews()
query.addQueryItem(QStringLiteral("lang"), QStringLiteral("en-us")); query.addQueryItem(QStringLiteral("lang"), QStringLiteral("en-us"));
query.addQueryItem(QStringLiteral("media"), QStringLiteral("pcapp")); query.addQueryItem(QStringLiteral("media"), QStringLiteral("pcapp"));
QUrl url; QUrl headlineUrl;
url.setScheme(m_settings->preferredProtocol()); headlineUrl.setScheme(m_settings->preferredProtocol());
url.setHost(QStringLiteral("frontier.%1").arg(m_settings->squareEnixServer())); headlineUrl.setHost(QStringLiteral("frontier.%1").arg(m_settings->squareEnixServer()));
url.setPath(QStringLiteral("/news/headline.json")); headlineUrl.setPath(QStringLiteral("/news/headline.json"));
url.setQuery(query); headlineUrl.setQuery(query);
QNetworkRequest request(QUrl(QStringLiteral("%1&%2").arg(url.toString(), QString::number(QDateTime::currentMSecsSinceEpoch())))); QNetworkRequest headlineRequest(QUrl(QStringLiteral("%1&%2").arg(headlineUrl.toString(), QString::number(QDateTime::currentMSecsSinceEpoch()))));
request.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("application/json, text/plain, */*")); headlineRequest.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("application/json, text/plain, */*"));
request.setRawHeader(QByteArrayLiteral("Origin"), QByteArrayLiteral("https://launcher.finalfantasyxiv.com")); headlineRequest.setRawHeader(QByteArrayLiteral("Origin"), QByteArrayLiteral("https://launcher.finalfantasyxiv.com"));
request.setRawHeader(QByteArrayLiteral("Referer"), headlineRequest.setRawHeader(QByteArrayLiteral("Referer"),
QStringLiteral("https://launcher.finalfantasyxiv.com/v600/index.html?rc_lang=%1&time=%2") QStringLiteral("https://launcher.finalfantasyxiv.com/v600/index.html?rc_lang=%1&time=%2")
.arg(QStringLiteral("en-us"), QDateTime::currentDateTimeUtc().toString(QStringLiteral("yyyy-MM-dd-HH"))) .arg(QStringLiteral("en-us"), QDateTime::currentDateTimeUtc().toString(QStringLiteral("yyyy-MM-dd-HH")))
.toUtf8()); .toUtf8());
Utility::printRequest(QStringLiteral("GET"), request); Utility::printRequest(QStringLiteral("GET"), headlineRequest);
auto reply = mgr()->get(request); auto headlineReply = mgr()->get(headlineRequest);
co_await reply; co_await headlineReply;
auto document = QJsonDocument::fromJson(reply->readAll()); QUrl bannerUrl;
bannerUrl.setScheme(m_settings->preferredProtocol());
bannerUrl.setHost(QStringLiteral("frontier.%1").arg(m_settings->squareEnixServer()));
bannerUrl.setPath(QStringLiteral("/v2/topics/%1/banner.json").arg(QStringLiteral("en-us")));
bannerUrl.setQuery(query);
QNetworkRequest bannerRequest(QUrl(QStringLiteral("%1&_=%3").arg(bannerUrl.toString(), QString::number(QDateTime::currentMSecsSinceEpoch()))));
bannerRequest.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("application/json, text/plain, */*"));
bannerRequest.setRawHeader(QByteArrayLiteral("Origin"), QByteArrayLiteral("https://launcher.finalfantasyxiv.com"));
bannerRequest.setRawHeader(QByteArrayLiteral("Referer"),
QStringLiteral("https://launcher.finalfantasyxiv.com/v700/index.html?rc_lang=%1&time=%2")
.arg(QStringLiteral("en-us"), QDateTime::currentDateTimeUtc().toString(QStringLiteral("yyyy-MM-dd-HH")))
.toUtf8());
Utility::printRequest(QStringLiteral("GET"), bannerRequest);
auto bannerReply = mgr()->get(bannerRequest);
co_await bannerReply;
auto document = QJsonDocument::fromJson(headlineReply->readAll());
auto bannerDocument = QJsonDocument::fromJson(bannerReply->readAll());
auto headline = new Headline(this); auto headline = new Headline(this);
if (document.isEmpty()) { if (document.isEmpty() || bannerDocument.isEmpty()) {
headline->failedToLoad = true; headline->failedToLoad = true;
} } else {
const auto parseNews = [](QJsonObject object) -> News {
News news;
news.date = QDateTime::fromString(object["date"_L1].toString(), Qt::DateFormat::ISODate);
news.id = object["id"_L1].toString();
news.tag = object["tag"_L1].toString();
news.title = object["title"_L1].toString();
const auto parseNews = [](QJsonObject object) -> News { if (object["url"_L1].toString().isEmpty()) {
News news; news.url = QUrl(QStringLiteral("https://na.finalfantasyxiv.com/lodestone/news/detail/%1").arg(news.id));
news.date = QDateTime::fromString(object["date"_L1].toString(), Qt::DateFormat::ISODate); } else {
news.id = object["id"_L1].toString(); news.url = QUrl(object["url"_L1].toString());
news.tag = object["tag"_L1].toString(); }
news.title = object["title"_L1].toString();
if (object["url"_L1].toString().isEmpty()) { return news;
news.url = QUrl(QStringLiteral("https://na.finalfantasyxiv.com/lodestone/news/detail/%1").arg(news.id)); };
} else {
news.url = QUrl(object["url"_L1].toString()); for (const auto bannerObject : bannerDocument.object()["banner"_L1].toArray()) {
// TODO: use new order_priority and fix_order params
headline->banners.push_back(
{.link = QUrl(bannerObject.toObject()["link"_L1].toString()), .bannerImage = QUrl(bannerObject.toObject()["lsb_banner"_L1].toString())});
} }
return news; for (const auto newsObject : document.object()["news"_L1].toArray()) {
}; headline->news.push_back(parseNews(newsObject.toObject()));
}
for (const auto bannerObject : document.object()["banner"_L1].toArray()) { for (const auto pinnedObject : document.object()["pinned"_L1].toArray()) {
headline->banners.push_back( headline->pinned.push_back(parseNews(pinnedObject.toObject()));
{.link = QUrl(bannerObject.toObject()["link"_L1].toString()), .bannerImage = QUrl(bannerObject.toObject()["lsb_banner"_L1].toString())}); }
}
for (const auto newsObject : document.object()["news"_L1].toArray()) { for (const auto pinnedObject : document.object()["topics"_L1].toArray()) {
headline->news.push_back(parseNews(newsObject.toObject())); headline->topics.push_back(parseNews(pinnedObject.toObject()));
} }
for (const auto pinnedObject : document.object()["pinned"_L1].toArray()) {
headline->pinned.push_back(parseNews(pinnedObject.toObject()));
}
for (const auto pinnedObject : document.object()["topics"_L1].toArray()) {
headline->topics.push_back(parseNews(pinnedObject.toObject()));
} }
m_headline = headline; m_headline = headline;