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"/> + +