From d274c3e05290b60a66ffc56a44a961a02fb5be2d Mon Sep 17 00:00:00 2001 From: Tushar Date: Tue, 12 Mar 2019 09:29:35 +0530 Subject: [PATCH] Added support for artstn. --- .../ripme/ripper/rippers/ArtstnRipper.java | 58 +++++++++++++++++++ .../tst/ripper/rippers/ArtstnRipperTest.java | 19 ++++++ 2 files changed, 77 insertions(+) create mode 100644 src/main/java/com/rarchives/ripme/ripper/rippers/ArtstnRipper.java create mode 100644 src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtstnRipperTest.java diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/ArtstnRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/ArtstnRipper.java new file mode 100644 index 00000000..82b6e97c --- /dev/null +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/ArtstnRipper.java @@ -0,0 +1,58 @@ +package com.rarchives.ripme.ripper.rippers; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import org.jsoup.Connection.Response; + +import com.rarchives.ripme.utils.Http; + +/* + * Ripper for ArtStation's short URL domain. + * Example URL: https://artstn.co/p/JlE15Z + */ + +public class ArtstnRipper extends ArtStationRipper { + public URL artStationUrl = null; + + public ArtstnRipper(URL url) throws IOException { + super(url); + } + + @Override + public boolean canRip(URL url) { + return url.getHost().endsWith("artstn.co"); + } + + @Override + public String getGID(URL url) throws MalformedURLException { + if (artStationUrl == null) { + // Run only once. + try { + artStationUrl = getFinalUrl(url); + if (artStationUrl == null) { + throw new IOException("Null url received."); + } + } catch (IOException e) { + LOGGER.error("Couldnt resolve URL.", e); + } + + } + return super.getGID(artStationUrl); + } + + public URL getFinalUrl(URL url) throws IOException { + if (url.getHost().endsWith("artstation.com")) { + return url; + } + + LOGGER.info("Checking url: " + url); + Response response = Http.url(url).connection().followRedirects(false).execute(); + if (response.statusCode() / 100 == 3 && response.hasHeader("location")) { + return getFinalUrl(new URL(response.header("location"))); + } else { + return null; + } + } +} diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtstnRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtstnRipperTest.java new file mode 100644 index 00000000..0566f161 --- /dev/null +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/ArtstnRipperTest.java @@ -0,0 +1,19 @@ +package com.rarchives.ripme.tst.ripper.rippers; + +import java.io.IOException; +import java.net.URL; + +import com.rarchives.ripme.ripper.rippers.ArtstnRipper; + +public class ArtstnRipperTest extends RippersTest { + + public void testSingleProject() throws IOException { + URL url = new URL("https://artstn.co/p/JlE15Z"); + testRipper(new ArtstnRipper(url)); + } + + public void testUserPortfolio() throws IOException { + URL url = new URL("https://artstn.co/m/rv37"); + testRipper(new ArtstnRipper(url)); + } +}