diff --git a/.gitignore b/.gitignore index e43b0f9..de2b2c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +downloads diff --git a/README.md b/README.md index 5b98a59..57a3689 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,37 @@ -# MKBSD +``` + /$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ +| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$ +| $$$$ /$$$$| $$ /$$/ | $$ \ $$| $$ \__/| $$ \ $$ +| $$ $$/$$ $$| $$$$$/ | $$$$$$$ | $$$$$$ | $$ | $$ +| $$ $$$| $$| $$ $$ | $$__ $$ \____ $$| $$ | $$ +| $$\ $ | $$| $$\ $$ | $$ \ $$ /$$ \ $$| $$ | $$ +| $$ \/ | $$| $$ \ $$| $$$$$$$/| $$$$$$/| $$$$$$$/ +|__/ |__/|__/ \__/|_______/ \______/ |_______/ +``` -Work in progress \ No newline at end of file +_Because selling out is bad_ + +## How to use + +1. Ensure you have Node.js installed. +2. Run `node mkbsd.js` +3. Wait a little. +4. All wallpapers are now in a newly created `downloads` subfolder. + +## License + +``` + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. +``` \ No newline at end of file diff --git a/mkbsd.js b/mkbsd.js new file mode 100644 index 0000000..b400476 --- /dev/null +++ b/mkbsd.js @@ -0,0 +1,76 @@ +// Copyright 2024 Nadim Kobeissi +// Licensed under the WTFPL License + +const fs = require(`fs`); +const path = require(`path`); + +async function main() { + const url = 'https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s'; + 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; + function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + 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}`); + } +} + +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); +} + +function asciiArt() { + console.info(` + /$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ +| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$ +| $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$ +| $$ $$/$$ $$| $$$$$/ | $$$$$$$ | $$$$$$ | $$ | $$ +| $$ $$$| $$| $$ $$ | $$__ $$ \\____ $$| $$ | $$ +| $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$ +| $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/ +|__/ |__/|__/ \\__/|_______/ \\______/ |_______/`); + console.info(``); + console.info(`🤑 Starting downloads from your favorite sellout grifter's wallpaper app...`); +} + +(() => { + asciiArt(); + setTimeout(main, 5000); +})();