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 {<FILL_FUNCTION_BODY>}

	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;
		}
	}
}

		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);
	
<methods>public void <init>(java.net.URL) throws java.io.IOException,public java.lang.String getGID(java.net.URL) throws java.net.MalformedURLException,public java.lang.String getHost() ,public java.lang.String normalizeUrl(java.lang.String) <variables>private com.rarchives.ripme.ripper.rippers.ArtStationRipper.ParsedURL albumURL,private java.lang.Integer projectIndex,private java.lang.String projectName,private java.lang.Integer projectPageNumber