fix: re-parse tags from filename when renaming a rom

Renaming a rom via PUT /roms/{id} only updated fs_name and its
derivatives, leaving regions/languages/tags/revision/version stale
against the new filename. Re-parse them whenever fs_name changes so
edits like "patapon (Fr En)" -> "Patapon (Fr, En)" are reflected in
the database.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
zurdi
2026-04-20 22:23:33 +00:00
parent 64ea0561c2
commit d7a896b5da
2 changed files with 38 additions and 0 deletions
+14
View File
@@ -1296,6 +1296,20 @@ async def update_rom(
}
)
# Re-parse tags from the filename so region/language/revision/version/tags
# stay in sync whenever the fs_name changes.
if new_fs_name != rom.fs_name:
parsed_tags = fs_rom_handler.parse_tags(new_fs_name)
cleaned_data.update(
{
"regions": parsed_tags.regions,
"languages": parsed_tags.languages,
"tags": parsed_tags.other_tags,
"revision": parsed_tags.revision,
"version": parsed_tags.version,
}
)
if remove_cover:
cleaned_data.update(await fs_resource_handler.remove_cover(rom))
cleaned_data.update({"url_cover": ""})
+24
View File
@@ -103,6 +103,30 @@ def test_update_rom(
assert get_rom_by_id_mock.called
@patch.object(FSRomsHandler, "rename_fs_rom")
@patch.object(IGDBHandler, "get_rom_by_id", return_value=IGDBRom(igdb_id=None))
def test_update_rom_reparses_tags_on_fs_name_change(
rename_fs_rom_mock: AsyncMock,
get_rom_by_id_mock: AsyncMock,
client: TestClient,
access_token: str,
rom: Rom,
):
response = client.put(
f"/api/roms/{rom.id}",
headers={"Authorization": f"Bearer {access_token}"},
data={"fs_name": "Patapon (Fr, En) (Rev 1).iso"},
)
assert response.status_code == status.HTTP_200_OK
body = response.json()
assert body["fs_name"] == "Patapon (Fr, En) (Rev 1).iso"
assert body["languages"] == ["French", "English"]
assert body["regions"] == []
assert body["revision"] == "1"
assert body["tags"] == []
def test_delete_roms(client: TestClient, access_token: str, rom: Rom):
response = client.post(
"/api/roms/delete",