Ignore DLC count information for specific games

Ignore DLC count information for specific games by using a list of games that we know have DLC.
GOG reports wrong DLC count information for many games. By using a list of games that we know have DLC we can ignore DLC count info that GOG provides for those games.
User can use local list ($XDG_CONFIG_HOME/lgogdownloader/game_has_dlc.txt) or use remote list by using the new "--dlc-list" option.
The list uses same format as blacklist.
This commit is contained in:
Sude 2016-11-05 14:51:52 +02:00
parent 0b3a6643c6
commit 34e3af3438
6 changed files with 62 additions and 4 deletions

View File

@ -31,6 +31,8 @@ class Blacklist
bool isBlacklisted(const std::string& path); bool isBlacklisted(const std::string& path);
bool isBlacklisted(const std::string& path, const std::string& gamename, std::string subdirectory = ""); bool isBlacklisted(const std::string& path, const std::string& gamename, std::string subdirectory = "");
std::vector<BlacklistItem>::size_type size() const { return blacklist_.size(); }
bool empty() { return blacklist_.empty(); }
private: private:
std::vector<BlacklistItem> blacklist_; std::vector<BlacklistItem> blacklist_;
}; };

View File

@ -63,8 +63,10 @@ class Config
std::string sConfigFilePath; std::string sConfigFilePath;
std::string sBlacklistFilePath; std::string sBlacklistFilePath;
std::string sIgnorelistFilePath; std::string sIgnorelistFilePath;
std::string sGameHasDLCListFilePath;
std::string sOrphanRegex; std::string sOrphanRegex;
std::string sCoverList; std::string sCoverList;
std::string sGameHasDLCList;
std::string sReportFilePath; std::string sReportFilePath;
std::string sInstallersSubdir; std::string sInstallersSubdir;
std::string sExtrasSubdir; std::string sExtrasSubdir;
@ -93,6 +95,7 @@ class Config
long int iTimeout; long int iTimeout;
Blacklist blacklist; Blacklist blacklist;
Blacklist ignorelist; Blacklist ignorelist;
Blacklist gamehasdlc;
}; };
#endif // CONFIG_H__ #endif // CONFIG_H__

View File

@ -55,6 +55,7 @@ int main(int argc, char *argv[])
config.sConfigFilePath = config.sConfigDirectory + "/config.cfg"; config.sConfigFilePath = config.sConfigDirectory + "/config.cfg";
config.sBlacklistFilePath = config.sConfigDirectory + "/blacklist.txt"; config.sBlacklistFilePath = config.sConfigDirectory + "/blacklist.txt";
config.sIgnorelistFilePath = config.sConfigDirectory + "/ignorelist.txt"; config.sIgnorelistFilePath = config.sConfigDirectory + "/ignorelist.txt";
config.sGameHasDLCListFilePath = config.sConfigDirectory + "/game_has_dlc.txt";
std::string priority_help_text = "Set priority by separating values with \",\"\nCombine values by separating with \"+\""; std::string priority_help_text = "Set priority by separating values with \",\"\nCombine values by separating with \"+\"";
// Create help text for --platform option // Create help text for --platform option
@ -164,7 +165,7 @@ int main(int argc, char *argv[])
("timeout", bpo::value<long int>(&config.iTimeout)->default_value(10), "Set timeout for connection\nMaximum time in seconds that connection phase is allowed to take") ("timeout", bpo::value<long int>(&config.iTimeout)->default_value(10), "Set timeout for connection\nMaximum time in seconds that connection phase is allowed to take")
("retries", bpo::value<int>(&config.iRetries)->default_value(3), "Set maximum number of retries on failed download") ("retries", bpo::value<int>(&config.iRetries)->default_value(3), "Set maximum number of retries on failed download")
("wait", bpo::value<int>(&config.iWait)->default_value(0), "Time to wait between requests (milliseconds)") ("wait", bpo::value<int>(&config.iWait)->default_value(0), "Time to wait between requests (milliseconds)")
("cover-list", bpo::value<std::string>(&config.sCoverList)->default_value("https://sites.google.com/site/gogdownloader/covers.xml"), "Set URL for cover list") ("cover-list", bpo::value<std::string>(&config.sCoverList)->default_value("https://raw.githubusercontent.com/Sude-/lgogdownloader-lists/master/covers.xml"), "Set URL for cover list")
("subdir-installers", bpo::value<std::string>(&config.sInstallersSubdir)->default_value(""), ("Set subdirectory for extras" + subdir_help_text).c_str()) ("subdir-installers", bpo::value<std::string>(&config.sInstallersSubdir)->default_value(""), ("Set subdirectory for extras" + subdir_help_text).c_str())
("subdir-extras", bpo::value<std::string>(&config.sExtrasSubdir)->default_value("extras"), ("Set subdirectory for extras" + subdir_help_text).c_str()) ("subdir-extras", bpo::value<std::string>(&config.sExtrasSubdir)->default_value("extras"), ("Set subdirectory for extras" + subdir_help_text).c_str())
("subdir-patches", bpo::value<std::string>(&config.sPatchesSubdir)->default_value("patches"), ("Set subdirectory for patches" + subdir_help_text).c_str()) ("subdir-patches", bpo::value<std::string>(&config.sPatchesSubdir)->default_value("patches"), ("Set subdirectory for patches" + subdir_help_text).c_str())
@ -180,6 +181,7 @@ int main(int argc, char *argv[])
("automatic-xml-creation", bpo::value<bool>(&config.bAutomaticXMLCreation)->zero_tokens()->default_value(false), "Automatically create XML data after download has completed") ("automatic-xml-creation", bpo::value<bool>(&config.bAutomaticXMLCreation)->zero_tokens()->default_value(false), "Automatically create XML data after download has completed")
("save-changelogs", bpo::value<bool>(&config.bSaveChangelogs)->zero_tokens()->default_value(false), "Save changelogs when downloading") ("save-changelogs", bpo::value<bool>(&config.bSaveChangelogs)->zero_tokens()->default_value(false), "Save changelogs when downloading")
("threads", bpo::value<unsigned int>(&config.iThreads)->default_value(4), "Number of download threads") ("threads", bpo::value<unsigned int>(&config.iThreads)->default_value(4), "Number of download threads")
("dlc-list", bpo::value<std::string>(&config.sGameHasDLCList)->default_value("https://raw.githubusercontent.com/Sude-/lgogdownloader-lists/master/game_has_dlc.txt"), "Set URL for list of games that have DLC")
; ;
// Options read from config file // Options read from config file
options_cfg_only.add_options() options_cfg_only.add_options()
@ -298,6 +300,30 @@ int main(int argc, char *argv[])
} }
} }
if (config.sIgnoreDLCCountRegex.empty())
{
if (boost::filesystem::exists(config.sGameHasDLCListFilePath))
{
std::ifstream ifs(config.sGameHasDLCListFilePath.c_str());
if (!ifs)
{
std::cerr << "Could not open list of games that have dlc: " << config.sGameHasDLCListFilePath << std::endl;
return 1;
}
else
{
std::string line;
std::vector<std::string> lines;
while (!ifs.eof())
{
std::getline(ifs, line);
lines.push_back(std::move(line));
}
config.gamehasdlc.initialize(lines);
}
}
}
if (vm.count("chunk-size")) if (vm.count("chunk-size"))
config.iChunkSize <<= 20; // Convert chunk size from bytes to megabytes config.iChunkSize <<= 20; // Convert chunk size from bytes to megabytes

View File

@ -74,6 +74,17 @@ blacklist.
.br .br
It doesn't have to exist, but if it does exist, it must be readable to lgogdownloader. It doesn't have to exist, but if it does exist, it must be readable to lgogdownloader.
.TP
\fI$XDG_CONFIG_HOME/lgogdownloader/game_has_dlc.txt\fP
Allows user to specify which games have dlc and should have their DLC count
information ignored. The file has the same format and interpretation as a
blacklist.
.br
It doesn't have to exist, but if it does exist, it must be readable to lgogdownloader.
.br
If the file exists lgogdownloader uses it instead of list specified with
\fB--dlc-list\fP option
.TP .TP
\fI$XDG_CONFIG_HOME/lgogdownloader/gamespecific/gamename.conf\fP \fI$XDG_CONFIG_HOME/lgogdownloader/gamespecific/gamename.conf\fP
JSON formatted file. Sets game specific settings for \fBgamename\fP. JSON formatted file. Sets game specific settings for \fBgamename\fP.

View File

@ -112,6 +112,17 @@ int Downloader::init()
if (!bInitOK || !bWebsiteIsLoggedIn || config.bLoginHTTP || config.bLoginAPI) if (!bInitOK || !bWebsiteIsLoggedIn || config.bLoginHTTP || config.bLoginAPI)
return 1; return 1;
if (!config.sGameHasDLCList.empty())
{
if (config.gamehasdlc.empty())
{
std::string game_has_dlc_list = this->getResponse(config.sGameHasDLCList);
if (!game_has_dlc_list.empty())
config.gamehasdlc.initialize(Util::tokenize(game_has_dlc_list, "\n"));
}
}
gogWebsite->setConfig(config); // Update config for website handle
if (config.bCover && config.bDownload && !config.bUpdateCheck) if (config.bCover && config.bDownload && !config.bUpdateCheck)
coverXML = this->getResponse(config.sCoverList); coverXML = this->getResponse(config.sCoverList);

View File

@ -204,14 +204,19 @@ std::vector<gameItem> Website::getGames()
} }
} }
if (!bDownloadDLCInfo && !config.gamehasdlc.empty())
{
if (config.gamehasdlc.isBlacklisted(game.name))
bDownloadDLCInfo = true;
}
// Check game specific config // Check game specific config
if (!config.bUpdateCache) // Disable game specific config files for cache update if (!config.bUpdateCache) // Disable game specific config files for cache update
{ {
gameSpecificConfig conf; gameSpecificConfig conf;
conf.bIgnoreDLCCount = false; // Assume false conf.bIgnoreDLCCount = bDownloadDLCInfo;
Util::getGameSpecificConfig(game.name, &conf); Util::getGameSpecificConfig(game.name, &conf);
if (conf.bIgnoreDLCCount) bDownloadDLCInfo = conf.bIgnoreDLCCount;
bDownloadDLCInfo = true;
} }
if (bDownloadDLCInfo && !config.sGameRegex.empty()) if (bDownloadDLCInfo && !config.sGameRegex.empty())