← back to Animate Museum Posts
src/fetchArtwork.js
148 lines
import axios from 'axios';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import dotenv from 'dotenv';
dotenv.config();
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const FAMOUS_ARTWORKS = [
{
title: 'The Night Watch',
artist: 'Rembrandt van Rijn',
year: '1642',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/The_Night_Watch_-_HD.jpg/1920px-The_Night_Watch_-_HD.jpg'
},
{
title: 'Girl with a Pearl Earring',
artist: 'Johannes Vermeer',
year: '1665',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/1665_Girl_with_a_Pearl_Earring.jpg/800px-1665_Girl_with_a_Pearl_Earring.jpg'
},
{
title: 'The Starry Night',
artist: 'Vincent van Gogh',
year: '1889',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg/1920px-Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg'
},
{
title: 'The Great Wave off Kanagawa',
artist: 'Katsushika Hokusai',
year: '1831',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/The_Great_Wave_off_Kanagawa.jpg/1920px-The_Great_Wave_off_Kanagawa.jpg'
},
{
title: 'The Birth of Venus',
artist: 'Sandro Botticelli',
year: '1485',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Sandro_Botticelli_-_La_nascita_di_Venere_-_Google_Art_Project_-_edited.jpg/1920px-Sandro_Botticelli_-_La_nascita_di_Venere_-_Google_Art_Project_-_edited.jpg'
},
{
title: 'The Garden of Earthly Delights',
artist: 'Hieronymus Bosch',
year: '1515',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/El_jard%C3%ADn_de_las_Delicias%2C_de_El_Bosco.jpg/1920px-El_jard%C3%ADn_de_las_Delicias%2C_de_El_Bosco.jpg'
},
{
title: 'Las Meninas',
artist: 'Diego Velázquez',
year: '1656',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Las_Meninas%2C_by_Diego_Vel%C3%A1zquez%2C_from_Prado_in_Google_Earth.jpg/1200px-Las_Meninas%2C_by_Diego_Vel%C3%A1zquez%2C_from_Prado_in_Google_Earth.jpg'
},
{
title: 'The Arnolfini Portrait',
artist: 'Jan van Eyck',
year: '1434',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Van_Eyck_-_Arnolfini_Portrait.jpg/800px-Van_Eyck_-_Arnolfini_Portrait.jpg'
},
{
title: 'Sunflowers',
artist: 'Vincent van Gogh',
year: '1888',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Vincent_Willem_van_Gogh_127.jpg/800px-Vincent_Willem_van_Gogh_127.jpg'
},
{
title: 'The Milkmaid',
artist: 'Johannes Vermeer',
year: '1658',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Johannes_Vermeer_-_Het_melkmeisje_-_Google_Art_Project.jpg/800px-Johannes_Vermeer_-_Het_melkmeisje_-_Google_Art_Project.jpg'
},
{
title: 'Liberty Leading the People',
artist: 'Eugène Delacroix',
year: '1830',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Eug%C3%A8ne_Delacroix_-_Le_28_Juillet._La_Libert%C3%A9_guidant_le_peuple.jpg/1920px-Eug%C3%A8ne_Delacroix_-_Le_28_Juillet._La_Libert%C3%A9_guidant_le_peuple.jpg'
},
{
title: 'Wanderer above the Sea of Fog',
artist: 'Caspar David Friedrich',
year: '1818',
imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Caspar_David_Friedrich_-_Wanderer_above_the_sea_of_fog.jpg/800px-Caspar_David_Friedrich_-_Wanderer_above_the_sea_of_fog.jpg'
}
];
export async function fetchRandomArtwork() {
try {
const randomArtwork = FAMOUS_ARTWORKS[Math.floor(Math.random() * FAMOUS_ARTWORKS.length)];
console.log(`Fetching: ${randomArtwork.title} by ${randomArtwork.artist}...`);
const response = await axios.get(randomArtwork.imageUrl, {
responseType: 'arraybuffer',
headers: {
'User-Agent': 'Mozilla/5.0 (compatible; MuseumBot/1.0; +https://github.com/museum-bot)',
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8'
},
maxRedirects: 5,
timeout: 30000
});
if (!response.data || response.data.length < 1000) {
throw new Error('Failed to download image');
}
const outputDir = path.join(__dirname, '..', 'output');
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
const timestamp = new Date().getTime();
const fileName = `artwork_${timestamp}.jpg`;
const filePath = path.join(outputDir, fileName);
fs.writeFileSync(filePath, response.data);
const metadata = {
title: randomArtwork.title,
artist: randomArtwork.artist,
year: randomArtwork.year,
description: `${randomArtwork.title} is a masterpiece created by ${randomArtwork.artist} in ${randomArtwork.year}. This artwork is now in the public domain and represents a significant contribution to art history.`,
objectNumber: `PD-${timestamp}`,
imageUrl: randomArtwork.imageUrl,
localPath: filePath,
fileName: fileName,
museum: 'Public Domain Collection',
creditLine: `${randomArtwork.artist} (Public Domain)`,
dimensions: []
};
const metadataPath = path.join(outputDir, `metadata_${timestamp}.json`);
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
console.log(`Artwork fetched: ${metadata.title} by ${metadata.artist}`);
return metadata;
} catch (error) {
console.error('Error fetching artwork:', error.message);
throw error;
}
}
if (process.argv[1] === fileURLToPath(import.meta.url)) {
fetchRandomArtwork()
.then(metadata => console.log('Success:', metadata))
.catch(error => console.error('Failed:', error));
}