From 21c8d24d5753471b7440f22e1193e80419df0b8e Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Sun, 1 Jan 2023 14:03:08 +0800 Subject: [PATCH] Add size and cost for archive download --- .../com/hippo/ehviewer/client/EhEngine.java | 6 +- .../ehviewer/client/parser/ArchiveParser.java | 120 ++++++++++++++++-- .../ehviewer/ui/scene/GalleryDetailScene.java | 26 ++-- 3 files changed, 127 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java index e21a33202..e8f961e2d 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java @@ -684,8 +684,8 @@ public class EhEngine { return result; } - public static Pair[]> getArchiveList(@Nullable EhClient.Task task, OkHttpClient okHttpClient, - String url, long gid, String token) throws Throwable { + public static ArchiveParser.Result getArchiveList(@Nullable EhClient.Task task, OkHttpClient okHttpClient, + String url, long gid, String token) throws Throwable { String referer = EhUrl.getGalleryDetailUrl(gid, token); Log.d(TAG, url); Request request = new EhRequestBuilder(url, referer).build(); @@ -698,7 +698,7 @@ public class EhEngine { String body = null; Headers headers = null; - Pair[]> result; + ArchiveParser.Result result; int code = -1; try (Response response = call.execute()) { code = response.code(); diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.java index c56006ea4..38e0c600e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.java +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/ArchiveParser.java @@ -16,33 +16,137 @@ package com.hippo.ehviewer.client.parser; -import android.util.Pair; +import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ArchiveParser { private static final Pattern PATTERN_FORM = Pattern.compile("
"); - private static final Pattern PATTERN_ARCHIVE = Pattern.compile("([^<]+)"); + private static final Pattern PATTERN_ARCHIVE = Pattern.compile("

([^<]+)

\\s*

([\\w. ]+)

\\s*

([\\w. ]+)

"); - @SuppressWarnings("unchecked") - public static Pair[]> parse(String body) { + public static Result parse(String body) { Matcher m = PATTERN_FORM.matcher(body); if (!m.find()) { - return new Pair[]>("", new Pair[0]); + return new Result(null, null); } String paramOr = m.group(1); - List> archiveList = new ArrayList<>(); + var archiveList = new ArrayList(); m = PATTERN_ARCHIVE.matcher(body); while (m.find()) { String res = ParserUtils.trim(m.group(1)); String name = ParserUtils.trim(m.group(2)); - Pair item = new Pair<>(res, name); + String size = ParserUtils.trim(m.group(3)); + String cost = ParserUtils.trim(m.group(4)); + var item = new Archive(res, name, size, cost); archiveList.add(item); } - return new Pair<>(paramOr, archiveList.toArray(new Pair[0])); + return new Result(paramOr, archiveList); + } + + public static final class Archive { + private final String res; + private final String name; + private final String size; + private final String cost; + + public Archive(String res, String name, String size, String cost) { + this.res = res; + this.name = name; + this.size = size; + this.cost = cost; + } + + public String format() { + return String.format("%s [%s, %s]", name, size, cost); + } + + public String res() { + return res; + } + + public String name() { + return name; + } + + public String size() { + return size; + } + + public String cost() { + return cost; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (Archive) obj; + return Objects.equals(this.res, that.res) && + Objects.equals(this.name, that.name) && + Objects.equals(this.size, that.size) && + Objects.equals(this.cost, that.cost); + } + + @Override + public int hashCode() { + return Objects.hash(res, name, size, cost); + } + + @NonNull + @Override + public String toString() { + return "Archive[" + + "res=" + res + ", " + + "name=" + name + ", " + + "size=" + size + ", " + + "cost=" + cost + ']'; + } + + } + + public static final class Result { + private final String paramOr; + private final List archiveList; + + public Result(String paramOr, List archiveList) { + this.paramOr = paramOr; + this.archiveList = archiveList; + } + + public String paramOr() { + return paramOr; + } + + public List archiveList() { + return archiveList; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (Result) obj; + return Objects.equals(this.paramOr, that.paramOr) && + Objects.equals(this.archiveList, that.archiveList); + } + + @Override + public int hashCode() { + return Objects.hash(paramOr, archiveList); + } + + @NonNull + @Override + public String toString() { + return "Result[" + + "paramOr=" + paramOr + ", " + + "archiveList=" + archiveList + ']'; + } + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index 22ed97aba..80d2071c2 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -84,6 +84,7 @@ import com.hippo.ehviewer.client.data.GalleryTagGroup; import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.data.PreviewSet; import com.hippo.ehviewer.client.exception.NoHAtHClientException; +import com.hippo.ehviewer.client.parser.ArchiveParser; import com.hippo.ehviewer.client.parser.RateGalleryParser; import com.hippo.ehviewer.client.parser.VoteTagParser; import com.hippo.ehviewer.dao.DownloadInfo; @@ -257,7 +258,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O } }); private String mArchiveFormParamOr; - private Pair[] mArchiveList; + private List mArchiveList; @State private int mState = STATE_INIT; private boolean mModifyingFavorites; @@ -1754,7 +1755,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O } private class ArchiveListDialogHelper implements AdapterView.OnItemClickListener, - DialogInterface.OnDismissListener, EhClient.Callback[]>> { + DialogInterface.OnDismissListener, EhClient.Callback { @Nullable private CircularProgressIndicator mProgressView; @@ -1789,21 +1790,18 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O } } - private void bind(Pair[] data) { + private void bind(List data) { if (null == mDialog || null == mProgressView || null == mErrorText || null == mListView) { return; } - if (0 == data.length) { + if (null == data || 0 == data.size()) { mProgressView.setVisibility(View.GONE); mErrorText.setVisibility(View.VISIBLE); mListView.setVisibility(View.GONE); mErrorText.setText(R.string.no_archives); } else { - String[] nameArray = new String[data.length]; - for (int i = 0, n = data.length; i < n; i++) { - nameArray[i] = data[i].second; - } + var nameArray = data.stream().map(ArchiveParser.Archive::format).toArray(String[]::new); mProgressView.setVisibility(View.GONE); mErrorText.setVisibility(View.GONE); mListView.setVisibility(View.VISIBLE); @@ -1815,8 +1813,8 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O public void onItemClick(AdapterView parent, View view, int position, long id) { Context context = getContext(); MainActivity activity = getMainActivity(); - if (null != context && null != activity && null != mArchiveList && position < mArchiveList.length) { - String res = mArchiveList[position].first; + if (null != context && null != activity && null != mArchiveList && position < mArchiveList.size()) { + String res = mArchiveList.get(position).res(); EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_DOWNLOAD_ARCHIVE); request.setArgs(mGalleryDetail.gid, mGalleryDetail.token, mArchiveFormParamOr, res); @@ -1843,12 +1841,12 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O } @Override - public void onSuccess(Pair[]> result) { + public void onSuccess(ArchiveParser.Result result) { if (mRequest != null) { mRequest = null; - mArchiveFormParamOr = result.first; - mArchiveList = result.second; - bind(result.second); + mArchiveFormParamOr = result.paramOr(); + mArchiveList = result.archiveList(); + bind(result.archiveList()); } }