diff --git a/pom.xml b/pom.xml index 0e5688c7d..e0ab274f6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.rarchives.ripme ripme jar - 1.0.35 + 1.0.36 ripme http://rip.rarchives.com diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/GifyoRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/GifyoRipper.java new file mode 100644 index 000000000..c5a9b074d --- /dev/null +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/GifyoRipper.java @@ -0,0 +1,125 @@ +package com.rarchives.ripme.ripper.rippers; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; +import org.jsoup.Connection.Method; +import org.jsoup.Jsoup; +import org.jsoup.Connection.Response; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import com.rarchives.ripme.ripper.AlbumRipper; +import com.rarchives.ripme.ui.RipStatusMessage.STATUS; + +public class GifyoRipper extends AlbumRipper { + + private static final String DOMAIN = "gifyo.com", + HOST = "gifyo"; + private static final Logger logger = Logger.getLogger(GifyoRipper.class); + + public GifyoRipper(URL url) throws IOException { + super(url); + } + + @Override + public boolean canRip(URL url) { + return (url.getHost().endsWith(DOMAIN)); + } + + @Override + public URL sanitizeURL(URL url) throws MalformedURLException { + Pattern p = Pattern.compile("^https?://gifyo\\.com/([a-zA-Z0-9\\-_]+)/?$"); + Matcher m = p.matcher(url.toExternalForm()); + if (m.matches()) { + return new URL("http://gifyo.com/" + m.group(1) + "/"); + } + throw new MalformedURLException("Expected username in URL (gifyo.com/username/ and not " + url); + } + @Override + public void rip() throws IOException { + int page = 0; + Map cookies = new HashMap(); + while (true) { + this.sendUpdate(STATUS.LOADING_RESOURCE, this.url.toExternalForm() + " (page #" + page + ")"); + logger.info(" Retrieving " + this.url + "(page #" + page + ")"); + Response resp = null; + if (page == 0) { + resp = Jsoup.connect(this.url.toExternalForm()) + .ignoreContentType(true) + .userAgent(USER_AGENT) + .method(Method.GET) + .execute(); + cookies = resp.cookies(); + } + else { + Map postData = new HashMap(); + postData.put("cmd", "refreshData"); + postData.put("view", "gif"); + postData.put("layout", "grid"); + postData.put("page", Integer.toString(page)); + resp = Jsoup.connect(this.url.toExternalForm()) + .ignoreContentType(true) + .userAgent(USER_AGENT) + .data(postData) + .cookies(cookies) + .method(Method.POST) + .execute(); + cookies.putAll(resp.cookies()); + } + Document doc = resp.parse(); + Elements images = doc.select("div.gif img"); + logger.info("Found " + images.size() + " images"); + for (Element image : images) { + String imageUrl = image.attr("src"); + if (imageUrl.startsWith("//")) { + imageUrl = "http:" + imageUrl; + } + imageUrl = imageUrl.replace("/medium/", "/large/"); + imageUrl = imageUrl.replace("_s.gif", ".gif"); + addURLToDownload(new URL(imageUrl)); + } + if (images.size() == 0) { + if (doc.html().contains("profile is private")) { + sendUpdate(STATUS.RIP_ERRORED, "User has private profile"); + throw new IOException("User has private profile"); + } + else { + logger.info("Page " + page + " has 0 images"); + } + break; + } + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + logger.error("[!] Interrupted while waiting to load next album:", e); + break; + } + page++; + } + waitForThreads(); + } + + @Override + public String getHost() { + return HOST; + } + + @Override + public String getGID(URL url) throws MalformedURLException { + Pattern p = Pattern.compile("^https?://[w.]*gifyo.com/([a-zA-Z0-9\\-_]+)/?$"); + Matcher m = p.matcher(url.toExternalForm()); + if (m.matches()) { + return m.group(1); + } + throw new MalformedURLException("Gifyo user not found in " + url + ", expected http://gifyo.com/username"); + } + +} diff --git a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java index 6df993d46..b62ad0db1 100644 --- a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java +++ b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java @@ -21,7 +21,7 @@ public class UpdateUtils { private static final Logger logger = Logger.getLogger(UpdateUtils.class); - private static final String DEFAULT_VERSION = "1.0.35"; + private static final String DEFAULT_VERSION = "1.0.36"; private static final String updateJsonURL = "http://rarchives.com/ripme.json"; private static final String updateJarURL = "http://rarchives.com/ripme.jar"; private static final String mainFileName = "ripme.jar";