mirror of
				https://github.com/nadimkobeissi/mkbsd.git
				synced 2025-11-04 15:55:05 +00:00 
			
		
		
		
	Literally took me 26 minutes to write this
This commit is contained in:
		
							parent
							
								
									c3fb14f17c
								
							
						
					
					
						commit
						8652de12e3
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1 +1,2 @@
 | 
			
		|||
.DS_Store
 | 
			
		||||
downloads
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								README.md
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,37 @@
 | 
			
		|||
# MKBSD
 | 
			
		||||
```
 | 
			
		||||
 /$$      /$$ /$$   /$$ /$$$$$$$   /$$$$$$  /$$$$$$$ 
 | 
			
		||||
| $$$    /$$$| $$  /$$/| $$__  $$ /$$__  $$| $$__  $$
 | 
			
		||||
| $$$$  /$$$$| $$ /$$/ | $$  \ $$| $$  \__/| $$  \ $$
 | 
			
		||||
| $$ $$/$$ $$| $$$$$/  | $$$$$$$ |  $$$$$$ | $$  | $$
 | 
			
		||||
| $$  $$$| $$| $$  $$  | $$__  $$ \____  $$| $$  | $$
 | 
			
		||||
| $$\  $ | $$| $$\  $$ | $$  \ $$ /$$  \ $$| $$  | $$
 | 
			
		||||
| $$ \/  | $$| $$ \  $$| $$$$$$$/|  $$$$$$/| $$$$$$$/
 | 
			
		||||
|__/     |__/|__/  \__/|_______/  \______/ |_______/ 
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Work in progress
 | 
			
		||||
_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 <sam@hocevar.net>
 | 
			
		||||
 | 
			
		||||
 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.
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										76
									
								
								mkbsd.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								mkbsd.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
})();
 | 
			
		||||
		Loading…
	
		Reference in a new issue