mirror of
https://github.com/derrod/legendary.git
synced 2024-05-18 19:43:39 +12:00
Compare commits
6 commits
Author | SHA1 | Date | |
---|---|---|---|
7fefdc4973 | |||
96e07ff453 | |||
ac6290627c | |||
691048d481 | |||
837c166187 | |||
1841da51f0 |
|
@ -186,13 +186,24 @@ class EPCAPI:
|
|||
r.raise_for_status()
|
||||
return r.json()
|
||||
|
||||
def get_user_entitlements(self):
|
||||
def get_user_entitlements(self, start=0):
|
||||
user_id = self.user.get('account_id')
|
||||
r = self.session.get(f'https://{self._entitlements_host}/entitlement/api/account/{user_id}/entitlements',
|
||||
params=dict(start=0, count=5000), timeout=self.request_timeout)
|
||||
params=dict(start=start, count=1000), timeout=self.request_timeout)
|
||||
r.raise_for_status()
|
||||
return r.json()
|
||||
|
||||
def get_user_entitlements_full(self):
|
||||
ret = []
|
||||
|
||||
while True:
|
||||
resp = self.get_user_entitlements(start=len(ret))
|
||||
ret.extend(resp)
|
||||
if len(resp) < 1000:
|
||||
break
|
||||
|
||||
return ret
|
||||
|
||||
def get_game_info(self, namespace, catalog_item_id, timeout=None):
|
||||
r = self.session.get(f'https://{self._catalog_host}/catalog/api/shared/namespace/{namespace}/bulk/items',
|
||||
params=dict(id=catalog_item_id, includeDLCDetails=True, includeMainGameDetails=True,
|
||||
|
|
|
@ -568,6 +568,7 @@ class LegendaryCLI:
|
|||
|
||||
def launch_game(self, args, extra):
|
||||
app_name = self._resolve_aliases(args.app_name)
|
||||
addon_app_name = None
|
||||
|
||||
# Interactive CrossOver setup
|
||||
if args.crossover and sys_platform == 'darwin':
|
||||
|
@ -578,6 +579,13 @@ class LegendaryCLI:
|
|||
return self._launch_origin(args)
|
||||
|
||||
igame = self.core.get_installed_game(app_name)
|
||||
if (not igame or not igame.executable) and (game := self.core.get_game(app_name)) is not None:
|
||||
# override installed game with base title
|
||||
if game.is_launchable_addon:
|
||||
addon_app_name = app_name
|
||||
app_name = game.metadata['mainGameItem']['releaseInfo'][0]['appId']
|
||||
igame = self.core.get_installed_game(app_name)
|
||||
|
||||
if not igame:
|
||||
logger.error(f'Game {app_name} is not currently installed!')
|
||||
exit(1)
|
||||
|
@ -622,7 +630,8 @@ class LegendaryCLI:
|
|||
disable_wine=args.no_wine,
|
||||
executable_override=args.executable_override,
|
||||
crossover_app=args.crossover_app,
|
||||
crossover_bottle=args.crossover_bottle)
|
||||
crossover_bottle=args.crossover_bottle,
|
||||
addon_app_name=addon_app_name)
|
||||
|
||||
if args.set_defaults:
|
||||
self.core.lgd.config[app_name] = dict()
|
||||
|
@ -1648,7 +1657,7 @@ class LegendaryCLI:
|
|||
else:
|
||||
logger.info('Game not installed and offline mode enabled, cannot load manifest.')
|
||||
elif game:
|
||||
entitlements = self.core.egs.get_user_entitlements()
|
||||
entitlements = self.core.egs.get_user_entitlements_full()
|
||||
egl_meta = self.core.egs.get_game_info(game.namespace, game.catalog_item_id)
|
||||
game.metadata = egl_meta
|
||||
# Get manifest if asset exists for current platform
|
||||
|
@ -1704,6 +1713,9 @@ class LegendaryCLI:
|
|||
else:
|
||||
game_infos.append(InfoItem('Extra launch options', 'launch_options', None, []))
|
||||
|
||||
game_infos.append(InfoItem('Command Line', 'command_line', game.additional_command_line,
|
||||
game.additional_command_line))
|
||||
|
||||
# list all owned DLC based on entitlements
|
||||
if entitlements and not game.is_dlc:
|
||||
owned_entitlements = {i['entitlementName'] for i in entitlements}
|
||||
|
@ -2034,7 +2046,7 @@ class LegendaryCLI:
|
|||
redeemed = {k['gameId'] for k in key_list if k['redeemedOnUplay']}
|
||||
|
||||
games = self.core.get_game_list()
|
||||
entitlements = self.core.egs.get_user_entitlements()
|
||||
entitlements = self.core.egs.get_user_entitlements_full()
|
||||
owned_entitlements = {i['entitlementName'] for i in entitlements}
|
||||
|
||||
uplay_games = []
|
||||
|
|
|
@ -689,9 +689,10 @@ class LegendaryCore:
|
|||
disable_wine: bool = False,
|
||||
executable_override: str = None,
|
||||
crossover_app: str = None,
|
||||
crossover_bottle: str = None) -> LaunchParameters:
|
||||
crossover_bottle: str = None,
|
||||
addon_app_name: str = None) -> LaunchParameters:
|
||||
install = self.lgd.get_installed_game(app_name)
|
||||
game = self.lgd.get_game_meta(app_name)
|
||||
game = self.lgd.get_game_meta(addon_app_name if addon_app_name else app_name)
|
||||
|
||||
# Disable wine for non-Windows executables (e.g. native macOS)
|
||||
if not install.platform.startswith('Win'):
|
||||
|
@ -733,6 +734,13 @@ class LegendaryCore:
|
|||
self.log.warning(f'Parsing predefined launch parameters failed with: {e!r}, '
|
||||
f'input: {install.launch_parameters}')
|
||||
|
||||
if meta_args := game.additional_command_line:
|
||||
try:
|
||||
params.game_parameters.extend(shlex.split(meta_args.strip(), posix=False))
|
||||
except ValueError as e:
|
||||
self.log.warning(f'Parsing metadata launch parameters failed with: {e!r}, '
|
||||
f'input: {install.launch_parameters}')
|
||||
|
||||
game_token = ''
|
||||
if not offline:
|
||||
self.log.info('Getting authentication token...')
|
||||
|
|
|
@ -91,6 +91,18 @@ class Game:
|
|||
def supports_mac_cloud_saves(self):
|
||||
return self.metadata and (self.metadata.get('customAttributes', {}).get('CloudSaveFolder_MAC') is not None)
|
||||
|
||||
@property
|
||||
def additional_command_line(self):
|
||||
if not self.metadata:
|
||||
return None
|
||||
return self.metadata.get('customAttributes', {}).get('AdditionalCommandLine', {}).get('value', None)
|
||||
|
||||
@property
|
||||
def is_launchable_addon(self):
|
||||
if not self.metadata:
|
||||
return False
|
||||
return any(m['path'] == 'addons/launchable' for m in self.metadata.get('categories', []))
|
||||
|
||||
@property
|
||||
def catalog_item_id(self):
|
||||
if not self.metadata:
|
||||
|
|
Loading…
Reference in a new issue