1
0
Fork 0
mirror of synced 2024-09-14 16:38:00 +12:00
Rare/rare/shared/workers/fetch.py
loathingKernel 713573b762
RareCore: Move entitlements request into an independent worker
Yes, we are back at this. Entitlements are important to have early
as Ubisoft redemption requires them, and they don't depend on anything
else.

* Move config helper initialization into RareCore to make it available
earlier.
2023-12-03 17:11:45 +02:00

92 lines
3.7 KiB
Python

from argparse import Namespace
from enum import IntEnum
from logging import getLogger
from PyQt5.QtCore import QObject, pyqtSignal, QSettings
from requests.exceptions import HTTPError, ConnectionError
from rare.lgndr.core import LegendaryCore
from rare.utils.metrics import timelogger
from .worker import Worker
logger = getLogger("FetchWorker")
class FetchWorker(Worker):
class Result(IntEnum):
ERROR = 0
GAMESDLCS = 1
ENTITLEMENTS = 2
class Signals(QObject):
progress = pyqtSignal(int, str)
result = pyqtSignal(object, int)
def __init__(self, core: LegendaryCore, args: Namespace):
super(Worker, self).__init__()
self.signals = FetchWorker.Signals()
self.core = core
self.args = args
class EntitlementsWorker(FetchWorker):
def __init__(self, core: LegendaryCore, args: Namespace):
super(EntitlementsWorker, self).__init__(core, args)
self.exclude_entitlements = QSettings().value("exclude_entitlements", False, bool)
def run_real(self):
entitlements = ()
self.signals.progress.emit(0, self.signals.tr("Updating entitlements"))
if not self.exclude_entitlements:
with timelogger(logger, "Request entitlements"):
entitlements = self.core.egs.get_user_entitlements()
logger.info(f"Entitlements: {len(list(entitlements))}")
self.signals.result.emit(entitlements, FetchWorker.Result.ENTITLEMENTS)
return
class GamesDlcsWorker(FetchWorker):
def __init__(self, core: LegendaryCore, args: Namespace):
super(GamesDlcsWorker, self).__init__(core, args)
self.exclude_non_asset = QSettings().value("exclude_non_asset", False, bool)
def run_real(self):
# Fetch regular EGL games with assets
self.signals.progress.emit(0, self.signals.tr("Updating game metadata"))
with timelogger(logger, "Request games"):
games, dlc_dict = self.core.get_game_and_dlc_list(
update_assets=not self.args.offline, platform="Windows", skip_ue=False
)
logger.info(f"Games: {len(games)}. Games with DLCs {len(dlc_dict)}")
# Fetch non-asset games
if not self.exclude_non_asset:
self.signals.progress.emit(10, self.signals.tr("Updating non-asset metadata"))
try:
with timelogger(logger, "Request non-asset"):
na_games, na_dlc_dict = self.core.get_non_asset_library_items(force_refresh=False, skip_ue=False)
except (HTTPError, ConnectionError) as e:
logger.error(f"Connection error while fetching non asset games")
logger.error(e)
na_games, na_dlc_dict = ([], {})
# NOTE: This is here because of broken appIds from Epic
# https://discord.com/channels/826881530310819914/884510635642216499/1111321692703305729
except Exception as e:
logger.error(f"General exception while fetching non asset games")
logger.error(e)
na_games, na_dlc_dict = ([], {})
logger.info(f"Non-asset: {len(na_games)}. Non-asset with DLCs: {len(na_dlc_dict)}")
# Combine the two games lists and the two dlc dictionaries between regular and non-asset results
games += na_games
for catalog_id, dlcs in na_dlc_dict.items():
if catalog_id in dlc_dict.keys():
dlc_dict[catalog_id] += dlcs
else:
dlc_dict[catalog_id] = dlcs
logger.info(f"Games: {len(games)}. Games with DLCs: {len(dlc_dict)}")
self.signals.progress.emit(10, self.signals.tr("Preparing library"))
self.signals.result.emit((games, dlc_dict), FetchWorker.Result.GAMESDLCS)