def download_missing(self, asset_id, progress_function=None): ''' Downloads assets specified in 'asset_id' that are not already downloaded ''' asset_info = FileTools.read_json(str(self.get_paths(asset_id)["index"])) asset_list = asset_info["objects"] if not (progress_function == None): progress_function("Finding missing assets", 0) asset_dict = dict() if (self._is_virtual(asset_info)): assets_base_path = self.BASE_PATH.joinpath("virtual/" + asset_id) if not assets_base_path.exists(): for asset_name in asset_list.keys(): asset_url = URL([asset_list[asset_name]["hash"][:2], asset_list[asset_name]["hash"]], URL.RESOURCES) asset_dict[asset_url] = str(assets_base_path.joinpath(asset_name)) else: for asset in asset_list.values(): asset_relative_path = [asset["hash"][:2], asset["hash"]] asset_url = URL(asset_relative_path, URL.RESOURCES) asset_path = self.BASE_PATH.joinpath(*(["objects"] + asset_relative_path)) if not asset_path.exists(): asset_dict[asset_url] = str(asset_path) asset_count = 0 asset_total_count = len(asset_dict) for asset_url in asset_dict.keys(): asset_url_object = asset_url.url_object() FileTools.write_object(asset_dict[asset_url], asset_url_object) asset_count += 1 if not (progress_function == None): progress_function("Downloading assets", asset_count/asset_total_count)
def _communicate(self, endpoint, payload): ''' Endpoint is a string path Payload is a JSON object ''' headers = dict() headers["Content-Type"] = "application/json" headers["User-Agent"] = "YAMCL" url_obj = URL(endpoint, URL.AUTH) server_data = [None, None] try: url_request = url_obj.url_object(JSONTools.serialize_json(payload).encode(OnlineAccount.TEXT_ENCODING), headers) server_data[0] = True try: server_data[1] = JSONTools.read_json(url_request.read().decode(OnlineAccount.TEXT_ENCODING)) except ValueError: server_data[1] = None except urllib.error.HTTPError as http_error: server_data[0] = False try: server_data[1] = JSONTools.read_json(http_error.read().decode(OnlineAccount.TEXT_ENCODING)) except ValueError: server_data[1] = None return server_data
def download_versions(self): ''' Downloads the latest versions.json from the official servers ''' tmp_file_object = URL("versions/versions.json", URL.DOWNLOAD).url_object() self.versions_json = JSONTools.read_json(tmp_file_object.read().decode("UTF-8"))