Play-/Source/ui_shared/BootablesProcesses.cpp

146 lines
3.9 KiB
C++
Raw Normal View History

#include <algorithm>
#include "BootablesProcesses.h"
2017-10-20 15:38:51 -04:00
#include "BootablesDbClient.h"
2017-10-20 15:40:49 -04:00
#include "LocalGamesDbClient.h"
2017-10-23 07:27:42 -04:00
#include "TheGamesDbClient.h"
#include "DiskUtils.h"
2017-10-23 07:27:42 -04:00
#include "string_format.h"
//Jobs
// Scan for new games (from input directory)
// Remove games that might not be available anymore
// Extract game ids from disk images
// Pull disc cover URLs and titles from GamesDb/TheGamesDb
bool IsBootableExecutablePath(const boost::filesystem::path& filePath)
{
auto extension = filePath.extension().string();
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
return (extension == ".elf");
}
bool IsBootableDiscImagePath(const boost::filesystem::path& filePath)
{
auto extension = filePath.extension().string();
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
return
(extension == ".iso") ||
(extension == ".isz") ||
(extension == ".cso") ||
(extension == ".bin");
}
void ScanBootables(const boost::filesystem::path& parentPath)
{
for(auto pathIterator = boost::filesystem::directory_iterator(parentPath);
pathIterator != boost::filesystem::directory_iterator(); pathIterator++)
{
auto& path = pathIterator->path();
if(boost::filesystem::is_directory(path))
{
ScanBootables(path);
continue;
}
if(
2017-11-01 07:26:30 -04:00
!IsBootableExecutablePath(path) &&
!IsBootableDiscImagePath(path))
{
continue;
}
BootablesDb::CClient::GetInstance().RegisterBootable(path);
BootablesDb::CClient::GetInstance().SetTitle(path, path.filename().string().c_str());
}
}
2017-10-27 18:06:59 -04:00
void PurgeInexistingFiles()
{
auto bootables = BootablesDb::CClient::GetInstance().GetBootables();
for(const auto& bootable : bootables)
{
if(boost::filesystem::exists(bootable.path)) continue;
BootablesDb::CClient::GetInstance().UnregisterBootable(bootable.path);
}
}
void ExtractDiscIds()
{
auto bootables = BootablesDb::CClient::GetInstance().GetBootables();
for(const auto& bootable : bootables)
{
std::string discId;
if(!DiskUtils::TryGetDiskId(bootable.path, &discId)) continue;
BootablesDb::CClient::GetInstance().SetDiscId(bootable.path, discId.c_str());
}
}
void FetchGameTitles()
{
2017-10-20 15:40:49 -04:00
auto bootables = BootablesDb::CClient::GetInstance().GetBootables();
for(const auto& bootable : bootables)
{
if(bootable.discId.empty()) continue;
try
{
auto game = LocalGamesDb::CClient::GetInstance().GetGame(bootable.discId.c_str());
BootablesDb::CClient::GetInstance().SetTitle(bootable.path, game.title.c_str());
}
catch(...)
{
//Log or something?
}
}
}
2017-10-23 07:27:42 -04:00
2017-10-27 18:18:14 -04:00
uint32 GetTheGamesDbId(const char* discId)
2017-10-23 07:27:42 -04:00
{
2017-10-27 18:18:14 -04:00
//Get the TheGamesDb ID from the local games db
auto localGame = LocalGamesDb::CClient::GetInstance().GetGame(discId);
if(localGame.theGamesDbId != 0)
2017-10-23 07:27:42 -04:00
{
2017-10-27 18:18:14 -04:00
return localGame.theGamesDbId;
2017-10-23 07:27:42 -04:00
}
2017-10-27 18:18:14 -04:00
//If no ID found in database, then, try a fuzzy lookup using the game name specified in the
//local database
auto gamesList = TheGamesDb::CClient::GetInstance().GetGamesList("sony playstation 2", localGame.title);
if(gamesList.empty())
2017-10-23 07:27:42 -04:00
{
2017-10-27 18:18:14 -04:00
throw std::runtime_error("Game not found.");
2017-10-23 07:27:42 -04:00
}
2017-10-27 18:18:14 -04:00
else
{
//This is the one (might be wrong due to fuzzy search)
auto gamesListItem = gamesList[0];
return gamesListItem.id;
}
}
2017-10-23 07:27:42 -04:00
2017-10-27 18:18:14 -04:00
std::string GetCoverUrl(const char* discId)
{
2017-10-23 07:27:42 -04:00
try
{
2017-10-27 18:18:14 -04:00
auto theGamesDbId = GetTheGamesDbId(discId);
auto theGamesDbGame = TheGamesDb::CClient::GetInstance().GetGame(theGamesDbId);
auto coverUrl = string_format("%s/%s", theGamesDbGame.baseImgUrl.c_str(), theGamesDbGame.boxArtUrl.c_str());
return coverUrl;
2017-10-23 07:27:42 -04:00
}
catch(const std::exception& exception)
{
return "";
}
}
void FetchCoverUrls()
{
auto bootables = BootablesDb::CClient::GetInstance().GetBootables();
for(const auto& bootable : bootables)
{
//Don't fetch if bootable already has a coverUrl
if(!bootable.coverUrl.empty()) continue;
2017-10-23 07:27:42 -04:00
if(bootable.discId.empty()) continue;
auto coverUrl = GetCoverUrl(bootable.discId.c_str());
BootablesDb::CClient::GetInstance().SetCoverUrl(bootable.path, coverUrl.c_str());
}
}