first
parent
0e057cb39a
commit
cecab97afa
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jackson-core-2.2.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jackson-databind-2.2.3.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jna-4.1.0.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-lang3-3.3.2.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jackson-annotations-2.2.3 (1).jar"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>ImgurLibrary</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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<JsonNode> 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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue