Skip to content

Commit 84f9dd2

Browse files
authored
Merge pull request #3434 from rommapp/copilot/fix-region-specific-release-date
Use region-prioritized release dates from ScreenScraper
2 parents 830902c + 29ce936 commit 84f9dd2

2 files changed

Lines changed: 54 additions & 7 deletions

File tree

backend/handler/metadata/ss_handler.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -400,19 +400,36 @@ def _normalize_score(score: str) -> str:
400400
except (ValueError, TypeError):
401401
return ""
402402

403-
def _get_lowest_date(dates: list[SSGameDate]) -> int | None:
404-
lowest_date = min(dates, default=None, key=lambda v: v.get("text", ""))
405-
if not lowest_date:
406-
return None
407-
403+
def _parse_date(date_text: str) -> int | None:
408404
try:
409-
return int(datetime.strptime(lowest_date["text"], "%Y-%m-%d").timestamp())
405+
return int(datetime.strptime(date_text, "%Y-%m-%d").timestamp())
410406
except ValueError:
411407
try:
412-
return int(datetime.strptime(lowest_date["text"], "%Y").timestamp())
408+
return int(datetime.strptime(date_text, "%Y").timestamp())
413409
except ValueError:
414410
return None
415411

412+
def _get_lowest_date(dates: list[SSGameDate]) -> int | None:
413+
if not dates:
414+
return None
415+
416+
for region in get_preferred_regions(rom):
417+
region_dates = sorted(
418+
(d for d in dates if d.get("region", "unk") == region),
419+
key=lambda v: v.get("text", ""),
420+
)
421+
for region_date in region_dates:
422+
parsed_date = _parse_date(region_date.get("text", ""))
423+
if parsed_date is not None:
424+
return parsed_date
425+
426+
for date in sorted(dates, key=lambda v: v.get("text", "")):
427+
parsed_date = _parse_date(date.get("text", ""))
428+
if parsed_date is not None:
429+
return parsed_date
430+
431+
return None
432+
416433
def _get_genres(game: SSGame) -> list[str]:
417434
return [
418435
genre_name["text"]

backend/tests/handler/metadata/test_ss_handler.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
_is_notgame,
1515
add_ss_auth_to_url,
1616
extract_media_from_ss_game,
17+
extract_metadata_from_ss_rom,
1718
get_preferred_regions,
1819
)
1920

@@ -203,6 +204,35 @@ def test_preferred_region_wins_over_cus(self):
203204
assert "box-2D(us)" in result["box2d_url"]
204205

205206

207+
class TestExtractMetadataFromSsRom:
208+
def _make_rom(self, regions: list[str] | None = None) -> MagicMock:
209+
rom = MagicMock()
210+
rom.platform_id = 1
211+
rom.id = 100
212+
rom.regions = regions
213+
return rom
214+
215+
def test_release_date_prefers_tagged_region(self):
216+
config = _make_config(region_priority=[])
217+
rom = self._make_rom(regions=["Japan", "USA"])
218+
game = cast(
219+
SSGame,
220+
{
221+
"dates": [
222+
{"region": "us", "text": "1990-02-12"},
223+
{"region": "jp", "text": "1988-10-23"},
224+
{"region": "eu", "text": "1991-08-29"},
225+
],
226+
"medias": [],
227+
},
228+
)
229+
230+
with patch("handler.metadata.ss_handler.cm.get_config", return_value=config):
231+
metadata = extract_metadata_from_ss_rom(rom, game)
232+
233+
assert metadata["first_release_date"] == 593568000
234+
235+
206236
class TestIsNotgame:
207237
def _game(self, notgame: str = "false", names: list[str] | None = None) -> SSGame:
208238
return cast(

0 commit comments

Comments
 (0)