diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/LargePreviewSet.java b/app/src/main/java/com/hippo/ehviewer/client/data/LargePreviewSet.java index 18dbafcdb..2531c42bd 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/LargePreviewSet.java +++ b/app/src/main/java/com/hippo/ehviewer/client/data/LargePreviewSet.java @@ -25,9 +25,9 @@ import java.util.ArrayList; public class LargePreviewSet implements Parcelable { - private IntList mIndexList; - private ArrayList mImageUrlList; - private ArrayList mPageUrlList; + private final IntList mIndexList; + private final ArrayList mImageUrlList; + private final ArrayList mPageUrlList; public int size() { return mImageUrlList.size(); diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java b/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java index 84fffe7f7..725453596 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java +++ b/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java @@ -22,13 +22,13 @@ import java.util.ArrayList; public class NormalPreviewSet { - private IntList mIndexList = new IntList(); - private ArrayList mImageUrlList = new ArrayList<>(); - private IntList mXOffsetList = new IntList(); - private IntList mYOffsetList = new IntList(); - private IntList mWidthList = new IntList(); - private IntList mHeightList = new IntList(); - private ArrayList mPageUrlList = new ArrayList<>(); + private final IntList mIndexList = new IntList(); + private final ArrayList mImageUrlList = new ArrayList<>(); + private final IntList mXOffsetList = new IntList(); + private final IntList mYOffsetList = new IntList(); + private final IntList mWidthList = new IntList(); + private final IntList mHeightList = new IntList(); + private final ArrayList mPageUrlList = new ArrayList<>(); public void addItem(int index, String imageUrl, int xOffset, int yOffset, int width, int height, String pageUrl) { 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 5798fdd29..c6e5514c7 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java @@ -34,7 +34,6 @@ public class SpiderInfo { private static final String TAG = SpiderInfo.class.getSimpleName(); static final String TOKEN_FAILED = "failed"; - static final String TOKEN_WAIT = "wait"; int startPage = 0; long gid = -1; 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 83d239173..763c227ff 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -37,6 +37,7 @@ import com.hippo.ehviewer.client.EhConfig; import com.hippo.ehviewer.client.EhRequestBuilder; import com.hippo.ehviewer.client.EhUrl; import com.hippo.ehviewer.client.data.GalleryInfo; +import com.hippo.ehviewer.client.data.LargePreviewSet; import com.hippo.ehviewer.client.data.NormalPreviewSet; import com.hippo.ehviewer.client.exception.Image509Exception; import com.hippo.ehviewer.client.exception.ParseException; @@ -63,11 +64,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.net.MalformedURLException; import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Queue; -import java.util.Set; import java.util.Stack; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadFactory; @@ -154,8 +153,6 @@ public class SpiderQueen implements Runnable { // For download, when it go to mPageStateArray.size(), done private volatile int mDownloadPage = -1; - private final Set mRequestPreviewPageSet = new HashSet<>(); - private final AtomicInteger mDownloadedPages = new AtomicInteger(0); private final AtomicInteger mFinishedPages = new AtomicInteger(0); @@ -681,6 +678,28 @@ public class SpiderQueen implements Runnable { return null; } + private void readPreviews(String body, SpiderInfo spiderInfo) throws ParseException { + try { + NormalPreviewSet previewSet = GalleryDetailParser.parseNormalPreviewSet(body); + 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) { + spiderInfo.pTokenMap.put(result.page, result.pToken); + } + } + } catch (ParseException e) { + LargePreviewSet previewSet = GalleryDetailParser.parseLargePreview(body); + 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) { + spiderInfo.pTokenMap.put(result.page, result.pToken); + } + } + } + } + private SpiderInfo readSpiderInfoFromInternet(EhConfig config) { try { SpiderInfo spiderInfo = new SpiderInfo(); @@ -693,17 +712,9 @@ public class SpiderQueen implements Runnable { String body = response.body().string(); spiderInfo.pages = GalleryDetailParser.parsePages(body); - spiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); - NormalPreviewSet previewSet = GalleryDetailParser.parseNormalPreviewSet(body); - spiderInfo.previewPerPage = previewSet.size(); spiderInfo.pTokenMap = new SparseArray<>(spiderInfo.pages); - for (int i = 0, n = previewSet.size(); i < n; i++) { - GalleryPageUrlParser.Result result = GalleryPageUrlParser.parse(previewSet.getPageUrlAt(i)); - if (result != null) { - spiderInfo.pTokenMap.put(result.page, result.pToken); - } - } - + spiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); + readPreviews(body, spiderInfo); return spiderInfo; } catch (Exception e) { return null; @@ -713,12 +724,6 @@ public class SpiderQueen implements Runnable { private String getPTokenFromInternet(int index, EhConfig config) { // Check previewIndex int previewIndex = index / mSpiderInfo.previewPerPage; - synchronized (mRequestPreviewPageSet) { - if (mRequestPreviewPageSet.contains(previewIndex)) { - return SpiderInfo.TOKEN_WAIT; - } - mRequestPreviewPageSet.add(previewIndex); - } try { String url = EhUrl.getGalleryDetailUrl( @@ -729,23 +734,15 @@ public class SpiderQueen implements Runnable { Request request = new EhRequestBuilder(url, config).build(); Response response = mHttpClient.newCall(request).execute(); String body = response.body().string(); - NormalPreviewSet previewSet = GalleryDetailParser.parseNormalPreviewSet(body); - synchronized (mPTokenLock) { - for (int i = 0, n = previewSet.size(); i < n; i++) { - GalleryPageUrlParser.Result result = GalleryPageUrlParser.parse(previewSet.getPageUrlAt(i)); - if (result != null) { - mSpiderInfo.pTokenMap.put(result.page, result.pToken); - } - } - writeSpiderInfoToLocal(mSpiderInfo); - } + mSpiderInfo.previewPages = GalleryDetailParser.parsePreviewPages(body); + readPreviews(body, mSpiderInfo); + + // Save to local + writeSpiderInfoToLocal(mSpiderInfo); + return mSpiderInfo.pTokenMap.get(index); } catch (Exception e) { return null; - } finally { - synchronized (mRequestPreviewPageSet) { - mRequestPreviewPageSet.remove(previewIndex); - } } } @@ -863,8 +860,12 @@ public class SpiderQueen implements Runnable { // Get pToken from internet pToken = getPTokenFromInternet(index, config); + if (null == pToken) { + // Preview size may changed, so try to get pToken twice + pToken = getPTokenFromInternet(index, config); + } - if (null == pToken || SpiderInfo.TOKEN_WAIT.equals(pToken)) { + if (null == pToken) { // If failed, set the pToken "failed" synchronized (mPTokenLock) { mSpiderInfo.pTokenMap.put(index, SpiderInfo.TOKEN_FAILED); @@ -872,10 +873,8 @@ public class SpiderQueen implements Runnable { } // Notify worker - if (!SpiderInfo.TOKEN_WAIT.equals(pToken)) { - synchronized (mWorkerLock) { - mWorkerLock.notifyAll(); - } + synchronized (mWorkerLock) { + mWorkerLock.notifyAll(); } } }