Improve gallery spider

This commit is contained in:
seven332 committed 2016-03-17 15:33:58 +08:00
1 parent 6e315ea94d
commit d4a39990ed
4 files changed
+48 -50

No files matched your search

@@ -25,9 +25,9 @@ import java.util.ArrayList;
public class LargePreviewSet implements Parcelable {
private IntList mIndexList;
private ArrayList<String> mImageUrlList;
private ArrayList<String> mPageUrlList;
private final IntList mIndexList;
private final ArrayList<String> mImageUrlList;
private final ArrayList<String> mPageUrlList;
public int size() {
return mImageUrlList.size();
@@ -22,13 +22,13 @@ import java.util.ArrayList;
public class NormalPreviewSet {
private IntList mIndexList = new IntList();
private ArrayList<String> 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<String> mPageUrlList = new ArrayList<>();
private final IntList mIndexList = new IntList();
private final ArrayList<String> 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<String> mPageUrlList = new ArrayList<>();
public void addItem(int index, String imageUrl, int xOffset, int yOffset, int width,
int height, String pageUrl) {
@@ -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;
@@ -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<Integer> 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();
}
}
}