mirror of
https://github.com/nadimkobeissi/mkbsd.git
synced 2024-12-22 09:45:13 +00:00
Added js progress bar | logs save to file
This commit is contained in:
parent
82e50c64f0
commit
9034ea124f
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
.DS_Store
|
||||
downloads
|
||||
logs
|
||||
|
147
mkbsd.js
147
mkbsd.js
@ -3,60 +3,105 @@
|
||||
|
||||
const fs = require(`fs`);
|
||||
const path = require(`path`);
|
||||
const cliProgress = require(`cli-progress`);
|
||||
const colors = require("ansi-colors");
|
||||
|
||||
async function getTotalPics(data) {
|
||||
let totalPics = 0;
|
||||
for (const key in data) {
|
||||
const subproperty = data[key];
|
||||
if (subproperty && subproperty.dhd) {
|
||||
totalPics++;
|
||||
}
|
||||
}
|
||||
return totalPics;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const url = 'https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s';
|
||||
const delay = (ms) => {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(`⛔ Failed to fetch JSON file: ${response.statusText}`);
|
||||
}
|
||||
const jsonData = await response.json();
|
||||
const data = jsonData.data;
|
||||
if (!data) {
|
||||
throw new Error('⛔ JSON does not have a "data" property at its root.');
|
||||
}
|
||||
const downloadDir = path.join(__dirname, 'downloads');
|
||||
if (!fs.existsSync(downloadDir)) {
|
||||
fs.mkdirSync(downloadDir);
|
||||
console.info(`📁 Created directory: ${downloadDir}`);
|
||||
}
|
||||
let fileIndex = 1;
|
||||
for (const key in data) {
|
||||
const subproperty = data[key];
|
||||
if (subproperty && subproperty.dhd) {
|
||||
const imageUrl = subproperty.dhd;
|
||||
console.info(`🔍 Found image URL!`);
|
||||
await delay(100);
|
||||
const ext = path.extname(new URL(imageUrl).pathname) || '.jpg';
|
||||
const filename = `${fileIndex}${ext}`;
|
||||
const filePath = path.join(downloadDir, filename);
|
||||
await downloadImage(imageUrl, filePath);
|
||||
console.info(`🖼️ Saved image to ${filePath}`);
|
||||
fileIndex++;
|
||||
await delay(250);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error: ${error.message}`);
|
||||
}
|
||||
const url =
|
||||
"https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s";
|
||||
const delay = (ms) => {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
};
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(`⛔ Failed to fetch JSON file: ${response.statusText}`);
|
||||
}
|
||||
const jsonData = await response.json();
|
||||
const data = jsonData.data;
|
||||
if (!data) {
|
||||
throw new Error('⛔ JSON does not have a "data" property at its root.');
|
||||
}
|
||||
const downloadDir = path.join(__dirname, "downloads");
|
||||
const logsDir = path.join(__dirname, "logs");
|
||||
if (!fs.existsSync(downloadDir)) {
|
||||
fs.mkdirSync(downloadDir);
|
||||
console.info(`📁 Created directory: ${downloadDir}`);
|
||||
}
|
||||
if (!fs.existsSync(logsDir)) {
|
||||
fs.mkdirSync(logsDir);
|
||||
console.info(`📁 Created logs directory: ${logsDir}`);
|
||||
}
|
||||
const logsFilePath = path.join(logsDir, `logs.txt`);
|
||||
let fileIndex = 1;
|
||||
let totalPictures = await getTotalPics(data);
|
||||
const bar = new cliProgress.SingleBar(
|
||||
{
|
||||
format:
|
||||
"Picture Progress Download |" +
|
||||
colors.cyan("{bar}") +
|
||||
"| {percentage}% || {value}/{total} Pictures",
|
||||
barCompleteChar: "\u2588",
|
||||
barIncompleteChar: "\u2591",
|
||||
hideCursor: true,
|
||||
},
|
||||
cliProgress.Presets.shades_classic
|
||||
);
|
||||
bar.start(totalPictures, 0, {
|
||||
speed: "N/A",
|
||||
});
|
||||
for (const key in data) {
|
||||
const subproperty = data[key];
|
||||
if (subproperty && subproperty.dhd) {
|
||||
const imageUrl = subproperty.dhd;
|
||||
writeLogs(`🔍 Found image URL!`, logsFilePath);
|
||||
await delay(100);
|
||||
const ext = path.extname(new URL(imageUrl).pathname) || ".jpg";
|
||||
const filename = `${fileIndex}${ext}`;
|
||||
const filePath = path.join(downloadDir, filename);
|
||||
await downloadImage(imageUrl, filePath);
|
||||
writeLogs(`🖼️ Saved image to ${filePath}`, logsFilePath);
|
||||
fileIndex++;
|
||||
bar.increment();
|
||||
bar.update();
|
||||
await delay(250);
|
||||
}
|
||||
}
|
||||
bar.stop();
|
||||
console.info(`✅ All done! Saved images to ${downloadDir}`);
|
||||
} catch (error) {
|
||||
console.error(`Error: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function writeLogs(log, logsFilePath) {
|
||||
const buffer = Buffer.from(log + "\n");
|
||||
await fs.promises.appendFile(logsFilePath, buffer);
|
||||
}
|
||||
|
||||
async function downloadImage(url, filePath) {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
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);
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
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() {
|
||||
console.info(`
|
||||
console.info(`
|
||||
/$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$
|
||||
| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$
|
||||
| $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$
|
||||
@ -65,11 +110,13 @@ function asciiArt() {
|
||||
| $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$
|
||||
| $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/
|
||||
|__/ |__/|__/ \\__/|_______/ \\______/ |_______/`);
|
||||
console.info(``);
|
||||
console.info(`🤑 Starting downloads from your favorite sellout grifter's wallpaper app...`);
|
||||
console.info(``);
|
||||
console.info(
|
||||
`🤑 Starting downloads from your favorite sellout grifter's wallpaper app...`
|
||||
);
|
||||
}
|
||||
|
||||
(() => {
|
||||
asciiArt();
|
||||
setTimeout(main, 5000);
|
||||
asciiArt();
|
||||
setTimeout(main, 5000);
|
||||
})();
|
||||
|
Loading…
Reference in New Issue
Block a user