diff --git a/README.md b/README.md
index e56276c1..66ef3428 100644
--- a/README.md
+++ b/README.md
@@ -30,8 +30,6 @@ For information about running the `.jar` file, see [the How To Run wiki](https:/
## [Changelog](https://github.com/ripmeapp/ripme/blob/master/ripme.json) (ripme.json)
-## [Website](http://rip.rarchives.com/)
-
# Features
* Quickly downloads all images in an online album (see supported sites below)
diff --git a/pom.xml b/pom.xml
index 6b7084c8..8ce4b5ae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.rarchives.ripme
ripme
jar
- 1.7.33
+ 1.7.34
ripme
http://rip.rarchives.com
diff --git a/ripme.json b/ripme.json
index 8dc6e2cf..3a07f1b7 100644
--- a/ripme.json
+++ b/ripme.json
@@ -1,6 +1,7 @@
{
- "latestVersion": "1.7.33",
+ "latestVersion": "1.7.34",
"changeList": [
+ "1.7.34: Added Blackbrickroadofoz Ripper; Fixed webtoons regex",
"1.7.33: Instagram ripper no longer errors out when downloading from more than 1 page",
"1.7.32: Instagram ripper update to use new enpoints",
"1.7.31: InstaGram ripper no longer errors out when getting next page",
diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/BlackbrickroadofozRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/BlackbrickroadofozRipper.java
new file mode 100644
index 00000000..76340cf9
--- /dev/null
+++ b/src/main/java/com/rarchives/ripme/ripper/rippers/BlackbrickroadofozRipper.java
@@ -0,0 +1,82 @@
+package com.rarchives.ripme.ripper.rippers;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import com.rarchives.ripme.ripper.AbstractHTMLRipper;
+import com.rarchives.ripme.utils.Http;
+
+public class BlackbrickroadofozRipper extends AbstractHTMLRipper {
+
+ public BlackbrickroadofozRipper(URL url) throws IOException {
+ super(url);
+ }
+
+ @Override
+ public String getHost() {
+ return "blackbrickroadofoz";
+ }
+
+ @Override
+ public String getDomain() {
+ return "blackbrickroadofoz.com";
+ }
+
+ @Override
+ public String getGID(URL url) throws MalformedURLException {
+ Pattern p = Pattern.compile("https?://www.blackbrickroadofoz.com/comic/([a-zA-Z0-9_-]*)/?$");
+ Matcher m = p.matcher(url.toExternalForm());
+ if (m.matches()) {
+ return m.group(1);
+ }
+ throw new MalformedURLException("Expected blackbrickroadofoz URL format: " +
+ "www.blackbrickroadofoz.com/comic/PAGE - got " + url + " instead");
+ }
+
+ @Override
+ public Document getFirstPage() throws IOException {
+ // "url" is an instance field of the superclass
+ return Http.url(url).get();
+ }
+
+ @Override
+ public Document getNextPage(Document doc) throws IOException {
+ sleep(1000);
+ Element elem = doc.select("div[id=topnav] > nav.cc-nav > a.cc-next").first();
+ if (elem == null) {
+ throw new IOException("No more pages");
+ }
+ String nextPage = elem.attr("href");
+ // Some times this returns a empty string
+ // This for stops that
+ if (nextPage == "") {
+ throw new IOException("No more pages");
+ }
+ else {
+ return Http.url(nextPage).get();
+ }
+ }
+
+ @Override
+ public List getURLsFromPage(Document doc) {
+ List result = new ArrayList<>();
+ Element elem = doc.select("div[id=cc-comicbody] > a > img[id=cc-comic]").first();
+ // The site doesn't return properly encoded urls we replace all spaces ( ) with %20
+ result.add(elem.attr("src").replaceAll(" ", "%20"));
+
+ return result;
+ }
+
+ @Override
+ public void downloadURL(URL url, int index) {
+ addURLToDownload(url, getPrefix(index));
+ }
+}
diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/WebtoonsRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/WebtoonsRipper.java
index df373689..de785a44 100644
--- a/src/main/java/com/rarchives/ripme/ripper/rippers/WebtoonsRipper.java
+++ b/src/main/java/com/rarchives/ripme/ripper/rippers/WebtoonsRipper.java
@@ -36,7 +36,7 @@ public class WebtoonsRipper extends AbstractHTMLRipper {
@Override
public boolean canRip(URL url) {
- Pattern pat = Pattern.compile("https?://www.webtoons.com/[a-zA-Z]+/[a-zA-Z]+/([a-zA-Z0-9_-]*)/[a-zA-Z0-9_-]+/\\S*");
+ Pattern pat = Pattern.compile("https?://www.webtoons.com/[a-zA-Z-_]+/[a-zA-Z_-]+/([a-zA-Z0-9_-]*)/[a-zA-Z0-9_-]+/\\S*");
Matcher mat = pat.matcher(url.toExternalForm());
if (mat.matches()) {
return true;
@@ -47,7 +47,7 @@ public class WebtoonsRipper extends AbstractHTMLRipper {
@Override
public String getAlbumTitle(URL url) throws MalformedURLException {
- Pattern pat = Pattern.compile("https?://www.webtoons.com/[a-zA-Z]+/[a-zA-Z]+/([a-zA-Z0-9_-]*)/[a-zA-Z0-9_-]+/\\S*");
+ Pattern pat = Pattern.compile("https?://www.webtoons.com/[a-zA-Z-_]+/[a-zA-Z_-]+/([a-zA-Z0-9_-]*)/[a-zA-Z0-9_-]+/\\S*");
Matcher mat = pat.matcher(url.toExternalForm());
if (mat.matches()) {
return getHost() + "_" + mat.group(1);
diff --git a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java
index e1d579a4..01b6c7eb 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 @@ import com.rarchives.ripme.utils.Utils;
public class UpdateUtils {
private static final Logger logger = Logger.getLogger(UpdateUtils.class);
- private static final String DEFAULT_VERSION = "1.7.33";
+ private static final String DEFAULT_VERSION = "1.7.34";
private static final String REPO_NAME = "ripmeapp/ripme";
private static final String updateJsonURL = "https://raw.githubusercontent.com/" + REPO_NAME + "/master/ripme.json";
private static final String mainFileName = "ripme.jar";
diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/BlackbrickroadofozRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/BlackbrickroadofozRipperTest.java
new file mode 100644
index 00000000..a3c7d862
--- /dev/null
+++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/BlackbrickroadofozRipperTest.java
@@ -0,0 +1,13 @@
+package com.rarchives.ripme.tst.ripper.rippers;
+
+import com.rarchives.ripme.ripper.rippers.BlackbrickroadofozRipper;
+
+import java.io.IOException;
+import java.net.URL;
+
+public class BlackbrickroadofozRipperTest extends RippersTest {
+ public void testRip() throws IOException {
+ BlackbrickroadofozRipper ripper = new BlackbrickroadofozRipper(new URL("http://www.blackbrickroadofoz.com/comic/beginning"));
+ testRipper(ripper);
+ }
+}