diff --git a/backend/handler/metadata/ss_handler.py b/backend/handler/metadata/ss_handler.py index 201b690b3..380ab06af 100644 --- a/backend/handler/metadata/ss_handler.py +++ b/backend/handler/metadata/ss_handler.py @@ -400,19 +400,36 @@ def extract_metadata_from_ss_rom(rom: Rom, game: SSGame) -> SSMetadata: except (ValueError, TypeError): return "" - def _get_lowest_date(dates: list[SSGameDate]) -> int | None: - lowest_date = min(dates, default=None, key=lambda v: v.get("text", "")) - if not lowest_date: - return None - + def _parse_date(date_text: str) -> int | None: try: - return int(datetime.strptime(lowest_date["text"], "%Y-%m-%d").timestamp()) + return int(datetime.strptime(date_text, "%Y-%m-%d").timestamp()) except ValueError: try: - return int(datetime.strptime(lowest_date["text"], "%Y").timestamp()) + return int(datetime.strptime(date_text, "%Y").timestamp()) except ValueError: return None + def _get_lowest_date(dates: list[SSGameDate]) -> int | None: + if not dates: + return None + + for region in get_preferred_regions(rom): + region_dates = sorted( + (d for d in dates if d.get("region", "unk") == region), + key=lambda v: v.get("text", ""), + ) + for region_date in region_dates: + parsed_date = _parse_date(region_date.get("text", "")) + if parsed_date is not None: + return parsed_date + + for date in sorted(dates, key=lambda v: v.get("text", "")): + parsed_date = _parse_date(date.get("text", "")) + if parsed_date is not None: + return parsed_date + + return None + def _get_genres(game: SSGame) -> list[str]: return [ genre_name["text"] diff --git a/backend/tests/handler/metadata/test_ss_handler.py b/backend/tests/handler/metadata/test_ss_handler.py index f5f7c870c..3ccb1b659 100644 --- a/backend/tests/handler/metadata/test_ss_handler.py +++ b/backend/tests/handler/metadata/test_ss_handler.py @@ -14,6 +14,7 @@ from handler.metadata.ss_handler import ( _is_notgame, add_ss_auth_to_url, extract_media_from_ss_game, + extract_metadata_from_ss_rom, get_preferred_regions, ) @@ -203,6 +204,35 @@ class TestExtractMediaFromSsGame: assert "box-2D(us)" in result["box2d_url"] +class TestExtractMetadataFromSsRom: + def _make_rom(self, regions: list[str] | None = None) -> MagicMock: + rom = MagicMock() + rom.platform_id = 1 + rom.id = 100 + rom.regions = regions + return rom + + def test_release_date_prefers_tagged_region(self): + config = _make_config(region_priority=[]) + rom = self._make_rom(regions=["Japan", "USA"]) + game = cast( + SSGame, + { + "dates": [ + {"region": "us", "text": "1990-02-12"}, + {"region": "jp", "text": "1988-10-23"}, + {"region": "eu", "text": "1991-08-29"}, + ], + "medias": [], + }, + ) + + with patch("handler.metadata.ss_handler.cm.get_config", return_value=config): + metadata = extract_metadata_from_ss_rom(rom, game) + + assert metadata["first_release_date"] == 593568000 + + class TestIsNotgame: def _game(self, notgame: str = "false", names: list[str] | None = None) -> SSGame: return cast(