Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/adapters/services/rahasher.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
UPS.ARCADE: 27,
UPS.ARCADIA_2001: 73,
UPS.ARDUBOY: 71,
UPS.ATARI_JAGUAR_CD: 77,
UPS.JAGUAR_CD: 77,
UPS.ATARI2600: 25,
UPS.ATARI7800: 51,
UPS.COLECOVISION: 44,
Expand Down
41 changes: 41 additions & 0 deletions backend/alembic/versions/0057_add_giantbomb_metadata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""empty message
Revision ID: 0057_add_giantbomb_metadata
Revises: 0056_gamelist_xml
Create Date: 2025-09-19 21:37:14.878761
"""

import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = "0057_add_giantbomb_metadata"
down_revision = "0056_gamelist_xml"
branch_labels = None
depends_on = None


def upgrade() -> None:
with op.batch_alter_table("platforms", schema=None) as batch_op:
batch_op.add_column(sa.Column("giantbomb_id", sa.Integer(), nullable=True))
with op.batch_alter_table("roms", schema=None) as batch_op:
batch_op.add_column(sa.Column("giantbomb_id", sa.Integer(), nullable=True))
batch_op.add_column(
sa.Column(
"giantbomb_metadata",
sa.JSON().with_variant(
postgresql.JSONB(astext_type=sa.Text()), "postgresql"
),
nullable=True,
)
)
batch_op.create_index("idx_roms_giantbomb_id", ["giantbomb_id"], unique=False)


def downgrade() -> None:
with op.batch_alter_table("roms", schema=None) as batch_op:
batch_op.drop_index("idx_roms_giantbomb_id")
batch_op.drop_column("giantbomb_metadata")
batch_op.drop_column("giantbomb_id")
with op.batch_alter_table("platforms", schema=None) as batch_op:
batch_op.drop_column("giantbomb_id")
6 changes: 5 additions & 1 deletion backend/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ def _get_env(var: str, fallback: str | None = None) -> str | None:
# HOWLONGTOBEAT
HLTB_API_ENABLED: Final[bool] = safe_str_to_bool(_get_env("HLTB_API_ENABLED"))

# GIANTBOMB
GIANTBOMB_API_ENABLED: Final = safe_str_to_bool(_get_env("GIANTBOMB_API_ENABLED"))

# AUTH
ROMM_AUTH_SECRET_KEY: Final[str | None] = _get_env("ROMM_AUTH_SECRET_KEY")
if not ROMM_AUTH_SECRET_KEY:
Expand Down Expand Up @@ -153,7 +156,8 @@ def _get_env(var: str, fallback: str | None = None) -> str | None:
_get_env("ENABLE_RESCAN_ON_FILESYSTEM_CHANGE")
)
RESCAN_ON_FILESYSTEM_CHANGE_DELAY: Final[int] = safe_int(
_get_env("RESCAN_ON_FILESYSTEM_CHANGE_DELAY"), 5 # 5 minutes
_get_env("RESCAN_ON_FILESYSTEM_CHANGE_DELAY"),
5, # 5 minutes
)
ENABLE_SCHEDULED_RESCAN: Final[bool] = safe_str_to_bool(
_get_env("ENABLE_SCHEDULED_RESCAN")
Expand Down
6 changes: 6 additions & 0 deletions backend/endpoints/heartbeat.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from handler.metadata import (
meta_flashpoint_handler,
meta_gamelist_handler,
meta_giantbomb_handler,
meta_hasheous_handler,
meta_hltb_handler,
meta_igdb_handler,
Expand Down Expand Up @@ -62,6 +63,7 @@ async def heartbeat() -> HeartbeatResponse:
playmatch_enabled = meta_playmatch_handler.is_enabled()
hltb_enabled = meta_hltb_handler.is_enabled()
tgdb_enabled = meta_tgdb_handler.is_enabled()
giantbomb_enabled = meta_giantbomb_handler.is_enabled()

return {
"SYSTEM": {
Expand All @@ -80,6 +82,7 @@ async def heartbeat() -> HeartbeatResponse:
or tgdb_enabled
or flashpoint_enabled
or hltb_enabled
or giantbomb_enabled
),
"IGDB_API_ENABLED": igdb_enabled,
"SS_API_ENABLED": ss_enabled,
Expand All @@ -92,6 +95,7 @@ async def heartbeat() -> HeartbeatResponse:
"TGDB_API_ENABLED": tgdb_enabled,
"FLASHPOINT_API_ENABLED": flashpoint_enabled,
"HLTB_API_ENABLED": hltb_enabled,
"GIANTBOMB_API_ENABLED": giantbomb_enabled,
},
"FILESYSTEM": {
"FS_PLATFORMS": await fs_platform_handler.get_platforms(),
Expand Down Expand Up @@ -153,5 +157,7 @@ async def metadata_heartbeat(source: str) -> bool:
return await meta_hltb_handler.heartbeat()
case MetadataSource.GAMELIST:
return await meta_gamelist_handler.heartbeat()
case MetadataSource.GIANTBOMB:
return await meta_giantbomb_handler.heartbeat()
case _:
return False
1 change: 1 addition & 0 deletions backend/endpoints/responses/heartbeat.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class MetadataSourcesDict(TypedDict):
TGDB_API_ENABLED: bool
FLASHPOINT_API_ENABLED: bool
HLTB_API_ENABLED: bool
GIANTBOMB_API_ENABLED: bool


class FilesystemDict(TypedDict):
Expand Down
2 changes: 2 additions & 0 deletions backend/endpoints/responses/platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class PlatformSchema(BaseModel):
igdb_slug: str | None
moby_slug: str | None
hltb_slug: str | None
giantbomb_slug: str | None = None
custom_name: str | None = None
igdb_id: int | None = None
sgdb_id: int | None = None
Expand All @@ -27,6 +28,7 @@ class PlatformSchema(BaseModel):
hasheous_id: int | None = None
tgdb_id: int | None = None
flashpoint_id: int | None = None
giantbomb_id: int | None = None
category: str | None = None
generation: int | None = None
family_name: str | None = None
Expand Down
8 changes: 8 additions & 0 deletions backend/endpoints/responses/rom.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from endpoints.responses.assets import SaveSchema, ScreenshotSchema, StateSchema
from handler.metadata.flashpoint_handler import FlashpointMetadata
from handler.metadata.gamelist_handler import GamelistMetadata
from handler.metadata.giantbomb_handler import GiantBombMetadata
from handler.metadata.hasheous_handler import HasheousMetadata
from handler.metadata.hltb_handler import HLTBMetadata
from handler.metadata.igdb_handler import IGDBMetadata
Expand Down Expand Up @@ -69,6 +70,11 @@
{k: NotRequired[v] for k, v in get_type_hints(GamelistMetadata).items()}, # type: ignore[misc]
total=False,
)
RomGiantBombMetadata = TypedDict( # type: ignore[misc]
"RomGiantBombMetadata",
{k: NotRequired[v] for k, v in get_type_hints(GiantBombMetadata).items()}, # type: ignore[misc]
total=False,
)


def rom_user_schema_factory() -> RomUserSchema:
Expand Down Expand Up @@ -210,6 +216,7 @@ class RomSchema(BaseModel):
flashpoint_id: str | None
hltb_id: int | None
gamelist_id: str | None
giantbomb_id: int | None

platform_id: int
platform_slug: str
Expand Down Expand Up @@ -240,6 +247,7 @@ class RomSchema(BaseModel):
flashpoint_metadata: RomFlashpointMetadata | None
hltb_metadata: RomHLTBMetadata | None
gamelist_metadata: RomGamelistMetadata | None
giantbomb_metadata: RomGiantBombMetadata | None

path_cover_small: str | None
path_cover_large: str | None
Expand Down
7 changes: 7 additions & 0 deletions backend/handler/database/roms_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ def filter_by_matched(self, query: Query, value: bool) -> Query:
Rom.hasheous_id.isnot(None),
Rom.tgdb_id.isnot(None),
Rom.flashpoint_id.isnot(None),
Rom.giantbomb_id.isnot(None),
)
if not value:
predicate = not_(predicate)
Expand Down Expand Up @@ -465,6 +466,7 @@ def filter_roms(
base_subquery.c.launchbox_id,
base_subquery.c.tgdb_id,
base_subquery.c.flashpoint_id,
base_subquery.c.giantbomb_id,
)
.outerjoin(
RomUser,
Expand Down Expand Up @@ -516,6 +518,11 @@ def filter_roms(
base_subquery.c.flashpoint_id,
base_subquery.c.platform_id,
),
_create_metadata_id_case(
MetadataSource.GIANTBOMB,
base_subquery.c.giantbomb_id,
base_subquery.c.platform_id,
),
_create_metadata_id_case(
"romm",
base_subquery.c.id,
Expand Down
2 changes: 2 additions & 0 deletions backend/handler/metadata/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .flashpoint_handler import FlashpointHandler
from .gamelist_handler import GamelistHandler
from .giantbomb_handler import GiantBombHandler
from .hasheous_handler import HasheousHandler
from .hltb_handler import HLTBHandler
from .igdb_handler import IGDBHandler
Expand All @@ -23,3 +24,4 @@
meta_flashpoint_handler = FlashpointHandler()
meta_gamelist_handler = GamelistHandler()
meta_hltb_handler = HLTBHandler()
meta_giantbomb_handler = GiantBombHandler()
15 changes: 14 additions & 1 deletion backend/handler/metadata/base_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ class UniversalPlatformSlug(enum.StrEnum):
ARDUBOY = "arduboy"
ASTRAL_2000 = "astral-2000"
ASTROCADE = "astrocade"
ATARI_JAGUAR_CD = "atari-jaguar-cd"
JAGUAR_CD = "atari-jaguar-cd"
ATARI_ST = "atari-st"
ATARI_VCS = "atari-vcs"
ATARI_XEGS = "atari-xegs"
Expand Down Expand Up @@ -371,6 +371,7 @@ class UniversalPlatformSlug(enum.StrEnum):
DC = "dc"
DEDICATED_CONSOLE = "dedicated-console"
DEDICATED_HANDHELD = "dedicated-handheld"
DENSHI_MANGAJUKU = "denshi-mangajuku"
DIDJ = "didj"
DIGIBLAST = "digiblast"
DOJA = "doja"
Expand Down Expand Up @@ -406,6 +407,8 @@ class UniversalPlatformSlug(enum.StrEnum):
GAME_WAVE = "game-wave"
GAMEGEAR = "gamegear"
GAMESTICK = "gamestick"
GAMEKING = "gameking"
GAMEKINGIII = "gamekingiii"
GB = "gb"
GBA = "gba"
GBC = "gbc"
Expand All @@ -421,6 +424,7 @@ class UniversalPlatformSlug(enum.StrEnum):
GP32 = "gp32"
GT40 = "gt40"
GVM = "gvm"
HALCYON = "halcyon"
HANDHELD_ELECTRONIC_LCD = "handheld-electronic-lcd"
HARTUNG = "hartung"
HD_DVD_PLAYER = "hd-dvd-player"
Expand Down Expand Up @@ -472,6 +476,7 @@ class UniversalPlatformSlug(enum.StrEnum):
LYNX = "lynx"
MAC = "mac"
MAEMO = "maemo"
MAGIC_LEAP_ONE = "magic-leap-one"
MAINFRAME = "mainframe"
MATSUSHITAPANASONIC_JR = "matsushitapanasonic-jr"
MEEGO = "meego"
Expand All @@ -489,6 +494,7 @@ class UniversalPlatformSlug(enum.StrEnum):
MODEL1 = "model1"
MODEL2 = "model2"
MODEL3 = "model3"
MONON_COLOR = "monon-color"
MOPHUN = "mophun"
MOS_TECHNOLOGY_6502 = "mos-technology-6502"
MOTOROLA_6800 = "motorola-6800"
Expand All @@ -500,6 +506,7 @@ class UniversalPlatformSlug(enum.StrEnum):
MSX2PLUS = "msx2plus"
MTX512 = "mtx512"
MUGEN = "mugen"
MULTI_8 = "multi-8"
MULTIVISION = "multivision"
N3DS = "3ds"
N64 = "n64"
Expand Down Expand Up @@ -592,6 +599,7 @@ class UniversalPlatformSlug(enum.StrEnum):
RCA_STUDIO_II = "rca-studio-ii"
RESEARCH_MACHINES_380Z = "research-machines-380z"
ROKU = "roku"
RX_78 = "rx-78"
SAM_COUPE = "sam-coupe"
SATELLAVIEW = "satellaview"
SATURN = "saturn"
Expand All @@ -604,6 +612,7 @@ class UniversalPlatformSlug(enum.StrEnum):
SEGA32 = "sega32"
SEGACD = "segacd"
SEGACD32 = "segacd32"
SELECT_A_GAME = "select-a-game"
SERIES_X_S = "series-x-s"
SFAM = "sfam"
SG1000 = "sg1000"
Expand All @@ -615,6 +624,7 @@ class UniversalPlatformSlug(enum.StrEnum):
SIGNETICS_2650 = "signetics-2650"
SINCLAIR_QL = "sinclair-ql"
SK_VM = "sk-vm"
SMAKY = "smaky"
SMC_777 = "smc-777"
SMS = "sms"
SNES = "snes"
Expand All @@ -625,6 +635,7 @@ class UniversalPlatformSlug(enum.StrEnum):
SRI_5001000 = "sri-5001000"
STADIA = "stadia"
STEAM_VR = "steam-vr"
STREAMING = "streaming"
STV = "stv"
SUFAMI_TURBO = "sufami-turbo"
SUPER_ACAN = "super-acan"
Expand Down Expand Up @@ -673,6 +684,7 @@ class UniversalPlatformSlug(enum.StrEnum):
TRS_80_MC_10 = "trs-80-mc-10"
TRS_80_MODEL_100 = "trs-80-model-100"
TURBOGRAFX_CD = "turbografx-cd"
TVBOY = "tvboy"
TVOS = "tvos"
TYPE_X = "type-x"
UZEBOX = "uzebox"
Expand All @@ -685,6 +697,7 @@ class UniversalPlatformSlug(enum.StrEnum):
VIC_20 = "vic-20"
VIDEOBRAIN = "videobrain"
VIDEOPAC_G7400 = "videopac-g7400"
VIEW_MASTER = "view-master"
VIRTUALBOY = "virtualboy"
VIS = "vis"
VISIONOS = "visionos"
Expand Down
Loading
Loading