diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java index a0468e2d5..c646b071e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java @@ -158,6 +158,11 @@ public class EhUrl { return builder.build(); } + public static String getGalleryMultiPageViewerUrl(long gid, String token) { + UrlBuilder builder = new UrlBuilder(getHost() + "mpv/" + gid + '/' + token + '/'); + return builder.build(); + } + public static String getPageUrl(long gid, int index, String pToken) { return getHost() + "s/" + pToken + '/' + gid + '-' + (index + 1); } diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryMultiPageViewerPTokenParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryMultiPageViewerPTokenParser.java new file mode 100644 index 000000000..2a01e644d --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryMultiPageViewerPTokenParser.java @@ -0,0 +1,27 @@ +package com.hippo.ehviewer.client.parser; + +import com.hippo.ehviewer.client.exception.EhException; +import com.hippo.util.ExceptionUtils; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; + +public class GalleryMultiPageViewerPTokenParser { + public static ArrayList parse(String body) throws Exception { + ArrayList list = new ArrayList<>(); + String imagelist = body.substring(body.indexOf("var imagelist = ") + 16, body.indexOf(";", body.indexOf("var imagelist = "))); + try { + JSONArray ja = new JSONArray(imagelist); + for (int i = 0; i < ja.length(); i++) { + JSONObject jo = ja.getJSONObject(i); + list.add(jo.getString("k")); + } + } catch (Throwable e) { + ExceptionUtils.throwIfFatal(e); + throw new EhException(body); + } + return list; + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java index 929eb0cab..5961a484d 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -43,6 +43,7 @@ import com.hippo.ehviewer.client.data.PreviewSet; import com.hippo.ehviewer.client.exception.Image509Exception; import com.hippo.ehviewer.client.exception.ParseException; import com.hippo.ehviewer.client.parser.GalleryDetailParser; +import com.hippo.ehviewer.client.parser.GalleryMultiPageViewerPTokenParser; import com.hippo.ehviewer.client.parser.GalleryPageApiParser; import com.hippo.ehviewer.client.parser.GalleryPageParser; import com.hippo.ehviewer.client.parser.GalleryPageUrlParser; @@ -768,6 +769,42 @@ public final class SpiderQueen implements Runnable { } } + private String getPTokenFromMultiPageViewer(int index) { + SpiderInfo spiderInfo = mSpiderInfo.get(); + if (spiderInfo == null) { + return null; + } + + try { + String url = EhUrl.getGalleryMultiPageViewerUrl( + mGalleryInfo.gid, mGalleryInfo.token); + if (DEBUG_PTOKEN) { + Log.d(TAG, "getPTokenFromMultiPageViewer index " + index + ", url " + url); + } + String referer = EhUrl.getReferer(); + Request request = new EhRequestBuilder(url, referer).build(); + Response response = mHttpClient.newCall(request).execute(); + String body = response.body().string(); + + ArrayList list = GalleryMultiPageViewerPTokenParser.parse(body); + + for (int i = 0; i < list.size(); i++) { + synchronized (mPTokenLock) { + spiderInfo.pTokenMap.put(i, list.get(i)); + } + } + + String pToken; + synchronized (mPTokenLock) { + pToken = spiderInfo.pTokenMap.get(index); + } + return pToken; + } catch (Throwable e) { + ExceptionUtils.throwIfFatal(e); + return null; + } + } + private String getPTokenFromInternet(int index) { SpiderInfo spiderInfo = mSpiderInfo.get(); if (spiderInfo == null) { @@ -926,6 +963,11 @@ public final class SpiderQueen implements Runnable { pToken = getPTokenFromInternet(index); } + if (null == pToken) { + // Multi-page viewer enabled maybe + pToken = getPTokenFromMultiPageViewer(index); + } + if (null == pToken) { // If failed, set the pToken "failed" synchronized (mPTokenLock) {