diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..e418cf1 --- /dev/null +++ b/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..f455051 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + ImgurLibrary + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/src/ImgurRequest.java b/src/ImgurRequest.java new file mode 100644 index 0000000..fd41f8e --- /dev/null +++ b/src/ImgurRequest.java @@ -0,0 +1,231 @@ +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.sql.Connection; +import java.util.Iterator; + +import org.apache.commons.io.IOUtils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * now you need to have an instance. + * because only one request at a time. + * new request? new instance. + * later, TODO, make there be a busy + * variable or something. + * @author Marcus + * + */ +public class ImgurRequest { + + // used if no path is pre specified. + private String baseDir = System.getenv("USERPROFILE") + "\\Desktop\\Imgur\\"; + + // my personal API key so i can access imgur api and stuff + private String CLIENT_ID = "76535d44f1f94da"; + + //to track progress + //prediction because divide by zero errors are infectious + private volatile int totalImages = 0, imagesComplete = 0, predictedTotal = 1; + + //busy? ornahhhh + private boolean busy = false; + + //have we scanned all the pages in the current request? + private boolean scannedAllPages = true; + + //title so this can have a label + private String title = ""; + + // sort is usually time but i thought i'd be nice to yall. + public void saveSubreddit(final String subreddit, final int pages, final String sort) { + totalImages = imagesComplete = 0; + scannedAllPages = false; + busy = true; + predictedTotal = pages * 60; + title = subreddit; + new Thread(new Runnable() {public void run() { + + // https://api.imgur.com/3/gallery/r/{subreddit}/{sort}/{page} + for (int page = 0; page < pages; page++) { + try { + String path = "https://api.imgur.com/3/gallery/r/" + subreddit + "/" + sort + "/" + page + ".json"; + + HttpURLConnection connection = (HttpURLConnection) ((new URL(path)).openConnection()); + + connection.setRequestMethod("GET"); + connection.addRequestProperty("Authorization", "client-id " + CLIENT_ID); + connection.connect(); + + if(connection.getResponseCode() == 200) { + + InputStream response = connection.getInputStream(); + saveImages(response); + + }else{ + title = "error code " + connection.getResponseCode(); + busy = false; + } + + scannedAllPages = true; + + } catch (Exception e) { + e.printStackTrace(); + busy = false; + } + } + + }}).start(); + + + } + + public void saveImages(final InputStream response) { + new Thread(new Runnable() { + public void run() { + try { + ObjectMapper om = new ObjectMapper(); + + JsonNode root; + + root = om.readTree(response); + + JsonNode imagesNode = root.get("data"); + Iterator imagesIterator = imagesNode.iterator(); + + // count em up first + int images = 0; + while (imagesIterator.hasNext()) { + images++; + imagesIterator.next(); + } + totalImages += images; + imagesIterator = imagesNode.iterator(); + + int imageCounter = 1; + while (imagesIterator.hasNext()) { + + JsonNode item = imagesIterator.next(); + + String id = item.get("id").asText(); + // boolean album = item.get("is_album").asBoolean(); + int fileSize = item.get("size").asInt(); + + String extension = item.get("type").asText(); + extension = parseExtension(extension); + + String subreddit = item.get("section").asText(); + + saveID(id, subreddit + "\\", extension, fileSize); + + imagesComplete ++; + + imageCounter++; + } + + if(imagesComplete == totalImages) { + busy = false; + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + } + + private String parseExtension(String ext) { + if (ext.equals("image/jpeg")) { + return ".jpg"; + } + if (ext.equals("image/png")) { + return ".png"; + } + if (ext.equals("image/gif")) { + return ".gif"; + } + // eventually fill this with all possible cases + // nvm, i think this is all cases. + return ".jpg"; + } + + public void saveID(String hash, String subfolder, String extension, int filesize) { + try { + + // make sure our directories exist no matter what + new File(baseDir + subfolder).mkdirs(); + new File(baseDir + "backgrounds\\" + subfolder).mkdirs(); + + // if we haven't fully saved this yet... + if (!(new File(baseDir + subfolder + hash + extension).length() == filesize)) { + InputStream in = new URL("http://i.imgur.com/" + hash + extension).openConnection().getInputStream(); + OutputStream out = new FileOutputStream(baseDir + subfolder + hash + extension); + copy(in, out); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println(hash); + System.out.println(extension); + System.out.println("" + filesize); + } + } + + /** + * to copy one stream thing to another stream thing. it goes sanic fast. + * + * @param input + * @param output + */ + private void copy(InputStream input, OutputStream output) { + try { + IOUtils.copy(input, output); + } catch (Exception e) { + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + } + } + if (output != null) { + try { + output.close(); + } catch (IOException e) { + } + } + } + } + + + public double getProgress() { + return scannedAllPages ? (double)imagesComplete/(double)totalImages : (double)imagesComplete/(double)predictedTotal; + } + + public int getImagesDiscovered() { + return totalImages; + } + + public int getImagesDownloaded() { + return imagesComplete; + } + + public String getTitle() { + return title; + } + + public boolean isBusy() { + return busy; + } + + // you deserve a break + // Eugenia Suarez + // Mery del Cerro + // google them for a good time +}