diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java index 7a352c5a5..8f2f7893e 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java @@ -24,6 +24,7 @@ import android.util.SparseArray; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.IOUtils; +import com.hippo.yorozuya.NumberUtils; import java.io.IOException; import java.io.InputStream; @@ -34,6 +35,9 @@ public class SpiderInfo { private static final String TAG = SpiderInfo.class.getSimpleName(); + private static final String VERSION_STR = "VERSION"; + private static final int VERSION = 2; + static final String TOKEN_FAILED = "failed"; int startPage = 0; @@ -44,7 +48,6 @@ public class SpiderInfo { int previewPerPage = -1; SparseArray pTokenMap = null; - public static SpiderInfo read(@Nullable UniFile file) { if (file == null) { return null; @@ -80,6 +83,17 @@ public class SpiderInfo { return startPage >= 0 ? startPage : 0; } + private static int getVersion(String str) { + if (null == str) { + return -1; + } + if (str.startsWith(VERSION_STR)) { + return NumberUtils.parseIntSafely(str.substring(VERSION_STR.length()), -1); + } else { + return 1; + } + } + @SuppressWarnings("InfiniteLoopStatement") public static SpiderInfo read(@Nullable InputStream is) { if (null == is) { @@ -89,8 +103,20 @@ public class SpiderInfo { SpiderInfo spiderInfo = null; try { spiderInfo = new SpiderInfo(); + // Get version + String line = IOUtils.readAsciiLine(is); + int version = getVersion(line); + if (version == VERSION) { + // Read next line + line = IOUtils.readAsciiLine(is); + } else if (version == 1) { + // pass + } else { + // Invalid version + return null; + } // Start page - spiderInfo.startPage = getStartPage(IOUtils.readAsciiLine(is)); + spiderInfo.startPage = getStartPage(line); // Gid spiderInfo.gid = Long.parseLong(IOUtils.readAsciiLine(is)); // Token @@ -100,7 +126,12 @@ public class SpiderInfo { // Preview pages spiderInfo.previewPages = Integer.parseInt(IOUtils.readAsciiLine(is)); // Preview pre page - spiderInfo.previewPerPage = Integer.parseInt(IOUtils.readAsciiLine(is)); + line = IOUtils.readAsciiLine(is); + if (version == 1) { + // Skip it + } else { + spiderInfo.previewPerPage = Integer.parseInt(line); + } // Pages spiderInfo.pages = Integer.parseInt(IOUtils.readAsciiLine(is)); // Check pages @@ -110,7 +141,7 @@ public class SpiderInfo { // PToken spiderInfo.pTokenMap = new SparseArray<>(spiderInfo.pages); while (true) { // EOFException will raise - String line = IOUtils.readAsciiLine(is); + line = IOUtils.readAsciiLine(is); int pos = line.indexOf(" "); if (pos > 0 || pos < line.length() - 1) { int index = Integer.parseInt(line.substring(0, pos)); @@ -127,7 +158,6 @@ public class SpiderInfo { } if (spiderInfo == null || spiderInfo.gid == -1 || spiderInfo.token == null || - spiderInfo.previewPages == -1 || spiderInfo.previewPerPage == -1 || spiderInfo.pages == -1 || spiderInfo.pTokenMap == null) { return null; } else { @@ -139,6 +169,9 @@ public class SpiderInfo { OutputStreamWriter writer = null; try { writer = new OutputStreamWriter(os); + writer.write(VERSION_STR); + writer.write(Integer.toString(VERSION)); + writer.write("\n"); writer.write(String.format("%08x", startPage >= 0 ? startPage : 0)); // Avoid negative writer.write("\n"); writer.write(Long.toString(gid)); 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 5a49cb02a..e4920016c 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -84,11 +84,12 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; -public class SpiderQueen implements Runnable { +public final class SpiderQueen implements Runnable { private static final String TAG = SpiderQueen.class.getSimpleName(); private static final AtomicInteger sIdGenerator = new AtomicInteger(); private static final boolean DEBUG_LOG = false; + private static final boolean DEBUG_PTOKEN = true; @IntDef({MODE_READ, MODE_DOWNLOAD}) @Retention(RetentionPolicy.SOURCE) @@ -684,9 +685,16 @@ public class SpiderQueen implements Runnable { return null; } - private void readPreviews(String body, SpiderInfo spiderInfo) throws ParseException { + private void readPreviews(String body, int index, SpiderInfo spiderInfo) throws ParseException { + spiderInfo.pages = GalleryDetailParser.parsePages(body); + spiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); PreviewSet previewSet = GalleryDetailParser.parsePreviewSet(body); - spiderInfo.previewPerPage = previewSet.size(); + if ((index >= 0 && index < spiderInfo.pages - 1) || (index == 0 && spiderInfo.pages == 1)) { + spiderInfo.previewPerPage = previewSet.size(); + } else { + spiderInfo.previewPerPage = Math.max(spiderInfo.previewPerPage, previewSet.size()); + } + for (int i = 0, n = previewSet.size(); i < n; i++) { GalleryPageUrlParser.Result result = GalleryPageUrlParser.parse(previewSet.getPageUrlAt(i)); if (result != null) { @@ -710,8 +718,7 @@ public class SpiderQueen implements Runnable { spiderInfo.pages = GalleryDetailParser.parsePages(body); spiderInfo.pTokenMap = new SparseArray<>(spiderInfo.pages); - spiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); - readPreviews(body, spiderInfo); + readPreviews(body, 0, spiderInfo); return spiderInfo; } catch (Exception e) { return null; @@ -720,19 +727,24 @@ public class SpiderQueen implements Runnable { private String getPTokenFromInternet(int index, EhConfig config) { // Check previewIndex - int previewIndex = index / mSpiderInfo.previewPerPage; + int previewIndex; + if (mSpiderInfo.previewPerPage >= 0) { + previewIndex = index / mSpiderInfo.previewPerPage; + } else { + previewIndex = 0; + } try { String url = EhUrl.getGalleryDetailUrl( mGalleryInfo.gid, mGalleryInfo.token, previewIndex, false); - if (DEBUG_LOG) { - Log.d(TAG, url); + if (DEBUG_PTOKEN) { + Log.d(TAG, "index " + index + ", previewIndex " + previewIndex + + ", previewPerPage " + mSpiderInfo.previewPerPage+ ", url " + url); } Request request = new EhRequestBuilder(url, config).build(); Response response = mHttpClient.newCall(request).execute(); String body = response.body().string(); - mSpiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); - readPreviews(body, mSpiderInfo); + readPreviews(body, previewIndex, mSpiderInfo); // Save to local writeSpiderInfoToLocal(mSpiderInfo);