From d000f7080c831dc9015b34094c2bc5b6168dd05c Mon Sep 17 00:00:00 2001 From: nicked <@> Date: Sat, 2 Mar 2024 16:24:48 +0900 Subject: [PATCH] updates --- .../ceui/lisa/activities/BaseActivity.java | 9 +++ .../ceui/lisa/activities/OutWakeActivity.java | 12 ++-- .../ceui/lisa/activities/SearchActivity.java | 2 +- app/src/main/java/ceui/lisa/core/Manager.java | 8 ++- .../ceui/lisa/fragments/BaseFragment.java | 9 +++ .../ceui/lisa/fragments/FragmentDownload.java | 15 ++-- .../lisa/fragments/FragmentImageDetail.java | 17 ++++- .../lisa/fragments/FragmentNovelHolder.java | 68 +++++++++++++------ .../fragments/FragmentNovelSeriesDetail.java | 43 ++++++++---- .../ceui/lisa/fragments/FragmentSearch.java | 10 +-- .../ceui/lisa/fragments/WebNovelParser.kt | 32 +++++++++ app/src/main/java/ceui/lisa/http/AppApi.java | 13 ++-- .../java/ceui/lisa/utils/PixivOperate.java | 6 +- .../main/java/ceui/lisa/models/NovelBean.java | 27 ++++++++ .../main/java/ceui/lisa/models/WebNovel.kt | 27 ++++++++ 15 files changed, 235 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/ceui/lisa/fragments/WebNovelParser.kt create mode 100644 models/src/main/java/ceui/lisa/models/WebNovel.kt diff --git a/app/src/main/java/ceui/lisa/activities/BaseActivity.java b/app/src/main/java/ceui/lisa/activities/BaseActivity.java index 213c44495..1decb8b18 100644 --- a/app/src/main/java/ceui/lisa/activities/BaseActivity.java +++ b/app/src/main/java/ceui/lisa/activities/BaseActivity.java @@ -175,4 +175,13 @@ private void updateTheme() { break; } } + + protected long tryParseId(String str) { + try { + return Long.parseLong(str); + } catch (Exception ex) { + ex.printStackTrace(); + } + return 0; + } } diff --git a/app/src/main/java/ceui/lisa/activities/OutWakeActivity.java b/app/src/main/java/ceui/lisa/activities/OutWakeActivity.java index 161525e3c..be38e51f2 100644 --- a/app/src/main/java/ceui/lisa/activities/OutWakeActivity.java +++ b/app/src/main/java/ceui/lisa/activities/OutWakeActivity.java @@ -69,7 +69,7 @@ protected void initData() { List pathArray = uri.getPathSegments(); String illustID = pathArray.get(pathArray.size() - 1); if (!TextUtils.isEmpty(illustID)) { - PixivOperate.getIllustByID(Shaft.sUserModel, Integer.parseInt(illustID), mContext, new Callback() { + PixivOperate.getIllustByID(Shaft.sUserModel, tryParseId(illustID), mContext, new Callback() { @Override public void doSomething(Void t) { finish(); @@ -93,7 +93,7 @@ public void doSomething(Void t) { List pathArray = uri.getPathSegments(); novelId = pathArray.get(pathArray.size() - 1); } - PixivOperate.getNovelByID(sUserModel, Integer.parseInt(novelId), mContext, new Callback() { + PixivOperate.getNovelByID(sUserModel, tryParseId(novelId), mContext, new Callback() { @Override public void doSomething(Void t) { finish(); @@ -126,7 +126,7 @@ public void doSomething(Void t) { String idString = end.split("_")[0]; Common.showLog("end " + end + " idString " + idString); - PixivOperate.getIllustByID(Shaft.sUserModel, Integer.parseInt(idString), mContext, new Callback() { + PixivOperate.getIllustByID(Shaft.sUserModel, tryParseId(idString), mContext, new Callback() { @Override public void doSomething(Void t) { finish(); @@ -158,7 +158,7 @@ public void doSomething(Void t) { String illustID = uri.getQueryParameter("illust_id"); if (!TextUtils.isEmpty(illustID)) { - PixivOperate.getIllustByID(Shaft.sUserModel, Integer.parseInt(illustID), mContext, new Callback() { + PixivOperate.getIllustByID(Shaft.sUserModel, tryParseId(illustID), mContext, new Callback() { @Override public void doSomething(Void t) { finish(); @@ -262,14 +262,14 @@ public void onClick(QMUIDialog dialog, int index) { if (host.contains("illusts")) { String path = uri.getPath(); - PixivOperate.getIllustByID(Shaft.sUserModel, Integer.parseInt(path.substring(1)), + PixivOperate.getIllustByID(Shaft.sUserModel, tryParseId(path.substring(1)), mContext, t -> finish(),null); return; } if (host.contains("novels")) { String path = uri.getPath(); - PixivOperate.getNovelByID(Shaft.sUserModel, Integer.parseInt(path.substring(1)), + PixivOperate.getNovelByID(Shaft.sUserModel, tryParseId(path.substring(1)), mContext, t -> finish()); return; } diff --git a/app/src/main/java/ceui/lisa/activities/SearchActivity.java b/app/src/main/java/ceui/lisa/activities/SearchActivity.java index 70f58a04a..bfa18954e 100644 --- a/app/src/main/java/ceui/lisa/activities/SearchActivity.java +++ b/app/src/main/java/ceui/lisa/activities/SearchActivity.java @@ -233,7 +233,7 @@ else if(Common.isNumeric(trimmedKeyword)){ .create(); tipDialog.show(); //先假定为作品id - PixivOperate.getIllustByID(sUserModel, Integer.parseInt(trimmedKeyword), mContext, new Callback() { + PixivOperate.getIllustByID(sUserModel, tryParseId(trimmedKeyword), mContext, new Callback() { @Override public void doSomething(Void t) { PixivOperate.insertSearchHistory(trimmedKeyword, SearchTypeUtil.SEARCH_TYPE_DB_ILLUSTSID); diff --git a/app/src/main/java/ceui/lisa/core/Manager.java b/app/src/main/java/ceui/lisa/core/Manager.java index a02a82b83..43b8b355f 100644 --- a/app/src/main/java/ceui/lisa/core/Manager.java +++ b/app/src/main/java/ceui/lisa/core/Manager.java @@ -60,8 +60,12 @@ public void restore() { content = new ArrayList<>(); } for (DownloadingEntity entity : downloadingEntities) { - DownloadItem downloadItem = Shaft.sGson.fromJson(entity.getTaskGson(), DownloadItem.class); - content.add(downloadItem); + try { + DownloadItem downloadItem = Shaft.sGson.fromJson(entity.getTaskGson(), DownloadItem.class); + content.add(downloadItem); + } catch (Exception ex) { + ex.printStackTrace(); + } } Common.showToast("下载记录恢复成功"); } diff --git a/app/src/main/java/ceui/lisa/fragments/BaseFragment.java b/app/src/main/java/ceui/lisa/fragments/BaseFragment.java index e094836a1..0798baa11 100644 --- a/app/src/main/java/ceui/lisa/fragments/BaseFragment.java +++ b/app/src/main/java/ceui/lisa/fragments/BaseFragment.java @@ -156,4 +156,13 @@ public void finish() { public void initModel() { } + + protected long tryParseId(String str) { + try { + return Long.parseLong(str); + } catch (Exception ex) { + ex.printStackTrace(); + } + return 0; + } } diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentDownload.java b/app/src/main/java/ceui/lisa/fragments/FragmentDownload.java index 146054f5a..7bd645964 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentDownload.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentDownload.java @@ -15,6 +15,7 @@ import ceui.lisa.R; import ceui.lisa.activities.Shaft; +import ceui.lisa.adapters.BaseAdapter; import ceui.lisa.core.Manager; import ceui.lisa.database.AppDatabase; import ceui.lisa.databinding.ViewpagerWithTablayoutBinding; @@ -74,13 +75,19 @@ public void onClick(QMUIDialog dialog, int index) { return true; } else if (item.getItemId() == R.id.action_start) { Manager.get().startAll(); - if(allPages[0] instanceof FragmentDownloading){ - ((FragmentDownloading) allPages[0]).mAdapter.notifyDataSetChanged(); + if (allPages[0] instanceof FragmentDownloading){ + final BaseAdapter adapter = ((FragmentDownloading) allPages[0]).mAdapter; + if (adapter != null) { + adapter.notifyDataSetChanged(); + } } } else if (item.getItemId() == R.id.action_stop) { Manager.get().stopAll(); - if(allPages[0] instanceof FragmentDownloading){ - ((FragmentDownloading) allPages[0]).mAdapter.notifyDataSetChanged(); + if (allPages[0] instanceof FragmentDownloading){ + final BaseAdapter adapter = ((FragmentDownloading) allPages[0]).mAdapter; + if (adapter != null) { + adapter.notifyDataSetChanged(); + } } } else if (item.getItemId() == R.id.action_clear) { if (allPages[0] instanceof FragmentDownloading && diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentImageDetail.java b/app/src/main/java/ceui/lisa/fragments/FragmentImageDetail.java index fa2269e82..3fec393c6 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentImageDetail.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentImageDetail.java @@ -87,21 +87,24 @@ private void loadImage() { baseBind.emptyFrame.setVisibility(View.GONE); baseBind.progressLayout.getRoot().setVisibility(View.VISIBLE); String imageUrl; - baseBind.bigImage.setMaxScale(3.5F); - baseBind.bigImage.setDoubleTapZoomScale(2F); if (mIllustsBean == null && !TextUtils.isEmpty(url)) { + setUpMediumResolutionDoubleTap(); imageUrl = url; } else { final String originUrl = IllustDownload.getUrl(mIllustsBean, index); if (Shaft.getMMKV().decodeBool(originUrl)) { + setUpHighResolutionDoubleTap(); imageUrl = originUrl; } else { if (!TextUtils.isEmpty(url)) { + setUpMediumResolutionDoubleTap(); imageUrl = url; } else { if (Shaft.sSettings.isShowOriginalImage()) { + setUpHighResolutionDoubleTap(); imageUrl = IllustDownload.getUrl(mIllustsBean, index, Params.IMAGE_RESOLUTION_ORIGINAL); } else { + setUpMediumResolutionDoubleTap(); imageUrl = IllustDownload.getUrl(mIllustsBean, index, Params.IMAGE_RESOLUTION_LARGE); } } @@ -156,6 +159,16 @@ protected void onResourceCleared(@Nullable Drawable placeholder) { }); } + private void setUpHighResolutionDoubleTap() { + baseBind.bigImage.setMaxScale(3.8F); + baseBind.bigImage.setDoubleTapZoomScale(1.8F); + } + + private void setUpMediumResolutionDoubleTap() { + baseBind.bigImage.setMaxScale(7F); + baseBind.bigImage.setDoubleTapZoomScale(4F); + } + @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentNovelHolder.java b/app/src/main/java/ceui/lisa/fragments/FragmentNovelHolder.java index 77e672165..6fadde2a2 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentNovelHolder.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentNovelHolder.java @@ -1,5 +1,7 @@ package ceui.lisa.fragments; +import static ceui.lisa.activities.Shaft.sUserModel; + import android.content.Intent; import android.content.res.ColorStateList; import android.net.Uri; @@ -23,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; +import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import ceui.lisa.R; @@ -44,6 +47,7 @@ import ceui.lisa.interfaces.Callback; import ceui.lisa.models.NovelBean; import ceui.lisa.models.NovelDetail; +import ceui.lisa.models.NovelSearchResponse; import ceui.lisa.models.TagsBean; import ceui.lisa.utils.Common; import ceui.lisa.utils.Dev; @@ -55,6 +59,9 @@ import gdut.bsx.share2.ShareContentType; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Response; public class FragmentNovelHolder extends BaseFragment { @@ -103,7 +110,7 @@ public void onFinish(boolean isTransformed) { @Override protected void initData() { - getNovel(mNovelBean); + displayNovel(mNovelBean); } public void setBackgroundColor(int color) { @@ -117,7 +124,7 @@ public void setTextColor(int color) { setNovelAdapter(); } - private void getNovel(NovelBean novelBean) { + private void displayNovel(NovelBean novelBean) { mNovelBean = novelBean; if (mNovelBean.isIs_bookmarked()) { baseBind.like.setText(mContext.getString(R.string.string_179)); @@ -226,21 +233,24 @@ public void onClick(View v) { refreshDetail(mNovelDetail); } else { baseBind.progressRela.setVisibility(View.VISIBLE); - Retro.getAppApi().getNovelDetail(Shaft.sUserModel.getAccess_token(), novelBean.getId()) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new NullCtrl() { + Retro.getAppApi().getNovelDetailV2(Shaft.sUserModel.getAccess_token(), novelBean.getId()).enqueue(new retrofit2.Callback() { + @Override + public void onResponse(Call call, Response response) { + baseBind.progressRela.setVisibility(View.INVISIBLE); + new WebNovelParser(response) { @Override - public void success(NovelDetail novelDetail) { + public void onNovelPrepared(@NonNull NovelDetail novelDetail) { novelDetail.setParsedChapters(NovelParseHelper.tryParseChapters(novelDetail.getNovel_text())); refreshDetail(novelDetail); } + }; + } - @Override - public void must(boolean isSuccess) { - baseBind.progressRela.setVisibility(View.INVISIBLE); - } - }); + @Override + public void onFailure(Call call, Throwable t) { + baseBind.progressRela.setVisibility(View.INVISIBLE); + } + }); } baseBind.toolbar.setOnTouchListener(new View.OnTouchListener() { @@ -281,7 +291,15 @@ public boolean onTouch(View v, MotionEvent event) { @Override public void onClick(View view) { baseBind.transformationLayout.finishTransform(); - getNovel(novelDetail.getSeries_prev()); + Retro.getAppApi().getNovelByID(sUserModel.getAccess_token(), novelDetail.getSeries_prev().getId()) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new NullCtrl() { + @Override + public void success(NovelSearchResponse novelSearchResponse) { + displayNovel(novelSearchResponse.getNovel()); + } + }); } }); } else { @@ -293,7 +311,15 @@ public void onClick(View view) { @Override public void onClick(View view) { baseBind.transformationLayout.finishTransform(); - getNovel(novelDetail.getSeries_next()); + Retro.getAppApi().getNovelByID(sUserModel.getAccess_token(), novelDetail.getSeries_next().getId()) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new NullCtrl() { + @Override + public void success(NovelSearchResponse novelSearchResponse) { + displayNovel(novelSearchResponse.getNovel()); + } + }); } }); } else { @@ -397,13 +423,15 @@ private void setNovelAdapter() { int pageIndex = Math.min(novelDetail.getNovel_marker().getPage(),novelDetail.getParsedChapters().get(parsedSize-1).getChapterIndex()); pageIndex = Math.max(pageIndex,novelDetail.getParsedChapters().get(0).getChapterIndex()); baseBind.viewPager.scrollToPosition(pageIndex-1); - } - // 设置书签 - int markerPage = mNovelDetail.getNovel_marker().getPage(); - if(markerPage > 0){ - baseBind.saveNovel.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.novel_marker_add))); - }else{ + // 设置书签 + int markerPage = mNovelDetail.getNovel_marker().getPage(); + if(markerPage > 0){ + baseBind.saveNovel.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.novel_marker_add))); + }else{ + baseBind.saveNovel.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.novel_marker_none))); + } + } else { baseBind.saveNovel.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext, R.color.novel_marker_none))); } diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentNovelSeriesDetail.java b/app/src/main/java/ceui/lisa/fragments/FragmentNovelSeriesDetail.java index 236e53eb4..ad1472216 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentNovelSeriesDetail.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentNovelSeriesDetail.java @@ -5,6 +5,7 @@ import android.view.MenuItem; import android.view.View; +import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.databinding.ViewDataBinding; @@ -23,6 +24,7 @@ import ceui.lisa.core.BaseRepo; import ceui.lisa.databinding.FragmentNovelSeriesBinding; import ceui.lisa.download.IllustDownload; +import ceui.lisa.helper.NovelParseHelper; import ceui.lisa.http.NullCtrl; import ceui.lisa.http.Retro; import ceui.lisa.interfaces.Callback; @@ -38,6 +40,9 @@ import ceui.lisa.utils.PixivOperate; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Response; public class FragmentNovelSeriesDetail extends NetListFragment { @@ -69,16 +74,21 @@ public boolean onMenuItemClick(MenuItem item) { if (novelBean.isLocalSaved()) { saveNovelToDownload(novelBean, Cache.get().getModel(Params.NOVEL_KEY + novelBean.getId(), NovelDetail.class)); } else { - Retro.getAppApi().getNovelDetail(Shaft.sUserModel.getAccess_token(), novelBean.getId()) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new NullCtrl() { - + Retro.getAppApi().getNovelDetailV2(Shaft.sUserModel.getAccess_token(), novelBean.getId()).enqueue(new retrofit2.Callback() { + @Override + public void onResponse(Call call, Response response) { + new WebNovelParser(response) { @Override - public void success(NovelDetail novelDetail) { + public void onNovelPrepared(@NonNull NovelDetail novelDetail) { saveNovelToDownload(novelBean, novelDetail); } - }); + }; + } + + @Override + public void onFailure(Call call, Throwable t) { + } + }); } } } else if (item.getItemId() == R.id.batch_download_as_one) { @@ -94,13 +104,12 @@ public void success(NovelDetail novelDetail) { saveNovelSeriesToDownload(mResponse.getNovel_series_detail(), content); } } else { - Retro.getAppApi().getNovelDetail(Shaft.sUserModel.getAccess_token(), novelBean.getId()) - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new NullCtrl() { - + Retro.getAppApi().getNovelDetailV2(Shaft.sUserModel.getAccess_token(), novelBean.getId()).enqueue(new retrofit2.Callback() { + @Override + public void onResponse(Call call, Response response) { + new WebNovelParser(response) { @Override - public void success(NovelDetail novelDetail) { + public void onNovelPrepared(@NonNull NovelDetail novelDetail) { String sb = lineSeparator + novelBean.getTitle() + " - " + novelBean.getId() + lineSeparator + novelDetail.getNovel_text(); taskContainer.put(novelBean.getId(), sb); @@ -109,7 +118,13 @@ public void success(NovelDetail novelDetail) { saveNovelSeriesToDownload(mResponse.getNovel_series_detail(), content); } } - }); + }; + } + + @Override + public void onFailure(Call call, Throwable t) { + } + }); } } } diff --git a/app/src/main/java/ceui/lisa/fragments/FragmentSearch.java b/app/src/main/java/ceui/lisa/fragments/FragmentSearch.java index 1bc0817fb..cc6f99b70 100644 --- a/app/src/main/java/ceui/lisa/fragments/FragmentSearch.java +++ b/app/src/main/java/ceui/lisa/fragments/FragmentSearch.java @@ -196,7 +196,7 @@ private void dispatchClick(String keyWord, int searchType) { } else if (searchType == 1) { if (Common.isNumeric(trimmedKeyword)) { PixivOperate.insertSearchHistory(trimmedKeyword, SearchTypeUtil.SEARCH_TYPE_DB_ILLUSTSID); - PixivOperate.getIllustByID(sUserModel, Integer.parseInt(trimmedKeyword), mContext); + PixivOperate.getIllustByID(sUserModel, tryParseId(trimmedKeyword), mContext); } else { Common.showToast(getString(R.string.string_154)); } @@ -212,7 +212,7 @@ private void dispatchClick(String keyWord, int searchType) { } else if (searchType == 3) { if (Common.isNumeric(trimmedKeyword)) { PixivOperate.insertSearchHistory(trimmedKeyword, SearchTypeUtil.SEARCH_TYPE_DB_NOVELID); - PixivOperate.getNovelByID(sUserModel, Integer.parseInt(trimmedKeyword), mContext, null); + PixivOperate.getNovelByID(sUserModel, tryParseId(trimmedKeyword), mContext, null); } else { Common.showToast(getString(R.string.string_154)); } @@ -249,7 +249,7 @@ else if(Common.isNumeric(trimmedKeyword)){ .create(); tipDialog.show(); //先假定为作品id - PixivOperate.getIllustByID(sUserModel, Integer.parseInt(trimmedKeyword), mContext, new Callback() { + PixivOperate.getIllustByID(sUserModel, tryParseId(trimmedKeyword), mContext, new Callback() { @Override public void doSomething(Void t) { PixivOperate.insertSearchHistory(trimmedKeyword, SearchTypeUtil.SEARCH_TYPE_DB_ILLUSTSID); @@ -448,7 +448,7 @@ public boolean onTagClick(View view, int position, FlowLayout parent) { } else if (history.get(position).getSearchType() == SearchTypeUtil.SEARCH_TYPE_DB_ILLUSTSID) { history.get(position).setSearchTime(System.currentTimeMillis()); AppDatabase.getAppDatabase(mContext).searchDao().insert(history.get(position)); - PixivOperate.getIllustByID(sUserModel, Integer.parseInt(history.get(position).getKeyword()), mContext); + PixivOperate.getIllustByID(sUserModel, tryParseId(history.get(position).getKeyword()), mContext); } else if (history.get(position).getSearchType() == SearchTypeUtil.SEARCH_TYPE_DB_USERKEYWORD) { baseBind.hintList.setVisibility(View.INVISIBLE); Intent intent = new Intent(mContext, SearchActivity.class); @@ -464,7 +464,7 @@ public boolean onTagClick(View view, int position, FlowLayout parent) { } else if (history.get(position).getSearchType() == SearchTypeUtil.SEARCH_TYPE_DB_NOVELID) { history.get(position).setSearchTime(System.currentTimeMillis()); AppDatabase.getAppDatabase(mContext).searchDao().insert(history.get(position)); - PixivOperate.getNovelByID(sUserModel, Integer.parseInt(history.get(position).getKeyword()), mContext, null); + PixivOperate.getNovelByID(sUserModel, tryParseId(history.get(position).getKeyword()), mContext, null); } else if (history.get(position).getSearchType() == SearchTypeUtil.SEARCH_TYPE_DB_URL) { history.get(position).setSearchTime(System.currentTimeMillis()); AppDatabase.getAppDatabase(mContext).searchDao().insert(history.get(position)); diff --git a/app/src/main/java/ceui/lisa/fragments/WebNovelParser.kt b/app/src/main/java/ceui/lisa/fragments/WebNovelParser.kt new file mode 100644 index 000000000..d09198a5c --- /dev/null +++ b/app/src/main/java/ceui/lisa/fragments/WebNovelParser.kt @@ -0,0 +1,32 @@ +package ceui.lisa.fragments + +import ceui.lisa.models.NovelDetail +import ceui.lisa.models.WebNovel +import com.google.gson.Gson +import okhttp3.ResponseBody +import retrofit2.Response + +abstract class WebNovelParser(response: Response) { + + init { + try { + val html = response.body()?.string() ?: "" + html.lines().forEach { + if (it.contains("novel: {\"id\":")) { + val cleaned = it.trim() + val result = cleaned.substring(7, cleaned.length - 1) + val webNovel = Gson().fromJson(result, WebNovel::class.java) + onNovelPrepared(NovelDetail().apply { + novel_text = webNovel.text + series_next = webNovel.seriesNavigation?.nextNovel + series_prev = webNovel.seriesNavigation?.prevNovel + }) + } + } + } catch (ex: Exception) { + ex.printStackTrace() + } + } + + abstract fun onNovelPrepared(novelDetail: NovelDetail) +} diff --git a/app/src/main/java/ceui/lisa/http/AppApi.java b/app/src/main/java/ceui/lisa/http/AppApi.java index bd8621723..a015f1214 100644 --- a/app/src/main/java/ceui/lisa/http/AppApi.java +++ b/app/src/main/java/ceui/lisa/http/AppApi.java @@ -31,6 +31,8 @@ import ceui.lisa.models.UserState; import io.reactivex.Observable; import okhttp3.MultipartBody; +import okhttp3.ResponseBody; +import retrofit2.Call; import retrofit2.http.Field; import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; @@ -316,7 +318,7 @@ Observable postDislikeNovel(@Header("Authorization") String token, @GET("v1/illust/detail?filter=for_android") Observable getIllustByID(@Header("Authorization") String token, - @Query("illust_id") int illust_id); + @Query("illust_id") long illust_id); @GET("v1/search/user?filter=for_android") @@ -411,10 +413,9 @@ Observable getNewWorks(@Header("Authorization") String token, Observable getNewNovels(@Header("Authorization") String token); - //获取好P友 - @GET("v1/novel/text") - Observable getNovelDetail(@Header("Authorization") String token, - @Query("novel_id") int novel_id); + @GET("/webview/v2/novel") + Call getNovelDetailV2(@Header("Authorization") String token, + @Query("id") long id); //获取好P友 @@ -441,7 +442,7 @@ Observable getNovelSeries(@Header("Authorization") String tok @GET("v2/novel/detail") Observable getNovelByID(@Header("Authorization") String token, - @Query("novel_id") int novel_id); + @Query("novel_id") long novel_id); @GET("v1/illust/series?filter=for_android") Observable getMangaSeriesById(@Header("Authorization") String token, diff --git a/app/src/main/java/ceui/lisa/utils/PixivOperate.java b/app/src/main/java/ceui/lisa/utils/PixivOperate.java index 744d182af..f67907141 100644 --- a/app/src/main/java/ceui/lisa/utils/PixivOperate.java +++ b/app/src/main/java/ceui/lisa/utils/PixivOperate.java @@ -262,7 +262,7 @@ public void next(NullResponse nullResponse) { } } - public static void getIllustByID(UserModel userModel, int illustID, Context context) { + public static void getIllustByID(UserModel userModel, long illustID, Context context) { QMUITipDialog tipDialog = new QMUITipDialog.Builder(context) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord(getString(R.string.string_429)) @@ -313,7 +313,7 @@ public void must() { }); } - public static void getIllustByID(UserModel userModel, int illustID, Context context, + public static void getIllustByID(UserModel userModel, long illustID, Context context, ceui.lisa.interfaces.Callback success,ceui.lisa.interfaces.Callback fail) { Retro.getAppApi().getIllustByID(userModel.getAccess_token(), illustID) .subscribeOn(Schedulers.newThread()) @@ -355,7 +355,7 @@ public void must() { }); } - public static void getNovelByID(UserModel userModel, int novel, Context context, + public static void getNovelByID(UserModel userModel, long novel, Context context, ceui.lisa.interfaces.Callback callback) { Retro.getAppApi().getNovelByID(userModel.getAccess_token(), novel) .subscribeOn(Schedulers.newThread()) diff --git a/models/src/main/java/ceui/lisa/models/NovelBean.java b/models/src/main/java/ceui/lisa/models/NovelBean.java index a7fd603ba..880b8c50c 100644 --- a/models/src/main/java/ceui/lisa/models/NovelBean.java +++ b/models/src/main/java/ceui/lisa/models/NovelBean.java @@ -32,12 +32,15 @@ public class NovelBean implements Serializable, Starable { private int id; private String title; + private String coverUrl; private String caption; private int restrict; private int x_restrict; private boolean is_original; + private boolean viewable; private ImageUrlsBean image_urls; private String create_date; + private String contentOrder; private int page_count; private int text_length; private UserBean user; @@ -302,4 +305,28 @@ public String getTagString() { public String[] getTagNames(){ return tags.stream().map(TagsBean::getName).toArray(String[]::new); } + + public String getCoverUrl() { + return coverUrl; + } + + public void setCoverUrl(String coverUrl) { + this.coverUrl = coverUrl; + } + + public boolean isViewable() { + return viewable; + } + + public void setViewable(boolean viewable) { + this.viewable = viewable; + } + + public String getContentOrder() { + return contentOrder; + } + + public void setContentOrder(String contentOrder) { + this.contentOrder = contentOrder; + } } diff --git a/models/src/main/java/ceui/lisa/models/WebNovel.kt b/models/src/main/java/ceui/lisa/models/WebNovel.kt new file mode 100644 index 000000000..a333aba25 --- /dev/null +++ b/models/src/main/java/ceui/lisa/models/WebNovel.kt @@ -0,0 +1,27 @@ +package ceui.lisa.models + +data class WebNovel( + val aiType: Int? = null, + val caption: String? = null, + val coverUrl: String? = null, + val glossaryItems: List? = null, + val id: String? = null, + val text: String? = null, + val illusts: List? = null, + val images: List? = null, + val isOriginal: Boolean? = null, + val marker: Any? = null, + val replaceableItemIds: List? = null, + val seriesId: String? = null, + val seriesIsWatched: Boolean? = null, + val seriesNavigation: SeriesNavigation? = null, + val seriesTitle: String? = null, + val tags: List? = null, + val title: String? = null, + val userId: String? = null +) + +data class SeriesNavigation( + val nextNovel: NovelBean? = null, + val prevNovel: NovelBean? = null +) \ No newline at end of file