From 2bb8d3a64fbb5987375843d7d41e038a4aaae2af Mon Sep 17 00:00:00 2001 From: nikozark <37566071+nikozark@users.noreply.github.com> Date: Sat, 3 Oct 2020 05:23:02 +0300 Subject: [PATCH 1/2] Update MangadexRipper.java Added functionality to rip entire manga --- .../ripme/ripper/rippers/MangadexRipper.java | 92 ++++++++++++++++--- 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/MangadexRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/MangadexRipper.java index 6697a45b..ea8c4530 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/MangadexRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/MangadexRipper.java @@ -1,24 +1,28 @@ package com.rarchives.ripme.ripper.rippers; import com.rarchives.ripme.ripper.AbstractJSONRipper; +import com.rarchives.ripme.ui.History; +import com.rarchives.ripme.ui.RipStatusMessage; import com.rarchives.ripme.utils.Http; import com.rarchives.ripme.utils.Utils; +import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; import org.jsoup.Connection; import org.jsoup.nodes.Document; +import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MangadexRipper extends AbstractJSONRipper { private String chapterApiEndPoint = "https://mangadex.org/api/chapter/"; - + private String mangaApiEndPoint = "https://mangadex.org/api/manga/"; + private boolean isSingleChapter; private String getImageUrl(String chapterHash, String imageName, String server) { return server + chapterHash + "/" + imageName; } @@ -44,41 +48,102 @@ public class MangadexRipper extends AbstractJSONRipper { @Override public String getGID(URL url) throws MalformedURLException { String capID = getChapterID(url.toExternalForm()); + String mangaID = getMangaID(url.toExternalForm()); if (capID != null) { + isSingleChapter=true; return capID; } + else + if(mangaID!=null){ + isSingleChapter=false; + return mangaID; + } throw new MalformedURLException("Unable to get chapter ID from" + url); } private String getChapterID(String url) { - Pattern p = Pattern.compile("https://mangadex.org/chapter/([\\d]+)/?"); + Pattern p = Pattern.compile("https://mangadex.org/chapter/([\\d]+)/([\\d+]?)"); Matcher m = p.matcher(url); if (m.matches()) { return m.group(1); } return null; } + private String getMangaID(String url){ + Pattern p = Pattern.compile("https://mangadex.org/title/([\\d]+)/(.+)"); + Matcher m = p.matcher(url); + if(m.matches()){ + return m.group(1); + } + return null; + } + @Override public JSONObject getFirstPage() throws IOException { // Get the chapter ID String chapterID = getChapterID(url.toExternalForm()); - return Http.url(new URL(chapterApiEndPoint + chapterID)).getJSON(); + String mangaID = getMangaID(url.toExternalForm()); + if(mangaID!=null){ + return Http.url(new URL(mangaApiEndPoint+mangaID)).getJSON(); + } + else + return Http.url(new URL(chapterApiEndPoint + chapterID)).getJSON(); } @Override protected List getURLsFromJSON(JSONObject json) { + if(isSingleChapter){ + List assetURLs = new ArrayList<>(); + JSONArray currentObject; + String chapterHash; + // Server is the cdn hosting the images. + String server; + chapterHash = json.getString("hash"); + server = json.getString("server"); + for (int i = 0; i < json.getJSONArray("page_array").length(); i++) { + currentObject = json.getJSONArray("page_array"); + + assetURLs.add(getImageUrl(chapterHash, currentObject.getString(i), server)); + } + return assetURLs; + } + JSONObject chaptersJSON = (JSONObject) json.get("chapter"); + JSONObject temp; + Iterator keys = chaptersJSON.keys(); + HashMap chapterIDs = new HashMap<>(); + while (keys.hasNext()) { + String keyValue = (String) keys.next(); + temp=(JSONObject)chaptersJSON.get(keyValue); + if(temp.getString("lang_name").equals("English")) { + chapterIDs.put(temp.getDouble("chapter"),keyValue); + } + + } + List assetURLs = new ArrayList<>(); JSONArray currentObject; - - String chapterHash = json.getString("hash"); + String chapterHash; // Server is the cdn hosting the images. - String server = json.getString("server"); + String server; + JSONObject chapterJSON=null; + TreeMap treeMap = new TreeMap<>(chapterIDs); + Iterator it = treeMap.keySet().iterator(); + while(it.hasNext()) { + double key =(double) it.next(); + try { + chapterJSON = Http.url(new URL(chapterApiEndPoint + treeMap.get(key))).getJSON(); + } catch (IOException e) { + e.printStackTrace(); + } + sendUpdate(RipStatusMessage.STATUS.LOADING_RESOURCE,"chapter "+key); + chapterHash = chapterJSON.getString("hash"); + server = chapterJSON.getString("server"); + for (int i = 0; i < chapterJSON.getJSONArray("page_array").length(); i++) { + currentObject = chapterJSON.getJSONArray("page_array"); - for (int i = 0; i < json.getJSONArray("page_array").length(); i++) { - currentObject = json.getJSONArray("page_array"); - - assetURLs.add(getImageUrl(chapterHash, currentObject.getString(i), server)); + assetURLs.add(getImageUrl(chapterHash, currentObject.getString(i), server)); + } } return assetURLs; @@ -91,4 +156,5 @@ public class MangadexRipper extends AbstractJSONRipper { addURLToDownload(url, getPrefix(index)); } -} + +} \ No newline at end of file From 18d8b51a948b1533b411ed8b3b9e9dabcfd6618c Mon Sep 17 00:00:00 2001 From: nikozark <37566071+nikozark@users.noreply.github.com> Date: Sat, 3 Oct 2020 05:36:15 +0300 Subject: [PATCH 2/2] Update MangadexRipperTest.java Added test case for manga --- .../ripme/tst/ripper/rippers/MangadexRipperTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MangadexRipperTest.java b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MangadexRipperTest.java index 70aa5aaf..62aabf7c 100644 --- a/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MangadexRipperTest.java +++ b/src/test/java/com/rarchives/ripme/tst/ripper/rippers/MangadexRipperTest.java @@ -11,5 +11,12 @@ public class MangadexRipperTest extends RippersTest{ MangadexRipper ripper = new MangadexRipper(new URL("https://mangadex.org/chapter/467904/")); testRipper(ripper); } + public class testMangaRip extends RippersTest{ + + public void testRip() throws IOException { + MangadexRipper ripper = new MangadexRipper(new URL("https://mangadex.org/title/44625/this-croc-will-die-in-100-days")); + testRipper(ripper); + } + } }