This commit is contained in:
Dummerle 2024-01-01 10:13:11 -07:00 committed by GitHub
commit ad103ca4f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 18 deletions

View file

@ -21,7 +21,7 @@ from legendary import __version__, __codename__
from legendary.core import LegendaryCore from legendary.core import LegendaryCore
from legendary.models.exceptions import InvalidCredentialsError from legendary.models.exceptions import InvalidCredentialsError
from legendary.models.game import SaveGameStatus, VerifyResult, Game from legendary.models.game import SaveGameStatus, VerifyResult, Game
from legendary.utils.cli import get_boolean_choice, get_int_choice, sdl_prompt, strtobool from legendary.utils.cli import get_boolean_choice, get_int_choice, sdl_prompt, strtobool, get_size
from legendary.lfs.crossover import * from legendary.lfs.crossover import *
from legendary.utils.custom_parser import HiddenAliasSubparsersAction from legendary.utils.custom_parser import HiddenAliasSubparsersAction
from legendary.utils.env import is_windows_mac_or_pyi from legendary.utils.env import is_windows_mac_or_pyi
@ -1010,12 +1010,12 @@ class LegendaryCLI:
exit(0) exit(0)
logger.info(f'Install size: {analysis.install_size / 1024 / 1024:.02f} MiB') logger.info(f'Install size: {get_size(analysis.install_size)}')
compression = (1 - (analysis.dl_size / analysis.uncompressed_dl_size)) * 100 compression = (1 - (analysis.dl_size / analysis.uncompressed_dl_size)) * 100
logger.info(f'Download size: {analysis.dl_size / 1024 / 1024:.02f} MiB ' logger.info(f'Download size: {get_size(analysis.dl_size)} '
f'(Compression savings: {compression:.01f}%)') f'(Compression savings: {compression:.01f}%)')
logger.info(f'Reusable size: {analysis.reuse_size / 1024 / 1024:.02f} MiB (chunks) / ' logger.info(f'Reusable size: {get_size(analysis.reuse_size)} (chunks) / '
f'{analysis.unchanged / 1024 / 1024:.02f} MiB (unchanged / skipped)') f'{get_size(analysis.unchanged)} (unchanged / skipped)')
logger.info('Downloads are resumable, you can interrupt the download with ' logger.info('Downloads are resumable, you can interrupt the download with '
'CTRL-C and resume it using the same command later on.') 'CTRL-C and resume it using the same command later on.')
@ -2019,7 +2019,7 @@ class LegendaryCLI:
self.core.lgd.clean_tmp_data() self.core.lgd.clean_tmp_data()
after = self.core.lgd.get_dir_size() after = self.core.lgd.get_dir_size()
logger.info(f'Cleanup complete! Removed {(before - after) / 1024 / 1024:.02f} MiB.') logger.info(f'Cleanup complete! Removed {get_size(before - after)}.')
def activate(self, args): def activate(self, args):
if not self.core.login(): if not self.core.login():
@ -2340,8 +2340,8 @@ class LegendaryCLI:
return return
logger.info(f'Install directory: {igame.install_path}') logger.info(f'Install directory: {igame.install_path}')
logger.info(f'Install size: {ares.install_size / 1024 / 1024:.2f} MiB') logger.info(f'Install size: {get_size(ares.install_size)}')
logger.info(f'Download size: {ares.dl_size / 1024 / 1024:.2f} MiB') logger.info(f'Download size: {get_size(ares.dl_size)}')
if not args.yes: if not args.yes:
if not get_boolean_choice('Do you want to install the overlay?'): if not get_boolean_choice('Do you want to install the overlay?'):
@ -2469,7 +2469,7 @@ class LegendaryCLI:
default_choice = None default_choice = None
for i, bottle in enumerate(usable_bottles, start=1): for i, bottle in enumerate(usable_bottles, start=1):
extra = [] extra = []
if cx_version in bottle['cx_versions']: if cx_version in bottle['cx_versions']:
if app_name in bottle['compatible_apps']: if app_name in bottle['compatible_apps']:
extra.append('recommended') extra.append('recommended')
@ -2512,8 +2512,8 @@ class LegendaryCLI:
base_url=install_candidate.get('base_url')) base_url=install_candidate.get('base_url'))
logger.info(f'Bottle install directory: {path}') logger.info(f'Bottle install directory: {path}')
logger.info(f'Bottle size: {ares.install_size / 1024 / 1024:.2f} MiB') logger.info(f'Bottle size: {get_size(ares.install_size)}')
logger.info(f'Download size: {ares.dl_size / 1024 / 1024:.2f} MiB') logger.info(f'Download size: {get_size(ares.dl_size)}')
if not args.yes: if not args.yes:
if not get_boolean_choice('Do you want to download the selected bottle?'): if not get_boolean_choice('Do you want to download the selected bottle?'):

View file

@ -17,6 +17,7 @@ from threading import Condition, Thread
from legendary.downloader.mp.workers import DLWorker, FileWorker from legendary.downloader.mp.workers import DLWorker, FileWorker
from legendary.models.downloading import * from legendary.models.downloading import *
from legendary.models.manifest import ManifestComparison, Manifest from legendary.models.manifest import ManifestComparison, Manifest
from legendary.utils.cli import get_size
class DLManager(Process): class DLManager(Process):
@ -750,13 +751,13 @@ class DLManager(Process):
self.log.info(f'= Progress: {perc:.02f}% ({processed_chunks}/{num_chunk_tasks}), ' self.log.info(f'= Progress: {perc:.02f}% ({processed_chunks}/{num_chunk_tasks}), '
f'Running for {rt_hours:02d}:{rt_minutes:02d}:{rt_seconds:02d}, ' f'Running for {rt_hours:02d}:{rt_minutes:02d}:{rt_seconds:02d}, '
f'ETA: {hours:02d}:{minutes:02d}:{seconds:02d}') f'ETA: {hours:02d}:{minutes:02d}:{seconds:02d}')
self.log.info(f' - Downloaded: {total_dl / 1024 / 1024:.02f} MiB, ' self.log.info(f' - Downloaded: {get_size(total_dl)}, '
f'Written: {total_write / 1024 / 1024:.02f} MiB') f'Written: {get_size(total_write)}')
self.log.info(f' - Cache usage: {total_used:.02f} MiB, active tasks: {self.active_tasks}') self.log.info(f' - Cache usage: {get_size(total_used)} , active tasks: {self.active_tasks}')
self.log.info(f' + Download\t- {dl_speed / 1024 / 1024:.02f} MiB/s (raw) ' self.log.info(f' + Download\t- {get_size(dl_speed)}/s (raw) '
f'/ {dl_unc_speed / 1024 / 1024:.02f} MiB/s (decompressed)') f'/ {get_size(dl_unc_speed)}/s (decompressed)')
self.log.info(f' + Disk\t- {w_speed / 1024 / 1024:.02f} MiB/s (write) / ' self.log.info(f' + Disk\t- {get_size(w_speed)}/s (write) / '
f'{r_speed / 1024 / 1024:.02f} MiB/s (read)') f'{get_size(r_speed)}/s (read)')
# send status update to back to instantiator (if queue exists) # send status update to back to instantiator (if queue exists)
if self.status_queue: if self.status_queue:

View file

@ -1,3 +1,6 @@
from typing import Union
def get_boolean_choice(prompt, default=True): def get_boolean_choice(prompt, default=True):
yn = 'Y/n' if default else 'y/N' yn = 'Y/n' if default else 'y/N'
@ -89,3 +92,9 @@ def strtobool(val):
else: else:
raise ValueError("invalid truth value %r" % (val,)) raise ValueError("invalid truth value %r" % (val,))
def get_size(b: Union[int, float]) -> str:
for i in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei"]:
if b < 1024:
return f"{b:.2f}{i}B"
b /= 1024