1
0
Fork 0
mirror of synced 2024-07-03 13:40:47 +12:00

RareGame: Initialize steam_date and last_played to datetime.min

Due to some metadata corruption, metadata now gets locked before
being accessed
This commit is contained in:
loathingKernel 2023-03-31 14:02:01 +03:00
parent 639395c454
commit 459828f1de
No known key found for this signature in database
GPG key ID: CE0C72D0B53821FD

View file

@ -4,6 +4,7 @@ import platform
from dataclasses import dataclass, field from dataclasses import dataclass, field
from datetime import datetime from datetime import datetime
from logging import getLogger from logging import getLogger
from threading import Lock
from typing import List, Optional, Dict from typing import List, Optional, Dict
from PyQt5.QtCore import QRunnable, pyqtSlot, QProcess, QThreadPool from PyQt5.QtCore import QRunnable, pyqtSlot, QProcess, QThreadPool
@ -27,10 +28,10 @@ class RareGame(RareGameSlim):
auto_update: bool = False auto_update: bool = False
queued: bool = False queued: bool = False
queue_pos: Optional[int] = None queue_pos: Optional[int] = None
last_played: Optional[datetime] = None last_played: datetime = datetime.min
grant_date: Optional[datetime] = None grant_date: Optional[datetime] = None
steam_grade: Optional[str] = None steam_grade: Optional[str] = None
steam_date: Optional[datetime] = None steam_date: datetime = datetime.min
tags: List[str] = field(default_factory=list) tags: List[str] = field(default_factory=list)
@classmethod @classmethod
@ -39,7 +40,7 @@ class RareGame(RareGameSlim):
auto_update=data.get("auto_update", False), auto_update=data.get("auto_update", False),
queued=data.get("queued", False), queued=data.get("queued", False),
queue_pos=data.get("queue_pos", None), queue_pos=data.get("queue_pos", None),
last_played=datetime.fromisoformat(data["last_played"]) if data.get("last_played", None) else None, last_played=datetime.fromisoformat(data["last_played"]) if data.get("last_played", None) else datetime.min,
grant_date=datetime.fromisoformat(data["grant_date"]) if data.get("grant_date", None) else None, grant_date=datetime.fromisoformat(data["grant_date"]) if data.get("grant_date", None) else None,
steam_grade=data.get("steam_grade", None), steam_grade=data.get("steam_grade", None),
steam_date=datetime.fromisoformat(data["steam_date"]) if data.get("steam_date", None) else datetime.min, steam_date=datetime.fromisoformat(data["steam_date"]) if data.get("steam_date", None) else datetime.min,
@ -51,7 +52,7 @@ class RareGame(RareGameSlim):
auto_update=self.auto_update, auto_update=self.auto_update,
queued=self.queued, queued=self.queued,
queue_pos=self.queue_pos, queue_pos=self.queue_pos,
last_played=self.last_played.isoformat() if self.last_played else None, last_played=self.last_played.isoformat() if self.last_played else datetime.min,
grant_date=self.grant_date.isoformat() if self.grant_date else None, grant_date=self.grant_date.isoformat() if self.grant_date else None,
steam_grade=self.steam_grade, steam_grade=self.steam_grade,
steam_date=self.steam_date.isoformat() if self.steam_date else datetime.min, steam_date=self.steam_date.isoformat() if self.steam_date else datetime.min,
@ -122,6 +123,7 @@ class RareGame(RareGameSlim):
self.signals.game.finished.emit(self.app_name) self.signals.game.finished.emit(self.app_name)
__metadata_json: Optional[Dict] = None __metadata_json: Optional[Dict] = None
__metadata_lock: Lock = Lock()
@staticmethod @staticmethod
def __load_metadata_json() -> Dict: def __load_metadata_json() -> Dict:
@ -139,18 +141,20 @@ class RareGame(RareGameSlim):
return RareGame.__metadata_json return RareGame.__metadata_json
def __load_metadata(self): def __load_metadata(self):
metadata: Dict = self.__load_metadata_json() with RareGame.__metadata_lock:
# pylint: disable=unsupported-membership-test metadata: Dict = self.__load_metadata_json()
if self.app_name in metadata: # pylint: disable=unsupported-membership-test
# pylint: disable=unsubscriptable-object if self.app_name in metadata:
self.metadata = RareGame.Metadata.from_dict(metadata[self.app_name]) # pylint: disable=unsubscriptable-object
self.metadata = RareGame.Metadata.from_dict(metadata[self.app_name])
def __save_metadata(self): def __save_metadata(self):
metadata: Dict = self.__load_metadata_json() with RareGame.__metadata_lock:
# pylint: disable=unsupported-assignment-operation metadata: Dict = self.__load_metadata_json()
metadata[self.app_name] = self.metadata.as_dict() # pylint: disable=unsupported-assignment-operation
with open(os.path.join(data_dir(), "game_meta.json"), "w") as metadata_json: metadata[self.app_name] = self.metadata.as_dict()
json.dump(metadata, metadata_json, indent=2) with open(os.path.join(data_dir(), "game_meta.json"), "w") as metadata_json:
json.dump(metadata, metadata_json, indent=2)
def update_game(self): def update_game(self):
self.game = self.core.get_game( self.game = self.core.get_game(