diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index bb44b0c8..b48244ed 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -9,7 +9,11 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] - java: [1.8, 1.14] + java: [1.8] + include: # test newest java on one os only + - os: ubuntu-latest + java: 1.15 + steps: - uses: actions/checkout@v1 diff --git a/build.gradle.kts b/build.gradle.kts index 5572205f..cc164234 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,6 +35,7 @@ java { } tasks.withType { + duplicatesStrategy = DuplicatesStrategy.INCLUDE manifest { attributes["Main-Class"] = "com.rarchives.ripme.App" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2a563242..d8442f55 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/pom.xml b/pom.xml index 37136d8e..15b06823 100644 --- a/pom.xml +++ b/pom.xml @@ -132,7 +132,7 @@ org.jacoco jacoco-maven-plugin - 0.8.5 + 0.8.6 prepare-agent diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/DrawcrowdRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/DrawcrowdRipper.java deleted file mode 100644 index 521bc7c4..00000000 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/DrawcrowdRipper.java +++ /dev/null @@ -1,91 +0,0 @@ -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 org.jsoup.select.Elements; - -import com.rarchives.ripme.ripper.AbstractHTMLRipper; -import com.rarchives.ripme.utils.Http; - -public class DrawcrowdRipper extends AbstractHTMLRipper { - - public DrawcrowdRipper(URL url) throws IOException { - super(url); - } - - @Override - public String getHost() { - return "drawcrowd"; - } - @Override - public String getDomain() { - return "drawcrowd.com"; - } - - @Override - public String getGID(URL url) throws MalformedURLException { - Pattern p; Matcher m; - - p = Pattern.compile("^.*drawcrowd.com/projects/.*$"); - m = p.matcher(url.toExternalForm()); - if (m.matches()) { - throw new MalformedURLException("Cannot rip drawcrowd.com/projects/ pages"); - } - - p = Pattern.compile("^.*drawcrowd.com/([a-zA-Z0-9\\-_]+).*$"); - m = p.matcher(url.toExternalForm()); - if (m.matches()) { - return m.group(1); - } - - throw new MalformedURLException( - "Expected drawcrowd.com gallery format: " - + "drawcrowd.com/username" - + " Got: " + url); - } - - @Override - public Document getFirstPage() throws IOException { - return Http.url(this.url).get(); - } - - @Override - public Document getNextPage(Document doc) throws IOException { - Elements loadMore = doc.select("a#load-more"); - if (loadMore.isEmpty()) { - throw new IOException("No next page found"); - } - if (!sleep(1000)) { - throw new IOException("Interrupted while waiting for next page"); - } - String nextPage = "http://drawcrowd.com" + loadMore.get(0).attr("href"); - return Http.url(nextPage).get(); - } - - @Override - public List getURLsFromPage(Document page) { - List imageURLs = new ArrayList<>(); - for (Element thumb : page.select("div.item.asset img")) { - String image = thumb.attr("src"); - image = image - .replaceAll("/medium/", "/large/") - .replaceAll("/small/", "/large/"); - imageURLs.add(image); - } - return imageURLs; - } - - @Override - public void downloadURL(URL url, int index) { - addURLToDownload(url, getPrefix(index)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/PorncomixDotOneRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/PorncomixDotOneRipper.java deleted file mode 100644 index c1e7fac7..00000000 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/PorncomixDotOneRipper.java +++ /dev/null @@ -1,68 +0,0 @@ -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 PorncomixDotOneRipper extends AbstractHTMLRipper { - - public PorncomixDotOneRipper(URL url) throws IOException { - super(url); - } - - @Override - public String getHost() { - return "porncomix"; - } - - @Override - public String getDomain() { - return "porncomix.one"; - } - - @Override - public String getGID(URL url) throws MalformedURLException { - Pattern p = Pattern.compile("https?://www.porncomix.one/gallery/([a-zA-Z0-9_\\-]*)/?$"); - Matcher m = p.matcher(url.toExternalForm()); - if (m.matches()) { - return m.group(1); - } - throw new MalformedURLException("Expected proncomix URL format: " + - "porncomix.one/gallery/comic - got " + url + " instead"); - } - - @Override - public Document getFirstPage() throws IOException { - // "url" is an instance field of the superclass - return Http.url(url).get(); - } - - @Override - public List getURLsFromPage(Document doc) { - List result = new ArrayList<>(); - // We have 2 loops here to cover all the different album types - for (Element el : doc.select(".dgwt-jg-item > a")) { - result.add(el.attr("href")); - } - for (Element el : doc.select(".unite-gallery > img")) { - result.add(el.attr("data-image")); - - } - return result; - } - - @Override - public void downloadURL(URL url, int index) { - addURLToDownload(url, getPrefix(index)); - } -} \ No newline at end of file diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index 92b8071c..48e8d836 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -1183,13 +1183,15 @@ public final class MainWindow implements Runnable, RipStatusHandler { // Guess rip history based on rip folder String[] dirs = Utils.getWorkingDirectory() .list((dir, file) -> new File(dir.getAbsolutePath() + File.separator + file).isDirectory()); - for (String dir : dirs) { - String url = RipUtils.urlFromDirectoryName(dir); - if (url != null) { - // We found one, add it to history - HistoryEntry entry = new HistoryEntry(); - entry.url = url; - HISTORY.add(entry); + if (dirs != null) { + for (String dir : dirs) { + String url = RipUtils.urlFromDirectoryName(dir); + if (url != null) { + // We found one, add it to history + HistoryEntry entry = new HistoryEntry(); + entry.url = url; + HISTORY.add(entry); + } } } } diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/AerisdiesRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/AerisdiesRipperTest.java index d3166240..c4c2a7a8 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/AerisdiesRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/AerisdiesRipperTest.java @@ -6,16 +6,19 @@ import java.net.URL; import com.rarchives.ripme.ripper.rippers.AerisdiesRipper; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class AerisdiesRipperTest extends RippersTest { @Test + @Tag("flaky") public void testAlbum() throws IOException { AerisdiesRipper ripper = new AerisdiesRipper(new URL("http://www.aerisdies.com/html/lb/alb_1097_1.html")); testRipper(ripper); } @Test + @Tag("flaky") public void testSubAlbum() throws IOException { AerisdiesRipper ripper = new AerisdiesRipper(new URL("http://www.aerisdies.com/html/lb/alb_3692_1.html")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtStationRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtStationRipperTest.java index d7cf6cdf..e29a32ed 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtStationRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtStationRipperTest.java @@ -7,12 +7,13 @@ import java.util.List; import com.rarchives.ripme.ripper.rippers.ArtStationRipper; -import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class ArtStationRipperTest extends RippersTest { @Test + @Tag("flaky") public void testArtStationProjects() throws IOException { List contentURLs = new ArrayList<>(); contentURLs.add(new URL("https://www.artstation.com/artwork/the-dwarf-mortar")); @@ -25,7 +26,7 @@ public class ArtStationRipperTest extends RippersTest { } @Test - @Disabled("Failed with cloudflare protection") + @Tag("flaky") public void testArtStationUserProfiles() throws IOException { List contentURLs = new ArrayList<>(); contentURLs.add(new URL("https://www.artstation.com/heitoramatsu")); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/DrawcrowdRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/DrawcrowdRipperTest.java deleted file mode 100644 index b326d365..00000000 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/DrawcrowdRipperTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.rarchives.ripme.tst.ripper.rippers; - -import java.io.IOException; -import java.net.URL; - -import com.rarchives.ripme.ripper.rippers.DrawcrowdRipper; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -public class DrawcrowdRipperTest extends RippersTest { - @Test - @Disabled("https://github.com/RipMeApp/ripme/issues/304 -- Drawcrowd broken (site changed)") - public void testRip() throws IOException { - DrawcrowdRipper ripper = new DrawcrowdRipper(new URL("https://drawcrowd.com/rabbiteyes")); - testRipper(ripper); - } - -} diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/Hentai2readRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/Hentai2readRipperTest.java index f448f0de..c6e2d3de 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/Hentai2readRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/Hentai2readRipperTest.java @@ -4,10 +4,12 @@ import java.io.IOException; import java.net.URL; import com.rarchives.ripme.ripper.rippers.Hentai2readRipper; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class Hentai2readRipperTest extends RippersTest { @Test + @Tag("flaky") public void testHentai2readAlbum() throws IOException { Hentai2readRipper ripper = new Hentai2readRipper(new URL("https://hentai2read.com/sm_school_memorial/1/")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentaicafeRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentaicafeRipperTest.java index 9c922260..555c2662 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentaicafeRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentaicafeRipperTest.java @@ -4,16 +4,19 @@ import java.io.IOException; import java.net.URL; import com.rarchives.ripme.ripper.rippers.HentaiCafeRipper; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class HentaicafeRipperTest extends RippersTest { @Test + @Tag("flaky") public void testHentaiCafeAlbum() throws IOException { HentaiCafeRipper ripper = new HentaiCafeRipper(new URL("https://hentai.cafe/kikuta-the-oni-in-the-room/")); testRipper(ripper); } // This album has a line break (
) in the url. Test it to make sure ripme can handle these invalid urls @Test + @Tag("flaky") public void testAlbumWithInvalidChars() throws IOException { HentaiCafeRipper ripper = new HentaiCafeRipper(new URL("https://hentai.cafe/chobipero-club/")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentainexusRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentainexusRipperTest.java index a244276c..00340eba 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentainexusRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/HentainexusRipperTest.java @@ -8,10 +8,12 @@ import java.util.List; import com.rarchives.ripme.ripper.rippers.HentaiNexusRipper; import org.json.JSONObject; import org.junit.Assert; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class HentainexusRipperTest extends RippersTest { @Test + @Tag("flaky") public void testHentaiNexusJson() throws IOException { List testURLs = new ArrayList<>(); testURLs.add(new URL("https://hentainexus.com/view/9202")); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ImagebamRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ImagebamRipperTest.java index efe57b96..5ecfe3f6 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ImagebamRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ImagebamRipperTest.java @@ -4,10 +4,12 @@ import java.io.IOException; import java.net.URL; import com.rarchives.ripme.ripper.rippers.ImagebamRipper; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class ImagebamRipperTest extends RippersTest { @Test + @Tag("flaky") public void testImagebamRip() throws IOException { ImagebamRipper ripper = new ImagebamRipper(new URL("http://www.imagebam.com/gallery/488cc796sllyf7o5srds8kpaz1t4m78i")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MotherlessRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MotherlessRipperTest.java index 2739f9da..97f48a5f 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MotherlessRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MotherlessRipperTest.java @@ -5,10 +5,12 @@ import java.net.URL; import com.rarchives.ripme.ripper.rippers.MotherlessRipper; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class MotherlessRipperTest extends RippersTest { @Test + @Tag("flaky") public void testMotherlessAlbumRip() throws IOException { MotherlessRipper ripper = new MotherlessRipper(new URL("https://motherless.com/G1168D90")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/NhentaiRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/NhentaiRipperTest.java index b7e1a968..a1872703 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/NhentaiRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/NhentaiRipperTest.java @@ -7,6 +7,7 @@ import java.util.List; import com.rarchives.ripme.ripper.rippers.NhentaiRipper; import com.rarchives.ripme.utils.RipUtils; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class NhentaiRipperTest extends RippersTest { @@ -22,6 +23,7 @@ public class NhentaiRipperTest extends RippersTest { // Test the tag black listing @Test + @Tag("flaky") public void testTagBlackList() throws IOException { URL url = new URL("https://nhentai.net/g/233295/"); NhentaiRipper ripper = new NhentaiRipper(url); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PorncomixDotOneRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PorncomixDotOneRipperTest.java deleted file mode 100644 index 9d4df122..00000000 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PorncomixDotOneRipperTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.rarchives.ripme.tst.ripper.rippers; - -import java.io.IOException; -import java.net.URL; - -import com.rarchives.ripme.ripper.rippers.PorncomixDotOneRipper; -import org.junit.jupiter.api.Test; - -public class PorncomixDotOneRipperTest extends RippersTest { - @Test - public void testPorncomixAlbum() throws IOException { - PorncomixDotOneRipper ripper = new PorncomixDotOneRipper(new URL("https://www.porncomix.one/gallery/blacknwhite-make-america-great-again")); - testRipper(ripper); - } -} \ No newline at end of file diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PornhubRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PornhubRipperTest.java index 354b4e62..22de8349 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PornhubRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/PornhubRipperTest.java @@ -8,6 +8,7 @@ import com.rarchives.ripme.utils.Http; import com.rarchives.ripme.utils.Utils; import org.jsoup.nodes.Document; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class PornhubRipperTest extends RippersTest { @@ -28,6 +29,7 @@ public class PornhubRipperTest extends RippersTest { } @Test + @Tag("flaky") public void testGetNextPage() throws IOException { String baseURL = "https://www.pornhub.com/album/30687901"; PornhubRipper ripper = new PornhubRipper(new URL(baseURL)); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/RedgifsRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/RedgifsRipperTest.java index 8b45594d..ed71128d 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/RedgifsRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/RedgifsRipperTest.java @@ -36,6 +36,7 @@ public class RedgifsRipperTest extends RippersTest { * @throws IOException */ @Test + @Tag("flaky") public void testRedgifsProfile() throws IOException { RedgifsRipper ripper = new RedgifsRipper(new URL("https://redgifs.com/users/margo_monty")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/SmuttyRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/SmuttyRipperTest.java index cb1a78c4..4085bb56 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/SmuttyRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/SmuttyRipperTest.java @@ -5,10 +5,12 @@ import java.net.URL; import com.rarchives.ripme.ripper.rippers.SmuttyRipper; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class SmuttyRipperTest extends RippersTest { @Test + @Tag("flaky") public void testRip() throws IOException { SmuttyRipper ripper = new SmuttyRipper(new URL("https://smutty.com/user/QUIGON/")); testRipper(ripper); diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ZizkiRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ZizkiRipperTest.java index 7af10e55..3d21df97 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ZizkiRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ZizkiRipperTest.java @@ -5,20 +5,27 @@ import java.net.URL; import com.rarchives.ripme.ripper.rippers.ZizkiRipper; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; public class ZizkiRipperTest extends RippersTest { + + @Test + @Tag("flaky") public void testRip() throws IOException { ZizkiRipper ripper = new ZizkiRipper(new URL("http://zizki.com/dee-chorde/we-got-spirit")); testRipper(ripper); } + @Test public void testGetGID() throws IOException { URL url = new URL("http://zizki.com/dee-chorde/we-got-spirit"); ZizkiRipper ripper = new ZizkiRipper(url); Assertions.assertEquals("dee-chorde", ripper.getGID(url)); } + @Test + @Tag("flaky") public void testAlbumTitle() throws IOException { URL url = new URL("http://zizki.com/dee-chorde/we-got-spirit"); ZizkiRipper ripper = new ZizkiRipper(url);