def get_manifest(self, app_id, depot_id, manifest_gid, decrypt=True): key = (app_id, depot_id, manifest_gid) cached_manifest = UserCacheFile("manifests/{}_{}_{}".format(*key)) if key not in self.manifests: self.get_cached_manifest(*key) # if we still dont have a manifest, load it from CDN if key not in self.manifests: manifest = CDNClient.get_manifest(self, app_id, depot_id, manifest_gid, decrypt) # cache the manifest with cached_manifest.open('wb') as fp: # if we have the key decrypt the manifest before caching if manifest.filenames_encrypted and manifest.depot_id in self.depot_keys: manifest = self.DepotManifestClass( self, manifest.app_id, manifest.serialize(compress=False)) manifest.decrypt_filenames( self.depot_keys[manifest.depot_id]) fp.write(manifest.serialize(compress=False)) return self.manifests[key]
def check_for_changes(self): changefile = UserCacheFile('last_change_number') change_number = 0 if changefile.exists(): try: change_number = int(changefile.read_full()) except: changefile.remove() self._LOG.debug("Checking PICS for app changes") resp = self.steam.get_changes_since(change_number, True, False) if resp.force_full_app_update: change_number = 0 if resp.current_change_number != change_number: with changefile.open('w') as fp: fp.write(str(resp.current_change_number)) changed_apps = set((entry.appid for entry in resp.app_changes)) if change_number == 0 or changed_apps: self._LOG.debug("Checking for outdated cached appinfo files") for appinfo_file in UserCacheDirectory('appinfo').iter_files( '*.json'): app_id = int(appinfo_file.filename[:-5]) if change_number == 0 or app_id in changed_apps: appinfo_file.remove()
def get_cached_manifest(self, app_id, depot_id, manifest_gid): key = (app_id, depot_id, manifest_gid) if key in self.manifests: return self.manifests[key] # if we don't have the manifest loaded, check cache cached_manifest = UserCacheFile("manifests/{}_{}_{}".format(app_id, depot_id, manifest_gid)) # we have a cached manifest file, load it if cached_manifest.exists(): with cached_manifest.open('r+b') as fp: try: manifest = self.DepotManifestClass(self, app_id, fp.read()) except Exception as exp: self._LOG.debug("Error parsing cached manifest: %s", exp) else: # if its not empty, load it if manifest.gid > 0: self.manifests[key] = manifest # update cached file if we have depot key for it if manifest.filenames_encrypted and manifest.depot_id in self.depot_keys: manifest.decrypt_filenames(self.depot_keys[manifest.depot_id]) fp.seek(0) fp.write(manifest.serialize(compress=False)) fp.truncate() return manifest # empty manifest files shouldn't exist, handle it gracefully by removing the file if key not in self.manifests: self._LOG.debug("Found cached manifest, but encountered error or file is empty") cached_manifest.remove()
def get_manifest(self, app_id, depot_id, manifest_gid, decrypt=True): key = (app_id, depot_id, manifest_gid) cached_manifest = UserCacheFile("manifests/{}_{}_{}".format(*key)) if decrypt and depot_id not in self.depot_keys: self.get_depot_key(app_id, depot_id) manifest = self.get_cached_manifest(*key) # if manifest not cached, download from CDN if not manifest: manifest = CDNClient.get_manifest(self, app_id, depot_id, manifest_gid, decrypt) # cache the manifest with cached_manifest.open('wb') as fp: fp.write(manifest.serialize(compress=False)) return self.manifests[key]