Added scraper support for displaying the returned platform if it does not match the game platform.

This commit is contained in:
Leon Styhre 2022-01-03 18:37:43 +01:00
parent 6f35f16470
commit 5bb009e604
6 changed files with 81 additions and 9 deletions

View file

@ -153,6 +153,9 @@ namespace PlatformIds
const std::string getPlatformName(PlatformId id)
{
if (id > platformNames.size() - 1)
return "unknown";
// Return the platform name.
return platformNames[id];
}

View file

@ -351,7 +351,7 @@ void GuiScraperSearch::stop()
mScrapeResult = {};
}
void GuiScraperSearch::onSearchDone(const std::vector<ScraperSearchResult>& results)
void GuiScraperSearch::onSearchDone(std::vector<ScraperSearchResult>& results)
{
mResultList->clear();
@ -386,11 +386,57 @@ void GuiScraperSearch::onSearchDone(const std::vector<ScraperSearchResult>& resu
ComponentListRow row;
for (size_t i = 0; i < results.size(); ++i) {
// If the platform IDs returned by the scraper do not match the platform IDs of the
// scraped game, then add the additional platform information to the end of the game
// name (within square brackets).
std::string gameName = results.at(i).mdl.get("name");
std::string otherPlatforms;
// As the platform names are found via reverse lookup there could be multiple entries.
// So if any of the entries match the platforms of the last search, then just keep
// this platform ID and remove the other ones.
for (auto& platformID : mLastSearch.system->getSystemEnvData()->mPlatformIds) {
if (!results.at(i).platformIDs.empty() &&
std::find(results.at(i).platformIDs.begin(), results.at(i).platformIDs.end(),
platformID) != results.at(i).platformIDs.end()) {
results.at(i).platformIDs.clear();
results.at(i).platformIDs.push_back(platformID);
}
}
bool hasOtherPlatforms = false;
for (auto& platformID : mLastSearch.system->getSystemEnvData()->mPlatformIds) {
if (!results.at(i).platformIDs.empty() &&
std::find(results.at(i).platformIDs.cbegin(), results.at(i).platformIDs.cend(),
platformID) == results.at(i).platformIDs.cend())
hasOtherPlatforms = true;
}
if (hasOtherPlatforms) {
if (std::find(results.at(i).platformIDs.cbegin(), results.at(i).platformIDs.cend(),
PlatformIds::PlatformId::PC) != results.at(i).platformIDs.cend()) {
// The PC platform is a bit special as it's widely used by a number of
// different systems. As such remove these other IDs and only display the
// main PC ID as the list of platforms would otherwise be quite long.
otherPlatforms = PlatformIds::getPlatformName(PlatformIds::PlatformId::PC);
}
else {
for (auto& platform : results.at(i).platformIDs)
otherPlatforms += PlatformIds::getPlatformName(platform) + "/";
}
}
if (otherPlatforms != "" && otherPlatforms.back() == '/')
otherPlatforms.pop_back();
if (otherPlatforms != "")
gameName.append(" [").append(otherPlatforms).append("]");
row.elements.clear();
row.addElement(
std::make_shared<TextComponent>(
mWindow, Utils::String::toUpper(results.at(i).mdl.get("name")), font, color),
false);
row.addElement(std::make_shared<TextComponent>(
mWindow, Utils::String::toUpper(gameName), font, color),
false);
row.makeAcceptInputHandler([this, i] { returnResult(mScraperResults.at(i)); });
mResultList->addRow(row);
}

View file

@ -108,7 +108,7 @@ private:
void onSearchError(const std::string& error,
HttpReq::Status status = HttpReq::REQ_UNDEFINED_ERROR);
void onSearchDone(const std::vector<ScraperSearchResult>& results);
void onSearchDone(std::vector<ScraperSearchResult>& results);
int getSelectedIndex();

View file

@ -333,6 +333,17 @@ namespace
{
ScraperSearchResult result;
// Platform IDs.
if (game.HasMember("platform") && game["platform"].IsInt()) {
for (auto& platform : gamesdb_new_platformid_map) {
if (platform.second == std::to_string(game["platform"].GetInt()))
result.platformIDs.push_back(platform.first);
}
}
if (result.platformIDs.empty())
result.platformIDs.push_back(PlatformId::PLATFORM_UNKNOWN);
if (game.HasMember("id") && game["id"].IsInt())
result.gameID = std::to_string(getIntOrThrow(game, "id"));

View file

@ -14,6 +14,7 @@
#include "AsyncHandle.h"
#include "HttpReq.h"
#include "MetaData.h"
#include "PlatformId.h"
#include <assert.h>
#include <functional>
@ -52,6 +53,7 @@ struct ScraperSearchResult {
MetaDataList mdl;
std::string gameID;
std::vector<PlatformIds::PlatformId> platformIDs;
// How many more objects the scraper service allows to be downloaded
// within a given time period.

View file

@ -445,11 +445,21 @@ void ScreenScraperRequest::processGame(const pugi::xml_document& xmldoc,
<< result.mdl.get("players");
}
// Controller (only for the Arcade and SNK Neo Geo systems).
pugi::xml_node system = game.child("systeme");
int platformID = system.attribute("parentid").as_int();
int platformID = system.attribute("id").as_int();
int parentPlatformID = system.attribute("parentid").as_int();
if (platformID == 75 || platformID == 142) {
// Platform IDs.
for (auto& platform : screenscraper_platformid_map) {
if (platform.second == platformID || platform.second == parentPlatformID)
result.platformIDs.push_back(platform.first);
}
if (result.platformIDs.empty())
result.platformIDs.push_back(PlatformId::PLATFORM_UNKNOWN);
// Controller (only for the Arcade and SNK Neo Geo systems).
if (parentPlatformID == 75 || parentPlatformID == 142) {
std::string controller = Utils::String::toLower(game.child("controles").text().get());
if (!controller.empty()) {
std::string controllerDescription = "Other";