* [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=`
If a game has a `__required` SDL which is an empty string will fail verification
because the check for building the list of hashes will fail, implying that the
whole game including all the SDLs will be validated.
At the same time, if we are importing a game using a config file that doesn't
specify the `install_tags` for such a game, the install tags won't be saved
due to calling an early `exit(0)`.
These two issues combined can cause a verification, repair, verification loop.
This commit addresses both of those issues.
Related convertation on Discord:
https://discord.com/channels/695233346627698689/695234626582609940/1084939380713594924