* [egs] add methods to fetch game and user achievements from graphql api
* [lfs] add methods to store and load user achievements
* [core] fetch game achievements when updating assets and user achievements when requested
* [cli] add CLI interface for achievements
* [cli] Fix achievement classification filters
* [cli,core] Move achievement classification into LegendaryCore
There's no need for iterating twice
* [core] Check if achievements exists
some games have achievements_sets but no achievements
* [core] Associate user achievements with the namespace instead of app_name
* [core] sort achievements
* [cli/core]: report grant date information with `info`
Entitlements are updated only when there is an asset update. If no matching
entitlement is found, the creation date from the game's metadata is returned
instead.
* [cli] replace missed use of entitlements with cached/on-disk data
* [core] update entitlements only when there are new assets.
* [cli] correctly pass `get_assets` platform argument
* fix: add 3rd param to setexchangecode callback
I'm unsure what that param is, it could be an error indicator of some sorts, for now I'll just assume a happy path
* chore: add logging for the param
* Handle file tasks case-insensitively
* Also make verification and uninstallation case-insensitive if necessary
This also only enables case-insensitive file tasks if installing a
Windows game
* Fastpath for existing path case
"Fastpath", heh, get it, because it's working with paths...
* Move to pyproject.toml and the uv build system
* A few tweaks that should make it even faster
* Add pyinstaller to optional dependencies and install it as part of the workflow
* Use --no-editable to avoid building and installing Legendary manually
* Drop deprecated license classifier
* Update README.md to mention uv
* feat: support encrypted manifests and chunks
fix: ensure manifest_secrets is always defined in info
fix: update all usage of DLManager with manifest secrets
* chore: remove unused is_preloaded var
Some UE asset manifests seem to have `"OwnershipToken": ""` instead
of something `strtobool` could understand. When trying to import these
through `egl-sync` an exception is being raised, which blocks importing
other titles too.
The other use of `strtobool` is in `LGDRY_NO_WINE` environment variable,
which also causes an exception if set as `LGDRY_NO_WINE=`