Skip to content

Rename variety sprites to correct Pokémon IDs#198

Open
anhthang wants to merge 5 commits intoPokeAPI:masterfrom
anhthang:rename-images
Open

Rename variety sprites to correct Pokémon IDs#198
anhthang wants to merge 5 commits intoPokeAPI:masterfrom
anhthang:rename-images

Conversation

@anhthang
Copy link

This adds a script that renames variety PNG files (e.g. 877-hangry.png) to their correct Pokémon IDs by querying the Pokémon species endpoint and matching varieties by name.

Resolves #174.

First run against the official-artwork folder looks correct; I'll follow up with 2–3 other folders in this PRs and keep this minimal.

@anhthang anhthang marked this pull request as draft February 26, 2026 03:59
@anhthang
Copy link
Author

I’ve run the rename script on two folders so far: ‎sprites/other and ‎sprites/lowres. I think this is enough for an initial review. Here is the log output from lowres run:

--> Fetching API data for Species ID: 308...
Success: [../sprites/pokemon/lowres] 308-mega.png -> 10054.png
--> Fetching API data for Species ID: 6...
--> Fetching API data for Species ID: 550...
--> Fetching API data for Species ID: 248...
Success: [../sprites/pokemon/lowres] 248-mega.png -> 10049.png
--> Fetching API data for Species ID: 127...
Success: [../sprites/pokemon/lowres] 127-mega.png -> 10040.png
--> Fetching API data for Species ID: 647...
Success: [../sprites/pokemon/lowres] 647-resolute.png -> 10024.png
--> Fetching API data for Species ID: 711...
Success: [../sprites/pokemon/lowres] 711-super.png -> 10032.png
--> Fetching API data for Species ID: 386...
Success: [../sprites/pokemon/lowres] 386-defense.png -> 10002.png
--> Fetching API data for Species ID: 302...
Success: [../sprites/pokemon/lowres] 302-mega.png -> 10066.png
--> Fetching API data for Species ID: 303...
Success: [../sprites/pokemon/lowres] 303-mega.png -> 10052.png
--> Fetching API data for Species ID: 181...
Success: [../sprites/pokemon/lowres] 181-mega.png -> 10045.png
--> Fetching API data for Species ID: 94...
Success: [../sprites/pokemon/lowres] 94-mega.png -> 10038.png
--> Fetching API data for Species ID: 130...
Success: [../sprites/pokemon/lowres] 130-mega.png -> 10041.png
--> Fetching API data for Species ID: 678...
Success: [../sprites/pokemon/lowres] 678-male.png -> 678.png
--> Fetching API data for Species ID: 201...
--> Fetching API data for Species ID: 778...
Success: [../sprites/pokemon/lowres] 778-disguised.png -> 778.png
--> Fetching API data for Species ID: 260...
Success: [../sprites/pokemon/lowres] 260-mega.png -> 10064.png
--> Fetching API data for Species ID: 3...
Success: [../sprites/pokemon/lowres] 3-mega.png -> 10033.png
--> Fetching API data for Species ID: 351...
Success: [../sprites/pokemon/lowres] 351-snowy.png -> 10015.png
--> Fetching API data for Species ID: 492...
Success: [../sprites/pokemon/lowres] 492-sky.png -> 10006.png
--> Fetching API data for Species ID: 229...
Success: [../sprites/pokemon/lowres] 229-mega.png -> 10048.png
--> Fetching API data for Species ID: 586...
--> Fetching API data for Species ID: 150...
--> Fetching API data for Species ID: 254...
Success: [../sprites/pokemon/lowres] 254-mega.png -> 10065.png
--> Fetching API data for Species ID: 479...
Success: [../sprites/pokemon/lowres] 479-fan.png -> 10011.png
--> Fetching API data for Species ID: 9...
Success: [../sprites/pokemon/lowres] 9-mega.png -> 10036.png
--> Fetching API data for Species ID: 710...
Success: [../sprites/pokemon/lowres] 710-average.png -> 710.png
--> Fetching API data for Species ID: 362...
Success: [../sprites/pokemon/lowres] 362-mega.png -> 10074.png
--> Fetching API data for Species ID: 716...
--> Fetching API data for Species ID: 319...
Success: [../sprites/pokemon/lowres] 319-mega.png -> 10070.png
--> Fetching API data for Species ID: 282...
Success: [../sprites/pokemon/lowres] 282-mega.png -> 10051.png
--> Fetching API data for Species ID: 642...
Success: [../sprites/pokemon/lowres] 642-incarnate.png -> 642.png
--> Fetching API data for Species ID: 669...
--> Fetching API data for Species ID: 741...
Success: [../sprites/pokemon/lowres] 741-baile.png -> 741.png
Success: [../sprites/pokemon/lowres] 647-ordinary.png -> 647.png
--> Fetching API data for Species ID: 646...
Success: [../sprites/pokemon/lowres] 646-white.png -> 10023.png
--> Fetching API data for Species ID: 380...
Success: [../sprites/pokemon/lowres] 380-mega.png -> 10062.png
--> Fetching API data for Species ID: 381...
Success: [../sprites/pokemon/lowres] 381-mega.png -> 10063.png
--> Fetching API data for Species ID: 666...
Success: [../sprites/pokemon/lowres] 710-super.png -> 10029.png
--> Fetching API data for Species ID: 383...
Success: [../sprites/pokemon/lowres] 383-primal.png -> 10078.png
--> Fetching API data for Species ID: 493...
--> Fetching API data for Species ID: 670...
--> Fetching API data for Species ID: 413...
Success: [../sprites/pokemon/lowres] 413-trash.png -> 10005.png
Success: [../sprites/pokemon/lowres] 479-frost.png -> 10010.png
Success: [../sprites/pokemon/lowres] 413-sandy.png -> 10004.png
--> Fetching API data for Species ID: 475...
Success: [../sprites/pokemon/lowres] 475-mega.png -> 10068.png
Success: [../sprites/pokemon/lowres] 386-speed.png -> 10003.png
--> Fetching API data for Species ID: 671...
--> Fetching API data for Species ID: 773...
--> Fetching API data for Species ID: 645...
Success: [../sprites/pokemon/lowres] 645-incarnate.png -> 645.png
--> Fetching API data for Species ID: 745...
Success: [../sprites/pokemon/lowres] 745-midday.png -> 745.png
Success: [../sprites/pokemon/lowres] 645-therian.png -> 10021.png
--> Fetching API data for Species ID: 641...
Success: [../sprites/pokemon/lowres] 641-incarnate.png -> 641.png
--> Fetching API data for Species ID: 373...
Success: [../sprites/pokemon/lowres] 373-mega.png -> 10089.png
--> Fetching API data for Species ID: 115...
Success: [../sprites/pokemon/lowres] 115-mega.png -> 10039.png
--> Fetching API data for Species ID: 384...
Success: [../sprites/pokemon/lowres] 384-mega.png -> 10079.png
--> Fetching API data for Species ID: 257...
Success: [../sprites/pokemon/lowres] 257-mega.png -> 10050.png
Success: [../sprites/pokemon/lowres] 479-mow.png -> 10012.png
Success: [../sprites/pokemon/lowres] 711-average.png -> 711.png
--> Fetching API data for Species ID: 65...
Success: [../sprites/pokemon/lowres] 65-mega.png -> 10037.png
--> Fetching API data for Species ID: 80...
Success: [../sprites/pokemon/lowres] 80-mega.png -> 10071.png
Success: [../sprites/pokemon/lowres] 351-rainy.png -> 10014.png
--> Fetching API data for Species ID: 720...
Success: [../sprites/pokemon/lowres] 720-unbound.png -> 10086.png
Success: [../sprites/pokemon/lowres] 642-therian.png -> 10020.png
Success: [../sprites/pokemon/lowres] 711-large.png -> 10031.png
--> Fetching API data for Species ID: 681...
Success: [../sprites/pokemon/lowres] 681-blade.png -> 10026.png
--> Fetching API data for Species ID: 354...
Success: [../sprites/pokemon/lowres] 354-mega.png -> 10056.png
--> Fetching API data for Species ID: 665...
--> Fetching API data for Species ID: 214...
Success: [../sprites/pokemon/lowres] 214-mega.png -> 10047.png
--> Fetching API data for Species ID: 323...
Success: [../sprites/pokemon/lowres] 323-mega.png -> 10087.png
--> Fetching API data for Species ID: 18...
Success: [../sprites/pokemon/lowres] 18-mega.png -> 10073.png
Success: [../sprites/pokemon/lowres] 413-plant.png -> 413.png
--> Fetching API data for Species ID: 208...
Success: [../sprites/pokemon/lowres] 208-mega.png -> 10072.png
--> Fetching API data for Species ID: 555...
Success: [../sprites/pokemon/lowres] 555-standard.png -> 555.png
--> Fetching API data for Species ID: 376...
Success: [../sprites/pokemon/lowres] 376-mega.png -> 10076.png
Success: [../sprites/pokemon/lowres] 479-heat.png -> 10008.png
--> Fetching API data for Species ID: 445...
Success: [../sprites/pokemon/lowres] 445-mega.png -> 10058.png
--> Fetching API data for Species ID: 531...
Success: [../sprites/pokemon/lowres] 531-mega.png -> 10069.png
--> Fetching API data for Species ID: 648...
Success: [../sprites/pokemon/lowres] 648-aria.png -> 648.png
--> Fetching API data for Species ID: 421...
Success: [../sprites/pokemon/lowres] 711-small.png -> 10030.png
--> Fetching API data for Species ID: 334...
Success: [../sprites/pokemon/lowres] 334-mega.png -> 10067.png
--> Fetching API data for Species ID: 487...
Success: [../sprites/pokemon/lowres] 487-origin.png -> 10007.png
--> Fetching API data for Species ID: 664...
Success: [../sprites/pokemon/lowres] 351-sunny.png -> 10013.png
--> Fetching API data for Species ID: 869...
Success: [../sprites/pokemon/lowres] 869-gmax.png -> 10223.png
--> Fetching API data for Species ID: 306...
Success: [../sprites/pokemon/lowres] 306-mega.png -> 10053.png
Success: [../sprites/pokemon/lowres] 710-large.png -> 10028.png
Success: [../sprites/pokemon/lowres] 555-zen.png -> 10017.png
Success: [../sprites/pokemon/lowres] 646-black.png -> 10022.png
Success: [../sprites/pokemon/lowres] 487-altered.png -> 487.png
--> Fetching API data for Species ID: 414...
Success: [../sprites/pokemon/lowres] 670-eternal.png -> 10061.png
Success: [../sprites/pokemon/lowres] 386-normal.png -> 386.png
--> Fetching API data for Species ID: 719...
Success: [../sprites/pokemon/lowres] 719-mega.png -> 10075.png
Success: [../sprites/pokemon/lowres] 681-shield.png -> 681.png
Success: [../sprites/pokemon/lowres] 648-pirouette.png -> 10018.png
--> Fetching API data for Species ID: 448...
Success: [../sprites/pokemon/lowres] 448-mega.png -> 10059.png
--> Fetching API data for Species ID: 585...
Success: [../sprites/pokemon/lowres] 386-attack.png -> 10001.png
--> Fetching API data for Species ID: 310...
Success: [../sprites/pokemon/lowres] 310-mega.png -> 10055.png
Success: [../sprites/pokemon/lowres] 479-wash.png -> 10009.png
--> Fetching API data for Species ID: 412...
--> Fetching API data for Species ID: 359...
Success: [../sprites/pokemon/lowres] 359-mega.png -> 10057.png
--> Fetching API data for Species ID: 746...
Success: [../sprites/pokemon/lowres] 746-solo.png -> 746.png
--> Fetching API data for Species ID: 15...
Success: [../sprites/pokemon/lowres] 15-mega.png -> 10090.png
--> Fetching API data for Species ID: 676...
--> Fetching API data for Species ID: 774...
Success: [../sprites/pokemon/lowres] 774-red-meteor.png -> 10136.png
--> Fetching API data for Species ID: 460...
Success: [../sprites/pokemon/lowres] 460-mega.png -> 10060.png
Success: [../sprites/pokemon/lowres] 710-small.png -> 10027.png
--> Fetching API data for Species ID: 212...
Success: [../sprites/pokemon/lowres] 212-mega.png -> 10046.png
--> Fetching API data for Species ID: 423...
--> Fetching API data for Species ID: 422...
Success: [../sprites/pokemon/lowres] 641-therian.png -> 10019.png
--> Fetching API data for Species ID: 428...
Success: [../sprites/pokemon/lowres] 428-mega.png -> 10088.png
--> Fetching API data for Species ID: 382...
Success: [../sprites/pokemon/lowres] 382-primal.png -> 10077.png
Success: [../sprites/pokemon/lowres] 492-land.png -> 492.png
--> Fetching API data for Species ID: 142...
Success: [../sprites/pokemon/lowres] 142-mega.png -> 10042.png

Finished! Processed folders in 37.03 seconds.

@anhthang anhthang marked this pull request as ready for review February 26, 2026 06:43
new_path = os.path.join(root, new_filename)

# Prevent overwriting if the file already exists
# if not os.path.exists(new_path):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this part commented? When a file is already present we could simply delete the id-variant.png file.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I commented this out so the file is always renamed, which lets me double-check any differences between the ‎id-variant and the Pokémon ID. The ‎id-variant file is always deleted.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there should be a case when there is a id-<variant> and a new custom <id> (10000+) present we compare both the images if they are same either rename or delete but if its different we flag that somewhere

@anhthang anhthang requested a review from Naramsim February 27, 2026 11:39
data = response.json()
species_cache[pokedex_num] = data
return data
elif response.status_code == 429:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont think pokepai has ratelimits in place so this check can probably be skipped

@anhthang
Copy link
Author

@FallenDeity thanks for your suggestions, script updated

@anhthang anhthang requested a review from FallenDeity February 28, 2026 15:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ID/naming inconsistencies with certain forms image paths

3 participants