← 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));
}