Searches for WoW addons hosted on Github.
A translation of the Python layday/github-wow-addon-catalogue to Go.
Addon metadata is read from a repository's release.json
file, falling back to the .toc files inside the release assets.
git clone https://github.com/ogri-la/github-wow-addon-catalogue-go
cd github-wow-addon-catalogue-go
./manage.sh build
export ADDONS_CATALOGUE_GITHUB_TOKEN=<your-token>
A Github token is required for the scrape subcommand. The other subcommands
read the local cache and need no token.
All functionality sits behind a subcommand:
$ ./github-wow-addon-catalogue <scrape|dump-release-dot-json|find-duplicates|cache-stats|cache-prune>
Global flags are --help, --version and --log-level (one of debug,
info, warn, error, defaulting to info).
The catalogue is written to stdout and logging to stderr:
$ ./github-wow-addon-catalogue scrape
CSV and JSON output formats are supported, chosen by file extension, with JSON
as the default. --out may be given more than once:
$ ./github-wow-addon-catalogue scrape --out addons.csv --out addons.json
To build upon the results of a previous run. --in may also be given more than
once and its results are merged with the search results:
$ ./github-wow-addon-catalogue scrape --in old.csv --out new.csv
To use the input files only and not search Github at all:
$ ./github-wow-addon-catalogue scrape --in old.csv --skip-search
To always use cached responses, even if they've expired:
$ ./github-wow-addon-catalogue scrape --use-expired-cache
To limit parsing to just addons with names matching a pattern:
$ ./github-wow-addon-catalogue scrape --filter '^AdiAddons'
Aug 15 22:16:30.107 INF final addons num=3 num-input-files=1 filtered=true
Aug 15 22:16:30.107 INF de-duplicated addons num=3 unique=3
Aug 15 22:16:30.107 INF parsing addons
Aug 15 22:16:30.107 INF parsing repo repo=AdiAddons/AdiBags
Aug 15 22:16:30.107 INF parsing repo repo=AdiAddons/AdiButtonAuras
Aug 15 22:16:30.108 INF parsing repo repo=AdiAddons/LibPlayerSpells-1.0
Aug 15 22:16:30.111 INF parsing .toc filename=LibPlayerSpells-1.0/LibPlayerSpells-1.0.toc
Aug 15 22:16:30.112 INF parsing .toc filename=AdiButtonAuras/AdiButtonAuras.toc
Aug 15 22:16:30.118 INF parsing .toc filename=AdiBags/AdiBags.toc
Aug 15 22:16:30.118 INF parsing .toc filename=AdiBags_Config/AdiBags_Config.toc
Aug 15 22:16:30.118 INF addons parsed num=3 viable=3
[
{
"id": 639034,
"name": "AdiBags",
"full_name": "AdiAddons/AdiBags",
"html_url": "https://github.com/AdiAddons/AdiBags",
"description": "WoW Addon — Adirelle's bag addon.",
"updated-date": "2024-09-08T02:20:23Z",
"flavor-list": [
"mainline",
"vanilla",
"tbc",
"wrath"
],
"has-release-json": true,
"downloads": 1099644,
"release-count": 56
},
{
"id": 14010348,
"name": "AdiButtonAuras",
"full_name": "AdiAddons/AdiButtonAuras",
"html_url": "https://github.com/AdiAddons/AdiButtonAuras",
"description": "WoW addon - Display auras on action buttons.",
"project-id-map": {
"x-curse-project-id": "68441"
},
"updated-date": "2025-10-31T15:59:16Z",
"flavor-list": [
"mainline"
],
"has-release-json": true,
"downloads": 35938,
"release-count": 24
},
{
"id": 14625469,
"name": "LibPlayerSpells-1.0",
"full_name": "AdiAddons/LibPlayerSpells-1.0",
"html_url": "https://github.com/AdiAddons/LibPlayerSpells-1.0",
"description": "WoW addon library - additional information about player spells.",
"project-id-map": {
"x-curse-project-id": "72228"
},
"updated-date": "2024-10-19T20:50:02Z",
"flavor-list": [
"mainline"
],
"has-release-json": true,
"downloads": 2728,
"release-count": 4
}
]The flavor-list values are mainline, vanilla, tbc, wrath, cata and
mists. The CSV form of the above uses the columns id, name, full_name,
url, description, last_updated, flavors, curse_id, wago_id,
wowi_id, has_release_json, last_seen, downloads and release_count.
Reports addons sharing a project ID across different owners, which usually means a fork has kept the original's Curse, Wago or WoWInterface ID. Bundles under a single owner and a list of known cases are skipped:
$ ./github-wow-addon-catalogue find-duplicates --in addons.csv
Emits the release.json files held in the cache as JSON lines, for use by the
release.json-validator:
$ ./github-wow-addon-catalogue dump-release-dot-json > dump.jsonl
HTTP responses are cached to ./output. Search results expire after two hours
and other responses after 24 hours, while zipfile entries, release.json files
and release page listings never expire.
To report the size and age of the cache, broken down by entry type:
$ ./github-wow-addon-catalogue cache-stats
To remove expired entries. This is a dry run unless --delete=true is given:
$ ./github-wow-addon-catalogue cache-prune
$ ./github-wow-addon-catalogue cache-prune --delete=true
manage.sh handles the routine tasks:
$ ./manage.sh build # build the binary
$ ./manage.sh test # run the tests
$ ./manage.sh lint # go mod tidy and go fix
$ ./manage.sh update # update the catalogue from its sources
debug.sh re-parses a single addon from the cache with debug logging:
$ ./debug.sh '^AdiAddons/AdiBags$'
Copyright © 2024 Torkus
Distributed under the GNU Affero General Public Licence.