Skip to content

Rename variety sprites to correct Pokémon IDs#198

Merged
Naramsim merged 3 commits intoPokeAPI:masterfrom
anhthang:rename-images
Mar 2, 2026
Merged

Rename variety sprites to correct Pokémon IDs#198
Naramsim merged 3 commits intoPokeAPI:masterfrom
anhthang:rename-images

Conversation

@anhthang
Copy link
Contributor

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
Contributor 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
Contributor 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
Copy link
Contributor Author

@FallenDeity thanks for your suggestions, script updated

@anhthang anhthang requested a review from FallenDeity February 28, 2026 15:08
Copy link
Contributor

@FallenDeity FallenDeity left a comment

Choose a reason for hiding this comment

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

Looks good to me :)

@Naramsim
Copy link
Member

Naramsim commented Mar 2, 2026

Alright, thanks a lot @anhthang for the contribution and @FallenDeity for the much appreciated review!

@Naramsim Naramsim merged commit d247aff into PokeAPI:master Mar 2, 2026
@Naramsim
Copy link
Member

Naramsim commented Mar 2, 2026

Now you can run the script on a single folder and create another PR. Then we'll do all the folders altogether.

@anhthang
Copy link
Contributor Author

anhthang commented Mar 3, 2026

Now you can run the script on a single folder and create another PR. Then we'll do all the folders altogether.

I've made 3 PRs for the versions folder to cover the remaining changes. Please check them when you have time and merge them if everything looks good.

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