mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-01-17 22:55:38 +00:00
Multi-scraper folder scraping and folder scraper exclusions added.
A quick-skip shortcut was added to the multi-scraper as well and some minor changes were done to the ScreenScraper debug logging.
This commit is contained in:
parent
2ee67407d8
commit
408be5120c
|
@ -345,6 +345,36 @@ std::vector<FileData*> FileData::getFilesRecursive(unsigned int typeMask,
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<FileData*> FileData::getScrapeFilesRecursive(bool includeFolders,
|
||||||
|
bool excludeRecursively, bool respectExclusions) const
|
||||||
|
{
|
||||||
|
std::vector<FileData*> out;
|
||||||
|
|
||||||
|
for (auto it = mChildren.cbegin(); it != mChildren.cend(); it++) {
|
||||||
|
if (includeFolders && (*it)->getType() == FOLDER) {
|
||||||
|
if (!(respectExclusions && (*it)->getExcludeFromScraper()))
|
||||||
|
out.push_back(*it);
|
||||||
|
}
|
||||||
|
else if ((*it)->getType() == GAME) {
|
||||||
|
if (!(respectExclusions && (*it)->getExcludeFromScraper()))
|
||||||
|
out.push_back(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the flag has been passed to exclude directories recursively, then skip the entire
|
||||||
|
// folder at this point if the folder is marked for scrape exclusion.
|
||||||
|
if (excludeRecursively && (*it)->getType() == FOLDER && (*it)->getExcludeFromScraper())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((*it)->getChildren().size() > 0) {
|
||||||
|
std::vector<FileData*> subChildren = (*it)->getScrapeFilesRecursive(
|
||||||
|
includeFolders, excludeRecursively, respectExclusions);
|
||||||
|
out.insert(out.cend(), subChildren.cbegin(), subChildren.cend());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
std::string FileData::getKey() {
|
std::string FileData::getKey() {
|
||||||
return getFileName();
|
return getFileName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,8 @@ public:
|
||||||
const std::vector<FileData*>& getChildrenListToDisplay();
|
const std::vector<FileData*>& getChildrenListToDisplay();
|
||||||
std::vector<FileData*> getFilesRecursive(unsigned int typeMask,
|
std::vector<FileData*> getFilesRecursive(unsigned int typeMask,
|
||||||
bool displayedOnly = false, bool countAllGames = true) const;
|
bool displayedOnly = false, bool countAllGames = true) const;
|
||||||
|
std::vector<FileData*> getScrapeFilesRecursive(bool includeFolders, bool excludeRecursively,
|
||||||
|
bool respectExclusions) const;
|
||||||
|
|
||||||
void addChild(FileData* file); // Error if mType != FOLDER
|
void addChild(FileData* file); // Error if mType != FOLDER
|
||||||
void removeChild(FileData* file); //Error if mType != FOLDER
|
void removeChild(FileData* file); //Error if mType != FOLDER
|
||||||
|
|
|
@ -28,7 +28,7 @@ MetaDataDecl gameDecls[] = {
|
||||||
{"hidden", MD_BOOL, "false", false, "hidden", "enter hidden off/on", false},
|
{"hidden", MD_BOOL, "false", false, "hidden", "enter hidden off/on", false},
|
||||||
{"broken", MD_BOOL, "false", false, "broken/not working", "enter broken off/on", false},
|
{"broken", MD_BOOL, "false", false, "broken/not working", "enter broken off/on", false},
|
||||||
{"nogamecount", MD_BOOL, "false", false, "exclude from game counter", "enter don't count as game off/on", false},
|
{"nogamecount", MD_BOOL, "false", false, "exclude from game counter", "enter don't count as game off/on", false},
|
||||||
{"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no autoscrape off/on", false},
|
{"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no multi-scrape off/on", false},
|
||||||
{"launchcommand", MD_LAUNCHCOMMAND, "", false, "launch command", "enter game launch command "
|
{"launchcommand", MD_LAUNCHCOMMAND, "", false, "launch command", "enter game launch command "
|
||||||
"(emulator override)", false},
|
"(emulator override)", false},
|
||||||
{"playcount", MD_INT, "0", false, "play count", "enter number of times played", false},
|
{"playcount", MD_INT, "0", false, "play count", "enter number of times played", false},
|
||||||
|
@ -51,7 +51,7 @@ MetaDataDecl folderDecls[] = {
|
||||||
{"completed", MD_BOOL, "false", false, "completed", "enter completed off/on", false},
|
{"completed", MD_BOOL, "false", false, "completed", "enter completed off/on", false},
|
||||||
{"hidden", MD_BOOL, "false", false, "hidden", "enter hidden off/on", false},
|
{"hidden", MD_BOOL, "false", false, "hidden", "enter hidden off/on", false},
|
||||||
{"broken", MD_BOOL, "false", false, "broken/not working", "enter broken off/on", false},
|
{"broken", MD_BOOL, "false", false, "broken/not working", "enter broken off/on", false},
|
||||||
{"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no autoscrape off/on", false},
|
{"nomultiscrape", MD_BOOL, "false", false, "exclude from multi-scraper", "enter no multi-scrape off/on", false},
|
||||||
{"lastplayed", MD_TIME, "0", true, "last played", "enter last played date", false}
|
{"lastplayed", MD_TIME, "0", true, "last played", "enter last played date", false}
|
||||||
};
|
};
|
||||||
const std::vector<MetaDataDecl> folderMDD(folderDecls, folderDecls +
|
const std::vector<MetaDataDecl> folderMDD(folderDecls, folderDecls +
|
||||||
|
|
|
@ -415,8 +415,10 @@ void GuiMetaDataEd::fetchDone(const ScraperSearchResult& result)
|
||||||
mEditors.at(i)->setColor(TEXTCOLOR_SCRAPERMARKED);
|
mEditors.at(i)->setColor(TEXTCOLOR_SCRAPERMARKED);
|
||||||
}
|
}
|
||||||
// Save all the keys, except the following which can't be scraped.
|
// Save all the keys, except the following which can't be scraped.
|
||||||
if (key != "favorite" && key != "completed" && key != "broken" &&
|
if (key != "favorite" && key != "completed" && key != "kidgame" &&
|
||||||
key != "hidden" && key != "kidgame")
|
key != "hidden" && key != "broken" && key != "nogamecount" &&
|
||||||
|
key != "nomultiscrape" && key != "nocontentscrape" &&
|
||||||
|
key != "nocontentscrape")
|
||||||
mEditors.at(i)->setValue(metadata->get(key));
|
mEditors.at(i)->setValue(metadata->get(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -292,6 +292,24 @@ void GuiScraperMenu::openOtherSettings()
|
||||||
Settings::getInstance()->setBool("ScraperRespectExclusions",
|
Settings::getInstance()->setBool("ScraperRespectExclusions",
|
||||||
scraper_respect_exclusions->getState()); });
|
scraper_respect_exclusions->getState()); });
|
||||||
|
|
||||||
|
// Exclude files recursively for excluded folders.
|
||||||
|
auto scraper_exclude_recursively = std::make_shared<SwitchComponent>(mWindow);
|
||||||
|
scraper_exclude_recursively->setState(
|
||||||
|
Settings::getInstance()->getBool("ScraperExcludeRecursively"));
|
||||||
|
s->addWithLabel("EXCLUDE FOLDERS RECURSIVELY", scraper_exclude_recursively);
|
||||||
|
s->addSaveFunc([scraper_exclude_recursively] {
|
||||||
|
Settings::getInstance()->setBool("ScraperExcludeRecursively",
|
||||||
|
scraper_exclude_recursively->getState()); });
|
||||||
|
|
||||||
|
// Include actual folders when scraping.
|
||||||
|
auto scraper_include_folders = std::make_shared<SwitchComponent>(mWindow);
|
||||||
|
scraper_include_folders->setState(
|
||||||
|
Settings::getInstance()->getBool("ScraperIncludeFolders"));
|
||||||
|
s->addWithLabel("SCRAPE ACTUAL FOLDERS", scraper_include_folders);
|
||||||
|
s->addSaveFunc([scraper_include_folders] {
|
||||||
|
Settings::getInstance()->setBool("ScraperIncludeFolders",
|
||||||
|
scraper_include_folders->getState()); });
|
||||||
|
|
||||||
mWindow->pushGui(s);
|
mWindow->pushGui(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,13 +355,12 @@ std::queue<ScraperSearchParams> GuiScraperMenu::getSearches(
|
||||||
{
|
{
|
||||||
std::queue<ScraperSearchParams> queue;
|
std::queue<ScraperSearchParams> queue;
|
||||||
for (auto sys = systems.cbegin(); sys != systems.cend(); sys++) {
|
for (auto sys = systems.cbegin(); sys != systems.cend(); sys++) {
|
||||||
std::vector<FileData*> games = (*sys)->getRootFolder()->getFilesRecursive(GAME);
|
std::vector<FileData*> games = (*sys)->getRootFolder()->getScrapeFilesRecursive(
|
||||||
|
Settings::getInstance()->getBool("ScraperIncludeFolders"),
|
||||||
|
Settings::getInstance()->getBool("ScraperExcludeRecursively"),
|
||||||
|
Settings::getInstance()->getBool("ScraperRespectExclusions"));
|
||||||
for (auto game = games.cbegin(); game != games.cend(); game++) {
|
for (auto game = games.cbegin(); game != games.cend(); game++) {
|
||||||
// Skip scraping the game if the multi-scraper exclusion flag has been
|
if (selector((*sys), (*game))) {
|
||||||
// set for the file, and the flag to respect this value is also enabled.
|
|
||||||
bool skipGame = ((*game)->getExcludeFromScraper() &&
|
|
||||||
Settings::getInstance()->getBool("ScraperRespectExclusions") == true);
|
|
||||||
if (!skipGame && selector((*sys), (*game))) {
|
|
||||||
ScraperSearchParams search;
|
ScraperSearchParams search;
|
||||||
search.game = *game;
|
search.game = *game;
|
||||||
search.system = *sys;
|
search.system = *sys;
|
||||||
|
|
|
@ -451,6 +451,10 @@ bool GuiScraperSearch::input(InputConfig* config, Input input)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Quick-skip option activated by pressing 's' on the keyboard.
|
||||||
|
if (config->getDeviceId() == DEVICE_KEYBOARD && input.id == SDLK_s && input.value != 0)
|
||||||
|
mSkipCallback();
|
||||||
|
|
||||||
return GuiComponent::input(config, input);
|
return GuiComponent::input(config, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -419,7 +419,8 @@ void ScreenScraperRequest::processMedia(
|
||||||
fileFormat = "." + media_type;
|
fileFormat = "." + media_type;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG(LogDebug) << "Failed to find media XML node with name=" << mediaType;
|
LOG(LogDebug) << "ScreenScraperRequest::processMedia(): "
|
||||||
|
"Failed to find media XML node with name '" << mediaType << "'.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,13 +430,13 @@ void ScreenScraperRequest::processList(const pugi::xml_document& xmldoc,
|
||||||
{
|
{
|
||||||
assert(mRequestQueue != nullptr);
|
assert(mRequestQueue != nullptr);
|
||||||
|
|
||||||
LOG(LogDebug) << "ScreenScraper: Processing a list of results";
|
LOG(LogDebug) << "ScreenScraperRequest::processList(): Processing a list of results.";
|
||||||
|
|
||||||
pugi::xml_node data = xmldoc.child("Data");
|
pugi::xml_node data = xmldoc.child("Data");
|
||||||
pugi::xml_node game = data.child("jeu");
|
pugi::xml_node game = data.child("jeu");
|
||||||
|
|
||||||
if (!game) {
|
if (!game) {
|
||||||
LOG(LogDebug) << "ScreenScraper: Found nothing";
|
LOG(LogDebug) << "ScreenScraperRequest::processList(): Found nothing.";
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenScraperRequest::ScreenScraperConfig ssConfig;
|
ScreenScraperRequest::ScreenScraperConfig ssConfig;
|
||||||
|
|
|
@ -155,6 +155,8 @@ void Settings::setDefaults()
|
||||||
mBoolMap["ScraperSemiautomatic"] = true;
|
mBoolMap["ScraperSemiautomatic"] = true;
|
||||||
mBoolMap["ScraperOverwriteData"] = true;
|
mBoolMap["ScraperOverwriteData"] = true;
|
||||||
mBoolMap["ScraperRespectExclusions"] = true;
|
mBoolMap["ScraperRespectExclusions"] = true;
|
||||||
|
mBoolMap["ScraperExcludeRecursively"] = true;
|
||||||
|
mBoolMap["ScraperIncludeFolders"] = false;
|
||||||
mBoolMap["ScrapeMetadata"] = true;
|
mBoolMap["ScrapeMetadata"] = true;
|
||||||
mBoolMap["ScrapeGameNames"] = true;
|
mBoolMap["ScrapeGameNames"] = true;
|
||||||
mBoolMap["ScrapeRatings"] = true;
|
mBoolMap["ScrapeRatings"] = true;
|
||||||
|
|
Loading…
Reference in a new issue