From 3a13bc84083725d3c6e6dcb529b20f394e600fe5 Mon Sep 17 00:00:00 2001 From: stevenyomi <95685115+stevenyomi@users.noreply.github.com> Date: Mon, 3 Oct 2022 19:48:28 +0800 Subject: [PATCH] DMZJ: rewrite, add rankings and comments (#13689) * DMZJ: rewrite, add rankings and comments * update launcher icons * fix ranking issue * add more description * add more description * add more description * add prompt if comment is empty --- src/zh/dmzj/API.md | 138 ++++ src/zh/dmzj/build.gradle | 4 +- src/zh/dmzj/res/mipmap-hdpi/ic_launcher.png | Bin 2790 -> 3756 bytes src/zh/dmzj/res/mipmap-mdpi/ic_launcher.png | Bin 1532 -> 2047 bytes src/zh/dmzj/res/mipmap-xhdpi/ic_launcher.png | Bin 3646 -> 5379 bytes src/zh/dmzj/res/mipmap-xxhdpi/ic_launcher.png | Bin 6669 -> 9872 bytes .../dmzj/res/mipmap-xxxhdpi/ic_launcher.png | Bin 11115 -> 14023 bytes src/zh/dmzj/res/web_hi_res_512.png | Bin 42097 -> 78388 bytes .../tachiyomi/extension/zh/dmzj/ApiSearch.kt | 42 ++ .../tachiyomi/extension/zh/dmzj/ApiV3.kt | 99 +++ .../tachiyomi/extension/zh/dmzj/ApiV4.kt | 193 ++++++ .../extension/zh/dmzj/CommentsInterceptor.kt | 71 ++ .../tachiyomi/extension/zh/dmzj/Common.kt | 49 ++ .../tachiyomi/extension/zh/dmzj/Dmzj.kt | 648 ++++-------------- .../extension/zh/dmzj/DmzjUrlActivity.kt | 2 +- .../tachiyomi/extension/zh/dmzj/Filters.kt | 199 ++++++ .../extension/zh/dmzj/ImageUrlInterceptor.kt | 41 ++ .../extension/zh/dmzj/Preferences.kt | 87 +++ .../extension/zh/dmzj/RetryInterceptor.kt | 18 + .../dmzj/protobuf/V4apiComicDetailResponse.kt | 66 -- .../dmzj/utils/HttpGetFailoverInterceptor.kt | 55 -- .../tachiyomi/extension/zh/dmzj/utils/RSA.kt | 43 +- 22 files changed, 1076 insertions(+), 679 deletions(-) create mode 100644 src/zh/dmzj/API.md create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV3.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV4.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/CommentsInterceptor.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Common.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Filters.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ImageUrlInterceptor.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Preferences.kt create mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/RetryInterceptor.kt delete mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/protobuf/V4apiComicDetailResponse.kt delete mode 100644 src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/HttpGetFailoverInterceptor.kt diff --git a/src/zh/dmzj/API.md b/src/zh/dmzj/API.md new file mode 100644 index 000000000..84da5bc51 --- /dev/null +++ b/src/zh/dmzj/API.md @@ -0,0 +1,138 @@ +# API v4 + +## Manga details + +Mostly taken from [here](https://github.com/xiaoyaocz/dmzj_flutter/blob/aac6ba3/lib/protobuf/comic/detail_response.proto). + +```protobuf +syntax = "proto3"; + +package dmzj.comic; + + +message ComicDetailResponse { + int32 Errno = 1; + string Errmsg = 2; + ComicDetailInfoResponse Data= 3; +} + +message ComicDetailInfoResponse { + int32 Id = 1; + string Title = 2; + int32 Direction=3; + int32 Islong=4; + int32 IsDmzj=5; + string Cover=6; + string Description=7; + int64 LastUpdatetime=8; + string LastUpdateChapterName=9; + int32 Copyright=10; + string FirstLetter=11; + string ComicPy=12; + int32 Hidden=13; + int32 HotNum=14; + int32 HitNum=15; + int32 Uid=16; + int32 IsLock=17; + int32 LastUpdateChapterId=18; + repeated ComicDetailTypeItemResponse Types=19; + repeated ComicDetailTypeItemResponse Status=20; + repeated ComicDetailTypeItemResponse Authors=21; + int32 SubscribeNum=22; + repeated ComicDetailChapterResponse Chapters=23; + int32 IsNeedLogin=24; + //object UrlLinks=25; { string name = 1; repeated object links = 2; } + // link { int32 = 1; string name = 2; string uriOrApk = 3; string icon = 4; string packageName = 5; string apk = 6; int32 = 7; } + int32 IsHideChapter=26; + //repeated object DhUrlLinks=27; { string name = 1; } + +} + +message ComicDetailTypeItemResponse { + int32 TagId = 1; + string TagName = 2; +} + +message ComicDetailChapterResponse { + string Title = 1; + repeated ComicDetailChapterInfoResponse Data=2; +} +message ComicDetailChapterInfoResponse { + int32 ChapterId = 1; + string ChapterTitle = 2; + int64 Updatetime=3; + int32 Filesize=4; + int32 ChapterOrder=5; +} +``` + +## Ranking + +Taken from [here](https://github.com/xiaoyaocz/dmzj_flutter/blob/e7f1b1e/lib/protobuf/comic/rank_list_response.proto). + +```protobuf +syntax = "proto3"; + +package dmzj.comic; + + +message ComicRankListResponse { + int32 Errno = 1; + string Errmsg = 2; + repeated ComicRankListItemResponse Data= 3; +} + +message ComicRankListItemResponse { + int32 ComicId = 1; + string Title = 2; + string Authors=3; + string Status=4; + string Cover=5; + string Types=6; + int64 LastUpdatetime=7; + string LastUpdateChapterName=8; + string ComicPy=9; + int32 Num=10; + int32 TagId=11; + string ChapterName=12; + int32 ChapterId=13; +} +``` + +## Chapter images + +```kotlin +@Serializable +class ResponseDto( + @ProtoNumber(1) val code: Int?, + @ProtoNumber(2) val message: String?, + @ProtoNumber(3) val data: T?, +) + +@Serializable +class ChapterImagesDto( + @ProtoNumber(1) val id: Int, + @ProtoNumber(2) val mangaId: Int, + @ProtoNumber(3) val name: String, + @ProtoNumber(4) val order: Int, + @ProtoNumber(5) val direction: Int, + @ProtoNumber(6) val lowResImages: List, + @ProtoNumber(7) val pageCount: Int?, + @ProtoNumber(8) val images: List, + @ProtoNumber(9) val commentCount: Int, +) +``` + +# Unused legacy API + +## Chapter images + +```kotlin +val webviewPageListApiUrl = "https://m.dmzj.com/chapinfo" +GET("$webviewPageListApiUrl/${chapter.url}.html") +``` + +```kotlin +val oldPageListApiUrl = "http://api.m.dmzj.com" // this domain has an expired certificate +GET("$oldPageListApiUrl/comic/chapter/${chapter.url}.html") +``` diff --git a/src/zh/dmzj/build.gradle b/src/zh/dmzj/build.gradle index 3efbb6521..d771227d7 100644 --- a/src/zh/dmzj/build.gradle +++ b/src/zh/dmzj/build.gradle @@ -3,10 +3,10 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlinx-serialization' ext { - extName = 'Dmzj' + extName = 'DMZJ' pkgNameSuffix = 'zh.dmzj' extClass = '.Dmzj' - extVersionCode = 31 + extVersionCode = 32 } apply from: "$rootDir/common.gradle" diff --git a/src/zh/dmzj/res/mipmap-hdpi/ic_launcher.png b/src/zh/dmzj/res/mipmap-hdpi/ic_launcher.png index aaddbe1711e271d9b6f53ae05ba82985269b9665..48efce5172e9ab13eb107c07056c22ee3ae334d6 100644 GIT binary patch literal 3756 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 Qy8r+H07*qoM6N<$f_540%>V!Z delta 1515 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 Q?EnA(07*qoM6N<$f-#TXDgXcg diff --git a/src/zh/dmzj/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/dmzj/res/mipmap-xxhdpi/ic_launcher.png index c12efcf7411e707d592d65fb21353ccc8e7c36b9..1edcb656ec9104108f5dd4c1e58e82253645356f 100644 GIT binary patch literal 9872 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 g9vzii`mCy|hMj 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 X;o=l>S^q6g00000NkvXXu0mjft_ox( diff --git a/src/zh/dmzj/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/dmzj/res/mipmap-xxxhdpi/ic_launcher.png index 7f7f4b5142ef7840352193b193eb174ca786e0f7..5e053fbeb7b4524618dd2a717eadfb7189d330fe 100644 GIT binary patch literal 14023 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 diff --git a/src/zh/dmzj/res/web_hi_res_512.png b/src/zh/dmzj/res/web_hi_res_512.png index 85314a5c81c5a51fe19a5bc3ee04c171d48af759..d040c2123ba9e832ba159dbfa510c91cbdf8536c 100644 GIT binary patch literal 78388 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

tIi?tPf-dkrkQ4IWZTC9Xf7dz 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 aBOIK!x#H&vnT%5a{Bw22I#oH~Z~X_gz*O=8 diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt new file mode 100644 index 000000000..c5487b154 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiSearch.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromString +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Response + +object ApiSearch { + + fun textSearchUrl(query: String) = + "http://s.acg.dmzj.com/comicsum/search.php".toHttpUrl().newBuilder() + .addQueryParameter("s", query) + .toString() + + fun parsePage(response: Response): MangasPage { + if (!response.isSuccessful) { + response.close() + return MangasPage(emptyList(), false) + } + // "var g_search_data = [...];" + val js = response.body!!.string().run { substring(20, length - 1) } + val data: List = json.decodeFromString(js) + return MangasPage(data.map { it.toSManga() }, false) + } + + @Serializable + class MangaDto( + private val id: Int, + private val comic_name: String, + private val comic_author: String, + private val comic_cover: String, + ) { + fun toSManga() = SManga.create().apply { + url = getMangaUrl(id.toString()) + title = comic_name + author = comic_author.formatList() + thumbnail_url = comic_cover + } + } +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV3.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV3.kt new file mode 100644 index 000000000..2752ac34a --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV3.kt @@ -0,0 +1,99 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonPrimitive +import okhttp3.Response + +object ApiV3 { + + private const val v3apiUrl = "https://v3api.dmzj.com" + private const val apiUrl = "https://api.dmzj.com" + + fun popularMangaUrl(page: Int) = "$v3apiUrl/classify/0/0/${page - 1}.json" + + fun latestUpdatesUrl(page: Int) = "$v3apiUrl/classify/0/1/${page - 1}.json" + + fun pageUrl(page: Int, filters: FilterList) = "$v3apiUrl/classify/${parseFilters(filters)}/${page - 1}.json" + + fun parsePage(response: Response): MangasPage { + val data: List = response.parseAs() + return MangasPage(data.map { it.toSManga() }, data.isNotEmpty()) + } + + fun mangaInfoUrlV1(id: String) = "$apiUrl/dynamic/comicinfo/$id.json" + + private fun parseMangaInfoV1(response: Response): ResponseDto = response.parseAs() + + fun parseMangaDetailsV1(response: Response): SManga { + return parseMangaInfoV1(response).data.info.toSManga() + } + + fun parseChapterListV1(response: Response): List { + return parseMangaInfoV1(response).data.list.map { it.toSChapter() } + } + + fun chapterCommentsUrl(path: String) = "$v3apiUrl/viewPoint/0/$path.json" + + fun parseChapterComments(response: Response): List { + val result: List = response.parseAs() + (result as MutableList).sort() + return result.map { it.toString() } + } + + @Serializable + class MangaDto( + private val id: JsonPrimitive, // can be int or string + private val title: String, + private val authors: String, + private val status: String, + private val cover: String, + private val types: String, + private val description: String? = null, + ) { + fun toSManga() = SManga.create().apply { + url = getMangaUrl(id.content) + title = this@MangaDto.title + author = authors.formatList() + genre = types.formatList() + status = parseStatus(this@MangaDto.status) + thumbnail_url = cover + + val desc = this@MangaDto.description ?: return@apply + description = "$desc\n\n漫画 ID (2): ${id.content}" // hidden + initialized = true + } + } + + @Serializable + class ChapterDto( + private val id: String, + private val comic_id: String, + private val chapter_name: String, + private val updatetime: String, + ) { + fun toSChapter() = SChapter.create().apply { + url = "$comic_id/$id" + name = chapter_name.formatChapterName() + date_upload = updatetime.toLong() * 1000 + } + } + + @Serializable + class ChapterCommentDto( + private val content: String, + private val num: Int, + ) : Comparable { + override fun toString() = if (num > 0) "$content [+$num]" else content + override fun compareTo(other: ChapterCommentDto) = other.num.compareTo(num) // descending + } + + @Serializable + class DataDto(val info: MangaDto, val list: List) + + @Serializable + class ResponseDto(val data: DataDto) +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV4.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV4.kt new file mode 100644 index 000000000..c1ce63f3e --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ApiV4.kt @@ -0,0 +1,193 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import eu.kanade.tachiyomi.extension.zh.dmzj.utils.RSA +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoBuf +import kotlinx.serialization.protobuf.ProtoNumber +import kotlinx.serialization.serializer +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Response +import kotlin.math.max +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +object ApiV4 { + + private const val v4apiUrl = "https://nnv4api.dmzj.com" + private const val imageSmallCDNUrl = "https://imgsmall.dmzj.com" + + fun mangaInfoUrl(id: String) = "$v4apiUrl/comic/detail/$id?uid=2665531" + + fun parseMangaInfo(response: Response): ParseResult { + val result: ResponseDto = response.decrypt() + return when (val manga = result.data) { + null -> ParseResult.Error(result.message) + else -> ParseResult.Ok(manga) + } + } + + // path = "mangaId/chapterId" + fun chapterImagesUrl(path: String) = "$v4apiUrl/comic/chapter/$path" + + fun parseChapterImages(response: Response): ArrayList { + val result: ResponseDto = response.decrypt() + return result.data!!.toPageList() + } + + fun rankingUrl(page: Int, filters: RankingGroup) = + "$v4apiUrl/comic/rank/list?${filters.parse()}&uid=2665531&page=$page" + + fun parseRanking(response: Response): MangasPage { + val result: ResponseDto> = response.decrypt() + val data = result.data ?: return MangasPage(emptyList(), false) + return MangasPage(data.map { it.toSManga() }, data.isNotEmpty()) + } + + private inline fun Response.decrypt(): T = decrypt(typeOf()) + + @Suppress("UNCHECKED_CAST") + private fun Response.decrypt(type: KType): T { + val bytes = RSA.decrypt(body!!.string(), cipher) + val deserializer = serializer(type) as KSerializer + return ProtoBuf.decodeFromByteArray(deserializer, bytes) + } + + @Serializable + class MangaDto( + @ProtoNumber(1) private val id: Int, + @ProtoNumber(2) private val title: String, + @ProtoNumber(6) private val cover: String, + @ProtoNumber(7) private val description: String, + @ProtoNumber(19) private val genres: List, + @ProtoNumber(20) private val status: List, + @ProtoNumber(21) private val authors: List, + @ProtoNumber(23) private val chapterGroups: List, + ) { + val isLicensed get() = chapterGroups.isEmpty() + + fun toSManga() = SManga.create().apply { + url = getMangaUrl(id.toString()) + title = this@MangaDto.title + author = authors.joinToString { it.name } + description = if (isLicensed) { + "${this@MangaDto.description}\n\n漫画 ID (1): $id" + } else { + this@MangaDto.description + } + genre = genres.joinToString { it.name } + status = parseStatus(this@MangaDto.status[0].name) + thumbnail_url = cover + initialized = true + } + + fun parseChapterList(): List { + val mangaId = id.toString() + val size = chapterGroups.sumOf { it.size } + return chapterGroups.flatMapTo(ArrayList(size)) { + it.toSChapterList(mangaId) + } + } + } + + @Serializable + class TagDto(@ProtoNumber(2) val name: String) + + @Serializable + class ChapterGroupDto( + @ProtoNumber(1) private val name: String, + @ProtoNumber(2) private val chapters: List, + ) { + fun toSChapterList(mangaId: String): List { + val groupName = name + val isDefaultGroup = groupName == "连载" + return chapters.map { + it.toSChapterInternal().apply { + url = "$mangaId/$url" + if (!isDefaultGroup) name = "$groupName: $name" + } + } + } + + val size get() = chapters.size + } + + @Serializable + class ChapterDto( + @ProtoNumber(1) private val id: Int, + @ProtoNumber(2) private val name: String, + @ProtoNumber(3) private val updateTime: Long, + ) { + fun toSChapterInternal() = SChapter.create().apply { + url = id.toString() + name = this@ChapterDto.name.formatChapterName() + date_upload = updateTime * 1000 + } + } + + @Serializable + class ChapterImagesDto( + @ProtoNumber(1) private val id: Int, + @ProtoNumber(2) private val mangaId: Int, + @ProtoNumber(6) private val lowResImages: List, + @ProtoNumber(8) private val images: List, + ) { + // page count can be messy, see manga ID 55847 chapters 107-109 + fun toPageList(): ArrayList { + val pageCount = max(images.size, lowResImages.size) + val list = ArrayList(pageCount + 1) // for comments page + for (i in 0 until pageCount) { + val imageUrl = images.getOrNull(i)?.fixFilename()?.toHttps() + val lowResUrl = lowResImages.getOrElse(i) { + // this is sometimes different in low-res URLs and might fail, see manga ID 56649 + val initial = imageUrl!!.decodePath().toHttpUrl().pathSegments[0] + "$imageSmallCDNUrl/$initial/$mangaId/$id/$i.jpg" + }.toHttps() + list.add(Page(i, url = lowResUrl, imageUrl = imageUrl ?: lowResUrl)) + } + return list + } + } + + // same as ApiV3.MangaDto + @Serializable + class RankingItemDto( + @ProtoNumber(1) private val id: Int?, + @ProtoNumber(2) private val title: String, + @ProtoNumber(3) private val authors: String, + @ProtoNumber(4) private val status: String, + @ProtoNumber(5) private val cover: String, + @ProtoNumber(6) private val genres: String, + @ProtoNumber(9) private val slug: String?, + ) { + fun toSManga() = SManga.create().apply { + url = when { + id != null -> getMangaUrl(id.toString()) + slug != null -> PREFIX_ID_SEARCH + slug + else -> throw Exception("无法解析") + } + title = this@RankingItemDto.title + author = authors.formatList() + genre = genres.formatList() + status = parseStatus(this@RankingItemDto.status) + thumbnail_url = cover + } + } + + @Serializable + class ResponseDto( + @ProtoNumber(2) val message: String?, + @ProtoNumber(3) val data: T?, + ) + + sealed interface ParseResult { + class Ok(val manga: MangaDto) : ParseResult + class Error(val message: String?) : ParseResult + } + + private val cipher by lazy { RSA.getPrivateKey("MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK8nNR1lTnIfIes6oRWJNj3mB6OssDGx0uGMpgpbVCpf6+VwnuI2stmhZNoQcM417Iz7WqlPzbUmu9R4dEKmLGEEqOhOdVaeh9Xk2IPPjqIu5TbkLZRxkY3dJM1htbz57d/roesJLkZXqssfG5EJauNc+RcABTfLb4IiFjSMlTsnAgMBAAECgYEAiz/pi2hKOJKlvcTL4jpHJGjn8+lL3wZX+LeAHkXDoTjHa47g0knYYQteCbv+YwMeAGupBWiLy5RyyhXFoGNKbbnvftMYK56hH+iqxjtDLnjSDKWnhcB7089sNKaEM9Ilil6uxWMrMMBH9v2PLdYsqMBHqPutKu/SigeGPeiB7VECQQDizVlNv67go99QAIv2n/ga4e0wLizVuaNBXE88AdOnaZ0LOTeniVEqvPtgUk63zbjl0P/pzQzyjitwe6HoCAIpAkEAxbOtnCm1uKEp5HsNaXEJTwE7WQf7PrLD4+BpGtNKkgja6f6F4ld4QZ2TQ6qvsCizSGJrjOpNdjVGJ7bgYMcczwJBALvJWPLmDi7ToFfGTB0EsNHZVKE66kZ/8Stx+ezueke4S556XplqOflQBjbnj2PigwBN/0afT+QZUOBOjWzoDJkCQClzo+oDQMvGVs9GEajS/32mJ3hiWQZrWvEzgzYRqSf3XVcEe7PaXSd8z3y3lACeeACsShqQoc8wGlaHXIJOHTcCQQCZw5127ZGs8ZDTSrogrH73Kw/HvX55wGAeirKYcv28eauveCG7iyFR0PFB/P/EDZnyb+ifvyEFlucPUI0+Y87F") } +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/CommentsInterceptor.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/CommentsInterceptor.kt new file mode 100644 index 000000000..b70f242d2 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/CommentsInterceptor.kt @@ -0,0 +1,71 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import java.io.ByteArrayOutputStream + +object CommentsInterceptor : Interceptor { + + class Tag + + private const val MAX_HEIGHT = 1920 + private const val WIDTH = 1080 + private const val UNIT = 32 + private const val UNIT_F = UNIT.toFloat() + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + if (request.tag(Tag::class.java) == null) return response + + val comments = ApiV3.parseChapterComments(response) + .take(MAX_HEIGHT / (UNIT * 2)) + .ifEmpty { listOf("没有吐槽") } + + val paint = TextPaint().apply { + color = Color.BLACK + textSize = UNIT_F + isAntiAlias = true + } + + var height = UNIT + val layouts = comments.map { + @Suppress("DEPRECATION") + StaticLayout(it, paint, WIDTH - 2 * UNIT, Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false) + }.takeWhile { + val lineHeight = it.height + UNIT + if (height + lineHeight <= MAX_HEIGHT) { + height += lineHeight + true + } else { + false + } + } + + val bitmap = Bitmap.createBitmap(WIDTH, height, Bitmap.Config.ARGB_8888) + bitmap.eraseColor(Color.WHITE) + val canvas = Canvas(bitmap) + + var y = UNIT + for (layout in layouts) { + canvas.save() + canvas.translate(UNIT_F, y.toFloat()) + layout.draw(canvas) + canvas.restore() + y += layout.height + UNIT + } + + val output = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 0, output) + val body = output.toByteArray().toResponseBody("image/png".toMediaType()) + return response.newBuilder().body(body).build() + } +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Common.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Common.kt new file mode 100644 index 000000000..acfa8d579 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Common.kt @@ -0,0 +1,49 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.Response +import uy.kohesive.injekt.injectLazy +import java.net.URLDecoder + +const val PREFIX_ID_SEARCH = "id:" + +val json: Json by injectLazy() + +inline fun Response.parseAs(): T { + return json.decodeFromString(body!!.string()) +} + +fun getMangaUrl(id: String) = "/comic/comic_$id.json?version=2.7.019" + +fun String.extractMangaId(): String { + val start = 13 // length of "/comic/comic_" + return substring(start, indexOf('.', start)) +} + +fun String.formatList() = replace("/", ", ") + +fun parseStatus(status: String): Int = when (status) { + "连载中" -> SManga.ONGOING + "已完结" -> SManga.COMPLETED + else -> SManga.UNKNOWN +} + +fun String.formatChapterName(): String { + val replaced = removePrefix("连载") + if (!replaced[0].isDigit()) return replaced + return when (replaced.last()) { + '话', '卷' -> "第$replaced" + else -> replaced + } +} + +fun String.toHttps() = "https:" + substringAfter(':') + +// see https://github.com/tachiyomiorg/tachiyomi-extensions/issues/3457 +fun String.fixFilename() = if (endsWith(".jp")) this + 'g' else this + +fun String.decodePath(): String = URLDecoder.decode(this, "UTF-8") + +const val COMMENTS_FLAG = "COMMENTS" diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt index 4cf0bea6c..0800add98 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Dmzj.kt @@ -2,36 +2,20 @@ package eu.kanade.tachiyomi.extension.zh.dmzj import android.app.Application import android.content.SharedPreferences -import android.net.Uri -import android.util.Base64 -import androidx.preference.ListPreference -import androidx.preference.Preference +import android.util.Log import androidx.preference.PreferenceScreen -import eu.kanade.tachiyomi.extension.zh.dmzj.protobuf.ComicDetailResponse -import eu.kanade.tachiyomi.extension.zh.dmzj.utils.HttpGetFailoverInterceptor -import eu.kanade.tachiyomi.extension.zh.dmzj.utils.RSA import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource -import eu.kanade.tachiyomi.util.asJsoup -import kotlinx.serialization.decodeFromByteArray -import kotlinx.serialization.protobuf.ProtoBuf -import okhttp3.Headers -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import org.json.JSONArray -import org.json.JSONObject import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -45,603 +29,201 @@ class Dmzj : ConfigurableSource, HttpSource() { override val supportsLatest = true override val name = "动漫之家" override val baseUrl = "https://m.dmzj.com" - private val v3apiUrl = "https://v3api.dmzj.com" - private val v3ChapterApiUrl = "https://nnv3api.muwai.com" - - // v3api now shutdown the functionality to fetch manga detail and chapter list, so move these logic to v4api - private val v4apiUrl = "https://nnv4api.muwai.com" // https://v4api.dmzj1.com - private val apiUrl = "https://api.dmzj.com" - private val oldPageListApiUrl = "http://api.m.dmzj.com" // this domain has an expired certificate - private val webviewPageListApiUrl = "https://m.dmzj.com/chapinfo" - private val imageCDNUrl = "https://images.dmzj.com" - private val imageSmallCDNUrl = "https://imgsmall.dmzj.com" - - private fun cleanUrl(url: String) = if (url.startsWith("//")) - "https:$url" - else url private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } - private val httpGetFailoverInterceptor = HttpGetFailoverInterceptor() - override val client: OkHttpClient = network.client.newBuilder() - .addInterceptor(httpGetFailoverInterceptor) - .rateLimitHost( - apiUrl.toHttpUrlOrNull()!!, - preferences.getString(API_RATELIMIT_PREF, "5")!!.toInt() - ) - .rateLimitHost( - v3apiUrl.toHttpUrlOrNull()!!, - preferences.getString(API_RATELIMIT_PREF, "5")!!.toInt() - ) - .rateLimitHost( - v4apiUrl.toHttpUrlOrNull()!!, - preferences.getString(API_RATELIMIT_PREF, "5")!!.toInt() - ) - .rateLimitHost( - imageCDNUrl.toHttpUrlOrNull()!!, - preferences.getString(IMAGE_CDN_RATELIMIT_PREF, "5")!!.toInt() - ) - .rateLimitHost( - imageSmallCDNUrl.toHttpUrlOrNull()!!, - preferences.getString(IMAGE_CDN_RATELIMIT_PREF, "5")!!.toInt() - ) + .addInterceptor(ImageUrlInterceptor) + .addInterceptor(CommentsInterceptor) + .rateLimit(4) .build() - override fun headersBuilder() = Headers.Builder().apply { - set("Referer", "https://www.dmzj.com/") - set( - "User-Agent", - "Mozilla/5.0 (Linux; Android 10) " + - "AppleWebKit/537.36 (KHTML, like Gecko) " + - "Chrome/88.0.4324.93 " + - "Mobile Safari/537.36 " + - "Tachiyomi/1.0" - ) + // API v4 randomly fails + private val retryClient = network.client.newBuilder() + .addInterceptor(RetryInterceptor) + .rateLimit(2) + .build() + + private fun fetchIdBySlug(slug: String): String { + val request = GET("https://manhua.dmzj.com/$slug/", headers) + val html = client.newCall(request).execute().body!!.string() + val start = "g_comic_id = \"" + val startIndex = html.indexOf(start) + start.length + val endIndex = html.indexOf('"', startIndex) + return html.substring(startIndex, endIndex) } - // for simple searches (query only, no filters) - private fun simpleSearchJsonParse(json: String): MangasPage { - val arr = JSONArray(json) - val ret = ArrayList(arr.length()) - for (i in 0 until arr.length()) { - val obj = arr.getJSONObject(i) - val cid = obj.getString("id") - ret.add( - SManga.create().apply { - title = obj.getString("comic_name") - thumbnail_url = cleanUrl(obj.getString("comic_cover")) - author = obj.optString("comic_author") - url = "/comic/comic_$cid.json?version=2.7.019" - } - ) + private fun fetchMangaInfoV4(id: String): ApiV4.MangaDto? { + val response = retryClient.newCall(GET(ApiV4.mangaInfoUrl(id), headers)).execute() + return when (val result = ApiV4.parseMangaInfo(response)) { + is ApiV4.ParseResult.Ok -> { + val manga = result.manga + if (manga.isLicensed) preferences.addLicensed(id) + manga + } + is ApiV4.ParseResult.Error -> { + Log.e("DMZJ", "no data for manga $id: ${result.message}") + preferences.addHidden(id) + null + } } - return MangasPage(ret, false) } - // for popular, latest, and filtered search - private fun mangaFromJSON(json: String): MangasPage { - val arr = JSONArray(json) - val ret = ArrayList(arr.length()) - for (i in 0 until arr.length()) { - val obj = arr.getJSONObject(i) - val cid = obj.getString("id") - ret.add( - SManga.create().apply { - title = obj.getString("title") - thumbnail_url = obj.getString("cover") - author = obj.optString("authors") - status = when (obj.getString("status")) { - "已完结" -> SManga.COMPLETED - "连载中" -> SManga.ONGOING - else -> SManga.UNKNOWN - } - url = "/comic/comic_$cid.json?version=2.7.019" - } - ) - } - return MangasPage(ret, arr.length() != 0) - } + override fun popularMangaRequest(page: Int) = GET(ApiV3.popularMangaUrl(page), headers) - private fun customUrlBuilder(baseUrl: String): HttpUrl.Builder { - val rightNow = System.currentTimeMillis() / 1000 - return baseUrl.toHttpUrlOrNull()!!.newBuilder() - .addQueryParameter("channel", "android") - .addQueryParameter("version", "3.0.0") - .addQueryParameter("timestamp", rightNow.toInt().toString()) - } + override fun popularMangaParse(response: Response) = ApiV3.parsePage(response) - private fun decryptProtobufData(rawData: String): ByteArray { - return RSA.decrypt(Base64.decode(rawData, Base64.DEFAULT), privateKey) - } + override fun latestUpdatesRequest(page: Int) = GET(ApiV3.latestUpdatesUrl(page), headers) - override fun popularMangaRequest(page: Int) = GET("$v3apiUrl/classify/0/0/${page - 1}.json") - - override fun popularMangaParse(response: Response) = searchMangaParse(response) - - override fun latestUpdatesRequest(page: Int) = GET("$v3apiUrl/classify/0/1/${page - 1}.json") - - override fun latestUpdatesParse(response: Response): MangasPage = searchMangaParse(response) + override fun latestUpdatesParse(response: Response) = ApiV3.parsePage(response) private fun searchMangaById(id: String): MangasPage { - val comicNumberID = if (checkComicIdIsNumericalRegex.matches(id)) { + val idNumber = if (id.all { it.isDigit() }) { id } else { // Chinese Pinyin ID - val document = client.newCall(GET("$baseUrl/info/$id.html", headers)).execute().asJsoup() - extractComicIdFromWebpageRegex.find( - document.select("#Subscribe").attr("onclick") - )!!.groups[1]!!.value // onclick="addSubscribe('{comicNumberID}')" + fetchIdBySlug(id) } - val sManga = try { - val r = client.newCall(GET("$v4apiUrl/comic/detail/$comicNumberID.json", headers)).execute() - mangaDetailsParse(r) - } catch (_: Exception) { - val r = client.newCall(GET("$apiUrl/dynamic/comicinfo/$comicNumberID.json", headers)).execute() - mangaDetailsParse(r) - } - // Change url format to as same as mangaFromJSON, which used by popularMangaParse and latestUpdatesParse. - // manga.url being used as key to identity a manga in tachiyomi, so if url format don't match popularMangaParse and latestUpdatesParse, - // tachiyomi will mark them as unsubscribe in popularManga and latestUpdates page. - sManga.url = "/comic/comic_$comicNumberID.json?version=2.7.019" + val sManga = fetchMangaDetails(idNumber) return MangasPage(listOf(sManga), false) } override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - return if (query.startsWith(PREFIX_ID_SEARCH)) { + return if (query.isEmpty()) { + val ranking = filters.filterIsInstance().firstOrNull() + if (ranking != null && ranking.isEnabled) { + val call = retryClient.newCall(GET(ApiV4.rankingUrl(page, ranking), headers)) + return Observable.fromCallable { + val result = ApiV4.parseRanking(call.execute()) + // result has no manga ID if filtered by certain genres; this can be slow + for (manga in result.mangas) if (manga.url.startsWith(PREFIX_ID_SEARCH)) { + manga.url = getMangaUrl(fetchIdBySlug(manga.url.removePrefix(PREFIX_ID_SEARCH))) + } + result + } + } + val call = client.newCall(GET(ApiV3.pageUrl(page, filters), headers)) + Observable.fromCallable { ApiV3.parsePage(call.execute()) } + } else if (query.startsWith(PREFIX_ID_SEARCH)) { // ID may be numbers or Chinese pinyin val id = query.removePrefix(PREFIX_ID_SEARCH).removeSuffix(".html") - Observable.just(searchMangaById(id)) + Observable.fromCallable { searchMangaById(id) } } else { - client.newCall(searchMangaRequest(page, query, filters)) - .asObservableSuccess() - .map { response -> - searchMangaParse(response) + val request = GET(ApiSearch.textSearchUrl(query), headers) + Observable.fromCallable { + // this API fails randomly, and might return empty list + repeat(8) { + val result = ApiSearch.parsePage(client.newCall(request).execute()) + if (result.mangas.isNotEmpty()) return@fromCallable result } + throw Exception("搜索出错或无结果") + } } } override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - if (query != "") { - val uri = Uri.parse("http://s.acg.dmzj.com/comicsum/search.php").buildUpon() - uri.appendQueryParameter("s", query) - return GET(uri.toString()) - } else { - var params = filters.map { - if (it !is SortFilter && it is UriPartFilter) { - it.toUriPart() - } else "" - }.filter { it != "" }.joinToString("-") - if (params == "") { - params = "0" - } - - val order = filters.filterIsInstance().joinToString("") { (it as UriPartFilter).toUriPart() } - - return GET("$v3apiUrl/classify/$params/$order/${page - 1}.json") - } + throw UnsupportedOperationException() } override fun searchMangaParse(response: Response): MangasPage { - val body = response.body!!.string() - - return if (body.contains("g_search_data")) { - simpleSearchJsonParse(body.substringAfter("=").trim().removeSuffix(";")) - } else { - mangaFromJSON(body) - } + throw UnsupportedOperationException() } // Bypass mangaDetailsRequest, fetch api url directly override fun fetchMangaDetails(manga: SManga): Observable { - val cid = extractComicIdFromMangaUrlRegex.find(manga.url)!!.groups[1]!!.value - return try { - // Not using client.newCall().asObservableSuccess() to ensure we can catch exception here. - val response = client.newCall( - GET( - customUrlBuilder("$v4apiUrl/comic/detail/$cid").build().toString(), headers - ) - ).execute() - val sManga = mangaDetailsParse(response).apply { initialized = true } - Observable.just(sManga) - } catch (e: Exception) { - val response = client.newCall(GET("$apiUrl/dynamic/comicinfo/$cid.json", headers)).execute() - val sManga = mangaDetailsParse(response).apply { initialized = true } - Observable.just(sManga) - } catch (e: Exception) { - Observable.error(e) + val id = manga.url.extractMangaId() + return Observable.fromCallable { fetchMangaDetails(id) } + } + + private fun fetchMangaDetails(id: String): SManga { + if (id !in preferences.hiddenList) { + fetchMangaInfoV4(id)?.run { return toSManga() } } + val response = client.newCall(GET(ApiV3.mangaInfoUrlV1(id), headers)).execute() + return ApiV3.parseMangaDetailsV1(response) } // Workaround to allow "Open in browser" use human readable webpage url. + // headers are not needed override fun mangaDetailsRequest(manga: SManga): Request { - val cid = extractComicIdFromMangaUrlRegex.find(manga.url)!!.groups[1]!!.value + val cid = manga.url.extractMangaId() return GET("$baseUrl/info/$cid.html") } override fun mangaDetailsParse(response: Response) = SManga.create().apply { - val responseBody = response.body!!.string() - if (response.request.url.toString().startsWith(v4apiUrl)) { - val pb = ProtoBuf.decodeFromByteArray(decryptProtobufData(responseBody)) - val pbData = pb.Data - title = pbData.Title - thumbnail_url = pbData.Cover - author = pbData.Authors.joinToString(separator = ", ") { it.TagName } - genre = pbData.TypesTypes.joinToString(separator = ", ") { it.TagName } - - status = when (pbData.Status[0].TagName) { - "已完结" -> SManga.COMPLETED - "连载中" -> SManga.ONGOING - else -> SManga.UNKNOWN - } - description = pbData.Description - } else { - val obj = JSONObject(responseBody) - val data = obj.getJSONObject("data").getJSONObject("info") - title = data.getString("title") - thumbnail_url = data.getString("cover") - author = data.getString("authors") - genre = data.getString("types").replace("/", ", ") - status = when (data.getString("status")) { - "连载中" -> SManga.ONGOING - "已完结" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - description = data.getString("description") - } + throw UnsupportedOperationException() } override fun chapterListRequest(manga: SManga): Request = throw UnsupportedOperationException("Not used.") override fun fetchChapterList(manga: SManga): Observable> { - val cid = extractComicIdFromMangaUrlRegex.find(manga.url)!!.groups[1]!!.value - return if (manga.status != SManga.LICENSED) { - try { - val response = - client.newCall( - GET( - customUrlBuilder("$v4apiUrl/comic/detail/$cid").build().toString(), - headers - ) - ).execute() - Observable.just(chapterListParse(response)) - } catch (e: Exception) { - val response = client.newCall(GET("$apiUrl/dynamic/comicinfo/$cid.json", headers)).execute() - Observable.just(chapterListParse(response)) - } catch (e: Exception) { - Observable.error(e) + return Observable.fromCallable { + val id = manga.url.extractMangaId() + if (id !in preferences.licensedList && id !in preferences.hiddenList) { + val result = fetchMangaInfoV4(id) + if (result != null && !result.isLicensed) { + return@fromCallable result.parseChapterList() + } } - } else { - Observable.error(Exception("Licensed - No chapters to show")) + val response = client.newCall(GET(ApiV3.mangaInfoUrlV1(id), headers)).execute() + ApiV3.parseChapterListV1(response) } } override fun chapterListParse(response: Response): List { - val ret = ArrayList() - val responseBody = response.body!!.string() - if (response.request.url.toString().startsWith(v4apiUrl)) { - val pb = ProtoBuf.decodeFromByteArray(decryptProtobufData(responseBody)) - val mangaPBData = pb.Data - // v4api can contain multiple series of chapters. - if (mangaPBData.Chapters.isEmpty()) { - throw Exception("empty chapter list") - } - mangaPBData.Chapters.forEach { chapterList -> - for (i in chapterList.Data.indices) { - val chapter = chapterList.Data[i] - ret.add( - SChapter.create().apply { - name = "${chapterList.Title}: ${chapter.ChapterTitle}" - date_upload = chapter.Updatetime * 1000 - url = "${mangaPBData.Id}/${chapter.ChapterId}" - } - ) - } - } - } else { - // get chapter info from old api - // Old api may only contain one series of chapters - val obj = JSONObject(responseBody) - val chaptersList = obj.getJSONObject("data").getJSONArray("list") - for (i in 0 until chaptersList.length()) { - val chapter = chaptersList.getJSONObject(i) - ret.add( - SChapter.create().apply { - name = chapter.getString("chapter_name") - date_upload = chapter.getString("updatetime").toLong() * 1000 - url = "${chapter.getString("comic_id")}/${chapter.getString("id")}" - } - ) - } - } - return ret + throw UnsupportedOperationException() } - override fun pageListRequest(chapter: SChapter) = throw UnsupportedOperationException("Not used.") + // for WebView, headers are not needed + override fun pageListRequest(chapter: SChapter) = GET("$baseUrl/view/${chapter.url}.html") override fun fetchPageList(chapter: SChapter): Observable> { - return try { - // webpage api - val response = client.newCall(GET("$webviewPageListApiUrl/${chapter.url}.html", headers)).execute() - Observable.just(pageListParse(response, chapter)) - } catch (e: Exception) { - // api.m.dmzj.com - val response = client.newCall(GET("$oldPageListApiUrl/comic/chapter/${chapter.url}.html", headers)).execute() - Observable.just(pageListParse(response, chapter)) - } catch (e: Exception) { - // v3api - val response = client.newCall( - GET( - customUrlBuilder("$v3ChapterApiUrl/chapter/${chapter.url}.json").build().toString(), - headers - ) - ).execute() - Observable.just(pageListParse(response, chapter)) - } catch (e: Exception) { - Observable.error(e) + val path = chapter.url + return Observable.fromCallable { + val response = retryClient.newCall(GET(ApiV4.chapterImagesUrl(path), headers)).execute() + val result = ApiV4.parseChapterImages(response) + if (preferences.showChapterComments) { + result.add(Page(result.size, COMMENTS_FLAG, ApiV3.chapterCommentsUrl(path))) + } + result } } override fun pageListParse(response: Response): List { - return pageListParse(response, null) - } - - private fun pageListParse(response: Response, chapter: SChapter?): List { - val requestUrl = response.request.url.toString() - val responseBody = response.body!!.string() - val arr = if ( - requestUrl.startsWith(webviewPageListApiUrl) || - requestUrl.startsWith(v3ChapterApiUrl) - ) { - // webpage api or v3api - JSONObject(responseBody).getJSONArray("page_url") - } else if (requestUrl.startsWith(oldPageListApiUrl)) { - try { - val obj = JSONObject(responseBody) - obj.getJSONObject("chapter").getJSONArray("page_url") - } catch (e: org.json.JSONException) { - // JSON data from api.m.dmzj.com may be incomplete, extract page_url list using regex - val extractPageList = extractPageListRegex.find(responseBody)?.value - if (extractPageList != null) { - JSONObject("{$extractPageList}").getJSONArray("page_url") - } else { - // The responseBody content is a sentence, for example, "The comic does not exist". - throw Exception(responseBody) - } - } - } else { - throw Exception("can't parse response") - } - val ret = ArrayList(arr.length()) - for (i in 0 until arr.length()) { - // Seems image urls from webpage api and api.m.dmzj.com may be URL encoded multiple times - val imageUrl = Uri.decode(Uri.decode(arr.getString(i))) - .replace("http:", "https:") - .replace("dmzj1.com", "dmzj.com") - // Use url to store lo-res image url - val url = if (chapter != null && chapter.url != "") { - // imageUrl be like: https://image.dmzj.com/m/manga_name/chapter_name/file_name.jpg - // Path node before manga_name is the initial letter of pinyin of the manga name, - // which is also used for small images. - val imgUrl = imageUrl.toHttpUrlOrNull() - if (imgUrl != null) { - val initial = imgUrl.encodedPath.trim('/').substringBefore('/') - "$imageSmallCDNUrl/$initial/${chapter.url}/$i.jpg" - } else "" - } else "" - ret.add(Page(i, url, imageUrl)) - } - return ret - } - - private fun String.encoded(): String { - return this.chunked(1) - .joinToString("") { if (it in setOf("%", " ", "+", "#")) Uri.encode(it) else it } - .let { if (it.endsWith(".jp")) "${it}g" else it } + throw UnsupportedOperationException() } + // see https://github.com/tachiyomiorg/tachiyomi-extensions/issues/10475 override fun imageRequest(page: Page): Request { - return when (preferences.getString(IMAGE_SOURCE_PREF, "")) { - ImageSource.ORIG_RES_ONLY.name -> GET(page.imageUrl!!.encoded(), headers) - ImageSource.LOW_RES_ONLY.name -> GET(page.url, headers) - else -> GET(page.imageUrl!!.encoded(), headers).newBuilder() - .addHeader(HttpGetFailoverInterceptor.RETRY_WITH_HEADER, page.url) + val url = page.url + val imageUrl = page.imageUrl!! + if (url == COMMENTS_FLAG) { + return GET(imageUrl, headers).newBuilder() + .tag(CommentsInterceptor.Tag::class.java, CommentsInterceptor.Tag()) .build() } + val fallbackUrl = when (preferences.imageQuality) { + AUTO_RES -> url + ORIGINAL_RES -> null + LOW_RES -> return GET(url, headers) + else -> url + } + return GET(imageUrl, headers).newBuilder() + .tag(ImageUrlInterceptor.Tag::class.java, ImageUrlInterceptor.Tag(fallbackUrl)) + .build() } // Unused, we can get image urls directly from the chapter page override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!") - override fun getFilterList() = FilterList( - SortFilter(), - GenreGroup(), - StatusFilter(), - TypeFilter(), - ReaderFilter() - ) - - private class GenreGroup : UriPartFilter( - "分类", - arrayOf( - Pair("全部", ""), - Pair("冒险", "4"), - Pair("百合", "3243"), - Pair("生活", "3242"), - Pair("四格", "17"), - Pair("伪娘", "3244"), - Pair("悬疑", "3245"), - Pair("后宫", "3249"), - Pair("热血", "3248"), - Pair("耽美", "3246"), - Pair("其他", "16"), - Pair("恐怖", "14"), - Pair("科幻", "7"), - Pair("格斗", "6"), - Pair("欢乐向", "5"), - Pair("爱情", "8"), - Pair("侦探", "9"), - Pair("校园", "13"), - Pair("神鬼", "12"), - Pair("魔法", "11"), - Pair("竞技", "10"), - Pair("历史", "3250"), - Pair("战争", "3251"), - Pair("魔幻", "5806"), - Pair("扶她", "5345"), - Pair("东方", "5077"), - Pair("奇幻", "5848"), - Pair("轻小说", "6316"), - Pair("仙侠", "7900"), - Pair("搞笑", "7568"), - Pair("颜艺", "6437"), - Pair("性转换", "4518"), - Pair("高清单行", "4459"), - Pair("治愈", "3254"), - Pair("宅系", "3253"), - Pair("萌系", "3252"), - Pair("励志", "3255"), - Pair("节操", "6219"), - Pair("职场", "3328"), - Pair("西方魔幻", "3365"), - Pair("音乐舞蹈", "3326"), - Pair("机战", "3325") - ) - ) - - private class StatusFilter : UriPartFilter( - "连载状态", - arrayOf( - Pair("全部", ""), - Pair("连载", "2309"), - Pair("完结", "2310") - ) - ) - - private class TypeFilter : UriPartFilter( - "地区", - arrayOf( - Pair("全部", ""), - Pair("日本", "2304"), - Pair("韩国", "2305"), - Pair("欧美", "2306"), - Pair("港台", "2307"), - Pair("内地", "2308"), - Pair("其他", "8453") - ) - ) - - private class SortFilter : UriPartFilter( - "排序", - arrayOf( - Pair("人气", "0"), - Pair("更新", "1") - ) - ) - - private class ReaderFilter : UriPartFilter( - "读者", - arrayOf( - Pair("全部", ""), - Pair("少年", "3262"), - Pair("少女", "3263"), - Pair("青年", "3264") - ) - ) - - private open class UriPartFilter( - displayName: String, - val vals: Array>, - defaultValue: Int = 0 - ) : - Filter.Select(displayName, vals.map { it.first }.toTypedArray(), defaultValue) { - open fun toUriPart() = vals[state].second - } + override fun getFilterList() = getFilterListInternal() override fun setupPreferenceScreen(screen: PreferenceScreen) { - val apiRateLimitPreference = ListPreference(screen.context).apply { - key = API_RATELIMIT_PREF - title = API_RATELIMIT_PREF_TITLE - summary = API_RATELIMIT_PREF_SUMMARY - entries = ENTRIES_ARRAY - entryValues = ENTRIES_ARRAY - - setDefaultValue("5") - setOnPreferenceChangeListener(onStringPreferenceChangeListener(API_RATELIMIT_PREF)) - } - - val imgCDNRateLimitPreference = ListPreference(screen.context).apply { - key = IMAGE_CDN_RATELIMIT_PREF - title = IMAGE_CDN_RATELIMIT_PREF_TITLE - summary = IMAGE_CDN_RATELIMIT_PREF_SUMMARY - entries = ENTRIES_ARRAY - entryValues = ENTRIES_ARRAY - - setDefaultValue("5") - setOnPreferenceChangeListener(onStringPreferenceChangeListener(IMAGE_CDN_RATELIMIT_PREF)) - } - - val imgSourcePreference = ListPreference(screen.context).apply { - key = IMAGE_SOURCE_PREF - title = IMAGE_SOURCE_PREF_TITLE - summary = IMAGE_SOURCE_PREF_SUMMARY - entries = enumValues().map { "${it.desc} (${it.name})" }.toTypedArray() - entryValues = enumValues().map { it.name }.toTypedArray() - - setDefaultValue(ImageSource.PREFER_ORIG_RES.name) - setOnPreferenceChangeListener(onStringPreferenceChangeListener(IMAGE_SOURCE_PREF)) - } - - screen.addPreference(apiRateLimitPreference) - screen.addPreference(imgCDNRateLimitPreference) - screen.addPreference(imgSourcePreference) - } - - private fun onStringPreferenceChangeListener(key: String): Preference.OnPreferenceChangeListener { - return Preference.OnPreferenceChangeListener { _, newValue -> - try { - val setting = preferences.edit().putString(key, newValue as String).commit() - setting - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - private enum class ImageSource(val desc: String) { - PREFER_ORIG_RES("优先标清"), // "Prefer Original Resolution" - ORIG_RES_ONLY("只用标清"), // "Original Resolution Only" - LOW_RES_ONLY("只用低清"), // "Low Resolution Only" - } - - companion object { - private const val API_RATELIMIT_PREF = "apiRatelimitPreference" - private const val API_RATELIMIT_PREF_TITLE = "主站每秒连接数限制" // "Ratelimit permits per second for main website" - private const val API_RATELIMIT_PREF_SUMMARY = "此值影响向动漫之家网站发起连接请求的数量。调低此值可能减少发生HTTP 429(连接请求过多)错误的几率,但加载速度也会变慢。需要重启软件以生效。\n当前值:%s" // "This value affects network request amount to dmzj's url. Lower this value may reduce the chance to get HTTP 429 error, but loading speed will be slower too. Tachiyomi restart required. Current value: %s" - - private const val IMAGE_CDN_RATELIMIT_PREF = "imgCDNRatelimitPreference" - private const val IMAGE_CDN_RATELIMIT_PREF_TITLE = "图片CDN每秒连接数限制" // "Ratelimit permits per second for image CDN" - private const val IMAGE_CDN_RATELIMIT_PREF_SUMMARY = "此值影响加载图片时发起连接请求的数量。调低此值可能减小图片加载错误的几率,但加载速度也会变慢。需要重启软件以生效。\n当前值:%s" // "This value affects network request amount for loading image. Lower this value may reduce the chance to get error when loading image, but loading speed will be slower too. Tachiyomi restart required. Current value: %s" - - private const val IMAGE_SOURCE_PREF = "imageSourcePreference" - private const val IMAGE_SOURCE_PREF_TITLE = "图源偏好" // "Image source preference" - private const val IMAGE_SOURCE_PREF_SUMMARY = "此值影响图片的加载来源。可以选择只用标清图源,只用低清图源,或优先尝试标清图源再回退到低清图源。部分漫画章节可能只能在低清图源下观看。不需要重启软件。\n当前值:%s" // "This value affects image load source. You can choose to use original resolution image source only, or use low resolution image source only, or try original resolution image source before fallback to low resolution image source. Some manga chapters may only be available from low resolution image source. Tachiyomi restart not required. Current value: %s" - - private val extractComicIdFromWebpageRegex = Regex("""addSubscribe\((\d+)\)""") - private val checkComicIdIsNumericalRegex = Regex("""^\d+$""") - private val extractComicIdFromMangaUrlRegex = Regex("""(\d+)\.(json|html)""") // Get comic ID from manga.url - private val extractPageListRegex = Regex(""""page_url".+?]""") - - private val ENTRIES_ARRAY = (1..10).map { i -> i.toString() }.toTypedArray() - const val PREFIX_ID_SEARCH = "id:" - - private const val privateKey = - "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK8nNR1lTnIfIes6oRWJNj3mB6OssDGx0uGMpgpbVCpf6+VwnuI2stmhZNoQcM417Iz7WqlPzbUmu9R4dEKmLGEEqOhOdVaeh9Xk2IPPjqIu5TbkLZRxkY3dJM1htbz57d/roesJLkZXqssfG5EJauNc+RcABTfLb4IiFjSMlTsnAgMBAAECgYEAiz/pi2hKOJKlvcTL4jpHJGjn8+lL3wZX+LeAHkXDoTjHa47g0knYYQteCbv+YwMeAGupBWiLy5RyyhXFoGNKbbnvftMYK56hH+iqxjtDLnjSDKWnhcB7089sNKaEM9Ilil6uxWMrMMBH9v2PLdYsqMBHqPutKu/SigeGPeiB7VECQQDizVlNv67go99QAIv2n/ga4e0wLizVuaNBXE88AdOnaZ0LOTeniVEqvPtgUk63zbjl0P/pzQzyjitwe6HoCAIpAkEAxbOtnCm1uKEp5HsNaXEJTwE7WQf7PrLD4+BpGtNKkgja6f6F4ld4QZ2TQ6qvsCizSGJrjOpNdjVGJ7bgYMcczwJBALvJWPLmDi7ToFfGTB0EsNHZVKE66kZ/8Stx+ezueke4S556XplqOflQBjbnj2PigwBN/0afT+QZUOBOjWzoDJkCQClzo+oDQMvGVs9GEajS/32mJ3hiWQZrWvEzgzYRqSf3XVcEe7PaXSd8z3y3lACeeACsShqQoc8wGlaHXIJOHTcCQQCZw5127ZGs8ZDTSrogrH73Kw/HvX55wGAeirKYcv28eauveCG7iyFR0PFB/P/EDZnyb+ifvyEFlucPUI0+Y87F" + getPreferencesInternal(screen.context, preferences).forEach(screen::addPreference) } } diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/DmzjUrlActivity.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/DmzjUrlActivity.kt index fe988945e..d0fed1ccb 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/DmzjUrlActivity.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/DmzjUrlActivity.kt @@ -25,7 +25,7 @@ class DmzjUrlActivity : Activity() { } val mainIntent = Intent().apply { action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${Dmzj.PREFIX_ID_SEARCH}$titleId") + putExtra("query", "$PREFIX_ID_SEARCH$titleId") putExtra("filter", packageName) } diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Filters.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Filters.kt new file mode 100644 index 000000000..e18eaae56 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Filters.kt @@ -0,0 +1,199 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList + +fun getFilterListInternal() = FilterList( + RankingGroup(), + Filter.Separator(), + Filter.Header("分类筛选(查看排行榜、搜索文本时无效)"), + GenreGroup(), + StatusFilter(), + ReaderFilter(), + RegionFilter(), + SortFilter(), +) + +// region Ranking filters + +class RankingGroup : Filter.Group>( + "排行榜(搜索文本时无效)", + listOf>( + EnabledFilter(), + TimeFilter(), + SortFilter(), + GenreFilter(), + ) +) { + val isEnabled get() = (state[0] as EnabledFilter).state + + fun parse() = state.filterIsInstance().joinToString("&") { it.uriPart } + + private class EnabledFilter : CheckBox("查看排行榜") + + private class TimeFilter : QueryFilter( + "榜单", + "by_time", + arrayOf( + Pair("日排行", "0"), + Pair("周排行", "1"), + Pair("月排行", "2"), + Pair("总排行", "3"), + ) + ) + + private class SortFilter : QueryFilter( + "排序", + "rank_type", + arrayOf( + Pair("人气", "0"), + Pair("吐槽", "1"), + Pair("订阅", "2"), + ) + ) + + private class GenreFilter : QueryFilter("题材(慎用/易出错)", "tag_id", genres) + + private open class QueryFilter( + name: String, + private val query: String, + values: Array>, + ) : SelectFilter(name, values) { + override val uriPart get() = query + '=' + super.uriPart + } +} + +// endregion + +// region Normal filters + +fun parseFilters(filters: FilterList): String { + val tags = filters.filterIsInstance().mapNotNull { + it.uriPart.takeUnless(String::isEmpty) + }.joinToString("-").ifEmpty { "0" } + val sort = filters.filterIsInstance().firstOrNull()?.uriPart ?: "0" + return "$tags/$sort" +} + +private interface TagFilter : UriPartFilter + +private class GenreGroup : TagFilter, Filter.Group( + "题材(作品需包含勾选的所有项目)", + genres.drop(1).map { GenreFilter(it.first, it.second) } +) { + override val uriPart get() = state.filter { it.state }.joinToString("-") { it.value } +} + +private class GenreFilter(name: String, val value: String) : Filter.CheckBox(name) + +private class StatusFilter : TagFilter, SelectFilter( + "状态", + arrayOf( + Pair("全部", ""), + Pair("连载中", "2309"), + Pair("已完结", "2310"), + ) +) + +private class ReaderFilter : TagFilter, SelectFilter( + "受众", + arrayOf( + Pair("全部", ""), + Pair("少年漫画", "3262"), + Pair("少女漫画", "3263"), + Pair("青年漫画", "3264"), + Pair("女青漫画", "13626"), + ) +) + +private class RegionFilter : TagFilter, SelectFilter( + "地域", + arrayOf( + Pair("全部", ""), + Pair("日本", "2304"), + Pair("韩国", "2305"), + Pair("欧美", "2306"), + Pair("港台", "2307"), + Pair("内地", "2308"), + Pair("其他", "8453"), + ) +) + +private class SortFilter : SelectFilter( + "排序", + arrayOf( + Pair("人气", "0"), + Pair("更新", "1"), + ) +) + +// endregion + +private val genres + get() = arrayOf( + Pair("全部", ""), + Pair("冒险", "4"), + Pair("欢乐向", "5"), + Pair("格斗", "6"), + Pair("科幻", "7"), + Pair("爱情", "8"), + Pair("侦探", "9"), + Pair("竞技", "10"), + Pair("魔法", "11"), + Pair("神鬼", "12"), + Pair("校园", "13"), + Pair("惊悚", "14"), + Pair("其他", "16"), + Pair("四格", "17"), + Pair("生活", "3242"), + Pair("ゆり", "3243"), + Pair("秀吉", "3244"), + Pair("悬疑", "3245"), + Pair("纯爱", "3246"), + Pair("热血", "3248"), + Pair("泛爱", "3249"), + Pair("历史", "3250"), + Pair("战争", "3251"), + Pair("萌系", "3252"), + Pair("宅系", "3253"), + Pair("治愈", "3254"), + Pair("励志", "3255"), + Pair("武侠", "3324"), + Pair("机战", "3325"), + Pair("音乐舞蹈", "3326"), + Pair("美食", "3327"), + Pair("职场", "3328"), + Pair("西方魔幻", "3365"), + Pair("高清单行", "4459"), + Pair("TS", "4518"), + Pair("东方", "5077"), + Pair("魔幻", "5806"), + Pair("奇幻", "5848"), + Pair("节操", "6219"), + Pair("轻小说", "6316"), + Pair("颜艺", "6437"), + Pair("搞笑", "7568"), + Pair("仙侠", "7900"), + Pair("舰娘", "13627"), + Pair("动画", "17192"), + Pair("AA", "18522"), + Pair("福瑞", "23323"), + Pair("生存", "23388"), + Pair("2021大赛", "23399"), + Pair("未来漫画家", "25011"), + ) + +interface UriPartFilter { + val uriPart: String +} + +private open class SelectFilter( + name: String, + values: Array>, +) : UriPartFilter, Filter.Select( + name = name, + values = Array(values.size) { values[it].first }, +) { + private val uriParts = Array(values.size) { values[it].second } + override val uriPart get() = uriParts[state] +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ImageUrlInterceptor.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ImageUrlInterceptor.kt new file mode 100644 index 000000000..1cc8c5c06 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/ImageUrlInterceptor.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import android.util.Log +import okhttp3.Interceptor +import okhttp3.Response +import java.io.IOException + +object ImageUrlInterceptor : Interceptor { + + class Tag(val url: String?) + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val tag = request.tag(Tag::class.java) ?: return chain.proceed(request) + + try { + val response = chain.proceed(request) + if (response.isSuccessful) return response + response.close() + Log.e("DMZJ", "failed to fetch '${request.url}': HTTP ${response.code}") + } catch (e: IOException) { + Log.e("DMZJ", "failed to fetch '${request.url}'", e) + } + + // this can sometimes bypass encoding issues by decoding '+' to ' ' + val decodedUrl = request.url.toString().decodePath() + val newRequest = request.newBuilder().url(decodedUrl).build() + try { + val response = chain.proceed(newRequest) + if (response.isSuccessful) return response + response.close() + Log.e("DMZJ", "failed to fetch '$decodedUrl': HTTP ${response.code}") + } catch (e: IOException) { + Log.e("DMZJ", "failed to fetch '$decodedUrl'", e) + } + + val url = tag.url ?: throw IOException() + val fallbackRequest = request.newBuilder().url(url).build() + return chain.proceed(fallbackRequest) + } +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Preferences.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Preferences.kt new file mode 100644 index 000000000..7c9b0f3f4 --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/Preferences.kt @@ -0,0 +1,87 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import android.content.Context +import android.content.SharedPreferences +import androidx.preference.ListPreference +import androidx.preference.MultiSelectListPreference +import androidx.preference.SwitchPreferenceCompat + +// Legacy preferences: +// "apiRatelimitPreference" -> 1..10 default "5" +// "imgCDNRatelimitPreference" -> 1..10 default "5" + +fun getPreferencesInternal(context: Context, preferences: SharedPreferences) = arrayOf( + + ListPreference(context).apply { + key = IMAGE_QUALITY_PREF + title = "图片质量" + summary = "%s\n如果选择“只用原图”可能会有部分图片无法加载。" + entries = arrayOf("优先原图", "只用原图", "只用低清") + entryValues = arrayOf(AUTO_RES, ORIGINAL_RES, LOW_RES) + setDefaultValue(AUTO_RES) + }, + + SwitchPreferenceCompat(context).apply { + key = CHAPTER_COMMENTS_PREF + title = "章末吐槽页" + summary = "修改后,已加载的章节需要清除章节缓存才能生效。" + setDefaultValue(false) + }, + + MultiSelectListPreference(context).setupIdList( + LICENSED_LIST_PREF, + "特殊漫画 ID 列表 (1)", + preferences.licensedList.toTypedArray(), + ), + + MultiSelectListPreference(context).setupIdList( + HIDDEN_LIST_PREF, + "特殊漫画 ID 列表 (2)", + preferences.hiddenList.toTypedArray(), + ), +) + +val SharedPreferences.imageQuality get() = getString(IMAGE_QUALITY_PREF, AUTO_RES)!! + +val SharedPreferences.showChapterComments get() = getBoolean(CHAPTER_COMMENTS_PREF, false) + +val SharedPreferences.licensedList: Set get() = getStringSet(LICENSED_LIST_PREF, emptySet())!! +val SharedPreferences.hiddenList: Set get() = getStringSet(HIDDEN_LIST_PREF, emptySet())!! + +fun SharedPreferences.addLicensed(id: String) = addToSet(LICENSED_LIST_PREF, id, licensedList) +fun SharedPreferences.addHidden(id: String) = addToSet(HIDDEN_LIST_PREF, id, hiddenList) + +private fun MultiSelectListPreference.setupIdList( + key: String, + title: String, + values: Array, +): MultiSelectListPreference { + this.key = key + this.title = title + summary = "如果漫画网页版可以正常访问,但是应用内章节目录加载异常,可以点开列表删除记录。" + + "删除方法是【取消勾选】要删除的 ID 再点击确定,勾选的项目会保留。" + + "如果点开为空,就表示没有记录。刷新漫画页并展开简介即可查看 ID。" + entries = values + entryValues = values + setDefaultValue(emptySet()) + return this +} + +@Synchronized +private fun SharedPreferences.addToSet(key: String, id: String, oldSet: Set) { + if (id in oldSet) return + val newSet = HashSet((oldSet.size + 1) * 2) + newSet.addAll(oldSet) + newSet.add(id) + edit().putStringSet(key, newSet).apply() +} + +private const val IMAGE_QUALITY_PREF = "imageSourcePreference" +const val AUTO_RES = "PREFER_ORIG_RES" +const val ORIGINAL_RES = "ORIG_RES_ONLY" +const val LOW_RES = "LOW_RES_ONLY" + +private const val CHAPTER_COMMENTS_PREF = "chapterComments" + +private const val LICENSED_LIST_PREF = "licensedList" +private const val HIDDEN_LIST_PREF = "hiddenList" diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/RetryInterceptor.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/RetryInterceptor.kt new file mode 100644 index 000000000..f6e45754a --- /dev/null +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/RetryInterceptor.kt @@ -0,0 +1,18 @@ +package eu.kanade.tachiyomi.extension.zh.dmzj + +import android.util.Log +import okhttp3.Interceptor +import okhttp3.Response + +object RetryInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + repeat(2) { + val response = chain.proceed(request) + if (response.isSuccessful) return response + response.close() + Log.e("DMZJ", "failed to fetch '${request.url}': HTTP ${response.code}") + } + return chain.proceed(request) + } +} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/protobuf/V4apiComicDetailResponse.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/protobuf/V4apiComicDetailResponse.kt deleted file mode 100644 index cbe0604ad..000000000 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/protobuf/V4apiComicDetailResponse.kt +++ /dev/null @@ -1,66 +0,0 @@ -package eu.kanade.tachiyomi.extension.zh.dmzj.protobuf - -/* - * Created by reference to https://github.com/xiaoyaocz/dmzj_flutter/blob/23b04c2af930cb7c18a74665e8ec0bf1ccc6f09b/lib/protobuf/comic/detail_response.proto - * All credit goes to their outstanding work. - */ - -import kotlinx.serialization.Serializable -import kotlinx.serialization.protobuf.ProtoNumber - -@Serializable -data class ComicDetailResponse( - @ProtoNumber(1) val Errno: Int = 0, - @ProtoNumber(2) val Errmsg: String = "", - @ProtoNumber(3) val Data: ComicDetailInfoResponse, -) - -@Serializable -data class ComicDetailInfoResponse( - @ProtoNumber(1) val Id: Int, - @ProtoNumber(2) val Title: String, - @ProtoNumber(3) val Direction: Int? = null, - @ProtoNumber(4) val Islong: Int? = null, - @ProtoNumber(5) val IsDmzj: Int? = null, - @ProtoNumber(6) val Cover: String, - @ProtoNumber(7) val Description: String, - @ProtoNumber(8) val LastUpdatetime: Long? = null, - @ProtoNumber(9) val LastUpdateChapterName: String? = null, - @ProtoNumber(10) val Copyright: Int? = null, - @ProtoNumber(11) val FirstLetter: String? = null, - @ProtoNumber(12) val ComicPy: String? = null, - @ProtoNumber(13) val Hidden: Int? = null, - @ProtoNumber(14) val HotNum: Int? = null, - @ProtoNumber(15) val HitNum: Int? = null, - @ProtoNumber(16) val Uid: Int? = null, - @ProtoNumber(17) val IsLock: Int? = null, - @ProtoNumber(18) val LastUpdateChapterId: Int? = null, - @ProtoNumber(19) val TypesTypes: List = emptyList(), - @ProtoNumber(20) val Status: List = emptyList(), - @ProtoNumber(21) val Authors: List = emptyList(), - @ProtoNumber(22) val SubscribeNum: Int? = null, - @ProtoNumber(23) val Chapters: List = emptyList(), - @ProtoNumber(24) val IsNeedLogin: Int? = null, - @ProtoNumber(26) val IsHideChapter: Int? = null, -) - -@Serializable -data class ComicDetailTypeItemResponse( - @ProtoNumber(1) val TagId: Int, - @ProtoNumber(2) val TagName: String, -) - -@Serializable -data class ComicDetailChapterResponse( - @ProtoNumber(1) val Title: String, - @ProtoNumber(2) val Data: List = emptyList(), -) - -@Serializable -data class ComicDetailChapterInfoResponse( - @ProtoNumber(1) val ChapterId: Int, - @ProtoNumber(2) val ChapterTitle: String, - @ProtoNumber(3) val Updatetime: Long, - @ProtoNumber(4) val Filesize: Int = 0, - @ProtoNumber(5) val ChapterOrder: Int = 0, -) diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/HttpGetFailoverInterceptor.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/HttpGetFailoverInterceptor.kt deleted file mode 100644 index 773332267..000000000 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/HttpGetFailoverInterceptor.kt +++ /dev/null @@ -1,55 +0,0 @@ -package eu.kanade.tachiyomi.extension.zh.dmzj.utils - -import android.util.Log -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import okhttp3.Interceptor -import okhttp3.Response - -/** - * An OkHttp interceptor that will switch to a failover address and retry when an HTTP GET request - * failed. - * - * Because failover addresses are provided per request, we use request headers to pass such info to - * the interceptor. Headers used for indicating failover addresses will be deleted before the request - * starts. - */ -class HttpGetFailoverInterceptor : Interceptor { - companion object { - const val RETRY_WITH_HEADER = "x-tachiyomi-retry-with" - - private const val LOG_TAG = "extension.zh.dmzj.utils" - } - - override fun intercept(chain: Interceptor.Chain): Response { - var request = chain.request() - if (request.method != "GET") { - return chain.proceed(request) - } - - val retries = request.headers(RETRY_WITH_HEADER).mapNotNull { it.toHttpUrlOrNull() }.toList() - if (retries.isNotEmpty()) { - request = request.newBuilder().removeHeader(RETRY_WITH_HEADER).build() - } - - for (retry in retries) { - var response: Response? = null - try { - Log.d(LOG_TAG, "[HttpGetFailoverInterceptor] try for ${request.url}") - response = chain.proceed(request) - if (response.code < 400) { - return response - } - Log.d(LOG_TAG, "[HttpGetFailoverInterceptor] failed with http status ${response.code}, next: $retry") - } catch (e: Exception) { - Log.d(LOG_TAG, "[HttpGetFailoverInterceptor] failed with exception, next: $retry", e) - } - try { - response?.close() - } catch (_: Exception) { - // Ignore exceptions - } - request = request.newBuilder().url(retry).build() - } - return chain.proceed(request) - } -} diff --git a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/RSA.kt b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/RSA.kt index 4d12d1326..4ec3595f7 100644 --- a/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/RSA.kt +++ b/src/zh/dmzj/src/eu/kanade/tachiyomi/extension/zh/dmzj/utils/RSA.kt @@ -1,43 +1,42 @@ package eu.kanade.tachiyomi.extension.zh.dmzj.utils import android.util.Base64 -import java.io.ByteArrayOutputStream import java.security.KeyFactory +import java.security.PrivateKey import java.security.spec.PKCS8EncodedKeySpec import javax.crypto.Cipher +import kotlin.math.min object RSA { + private val cipher by lazy(LazyThreadSafetyMode.NONE) { + Cipher.getInstance("RSA/ECB/PKCS1Padding") + } + private const val MAX_DECRYPT_BLOCK = 128 - fun decrypt(encryptedData: ByteArray, privateKey: String): ByteArray { + fun getPrivateKey(privateKey: String): PrivateKey { val keyBytes = Base64.decode(privateKey, Base64.DEFAULT) val pkcs8KeySpec = PKCS8EncodedKeySpec(keyBytes) val keyFactory = KeyFactory.getInstance("RSA") val privateK = keyFactory.generatePrivate(pkcs8KeySpec) - val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") - cipher.init(Cipher.DECRYPT_MODE, privateK) - return doFinal(encryptedData, cipher) + return privateK } - private fun doFinal(encryptedData: ByteArray, cipher: Cipher): ByteArray { + @Synchronized // because Cipher is not thread-safe + fun decrypt(encrypted: String, key: PrivateKey): ByteArray { + val cipher = this.cipher + cipher.init(Cipher.DECRYPT_MODE, key) // always reset in case of illegal state + val encryptedData = Base64.decode(encrypted, Base64.DEFAULT) val inputLen = encryptedData.size - ByteArrayOutputStream().use { out -> - var offSet = 0 - var cache: ByteArray - var i = 0 - val block = MAX_DECRYPT_BLOCK - while (inputLen - offSet > 0) { - cache = if (inputLen - offSet > block) { - cipher.doFinal(encryptedData, offSet, block) - } else { - cipher.doFinal(encryptedData, offSet, inputLen - offSet) - } - out.write(cache, 0, cache.size) - i++ - offSet = i * block - } - return out.toByteArray() + val result = ByteArray(inputLen) + var resultSize = 0 + + for (offset in 0 until inputLen step MAX_DECRYPT_BLOCK) { + val blockLen = min(MAX_DECRYPT_BLOCK, inputLen - offset) + resultSize += cipher.doFinal(encryptedData, offset, blockLen, result, resultSize) } + + return result.copyOf(resultSize) } }