137 async
downloadMaterialAsset(assetId, imageFormat =
'PNG', imageResolution =
'1', downloadAttributeKey =
'downloadAttribute', downloadLinkKey =
'downloadLink') {
152 let downloadAttribute =
'';
154 items.forEach(item => {
155 downloadAttribute = item[downloadAttributeKey];
156 if (downloadAttribute === target) {
157 url = item[downloadLinkKey];
158 this.logger.info(`Found Asset: ${assetId}. Download Attribute: ${downloadAttribute} -> ${url}`);
163 this.logger.error(`No download link found
for asset: ${assetId}, attribute: ${target}`);
167 this.downloadMaterialFileName = url.split(
'file=')[1];
170 const response = await fetch(url);
172 throw new Error(`HTTP error! Status: ${response.status}`);
176 const arrayBuffer = await response.arrayBuffer();
179 this.downloadMaterial = Buffer.from(arrayBuffer);
180 this.logger.info(`Material file downloaded: ${this.downloadMaterialFileName}`);
183 this.downloadMaterialFileName =
'';
184 this.logger.error(`Error occurred
while downloading the file: ${error}`);
187 return this.downloadMaterialFileName;
219 let haveMaterials =
false;
220 const MATERIALS_CACHE_FILE =
'ambientcg_materials.json';
222 if (fs.existsSync(MATERIALS_CACHE_FILE)) {
224 const data = fs.readFileSync(MATERIALS_CACHE_FILE,
'utf8');
225 this.materials = JSON.parse(data);
226 this.logger.info(`Loaded AmbientCG materials from cache: ${MATERIALS_CACHE_FILE}`);
227 haveMaterials =
true;
229 this.logger.warn(`Failed to load AmbientCG materials cache: ${e.message}`);
236 const headers = { Accept:
'application/csv' };
237 const url =
new URL(
'https://ambientCG.com/api/v2/downloads_csv');
238 url.searchParams.append(
'method',
'PBRPhotogrammetry');
239 url.searchParams.append(
'type',
'Material');
240 url.searchParams.append(
'sort',
'Alphabet');
242 this.logger.info(
'Downloading materials CSV list from network...');
244 const response = await fetch(url, { headers });
245 if (response.status === 200) {
246 const csvContent = await response.text();
247 this.csvMaterials = csvContent;
248 this.materials = parse(csvContent, { columns:
true });
249 this.logger.info(
'Downloaded CSV material list as JSON.');
251 this.materials =
null;
252 this.logger.warning(`Failed to fetch the CSV material content. HTTP status code: ${response.status}`);
255 this.materials =
null;
256 this.logger.error(`Error downloading materials list: ${error}`);
261 const have_database = this.database && Object.keys(this.database).length > 0;
263 for (let material of this.materials) {
264 const assetId = material.assetId;
265 const databaseEntry = this.database.find(entry => entry.assetId === assetId);
269 if (databaseEntry.previewImage && typeof databaseEntry.previewImage ===
'object') {
270 preview = databaseEntry.previewImage[
'256-PNG'] ||
'';
272 material.displayCategory = databaseEntry.displayCategory;
273 material.previewImage = preview;
274 material.tags = databaseEntry.tags;
277 this.logger.warn(
'No database entry found for assetId:', assetId);
285 fs.writeFileSync(MATERIALS_CACHE_FILE, JSON.stringify(
this.materials,
null, 2));
286 this.logger.info(`Saved AmbientCG materials to cache: ${MATERIALS_CACHE_FILE}`);
288 this.logger.warn(`Failed to write AmbientCG materials cache: ${e.message}`);
295 return this.materials;
313 haveDatabase =
false;
314 const MATERIALS_DATABASE_FILE =
'ambientcg_database.json';
315 if (fs.existsSync(MATERIALS_DATABASE_FILE)) {
317 const data = fs.readFileSync(MATERIALS_DATABASE_FILE,
'utf8');
318 this.database = JSON.parse(data);
319 this.logger.info(`Loaded AmbientCG database from file: ${MATERIALS_DATABASE_FILE}`);
322 this.logger.warn(`Failed to load AmbientCG database from file: ${e.message}`);
330 const headers = { Accept:
'application/json' };
331 let url =
new URL(
'https://ambientcg.com/api/v2/full_json');
332 url.searchParams.append(
'method',
'PBRPhotogrammetry');
333 url.searchParams.append(
'type',
'Material');
334 url.searchParams.append(
'sort',
'Alphabet');
335 url.searchParams.append(
'limit', limit);
336 url.searchParams.append(
'offset', 0);
337 url.searchParams.append(
'include',
'tagData,previewData')
339 let numberOfResults = -1;
344 while (numberOfResults === -1 || offset < numberOfResults) {
345 this.logger.info(`Downloading asset database from: ${url.toString()}`);
348 const response = await fetch(url, { headers });
349 if (response.status === 200) {
350 const data = await response.json();
351 this.logger.info(`Downloaded data at offset ${offset}. ${data.foundAssets.length} assets found.`);
355 let reduced_assets = data.foundAssets.map(asset => {
357 assetId: asset.assetId,
358 displayCategory: asset.displayCategory,
359 previewImage: asset.previewImage,
363 asset_list = asset_list.concat(reduced_assets);
365 if (numberOfResults === -1) {
366 numberOfResults = data.numberOfResults;
369 if (!data.nextPageHttp)
373 offset = offset + limit;
375 url.searchParams.set(
'offset', offset);
377 this.logger.error(`Status: ${response.status}, ${response.data}`);
381 this.logger.error(`Error downloading asset database: ${error}`);
385 this.database = asset_list;
391 return this.database;