2023-03-05 00:23:18 +13:00
|
|
|
from argparse import Namespace
|
|
|
|
from enum import IntEnum
|
|
|
|
from logging import getLogger
|
|
|
|
|
2023-09-11 04:08:47 +12:00
|
|
|
from PyQt5.QtCore import QObject, pyqtSignal, QSettings
|
|
|
|
from requests.exceptions import HTTPError, ConnectionError
|
2023-03-05 00:23:18 +13:00
|
|
|
|
|
|
|
from rare.lgndr.core import LegendaryCore
|
2023-09-11 04:08:47 +12:00
|
|
|
from rare.utils.metrics import timelogger
|
2023-03-05 00:23:18 +13:00
|
|
|
from .worker import Worker
|
|
|
|
|
|
|
|
logger = getLogger("FetchWorker")
|
|
|
|
|
|
|
|
|
|
|
|
class FetchWorker(Worker):
|
|
|
|
class Result(IntEnum):
|
2023-09-15 09:40:28 +12:00
|
|
|
ERROR = 0
|
|
|
|
GAMESDLCS = 1
|
|
|
|
ENTITLEMENTS = 2
|
2023-03-05 00:23:18 +13:00
|
|
|
|
|
|
|
class Signals(QObject):
|
2023-05-30 01:11:17 +12:00
|
|
|
progress = pyqtSignal(int, str)
|
2023-03-05 00:23:18 +13:00
|
|
|
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
|
2023-09-15 09:40:28 +12:00
|
|
|
|
|
|
|
|
|
|
|
class EntitlementsWorker(FetchWorker):
|
|
|
|
def __init__(self, core: LegendaryCore, args: Namespace):
|
|
|
|
super(EntitlementsWorker, self).__init__(core, args)
|
2023-09-11 04:08:47 +12:00
|
|
|
self.exclude_entitlements = QSettings().value("exclude_entitlements", False, bool)
|
2023-03-05 00:23:18 +13:00
|
|
|
|
|
|
|
def run_real(self):
|
2023-09-15 09:40:28 +12:00
|
|
|
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):
|
2023-09-11 04:08:47 +12:00
|
|
|
|
2023-05-30 01:11:17 +12:00
|
|
|
# Fetch regular EGL games with assets
|
2023-09-15 09:40:28 +12:00
|
|
|
self.signals.progress.emit(0, self.signals.tr("Updating game metadata"))
|
2023-09-11 04:08:47 +12:00
|
|
|
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)}")
|
2023-03-05 00:23:18 +13:00
|
|
|
|
2023-05-30 01:11:17 +12:00
|
|
|
# Fetch non-asset games
|
2023-09-11 04:08:47 +12:00
|
|
|
if not self.exclude_non_asset:
|
2023-09-15 09:40:28 +12:00
|
|
|
self.signals.progress.emit(10, self.signals.tr("Updating non-asset metadata"))
|
2023-09-11 04:08:47 +12:00
|
|
|
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:
|
2023-09-15 09:40:28 +12:00
|
|
|
logger.error(f"Connection error while fetching non asset games")
|
2023-09-11 04:08:47 +12:00
|
|
|
logger.error(e)
|
|
|
|
na_games, na_dlc_dict = ([], {})
|
2023-09-15 09:40:28 +12:00
|
|
|
# NOTE: This is here because of broken appIds from Epic
|
|
|
|
# https://discord.com/channels/826881530310819914/884510635642216499/1111321692703305729
|
2023-09-11 04:08:47 +12:00
|
|
|
except Exception as e:
|
2023-09-15 09:40:28 +12:00
|
|
|
logger.error(f"General exception while fetching non asset games")
|
2023-09-11 04:08:47 +12:00
|
|
|
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)}")
|
2023-05-30 01:11:17 +12:00
|
|
|
|
2023-09-15 09:40:28 +12:00
|
|
|
self.signals.progress.emit(10, self.signals.tr("Preparing library"))
|
|
|
|
self.signals.result.emit((games, dlc_dict), FetchWorker.Result.GAMESDLCS)
|