From 83d66f9c56d6469b082dfe3ce83f3c878469b81e Mon Sep 17 00:00:00 2001 From: seven332 Date: Sat, 7 May 2016 15:51:47 +0800 Subject: [PATCH] Fix ptoken failed error When get last page of gallery, the page preview count is not preview count pre page. So old version spider info file may store wrong preview count pre page. Spider info file version is added in the first line. --- .../com/hippo/ehviewer/spider/SpiderInfo.java | 43 ++++++++++++++++--- .../hippo/ehviewer/spider/SpiderQueen.java | 32 +++++++++----- 2 files changed, 60 insertions(+), 15 deletions(-) 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);