diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java
index f691c4fd9..9aa8cc732 100644
--- a/app/src/main/java/com/hippo/ehviewer/Settings.java
+++ b/app/src/main/java/com/hippo/ehviewer/Settings.java
@@ -540,6 +540,17 @@ public class Settings {
putIntToStr(KEY_PRELOAD_IMAGE, value);
}
+ private static final String KEY_DOWNLOAD_ORIGIN_IMAGE = "download_origin_image";
+ private static final boolean DEFAULT_DOWNLOAD_ORIGIN_IMAGE = false;
+
+ public static boolean getDownloadOriginImage() {
+ return getBoolean(KEY_DOWNLOAD_ORIGIN_IMAGE, DEFAULT_DOWNLOAD_ORIGIN_IMAGE);
+ }
+
+ public static void putDownloadOriginImage(boolean value) {
+ putBoolean(KEY_DOWNLOAD_ORIGIN_IMAGE, value);
+ }
+
/********************
****** Favorites
********************/
diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryPageParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryPageParser.java
index cfb8b809f..d631f1233 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryPageParser.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryPageParser.java
@@ -19,25 +19,31 @@ package com.hippo.ehviewer.client.parser;
import android.text.TextUtils;
import com.hippo.ehviewer.client.exception.ParseException;
+import com.hippo.yorozuya.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GalleryPageParser {
- private static final Pattern IMAGE_URL_PATTERN = Pattern.compile("
]+>
]+>
]+/> ");
public static Result parse(String body) throws ParseException {
Matcher m;
Result result = new Result();
- m = IMAGE_URL_PATTERN.matcher(body);
+ m = PATTERN_IMAGE_URL.matcher(body);
if (m.find()) {
- result.imageUrl = ParserUtils.trim(m.group(1));
+ result.imageUrl = StringUtils.unescapeXml(StringUtils.trim(m.group(1)));
}
- m = SKIP_HATH_KEY_PATTERN.matcher(body);
+ m = PATTERN_SKIP_HATH_KEY.matcher(body);
if (m.find()) {
- result.skipHathKey = ParserUtils.trim(m.group(1));
+ result.skipHathKey = StringUtils.unescapeXml(StringUtils.trim(m.group(1)));
+ }
+ m = PATTERN_ORIGIN_IMAGE_URL.matcher(body);
+ if (m.find()) {
+ result.originImageUrl = StringUtils.unescapeXml(StringUtils.trim(m.group(1)));
}
if (!TextUtils.isEmpty(result.imageUrl) && !TextUtils.isEmpty(result.skipHathKey)) {
return result;
@@ -49,5 +55,6 @@ public class GalleryPageParser {
public static class Result {
public String imageUrl;
public String skipHathKey;
+ public String originImageUrl;
}
}
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 7e4c7c6ed..a0d429084 100644
--- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java
+++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java
@@ -24,6 +24,7 @@ import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
+import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import android.webkit.MimeTypeMap;
@@ -52,6 +53,7 @@ import com.hippo.yorozuya.OSUtils;
import com.hippo.yorozuya.PriorityThread;
import com.hippo.yorozuya.PriorityThreadFactory;
import com.hippo.yorozuya.StringUtils;
+import com.hippo.yorozuya.Utilities;
import com.hippo.yorozuya.io.InputStreamPipe;
import com.hippo.yorozuya.io.OutputStreamPipe;
import com.hippo.yorozuya.sparse.SparseJLArray;
@@ -72,6 +74,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
+import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@@ -1015,7 +1018,11 @@ public class SpiderQueen implements Runnable {
break;
}
- imageUrl = result.imageUrl;
+ if (Settings.getDownloadOriginImage() && !TextUtils.isEmpty(result.originImageUrl)) {
+ imageUrl = result.originImageUrl;
+ } else {
+ imageUrl = result.imageUrl;
+ }
skipHathKey = result.skipHathKey;
// If it is force request, skip first image
@@ -1027,28 +1034,40 @@ public class SpiderQueen implements Runnable {
Log.d(TAG, imageUrl);
}
- // Start download image
- OutputStreamPipe pipe = mSpiderDen.openOutputStreamPipe(
- index, MimeTypeMap.getFileExtensionFromUrl(imageUrl));
- if (pipe == null) {
- // Can't get pipe
- error = GetText.getString(R.string.error_write_failed);
- break;
- }
-
// Download image
+ OutputStreamPipe pipe = null;
InputStream is = null;
try {
if (DEBUG_LOG) {
Log.d(TAG, "Start download image " + index);
}
- Response response = mHttpClient.newCall(new EhRequestBuilder(imageUrl).build()).execute();
+ Call call = mHttpClient.newCall(new EhRequestBuilder(imageUrl).build());
+ Response response = call.execute();
if (response.code() >= 400) {
// Maybe 404
+ call.cancel();
continue;
}
ResponseBody responseBody = response.body();
+
+ // Get extension
+ String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(
+ responseBody.contentType().toString());
+ // Ensure extension
+ if (!Utilities.contain(GalleryProvider.SUPPORT_IMAGE_EXTENSIONS, extension)) {
+ extension = GalleryProvider.SUPPORT_IMAGE_EXTENSIONS[0];
+ }
+
+ // Get out put pipe
+ pipe = mSpiderDen.openOutputStreamPipe(index, extension);
+ if (null == pipe) {
+ // Can't get pipe
+ error = GetText.getString(R.string.error_write_failed);
+ call.cancel();
+ break;
+ }
+
long contentLength = responseBody.contentLength();
is = responseBody.byteStream();
pipe.obtain();
@@ -1060,6 +1079,7 @@ public class SpiderQueen implements Runnable {
while (!Thread.currentThread().isInterrupted()) {
int bytesRead = is.read(data);
if (bytesRead == -1) {
+ call.cancel();
break;
}
os.write(data, 0, bytesRead);
@@ -1090,8 +1110,10 @@ public class SpiderQueen implements Runnable {
error = GetText.getString(R.string.error_socket);
} finally {
IOUtils.closeQuietly(is);
- pipe.close();
- pipe.release();
+ if (null != pipe) {
+ pipe.close();
+ pipe.release();
+ }
if (DEBUG_LOG) {
Log.d(TAG, "End download image " + index);
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 4f6e24aa3..e08c303e8 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -381,6 +381,8 @@
最多同时下载 %s 张图片
预载图片
向后预载 %s 张图片
+ 下载原图
+ 这很危险!勾选此项会导致下载配额迅速流失
恢复中
未找到可恢复下载项
恢复失败
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index eebc8eef8..c9e7e72a8 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -381,6 +381,8 @@
最多同時下載 %s 張圖片
預載圖片
向後預載 %s 張圖片
+ 下載原圖
+ 這很危險!勾選此項會導致下載配額迅速流失
恢復中
未找到可恢復下載項
恢復失敗
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index b8ccc7280..c9da48aa4 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -381,6 +381,8 @@
最多同時下載 %s 張圖片
預載圖片
向後預載 %s 張圖片
+ 下載原圖
+ 這很危險!勾選此項會導致下載配額迅速流失
恢復中
未找到可恢復下載項
恢復失敗
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f95d43fab..8ba1dd89a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -421,6 +421,8 @@
Up to %s images
Preload image
Preload next %s image
+ Download original image
+ It is dangerous! You may get 509 error
Restore download items
Restore all download items in download location
Restoring
diff --git a/app/src/main/res/xml/download_settings.xml b/app/src/main/res/xml/download_settings.xml
index 28d3b41f0..459847c76 100644
--- a/app/src/main/res/xml/download_settings.xml
+++ b/app/src/main/res/xml/download_settings.xml
@@ -39,6 +39,12 @@
app:entryValues="@array/preload_image_entry_values"
android:defaultValue="5"/>
+
+