mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-29 01:25:38 +00:00
Changed the logic for overwriting game names during scraping.
Also fixed an issue when refining searches during semi-automatic scraping.
This commit is contained in:
parent
777480aa6e
commit
65ca9bcfb9
|
@ -662,7 +662,7 @@ Describes the content types to include in the scraping. Most users will probably
|
||||||
|
|
||||||
**Scrape game names**
|
**Scrape game names**
|
||||||
|
|
||||||
Whether to scrape the names of the games. This does not affect the actual files on the filesystem and is only used for viewing and sorting purposes. The downloaded media files are also matched against the physical game files on the filesystem, and not against this name.
|
Whether to scrape the names of the games. This does not affect the actual files on the filesystem and is only used for viewing and sorting purposes. The downloaded media files are also matched against the physical game files on the filesystem, and not against this metadata. See the comments under _Overwrite files and data_ below to understand some additional implications regarding the game names.
|
||||||
|
|
||||||
**Scrape ratings** _(ScreenScraper only)_
|
**Scrape ratings** _(ScreenScraper only)_
|
||||||
|
|
||||||
|
@ -706,7 +706,7 @@ Currently only English or World are supported, not really significant at the mom
|
||||||
|
|
||||||
**Overwrite files and data**
|
**Overwrite files and data**
|
||||||
|
|
||||||
Affects both overwriting of metadata as well as actual game media files on the filesystem. Even with this option disabled, metadata entries which are set to their default values will of course be populated by the scraper. In other words, this option only affects overwriting of previously scraped data. The only exception is game names for newly added games (which are based on the physical filenames of the game files) which will not be overwritten unless this option is enabled.
|
Affects both overwriting of metadata as well as actual game media files on the filesystem. Even with this option disabled, metadata entries which are set to their default values will of course be populated by the scraper. In other words, this option only affects overwriting of previously scraped data. Game names are considered as set to their default vaules if either corresponding to the physical game file on disk minus the extension (e.g. the entry _Commando_ if the file is named _Commando.zip_), or for arcade games if corresponding to the MAME names as defined in the bundled mamenames.xml.
|
||||||
|
|
||||||
**Halt on invalid media files**
|
**Halt on invalid media files**
|
||||||
|
|
||||||
|
|
|
@ -444,7 +444,7 @@ void GuiMetaDataEd::fetchDone(const ScraperSearchResult& result)
|
||||||
metadata->set(key, mEditors[i]->getValue());
|
metadata->set(key, mEditors[i]->getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiScraperSearch::saveMetadata(result, *metadata);
|
GuiScraperSearch::saveMetadata(result, *metadata, mScraperParams.game);
|
||||||
|
|
||||||
// Update the list with the scraped metadata values.
|
// Update the list with the scraped metadata values.
|
||||||
for (unsigned int i = 0; i < mEditors.size(); i++) {
|
for (unsigned int i = 0; i < mEditors.size(); i++) {
|
||||||
|
|
|
@ -29,7 +29,8 @@ GuiScraperMulti::GuiScraperMulti(
|
||||||
: GuiComponent(window),
|
: GuiComponent(window),
|
||||||
mBackground(window, ":/graphics/frame.svg"),
|
mBackground(window, ":/graphics/frame.svg"),
|
||||||
mGrid(window, Vector2i(1, 5)),
|
mGrid(window, Vector2i(1, 5)),
|
||||||
mSearchQueue(searches)
|
mSearchQueue(searches),
|
||||||
|
mApproveResults(approveResults)
|
||||||
{
|
{
|
||||||
assert(mSearchQueue.size());
|
assert(mSearchQueue.size());
|
||||||
|
|
||||||
|
@ -56,13 +57,13 @@ GuiScraperMulti::GuiScraperMulti(
|
||||||
Font::get(FONT_SIZE_SMALL), 0x888888FF, ALIGN_CENTER);
|
Font::get(FONT_SIZE_SMALL), 0x888888FF, ALIGN_CENTER);
|
||||||
mGrid.setEntry(mSubtitle, Vector2i(0, 2), false, true);
|
mGrid.setEntry(mSubtitle, Vector2i(0, 2), false, true);
|
||||||
|
|
||||||
if (approveResults && !Settings::getInstance()->getBool("ScraperSemiautomatic"))
|
if (mApproveResults && !Settings::getInstance()->getBool("ScraperSemiautomatic"))
|
||||||
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
||||||
GuiScraperSearch::NEVER_AUTO_ACCEPT, mTotalGames);
|
GuiScraperSearch::NEVER_AUTO_ACCEPT, mTotalGames);
|
||||||
else if (approveResults && Settings::getInstance()->getBool("ScraperSemiautomatic"))
|
else if (mApproveResults && Settings::getInstance()->getBool("ScraperSemiautomatic"))
|
||||||
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
||||||
GuiScraperSearch::ACCEPT_SINGLE_MATCHES, mTotalGames);
|
GuiScraperSearch::ACCEPT_SINGLE_MATCHES, mTotalGames);
|
||||||
else if (!approveResults)
|
else if (!mApproveResults)
|
||||||
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
mSearchComp = std::make_shared<GuiScraperSearch>(mWindow,
|
||||||
GuiScraperSearch::ALWAYS_ACCEPT_FIRST_RESULT, mTotalGames);
|
GuiScraperSearch::ALWAYS_ACCEPT_FIRST_RESULT, mTotalGames);
|
||||||
mSearchComp->setAcceptCallback(std::bind(&GuiScraperMulti::acceptResult,
|
mSearchComp->setAcceptCallback(std::bind(&GuiScraperMulti::acceptResult,
|
||||||
|
@ -74,7 +75,7 @@ GuiScraperMulti::GuiScraperMulti(
|
||||||
|
|
||||||
std::vector< std::shared_ptr<ButtonComponent> > buttons;
|
std::vector< std::shared_ptr<ButtonComponent> > buttons;
|
||||||
|
|
||||||
if (approveResults) {
|
if (mApproveResults) {
|
||||||
buttons.push_back(std::make_shared<ButtonComponent>(mWindow, "REFINE SEARCH",
|
buttons.push_back(std::make_shared<ButtonComponent>(mWindow, "REFINE SEARCH",
|
||||||
"refine search", [&] {
|
"refine search", [&] {
|
||||||
mSearchComp->openInputScreen(mSearchQueue.front());
|
mSearchComp->openInputScreen(mSearchQueue.front());
|
||||||
|
@ -160,7 +161,7 @@ void GuiScraperMulti::acceptResult(const ScraperSearchResult& result)
|
||||||
{
|
{
|
||||||
ScraperSearchParams& search = mSearchQueue.front();
|
ScraperSearchParams& search = mSearchQueue.front();
|
||||||
|
|
||||||
GuiScraperSearch::saveMetadata(result, search.game->metadata);
|
GuiScraperSearch::saveMetadata(result, search.game->metadata, search.game);
|
||||||
|
|
||||||
updateGamelist(search.system);
|
updateGamelist(search.system);
|
||||||
|
|
||||||
|
@ -175,6 +176,7 @@ void GuiScraperMulti::skip()
|
||||||
mSearchQueue.pop();
|
mSearchQueue.pop();
|
||||||
mCurrentGame++;
|
mCurrentGame++;
|
||||||
mTotalSkipped++;
|
mTotalSkipped++;
|
||||||
|
mSearchComp->unsetRefinedSearch();
|
||||||
doNextSearch();
|
doNextSearch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +203,11 @@ void GuiScraperMulti::finish()
|
||||||
|
|
||||||
std::vector<HelpPrompt> GuiScraperMulti::getHelpPrompts()
|
std::vector<HelpPrompt> GuiScraperMulti::getHelpPrompts()
|
||||||
{
|
{
|
||||||
return mGrid.getHelpPrompts();
|
std::vector<HelpPrompt> prompts = mGrid.getHelpPrompts();
|
||||||
|
// Remove the 'Choose' entry if in fully automatic mode.
|
||||||
|
if (!mApproveResults)
|
||||||
|
prompts.pop_back();
|
||||||
|
return prompts;
|
||||||
}
|
}
|
||||||
|
|
||||||
HelpStyle GuiScraperMulti::getHelpStyle()
|
HelpStyle GuiScraperMulti::getHelpStyle()
|
||||||
|
|
|
@ -42,13 +42,13 @@ private:
|
||||||
void doNextSearch();
|
void doNextSearch();
|
||||||
|
|
||||||
void finish();
|
void finish();
|
||||||
|
|
||||||
unsigned int mTotalGames;
|
unsigned int mTotalGames;
|
||||||
unsigned int mCurrentGame;
|
unsigned int mCurrentGame;
|
||||||
unsigned int mTotalSuccessful;
|
unsigned int mTotalSuccessful;
|
||||||
unsigned int mTotalSkipped;
|
unsigned int mTotalSkipped;
|
||||||
std::queue<ScraperSearchParams> mSearchQueue;
|
std::queue<ScraperSearchParams> mSearchQueue;
|
||||||
std::vector<MetaDataDecl> mMetaDataDecl;
|
std::vector<MetaDataDecl> mMetaDataDecl;
|
||||||
|
bool mApproveResults;
|
||||||
|
|
||||||
NinePatchComponent mBackground;
|
NinePatchComponent mBackground;
|
||||||
ComponentGrid mGrid;
|
ComponentGrid mGrid;
|
||||||
|
|
|
@ -527,6 +527,7 @@ void GuiScraperSearch::returnResult(ScraperSearchResult result)
|
||||||
|
|
||||||
mScrapeCount -= 1;
|
mScrapeCount -= 1;
|
||||||
mAcceptCallback(result);
|
mAcceptCallback(result);
|
||||||
|
mRefinedSearch = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiScraperSearch::update(int deltaTime)
|
void GuiScraperSearch::update(int deltaTime)
|
||||||
|
@ -700,10 +701,23 @@ void GuiScraperSearch::openInputScreen(ScraperSearchParams& params)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GuiScraperSearch::saveMetadata(
|
bool GuiScraperSearch::saveMetadata(
|
||||||
const ScraperSearchResult& result, MetaDataList& metadata)
|
const ScraperSearchResult& result, MetaDataList& metadata, FileData* scrapedGame)
|
||||||
{
|
{
|
||||||
bool mMetadataUpdated = false;
|
bool metadataUpdated = false;
|
||||||
|
bool hasDefaultName = false;
|
||||||
std::vector<MetaDataDecl> mMetaDataDecl = metadata.getMDD();
|
std::vector<MetaDataDecl> mMetaDataDecl = metadata.getMDD();
|
||||||
|
std::string defaultName;
|
||||||
|
|
||||||
|
// Get the default name, which is either the MAME name or the name of the physical file
|
||||||
|
// or directory.
|
||||||
|
if (scrapedGame->isArcadeGame())
|
||||||
|
defaultName = MameNames::getInstance()->getCleanName(scrapedGame->getCleanName());
|
||||||
|
else
|
||||||
|
defaultName = Utils::FileSystem::getStem(scrapedGame->getFileName());
|
||||||
|
|
||||||
|
// We want the comparison to be case sensitive.
|
||||||
|
if (defaultName == metadata.get("name"))
|
||||||
|
hasDefaultName = true;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < mMetaDataDecl.size(); i++) {
|
for (unsigned int i = 0; i < mMetaDataDecl.size(); i++) {
|
||||||
|
|
||||||
|
@ -746,21 +760,26 @@ bool GuiScraperSearch::saveMetadata(
|
||||||
// Overwrite all the other values if the flag to overwrite data has been set.
|
// Overwrite all the other values if the flag to overwrite data has been set.
|
||||||
if (Settings::getInstance()->getBool("ScraperOverwriteData")) {
|
if (Settings::getInstance()->getBool("ScraperOverwriteData")) {
|
||||||
metadata.set(key, result.mdl.get(key));
|
metadata.set(key, result.mdl.get(key));
|
||||||
mMetadataUpdated = true;
|
metadataUpdated = true;
|
||||||
|
}
|
||||||
|
// If the key is the game name and it's set to its default value, then update.
|
||||||
|
else if (key == "name" && hasDefaultName) {
|
||||||
|
metadata.set(key, result.mdl.get(key));
|
||||||
|
metadataUpdated = true;
|
||||||
}
|
}
|
||||||
// Else only update the value if it is set to the default metadata value.
|
// Else only update the value if it is set to the default metadata value.
|
||||||
else if (metadata.get(key) == mMetaDataDecl.at(i).defaultValue) {
|
else if (metadata.get(key) == mMetaDataDecl.at(i).defaultValue) {
|
||||||
metadata.set(key, result.mdl.get(key));
|
metadata.set(key, result.mdl.get(key));
|
||||||
mMetadataUpdated = true;
|
metadataUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For the description, expand any escaped HTML quotation marks to literal
|
// For the description, expand any escaped HTML quotation marks to literal
|
||||||
// quotation marks.
|
// quotation marks.
|
||||||
if (key == "desc" && mMetadataUpdated)
|
if (key == "desc" && metadataUpdated)
|
||||||
metadata.set(key, Utils::String::replace(metadata.get(key), """, "\""));
|
metadata.set(key, Utils::String::replace(metadata.get(key), """, "\""));
|
||||||
}
|
}
|
||||||
|
|
||||||
return mMetadataUpdated;
|
return metadataUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<HelpPrompt> GuiScraperSearch::getHelpPrompts()
|
std::vector<HelpPrompt> GuiScraperSearch::getHelpPrompts()
|
||||||
|
|
|
@ -44,7 +44,8 @@ public:
|
||||||
void openInputScreen(ScraperSearchParams& from);
|
void openInputScreen(ScraperSearchParams& from);
|
||||||
void stop();
|
void stop();
|
||||||
inline SearchType getSearchType() const { return mSearchType; }
|
inline SearchType getSearchType() const { return mSearchType; }
|
||||||
static bool saveMetadata(const ScraperSearchResult& result, MetaDataList& metadata);
|
static bool saveMetadata(const ScraperSearchResult& result,
|
||||||
|
MetaDataList& metadata, FileData* scrapedGame);
|
||||||
|
|
||||||
// Metadata assets will be resolved before calling the accept callback
|
// Metadata assets will be resolved before calling the accept callback
|
||||||
// (e.g. result.mdl's "image" is automatically downloaded and properly set).
|
// (e.g. result.mdl's "image" is automatically downloaded and properly set).
|
||||||
|
@ -64,6 +65,8 @@ public:
|
||||||
void onFocusGained() override;
|
void onFocusGained() override;
|
||||||
void onFocusLost() override;
|
void onFocusLost() override;
|
||||||
|
|
||||||
|
void unsetRefinedSearch() { mRefinedSearch = false; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateViewStyle();
|
void updateViewStyle();
|
||||||
void updateThumbnail();
|
void updateThumbnail();
|
||||||
|
|
Loading…
Reference in a new issue