[cli] Add egl-sync command

This commit is contained in:
derrod 2020-05-29 23:09:02 +02:00
parent 0b220cd19a
commit 82f5adfaa4

View file

@ -19,6 +19,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 from legendary.models.game import SaveGameStatus, VerifyResult
from legendary.utils.cli import get_boolean_choice
from legendary.utils.custom_parser import AliasedSubParsersAction from legendary.utils.custom_parser import AliasedSubParsersAction
from legendary.utils.lfs import validate_files from legendary.utils.lfs import validate_files
@ -749,6 +750,76 @@ class LegendaryCLI:
f'verification will not be requried.') f'verification will not be requried.')
logger.info('Game has been imported.') logger.info('Game has been imported.')
def egs_sync(self, args):
if not self.core.egl.programdata_path:
if not args.egl_manifest_path:
# search default Lutris install path
egl_path = os.path.expanduser('~/Games/epic-games-store/drive_c/ProgramData'
'/Epic/EpicGamesLauncher/Data/Manifests')
if os.path.exists(egl_path):
logger.info(f'Found Lutris EGL install at "{egl_path}"')
else:
print('EGL path not found, please manually provide the path to the WINEPREFIX it is installed in')
egl_path = input('Path [empty input to quit]: ').strip()
if not egl_path:
print('Empty input, quitting...')
exit(0)
if not os.path.exists(egl_path):
print('Path is invalid (does not exist)!')
exit(1)
egl_path = os.path.join(egl_path, 'drive_c/ProgramData/Epic/EpicGamesLauncher/Data/Manifests')
if not os.path.exists(egl_path):
print('EGL manifests directory does not exist, this may happen if nothing has been installed.')
exit(1)
if not os.listdir(egl_path):
logger.warning('Folder is empty, this may be fine if nothing has been installed yet.')
self.core.egl.programdata_path = egl_path
self.core.lgd.config.set('Legendary', 'egl_programdata', egl_path)
else:
self.core.egl.programdata_path = args.egl_manifest_path
logger.debug(f'Using EGL ProgramData path "{self.core.egl.programdata_path}"...')
logger.info('Reading EGL game manifests...')
if not args.export_only:
print('\nChecking for importable games...')
importable = self.core.egl_get_importable()
if importable:
print('The following games are importable (EGL -> Legendary):')
for egl_game in importable:
print(' *', egl_game.app_name, '-', egl_game.display_name)
if get_boolean_choice('Do you want to import the games from EGL?'):
for egl_game in importable:
logger.info(f'Importing "{egl_game.display_name}"...')
self.core.egl_import(egl_game.app_name)
else:
print('Nothing to import.')
if not args.import_only:
print('\nChecking for exportable games...')
exportable = self.core.egl_get_exportable()
if exportable:
print('The following games are exportable (Legendary -> EGL)')
for lgd_game in exportable:
print(' *', lgd_game.app_name, '-', lgd_game.title)
if get_boolean_choice('Do you want to export the games to EGL?'):
for lgd_game in exportable:
logger.info(f'Exporting "{lgd_game.title}"...')
self.core.egl_export(lgd_game.app_name)
else:
print('Nothing to export.')
print('\nChecking automatic sync...')
if not self.core.egl_sync_enabled and not args.one_shot:
if not args.enable_sync:
args.enable_sync = get_boolean_choice('Enable automatic synchronization?')
self.core.lgd.config.set('Legendary', 'egl_sync', str(args.enable_sync))
else:
self.core.egl_sync()
def main(): def main():
parser = argparse.ArgumentParser(description=f'Legendary v{__version__} - "{__codename__}"') parser = argparse.ArgumentParser(description=f'Legendary v{__version__} - "{__codename__}"')
@ -777,6 +848,7 @@ def main():
sync_saves_parser = subparsers.add_parser('sync-saves', help='Sync cloud saves') sync_saves_parser = subparsers.add_parser('sync-saves', help='Sync cloud saves')
verify_parser = subparsers.add_parser('verify-game', help='Verify a game\'s local files') verify_parser = subparsers.add_parser('verify-game', help='Verify a game\'s local files')
import_parser = subparsers.add_parser('import-game', help='Import an already installed game') import_parser = subparsers.add_parser('import-game', help='Import an already installed game')
egl_sync_parser = subparsers.add_parser('egl-sync', help='Setup or run Epic Games Launcher sync')
install_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>') install_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>')
uninstall_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>') uninstall_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>')
@ -918,6 +990,18 @@ def main():
import_parser.add_argument('--disable-check', dest='disable_check', action='store_true', import_parser.add_argument('--disable-check', dest='disable_check', action='store_true',
help='Disables checks of specified game install.') help='Disables checks of specified game install.')
egl_sync_parser.add_argument('--egl-manifest-path', dest='egl_manifest_path', action='store',
help='Path to the Epic Games Launcher\'s ProgramData folder, should '
'point to /ProgramData/Epic/EpicGamesLauncher/Data/Manifests')
egl_sync_parser.add_argument('--enable-sync', dest='enable_sync', action='store_true',
help='Enable automatic EGL<->Legendary sync')
egl_sync_parser.add_argument('--one-shot', dest='one_shot', action='store_true',
help='Sync once, do not ask to setup automatic sync.')
egl_sync_parser.add_argument('--import-only', dest='import_only', action='store_true',
help='Only import games from EGL (no export)')
egl_sync_parser.add_argument('--export-only', dest='export_only', action='store_true',
help='Only export games to EGL (no import)')
args, extra = parser.parse_known_args() args, extra = parser.parse_known_args()
if args.version: if args.version:
@ -927,7 +1011,7 @@ def main():
if args.subparser_name not in ('auth', 'list-games', 'list-installed', 'list-files', if args.subparser_name not in ('auth', 'list-games', 'list-installed', 'list-files',
'launch', 'download', 'uninstall', 'install', 'update', 'launch', 'download', 'uninstall', 'install', 'update',
'repair', 'list-saves', 'download-saves', 'sync-saves', 'repair', 'list-saves', 'download-saves', 'sync-saves',
'verify-game', 'import-game'): 'verify-game', 'import-game', 'egl-sync'):
print(parser.format_help()) print(parser.format_help())
# Print the main help *and* the help for all of the subcommands. Thanks stackoverflow! # Print the main help *and* the help for all of the subcommands. Thanks stackoverflow!
@ -977,6 +1061,8 @@ def main():
cli.verify_game(args) cli.verify_game(args)
elif args.subparser_name == 'import-game': elif args.subparser_name == 'import-game':
cli.import_game(args) cli.import_game(args)
elif args.subparser_name == 'egl-sync':
cli.egs_sync(args)
except KeyboardInterrupt: except KeyboardInterrupt:
logger.info('Command was aborted via KeyboardInterrupt, cleaning up...') logger.info('Command was aborted via KeyboardInterrupt, cleaning up...')