Commit graph

570 commits

Author SHA1 Message Date
derrod 5a197fe6a9 Version 0.0.6
'Residue Processing' is a fitting codename given all the cleanup...
2020-04-30 12:08:22 +02:00
derrod 4ef55c02f3 Update README with new commands/flags 2020-04-30 12:07:53 +02:00
derrod 39bfb47d75 [cli] Add csv/tsv option to list commands
Closes #6 and #13
2020-04-30 12:03:23 +02:00
derrod 31bf74b33d [cli] Set no_install flag when using --prefix options 2020-04-30 11:49:33 +02:00
derrod c9392ca22c [models] Clear raw data in manifest after it has been read
Minor optimization to save some RAM, especially for JSON manifests.
2020-04-30 11:44:43 +02:00
derrod 7dacd7ba35 [cli/core] Fix manifest saving/loading
The refactoring didn't take into account that the raw
manifest data still needs to be accessible. Since I did
not want to modify the manifest model to hold the raw
data (waste of RAM), just make the methods return the
raw data again (at least for now)
2020-04-30 11:42:09 +02:00
derrod 8b63c482c1 [cli] Add new "list-files" command to list files in a manifest
Useful for use with the new --prefix option to search for which
prefix to use for the files you want to download.

Also supports creating a file usable with sha1sum/hashcheck to
verify a local installation manually as well as outputting the
list in csv format for other uses.
2020-04-30 11:14:18 +02:00
derrod 6788b1257c [core] Refactor manifest loading 2020-04-30 11:10:34 +02:00
derrod 8f7db143a6 [downloader] Greatly simplify download task creation
This is a change to something that was so massively stupid and
overcomplicated that I feel like I need to explain and justify myself:

After figuring out the format for manifests and spending countless
hours staring at IDA/Ghidra I kinda was sick of that, so I decided to
figure out what to do with the manifest myself by playing around with
it, which was also a lot more fun than looking through disassembly.

When looking at the chunks and files it quickly became obvious that the
way they're created is by concatenating all files into 1 MiB chunks that
can be downloaded and reassmebled (mostly) sequentially. What I did not
know was how the order of files in this "stream" was determined.

In playing around with it I came up with the old method: essentially
forming a chain of files, because each file's end generally pointed to
the start of the next file. And it worked great! At least until now...

Yesterday somebody alerted me to a game where this failed and it took me
a bit to figure out. Essentially the chaining had failed because
multiple files started at the same offset, but some of them would follow
another chain that never went back to the chunk it started at,
effectively skipping those files. This was rather annoying to deal with,
I came up with a workaround but it wasn't pretty. So I decided to jump
back into IDA/Ghidra and find out how Epic does it for real.

Well it took me a while, but thanks to symbols (yay macOS!) and a decent
decompiler in Ghidra even a noob like me was able to find it eventually.
The answer is as simple as it can be: the files are sorted alphabetically
(case-insensitive).

So really all I ever had to do was to sort files alphabetically and then
run through them to create the list of tasks.

I feel so stupid.

P.S.: I tested a few games and for the most part the resulting file
processing order is identical between the old and the new method. The
cases where it differs is when there's heavy de-duplication happening
(e.g. Diabotical's small model files) but the runtime cache size remains
the same so both methods are equally efficient, the old one just can't
handle certain cases.
2020-04-30 11:05:26 +02:00
derrod ef0ea26372 [cli/core/downloader] Add support for filtering downloaded files by prefix 2020-04-29 22:08:28 +02:00
derrod d61ce7dc6d [models] Support manifests metas with build ids 2020-04-29 21:39:14 +02:00
derrod 6e5e281c82 [core] Fix pre-installation warnings
- Make errors unique
- FNA/XNA games don't seem to really work with WINE.
2020-04-29 15:41:21 +02:00
derrod 209ba2dd81 [core] Remove unnecessary OVT path adjustments
Not only does this not work (path.join() will not
actually add Z: on non-Windows), it's also not necessary.

Confirmed to work with Detroit: Become Human (Demo) and
Just Cause 4.
2020-04-29 15:16:17 +02:00
derrod 63ff306fbf [cli] Fix offline flag 2020-04-29 14:05:30 +02:00
derrod ba7133d7d6 [cli] clean up imports 2020-04-29 10:56:47 +02:00
derrod 7c9ea631ed Update README with new flags 2020-04-28 16:18:59 +02:00
derrod eaf77abe97 Version 0.0.5 2020-04-28 15:58:34 +02:00
derrod 9613ad34ba [core] Log when manifest/base url is being overridden by the user 2020-04-28 15:56:52 +02:00
derrod 2eac83f6d1 [models] Add missing flags to FileManifests 2020-04-28 15:55:19 +02:00
derrod 8251db22d2 [cli/core] Allow overriding platform and UE filter in list-games 2020-04-28 15:32:38 +02:00
derrod e0b4769af2 [cli/core] Add option to override platform when downloading
This can be used to download Mac or 32-bit builds if desired.

For example: legendary download Corydalis --platform Mac
Will download the Slime Rancher macOS build.

Closes #12
2020-04-28 15:12:17 +02:00
derrod 79dc7d03a4 [api] Allow specifying label and platform in API requests 2020-04-28 14:51:00 +02:00
derrod f5861546b4 [core] Support manifest URLs with CDN authentication 2020-04-28 07:57:10 +02:00
derrod 5dd7cd64cc Update python requirements in README
Turns out that
1) 32 bit python is still a thing and
2) it throws an exception when trying to attach Shared Memory
that is larger than 64 MiB. While we could work around that
for cases where more than 64 MiB cache is required, for now
it makes more sense to just drop 32 bit support. Most games are
64-bit only anyway.
2020-04-28 06:55:09 +02:00
derrod e822a8f7bf [core] Fix OwnershipToken path for WINE
Fixes #2
2020-04-28 06:28:23 +02:00
derrod 89fe49aa4d [core] Add warning for BattlEye anticheat
Closes #8
2020-04-28 06:20:25 +02:00
derrod 2be1d367df [cli] Add version and release codename to help 2020-04-28 06:14:17 +02:00
derrod 0d08263afa [lfs] Return empty installed list if installed is None
Fixes #9
2020-04-28 06:13:03 +02:00
derrod e44a00d37f [downloader] Cap worker processes at 16 2020-04-28 06:12:30 +02:00
derrod 7bf517aa00 [models] Fix build id string creation 2020-04-27 14:31:12 +02:00
derrod 5e7bdca8c4 Update README with info regarding Linux packages
Closes #3
2020-04-27 12:46:22 +02:00
derrod b860034031 Update README for linux single-binary distribution 2020-04-26 21:00:00 +02:00
derrod 1da92fe341 Version 0.0.4 2020-04-26 14:58:40 +02:00
derrod 1b3ef31963 [cli/core] Fix config offline and environment overrides 2020-04-26 14:58:09 +02:00
derrod 76b7360732 Update README 2020-04-26 13:44:51 +02:00
derrod b9b459d527 [cli] Fix missing space breaking URL in log message 2020-04-26 13:37:35 +02:00
derrod 6895f25fbb Version 0.0.3 2020-04-26 13:24:15 +02:00
derrod f4b1605b92 [core] Minor improvements for DLC/logging 2020-04-26 13:20:54 +02:00
derrod 50bd35683f [cli] Minor adjustments to parser setup and readability 2020-04-26 13:20:11 +02:00
derrod 0485a728e3 [cli/downloader] Migrate to Queue based logging for subprocesses 2020-04-26 13:19:28 +02:00
derrod 035e23b964 [core/lfs] Clean up local manifest saving/loading 2020-04-25 23:06:46 +02:00
derrod 8f23770e43 [core] Add warning for games that are not marked for offline use 2020-04-25 22:54:18 +02:00
derrod ec97cef264 [core] Add additional warning for Ownership Token requirement 2020-04-25 12:20:55 +02:00
derrod c20619d6e7 [cli] Rework CLI
- Class instead of giant main() function
- Uses subparsers for commands (cleaner)
- Will make future enhancements easier
2020-04-25 12:20:14 +02:00
derrod 96602d1890 [downloader/models] Minor code cleanups 2020-04-25 10:18:45 +02:00
derrod f1885639ae [downloader] Remove unnecessary imports 2020-04-25 09:25:12 +02:00
derrod 0e81b87fac [cli] Simplify "is game installed" check 2020-04-24 06:38:11 +02:00
derrod d8b629a66d [cli] Simplify manual login procedure 2020-04-24 06:37:40 +02:00
derrod a59107e503 [core/lfs] Load correct old manifest file after aborted installation
If a user were to start and then abort an installation previously
we would have loaded the downloaded new manifest, rather than the
one of the installed version. By explicitly setting the version
we can avoid this.
2020-04-24 06:29:22 +02:00
derrod 78d745b03f [downloader] Fix log message and close shared memory on exit 2020-04-21 20:26:17 +02:00