Refactor download_image function to support replacing existing files for NodeJS

This commit is contained in:
Aholicknight 2024-09-28 03:07:51 -06:00
parent 2d51a5242e
commit d4a9423d69

136
mkbsd.js
View File

@ -1,62 +1,67 @@
// Copyright 2024 Nadim Kobeissi // Copyright 2024 Nadim Kobeissi
// Licensed under the WTFPL License // Licensed under the WTFPL License
const fs = require(`fs`); const fs = require('fs');
const path = require(`path`); const path = require('path');
const readline = require('readline');
async function main() { async function main(replaceExisting) {
const url = 'https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s'; const url = 'https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s';
const delay = (ms) => { const delay = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
} }
try { try {
const response = await fetch(url); const response = await fetch(url);
if (!response.ok) { if (!response.ok) {
throw new Error(`⛔ Failed to fetch JSON file: ${response.statusText}`); throw new Error(`⛔ Failed to fetch JSON file: ${response.statusText}`);
} }
const jsonData = await response.json(); const jsonData = await response.json();
const data = jsonData.data; const data = jsonData.data;
if (!data) { if (!data) {
throw new Error('⛔ JSON does not have a "data" property at its root.'); throw new Error('⛔ JSON does not have a "data" property at its root.');
} }
const downloadDir = path.join(__dirname, 'downloads'); const downloadDir = path.join(__dirname, 'downloads');
if (!fs.existsSync(downloadDir)) { if (!fs.existsSync(downloadDir)) {
fs.mkdirSync(downloadDir); fs.mkdirSync(downloadDir);
console.info(`📁 Created directory: ${downloadDir}`); console.info(`📁 Created directory: ${downloadDir}`);
} }
let fileIndex = 1; let fileIndex = 1;
for (const key in data) { for (const key in data) {
const subproperty = data[key]; const subproperty = data[key];
if (subproperty && subproperty.dhd) { if (subproperty && subproperty.dhd) {
const imageUrl = subproperty.dhd; const imageUrl = subproperty.dhd;
console.info(`🔍 Found image URL!`); console.info(`🔍 Found image URL!`);
await delay(100); await delay(100);
const ext = path.extname(new URL(imageUrl).pathname) || '.jpg'; const ext = path.extname(new URL(imageUrl).pathname) || '.jpg';
const filename = `${fileIndex}${ext}`; const filename = `${fileIndex}${ext}`;
const filePath = path.join(downloadDir, filename); const filePath = path.join(downloadDir, filename);
await downloadImage(imageUrl, filePath); await downloadImage(imageUrl, filePath, replaceExisting);
console.info(`🖼️ Saved image to ${filePath}`); console.info(`🖼️ Saved image to ${filePath}`);
fileIndex++; fileIndex++;
await delay(250); await delay(250);
} }
} }
} catch (error) { } catch (error) {
console.error(`Error: ${error.message}`); console.error(`Error: ${error.message}`);
} }
} }
async function downloadImage(url, filePath) { async function downloadImage(url, filePath, replaceExisting) {
const response = await fetch(url); if (!replaceExisting && fs.existsSync(filePath)) {
if (!response.ok) { console.info(`⚠️ File ${filePath} already exists. Skipping download.`);
throw new Error(`Failed to download image: ${response.statusText}`); return;
} }
const arrayBuffer = await response.arrayBuffer(); const response = await fetch(url);
const buffer = Buffer.from(arrayBuffer); if (!response.ok) {
await fs.promises.writeFile(filePath, buffer); throw new Error(`Failed to download image: ${response.statusText}`);
}
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
await fs.promises.writeFile(filePath, buffer);
} }
function asciiArt() { function asciiArt() {
console.info(` console.info(`
/$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$
| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$ | $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$
| $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$ | $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$
@ -65,11 +70,32 @@ function asciiArt() {
| $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$ | $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$
| $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/ | $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/
|__/ |__/|__/ \\__/|_______/ \\______/ |_______/`); |__/ |__/|__/ \\__/|_______/ \\______/ |_______/`);
console.info(``); console.info(``);
console.info(`🤑 Starting downloads from your favorite sellout grifter's wallpaper app...`); console.info(`🤑 Starting downloads from your favorite sellout grifter's wallpaper app...`);
} }
(() => { function promptUser() {
asciiArt(); return new Promise((resolve) => {
setTimeout(main, 5000); const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Files already exist in the 'downloads' directory.\n1. Skip existing files and download new ones.\n2. Replace existing files and download all.\nEnter your choice (1 or 2): ", (answer) => {
rl.close();
resolve(answer === '2');
});
});
}
(async () => {
asciiArt();
await new Promise(resolve => setTimeout(resolve, 5000));
const downloadDir = path.join(__dirname, 'downloads');
let replaceExisting = true;
if (fs.existsSync(downloadDir) && fs.readdirSync(downloadDir).length > 0) {
replaceExisting = await promptUser();
}
await main(replaceExisting);
})(); })();