20 #define LOC_ERR QString("MythGame:GAMEHANDLER Error: ")
21 #define LOC QString("MythGame:GAMEHANDLER: ")
23 static QList<GameHandler*> *
handlers =
nullptr;
39 if (!
query.
exec(
"SELECT DISTINCT playername FROM gameplayers "
40 "WHERE playername <> '';"))
59 query.
prepare(
"SELECT rompath, workingpath, commandline, screenshots, "
60 "gameplayerid, gametype, extensions, spandisks "
61 "FROM gameplayers WHERE playername = :SYSTEM ");
73 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
75 .remove(
" ").split(
",", QString::SkipEmptyParts);
78 .remove(
" ").split(
",", Qt::SkipEmptyParts);
108 query.
prepare(
"SELECT crc, category, year, country, name, "
109 "description, publisher, platform, version, "
110 "binfile FROM romdb WHERE platform = :GAMETYPE;");
118 key = QString(
"%1:%2")
135 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"No romDB data read from "
136 "database for gametype %1 . Not imported?").
arg(
GameType));
140 LOG(VB_GENERAL, LOG_INFO,
LOC +
141 QString(
"Loaded %1 items from romDB Database") .
arg(
m_romDB.count()));
146 QString* Country, QString*
CRC32, QString* GameName,
147 QString *Plot, QString *Publisher, QString *Version,
148 QString* Fanart, QString* Boxart)
155 LOG(VB_GENERAL, LOG_DEBUG,
"Key = " + key);
159 *Year = tr(
"19xx",
"Default game year");
160 *Country = tr(
"Unknown",
"Unknown country");
161 *GameName = tr(
"Unknown",
"Unknown game name");
162 *Genre = tr(
"Unknown",
"Unknown genre");
163 *Plot = tr(
"Unknown",
"Unknown plot");
164 *Publisher = tr(
"Unknown",
"Unknown publisher");
165 *Version = tr(
"0",
"Default game version");
169 if (!(*CRC32).isEmpty())
173 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"ROMDB FOUND for %1 - %2")
176 *Country =
m_romDB[key].Country();
178 *Publisher =
m_romDB[key].Publisher();
179 *GameName =
m_romDB[key].GameName();
180 *Version =
m_romDB[key].Version();
184 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"NO ROMDB FOUND for %1 (%2)")
190 if ((*Genre == tr(
"Unknown",
"Unknown genre")) || (*Genre).isEmpty())
191 *Genre = tr(
"Unknown %1",
"Unknown genre")
207 "romname = :ROMNAME AND "
208 "rompath = :ROMPATH ");
232 tr(
"%1 appears to be missing.\n"
233 "Remove it from the database?")
236 if (removalPopup->Create())
238 removalPopup->SetReturnEvent(
this,
"removalPopup");
240 removalPopup->AddButton(tr(
"No"));
241 removalPopup->AddButton(tr(
"No to all"));
242 removalPopup->AddButtonV(tr(
"Yes"), QVariant::fromValue(
scan));
243 removalPopup->AddButtonV(tr(
"Yes to all"), QVariant::fromValue(
scan));
250 static void updateDisplayRom(
const QString& romname,
int display,
const QString& Systemname)
253 query.
prepare(
"UPDATE gamemetadata SET display = :DISPLAY "
254 "WHERE romname = :ROMNAME AND `system` = :SYSTEM");
268 query.
prepare(
"UPDATE gamemetadata SET diskcount = :DISKCOUNT "
269 "WHERE romname = :ROMNAME AND gametype = :GAMETYPE ");
280 static void updateGameName(
const QString& romname,
const QString& GameName,
const QString& Systemname)
283 query.
prepare(
"UPDATE gamemetadata SET GameName = :GAMENAME "
284 "WHERE romname = :ROMNAME AND `system` = :SYSTEM ");
300 QRegExp multiDiskRGXP = QRegExp(
"[0-4]$", Qt::CaseSensitive, QRegExp::RegExp);
307 for (
const auto &
GameType : qAsConst(updatelist))
309 LOG(VB_GENERAL, LOG_NOTICE,
312 query.
prepare(
"SELECT romname,`system`,spandisks,gamename FROM "
313 "gamemetadata,gameplayers WHERE "
314 "gamemetadata.gametype = :GAMETYPE AND "
315 "playername = `system` ORDER BY romname");
334 pos = RomName.lastIndexOf(
".");
337 extlength = RomName.length() - pos;
340 basename = RomName.mid(pos,1);
343 if (basename.contains(multiDiskRGXP))
345 pos = (RomName.length() - extlength) - 1;
346 basename = RomName.left(pos);
348 if (basename.right(1) ==
".")
349 basename = RomName.left(pos - 1);
354 if (basename == lastrom)
367 if (basename != GameName)
372 if (basename == lastrom)
388 QString message = tr(
"Updating %1 (%2) ROM database")
413 for (
const auto & game : qAsConst(
m_gameMap))
420 GetMetadata(handler, game.RomFullPath(), &Genre, &Year, &Country, &
CRC32, &GameName,
421 &Plot, &Publisher, &Version, &Fanart, &Boxart);
427 Genre = tr(
"Unknown %1",
"Unknown genre").arg(handler->
GameType());
428 Country = tr(
"Unknown",
"Unknown country");
430 Year = tr(
"19xx",
"Default game year");
431 GameName = tr(
"Unknown",
"Unknown game name");
432 Plot = tr(
"Unknown",
"Unknown plot");
433 Publisher = tr(
"Unknown",
"Unknown publisher");
434 Version = tr(
"0",
"Default game version");
439 if (GameName == tr(
"Unknown",
"Unknown game name"))
440 GameName = game.GameName();
442 int suffixPos = game.Rom().lastIndexOf(QChar(
'.'));
446 baseName = game.Rom().left(suffixPos);
450 if (QFile(
baseName +
".png").exists())
452 else if (QFile(
baseName +
".jpg").exists())
454 else if (QFile(
baseName +
".gif").exists())
460 LOG(VB_GENERAL, LOG_INFO, QString(
"file %1 - genre %2 ")
461 .
arg(iter.data().Rom()).arg(Genre));
462 LOG(VB_GENERAL, LOG_INFO, QString(
"screenshot %1").
arg(ScreenShot));
466 "(`system`, romname, gamename, genre, year, gametype, "
467 "rompath, country, crc_value, diskcount, display, plot, "
468 "publisher, version, fanart, boxart, screenshot) "
469 "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
470 ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, :PUBLISHER, :VERSION, "
471 ":FANART, :BOXART, :SCREENSHOT)");
491 "insert gamemetadata",
query);
493 else if ((game.FoundLoc() ==
inDatabase) && (removalprompt))
513 GameScanMap::Iterator iter;
516 query.
prepare(
"SELECT romname,rompath,gamename FROM gamemetadata "
517 "WHERE `system` = :SYSTEM");
526 QString message = tr(
"Verifying %1 files...").arg(handler->
SystemName());
539 if (!RomName.isEmpty())
570 QDir RomDir(directory);
573 if (!RomDir.isReadable())
576 RomDir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
577 QFileInfoList List = RomDir.entryInfoList();
578 for (
const auto & Info : qAsConst(List))
590 r.setPattern(
"^" + Info.suffix() +
"$");
591 r.setCaseSensitivity(Qt::CaseInsensitive);
596 if (extension.contains(r))
597 result.append(extension);
599 if (result.isEmpty())
613 tr(
"This will clear all game metadata from the database. Are you sure "
614 "you want to do this?"), popupStack,
"clearAllPopup");
616 if (clearPopup->Create())
618 clearPopup->SetReturnEvent(
this,
"clearAllPopup");
619 clearPopup->AddButton(tr(
"No"));
620 clearPopup->AddButton(tr(
"Yes"));
630 QDir RomDir(directory);
633 if (!RomDir.isReadable())
636 RomDir.setSorting( QDir:: DirsFirst | QDir::Name );
637 RomDir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
638 QFileInfoList List = RomDir.entryInfoList();
639 for (
const auto & Info : qAsConst(List))
641 QString RomName = Info.fileName();
642 QString GameName = Info.completeBaseName();
654 r.setPattern(
"^" + Info.suffix() +
"$");
655 r.setCaseSensitivity(Qt::CaseInsensitive);
660 if (extension.contains(r))
661 result.append(extension);
664 if (result.isEmpty())
669 GameName, Info.absoluteDir().path());
671 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Found ROM : (%1) - %2")
674 *filecount = *filecount + 1;
692 LOG(VB_GENERAL, LOG_ERR,
LOC +
693 QString(
"ROM Path does not exist: %1")
706 QString message = tr(
"Scanning for %1 games...")
711 if (busyDialog->Create())
712 popupStack->
AddScreen(busyDialog,
false);
716 busyDialog =
nullptr;
729 LOG(VB_GENERAL, LOG_INFO,
LOC +
734 QString message = tr(
"Scanning for %1 games...")
770 QStringList updatelist;
772 for (
auto *handler : qAsConst(*
handlers))
777 handler->processGames(handler);
779 if (handler->needRebuild())
780 updatelist.append(handler->GameType());
784 if (!updatelist.isEmpty())
793 for (
auto *handler : qAsConst(*
handlers))
797 if (rominfo->
System() == handler->SystemName())
807 if (systemname.isEmpty() || systemname.isNull())
810 for (
auto *handler : qAsConst(*
handlers))
814 if (handler->SystemName() == systemname)
826 if (!systemname.isEmpty() && !systemname.isNull())
843 "/" + romdata->
Romname() +
"\"";
848 if (exec.contains(
"%s") || handler->
SpanDisks())
850 exec = exec.replace(QRegExp(
"%s"),
arg);
854 QRegExp rxp = QRegExp(
"%d[0-4]", Qt::CaseSensitive, QRegExp::RegExp);
856 if (exec.contains(rxp))
864 std::array<QString,7> diskid {
"%d0",
"%d1",
"%d2",
"%d3",
"%d4",
"%d5",
"%d6" };
866 for (
int disk = 1; disk <= romdata->
DiskCount(); disk++)
868 rom = QString(
"\"%1/%2%3.%4\"")
873 exec = exec.replace(QRegExp(diskid[disk]),rom);
877 exec = exec.replace(QRegExp(
"%d1"),
arg);
884 exec = exec +
" \"" +
896 LOG(VB_GENERAL, LOG_ERR,
LOC +
897 QString(
"Failed to change to specified Working Directory: %1")
901 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Launching Game : %1 : %2")
907 QStringList cmdlist = exec.split(
";");
908 if (cmdlist.count() > 0)
910 for (
const auto & cmd : qAsConst(cmdlist))
912 LOG(VB_GENERAL, LOG_INFO,
LOC +
913 QString(
"Executing : %1").
arg(cmd));
919 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Executing : %1").
arg(exec));
945 QString resultid = dce->GetId();
948 if (resultid ==
"removalPopup")
950 int buttonNum = dce->GetResult();
968 else if (resultid ==
"clearAllPopup")
970 int buttonNum = dce->GetResult();
986 if (!
query.
exec(
"DELETE FROM gamemetadata;"))
988 "delete gamemetadata",
query);