From c15fb9df4d9f12eaa407f4076cdf6deff2a87a9e Mon Sep 17 00:00:00 2001 From: Max Rydahl Andersen Date: Thu, 26 Sep 2024 15:42:47 +0200 Subject: [PATCH] java version --- README.md | 9 ++++- mkbsd.java | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 mkbsd.java diff --git a/README.md b/README.md index 2d34182..7cd8e7a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _Because selling out is bad_ ## How to use -MKBSD comes in two variants! Node.js and Python. +MKBSD comes in two variants! Node.js, Python and Java. ### Running in Node.js @@ -30,6 +30,13 @@ MKBSD comes in two variants! Node.js and Python. 4. Wait a little. 5. All wallpapers are now in a newly created `downloads` subfolder. +### Running in Java w/JBang + +1. Ensure you have JBang installed. +2. Run `jbang mkbsd.java` +3. Wait a little. +4. All wallpapers are now in a newly created `downloads` subfolder. + ## FAQ ### Q: What's the story behind this? diff --git a/mkbsd.java b/mkbsd.java new file mode 100644 index 0000000..d9cf7de --- /dev/null +++ b/mkbsd.java @@ -0,0 +1,104 @@ +//DEPS com.fasterxml.jackson.core:jackson-databind:2.13.3 +//DEPS com.fasterxml.jackson.core:jackson-core:2.13.3 +//DEPS com.fasterxml.jackson.core:jackson-annotations:2.13.3 + +import static java.lang.System.out; +import static java.nio.file.Files.*; +import static java.util.concurrent.TimeUnit.*; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class mkbsd { + + private static final String URL = "https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s"; + private static final HttpClient client = HttpClient.newHttpClient(); + private static final ObjectMapper mapper = new ObjectMapper(); + + public static void main(String[] args) throws Exception { + asciiArt(); + SECONDS.sleep(5); + mainSync(); + } + + private static void mainSync() throws Exception { + var jsonData = fetchJson(URL); + var data = (Map) jsonData.get("data"); + if (data == null) { + throw new RuntimeException("⛔ JSON does not have a 'data' property at its root."); + } + + var downloadDir = Paths.get("downloads"); + if (!exists(downloadDir)) { + createDirectory(downloadDir); + out.println("📁 Created directory: " + downloadDir.toAbsolutePath()); + } + + for (var entry : data.entrySet()) { + if (entry.getValue() instanceof Map && ((Map) entry.getValue()).get("dhd") != null) { + var imageUrl = (String) ((Map) entry.getValue()).get("dhd"); + var parsedUrl = URI.create(imageUrl); + out.println("🔍 Found image URL!"); + + var filename = parsedUrl.getPath().substring(parsedUrl.getPath().lastIndexOf('/')+1); + + var filePath = downloadDir.resolve(filename); + if(!filePath.toFile().exists()) { + downloadImage(imageUrl, filePath); + out.println("🖼️ Saved image to " + filePath); + } else { + out.println("Already saved " + filePath); + } + + MILLISECONDS.sleep(250); + } + } + } + + private static Map fetchJson(String url) throws Exception { + var request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .build(); + + var response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() != 200) { + throw new RuntimeException("⛔ Failed to fetch JSON file: " + response.statusCode()); + } + return mapper.readValue(response.body(), Map.class); + } + + private static void downloadImage(String imageUrl, Path filePath) throws Exception { + var request = HttpRequest.newBuilder() + .uri(URI.create(imageUrl)) + .build(); + + var response = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); + if (response.statusCode() != 200) { + throw new RuntimeException("Failed to download image: " + response.statusCode()); + } + Files.write(filePath, response.body()); + } + + private static void asciiArt() { + out.println(""" + /$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$ +| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$ +| $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$ +| $$ $$/$$ $$| $$$$$/ | $$$$$$$ | $$$$$$ | $$ | $$ +| $$ $$$| $$| $$ $$ | $$__ $$ \\____ $$| $$ | $$ +| $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$ +| $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/ +|__/ |__/|__/ \\__/|_______/ \\______/ |_______/"""); + out.println(""); + out.println("🤑 Starting downloads from your favorite sellout grifter's wallpaper app..."); + } +} \ No newline at end of file