From c6bad74c45cc2ec26b9ff80b5ec0e18277957574 Mon Sep 17 00:00:00 2001 From: tanaka-shizuku3 Date: Sun, 24 Aug 2025 22:27:11 +0800 Subject: [PATCH] Add Tongli (#10263) --- src/zh/tongli/build.gradle | 8 + src/zh/tongli/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4743 bytes src/zh/tongli/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2497 bytes .../tongli/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6863 bytes .../tongli/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 13089 bytes .../tongli/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 20049 bytes .../tachiyomi/extension/zh/tongli/Tongli.kt | 248 ++++++++++++++++++ .../extension/zh/tongli/TongliDto.kt | 82 ++++++ 8 files changed, 338 insertions(+) create mode 100644 src/zh/tongli/build.gradle create mode 100644 src/zh/tongli/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/zh/tongli/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/zh/tongli/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/zh/tongli/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/zh/tongli/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/zh/tongli/src/eu/kanade/tachiyomi/extension/zh/tongli/Tongli.kt create mode 100644 src/zh/tongli/src/eu/kanade/tachiyomi/extension/zh/tongli/TongliDto.kt diff --git a/src/zh/tongli/build.gradle b/src/zh/tongli/build.gradle new file mode 100644 index 000000000..5596ab74f --- /dev/null +++ b/src/zh/tongli/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Tongli' + extClass = '.Tongli' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/zh/tongli/res/mipmap-hdpi/ic_launcher.png b/src/zh/tongli/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3d9772a8d8885bf5d2ac14e07c7a872a35e274 GIT binary patch literal 4743 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 VZqOt|i;@5U002ovPDHLkV1in>2i*Vw literal 0 HcmV?d00001 diff --git a/src/zh/tongli/res/mipmap-mdpi/ic_launcher.png b/src/zh/tongli/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3a7352c8ebc0f62667f8a53c92fe2a6d800889 GIT binary patch literal 2497 zcmV;y2|o6TP)EHUo;D(|68)VE*O3``vrL`|iC@ zgcp2>UU2#Ge*o=m!N*yEJrmbm?I|Zmi?fS2CWKJ{QBhG=0RaJ_a=CoENF?gqp3?I? zUs_vRn;04z`ms`}R6Qz-F#yu4s;Vdp3yb;fDfpvnt5m9JYisMJbYIu_nK1xXdcD3x zEEX%CCjcbV1F2NnlVoaQg+~Ff-<`>9_gf=;QBe_+lM;}3ITth+ocp=J&u<2toSj=U zEy$g1X@Uoh`S2(JMp_$M^qwgzF<}$q!x85!yL`KO<-a`hU_ zoj0EeV#@UFyWi1=Ou3BI!e~#2k>w!fupHNa7Gtop26mk| zgvD8+RBelMnHR{4ogT}JHUn^y$hhc(K%|{YNB15*j4nF!{prZg$`Szd>{^D@FcpHr z&2S{$9R6>s;QFc-_sYfSK;V@z7T6QL9}_1{e!2i?J16ay26TV2m3#z8NP>29OXRhmeg*j2blx zUfw=J48MA{2o4Ut;r{xNW&kQGD#%I);YMU;#5|vw0q+43s4T0(s@)d2bz4NBvpoEm7HK?80#ICh4HG@bBY<+4pyex?L>HDKFqi6V zW7Dt>Be11~C8RQ0lf|pAdAyi3hgh0S7&GCBZQ==hD z{S-%!r@`5!U&A~m0oW9x#L2WY96xy)l+HHOc20H{wuf#NHm2KmZo{FM1A;$VY1FME zcWyy;Mi}g0j5PZ0h4Y#4p7IXFV++j0pRA!06Y*}AT}WhBPfkFHqK{e!pG|!gTQ7TAlrKh zVyUc&@WL~mgO&ie+|4HdCtC-AxzO=rf5(Z_8IV2V*KFpjOIh$;yBYjTM8fiWm^H9B zK3Tm=*wI*kZCr_O-x-PMvw2i9*@ORA5yTT0LeiJ=CKih6Md4k>1HBfSk0-!?%y4p{ z@YVsias4_x-x`Bia{{np)#`^NriIFCIm|kH2SvOkTUQun8Wj$>+hVYtdBei&Szf6I z@147g8goO~Wv}z9GVm7GL;;ps8$fUz`G3kDNWR%CXy1vrRXcCFt6AV~7C_X?1sqvWPhnJ&n}LlXn}ous@h}+x^KF(g?}`jZeqJ6l8Vz`J3&_Gx zL)5{F06Y|m5s;ZfyKg19fBe+|>b233FaGr5u3fi#3)Nap6>1j`1FFg)lglV<_NQ>Y z9HU2%ZM%)EUJERhV1)}yB_a-d0eR#ZTBN@6GB`cYF$fezz6t|>^q>KNhc9F^Hwc;+ z625u>%w;IkNsZL-CT}#!P$rfm0NBWUQ$=sZPIgo}Ph1j;cU;$o`UeLb~ zjkG)FfWMh4>E>JXkX6dw{ zph>~9B}RLNa#dLrvF#py&?$$z*7g zwgU1F1hxV;R#sTQF$BK8PZnNKMO*iU7zpZF;_TToD5S6&zB3HcHHnbC>Q<-uI$|3f z9=aR3&~5Odba}auJF%2Qp-?Me>$52> z*u4n3`B%`zmURh#+jyz~SYylU-O0G1mO-{W#<08cb^gydKo+QtTm)DCSA6@oW6xh> zi|O(V^+0D#_l17!Y)GdDfqILAig~>bI?C@wlpe&!C1A|h=diU{Pi$7btzEMkwF*0k zoraPTh`xoHkUh8!C8Y-ebDu$Tm)zmrlR{cc-phRb`n79_kBi0SoE#xF?$>_+-t(Uc zM@I^wCJyF;)Ng%acbYk^4dpsN((%%Bb-+O~RhXNb_a^z+`9O>9bp}9DTwJ`TPoF;T zo2aa(@);eP#5p=TE}_XQgq^W&7;Ea7IXOAK6dM~G;^5#gf$HFPwS-oyt+;XH#y5U` zeoFfL3&~y6SVP7DuzMDCu|6MlF~LGf(`Nru(Xr7~yl(S#f&_)_Q1<;Xs>B{wyYX;VtlAL926Z9K)^)00000 LNkvXXu0mjfI2e@# literal 0 HcmV?d00001 diff --git a/src/zh/tongli/res/mipmap-xhdpi/ic_launcher.png b/src/zh/tongli/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c574885565b66828640c77a8ff1523b4d89271 GIT binary patch literal 6863 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 a8Tdbvpr-5*_%pcx0000().rankingSet[0].week.map { + it.toSManga() + } + return MangasPage(mangas, false) + } + + // Latest + + override fun latestUpdatesRequest(page: Int) = + GET("$apiUrl/SellShelf/6e7e5b75-1acd-4b7c-0097-08d6179fc10a/$page?pageSize=20", headers) + + override fun latestUpdatesParse(response: Response): MangasPage { + val responseDto = response.parseAs() + val mangas = responseDto.books.map { + it.toSManga() + } + return MangasPage(mangas, responseDto.totalPage > responseDto.page) + } + + // Search + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val requestBody = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("SearchStr", query) + .build() + return POST("$apiUrl/Search", headers, requestBody) + } + + override fun searchMangaParse(response: Response): MangasPage { + val mangas = response.parseAs>().map { + it.toSManga() + } + return MangasPage(mangas, false) + } + + // Details + + override fun mangaDetailsRequest(manga: SManga): Request { + val bookGroupID = manga.url.substringBefore(",") + val isSerial = manga.url.substringAfter(",") + return GET("$apiUrl/Book?bookGroupID=$bookGroupID&isSerial=$isSerial", headers) + } + + override fun mangaDetailsParse(response: Response): SManga { + return response.parseAs().toSManga() + } + + // Chapters + + override fun chapterListRequest(manga: SManga): Request { + val newHeaders = headersBuilder().add("Authorization: Bearer ${getToken()}").build() + val bookGroupID = manga.url.substringBefore(",") + val isSerial = manga.url.substringAfter(",") + return GET("$apiUrl/Book/BookVol/$bookGroupID?bookID=null&isSerial=$isSerial", newHeaders) + } + + override fun chapterListParse(response: Response): List { + return response.parseAs>().mapNotNull { + it.toSChapter() + }.reversed() + } + + override fun getMangaUrl(manga: SManga): String { + val bookGroupID = manga.url.substringBefore(",") + val isSerial = manga.url.substringAfter(",") + return "$baseUrl/book?id=$bookGroupID&isGroup=true&isSerials=$isSerial" + } + + // Pages + + override fun pageListRequest(chapter: SChapter): Request { + val newHeaders = headersBuilder().add("Authorization: Bearer ${getToken()}").build() + return GET("$apiUrl/Comic/sas/${chapter.url}", newHeaders) + } + + override fun pageListParse(response: Response): List { + return response.parseAs().pages.mapIndexed { index, it -> + Page(index, imageUrl = it.imageURL) + } + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + + private fun getToken(): String { + val token = preferences.getString("TOKEN", "")!! + val expires = preferences.getLong("EXPIRES", 0) + val currentTimeMillis = System.currentTimeMillis() + if (token.isEmpty()) { + val email = preferences.getString("EMAIL", "")!! + val password = preferences.getString("PASSWORD", "")!! + if (email.isEmpty()) { + return loginAnonymous() + } + return login(email, password) + } + if (expires < currentTimeMillis) { + val refreshToken = preferences.getString("REFRESHTOKEN", "")!! + return refresh(refreshToken) + } + return token + } + + private fun login(email: String, password: String): String { + val requestBody = buildJsonObject { + put("email", email) + put("password", password) + put("returnSecureToken", true) + }.toString().toRequestBody(jsonMediaType) + val response: TokenResponseDto + try { + response = client.newCall( + POST( + "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=AIzaSyAJbYmo7KyhM_7CDXjjFXnp8bdRTNgbUIE", + headers, + requestBody, + ), + ).execute().parseAs() + } catch (e: SerializationException) { + // Remove email/password after failed login + preferences.edit() + .putString("EMAIL", "") + .putString("PASSWORD", "") + .apply() + throw Exception("登录失败") + } + val currentTimeMillis = System.currentTimeMillis() + preferences.edit() + .putString("TOKEN", response.idToken) + .putString("REFRESHTOKEN", response.refreshToken) + // Token expires after one hour + .putLong("EXPIRES", currentTimeMillis + 3600000) + .apply() + return response.idToken + } + + private fun loginAnonymous(): String { + val requestBody = buildJsonObject { + put("returnSecureToken", true) + }.toString().toRequestBody(jsonMediaType) + val response = client.newCall( + POST( + "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=AIzaSyAJbYmo7KyhM_7CDXjjFXnp8bdRTNgbUIE", + headers, + requestBody, + ), + ).execute().parseAs() + val currentTimeMillis = System.currentTimeMillis() + preferences.edit() + .putString("TOKEN", response.idToken) + .putString("REFRESHTOKEN", response.refreshToken) + .putLong("EXPIRES", currentTimeMillis + 3600000) + .apply() + return response.idToken + } + + private fun refresh(refreshToken: String): String { + val requestBody = buildJsonObject { + put("grant_type", "refresh_token") + put("refresh_token", refreshToken) + }.toString().toRequestBody(jsonMediaType) + val response = client.newCall( + POST( + "https://securetoken.googleapis.com/v1/token?key=AIzaSyAJbYmo7KyhM_7CDXjjFXnp8bdRTNgbUIE", + headers, + requestBody, + ), + ).execute().parseAs() + val currentTimeMillis = System.currentTimeMillis() + preferences.edit() + .putString("TOKEN", response.idToken) + .putString("REFRESHTOKEN", response.refreshToken) + .putLong("EXPIRES", currentTimeMillis + 3600000) + .apply() + return response.idToken + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + ListPreference(screen.context).apply { + EditTextPreference(screen.context).apply { + key = "EMAIL" + title = "电子邮件" + summary = "该配置被修改后,会清空令牌(Token)以便重新登录;如果登录失败,会清空该配置" + setOnPreferenceChangeListener { _, _ -> + // clean token after email/password changed + preferences.edit().putString("TOKEN", "").apply() + true + } + }.let(screen::addPreference) + + EditTextPreference(screen.context).apply { + key = "PASSWORD" + title = "密码" + summary = "该配置被修改后,会清空令牌(Token)以便重新登录;如果登录失败,会清空该配置" + setOnBindEditTextListener { + it.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + setOnPreferenceChangeListener { _, _ -> + // clean token after email/password changed + preferences.edit().putString("TOKEN", "").apply() + true + } + }.let(screen::addPreference) + } + } +} diff --git a/src/zh/tongli/src/eu/kanade/tachiyomi/extension/zh/tongli/TongliDto.kt b/src/zh/tongli/src/eu/kanade/tachiyomi/extension/zh/tongli/TongliDto.kt new file mode 100644 index 000000000..1ddd557a7 --- /dev/null +++ b/src/zh/tongli/src/eu/kanade/tachiyomi/extension/zh/tongli/TongliDto.kt @@ -0,0 +1,82 @@ +package eu.kanade.tachiyomi.extension.zh.tongli + +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonNames + +@Serializable +class PopularResponseDto(@SerialName("RankingSet") val rankingSet: List) + +@Serializable +class RankingSetDto(@SerialName("Week") val week: List) + +@Serializable +class MangaDto( + @JsonNames("BookTitle", "Title") private val bookTitle: String, + @JsonNames("BookCoverURL", "CoverURL") private val bookCoverURL: String, + @SerialName("BookGroupID") private val bookGroupID: String, + @SerialName("IsSerial") private val isSerial: Boolean, +) { + fun toSManga() = SManga.create().apply { + url = "$bookGroupID,$isSerial" + title = bookTitle + thumbnail_url = bookCoverURL + } +} + +@Serializable +class LatestResponseDto( + @SerialName("TotalPage") val totalPage: Int, + @SerialName("Page") val page: Int, + @SerialName("Books") val books: List, +) + +@Serializable +class ChapterDto( + @SerialName("BookID") private val bookID: String, + @SerialName("Vol") private val vol: String, + @SerialName("IsUpcoming") private val isUpcoming: Boolean, + @SerialName("IsPurchased") private val isPurchased: Boolean, + @SerialName("IsFree") private val isFree: Boolean, +) { + fun toSChapter(): SChapter? = SChapter.create().apply { + if (isUpcoming) return null + url = bookID + // Prepend lock emoji to name if not readable + name = if (isFree || isPurchased) vol else "\uD83D\uDD12 $vol" + } +} + +@Serializable +class DetailsDto( + @SerialName("Title") private val title: String, + @SerialName("CoverURL") private val coverURL: String, + @SerialName("Authors") private val authors: List, + @SerialName("Introduction") private val introduction: String, +) { + fun toSManga() = SManga.create().apply { + title = this@DetailsDto.title + thumbnail_url = coverURL + author = authors.joinToString { + if (it.title.isNullOrEmpty()) it.name else "${it.title}:${it.name}" + } + description = introduction + } +} + +@Serializable +class AuthorDto(@SerialName("Name") val name: String, @SerialName("Title") val title: String?) + +@Serializable +class PageListResponseDto(@SerialName("Pages") val pages: List) + +@Serializable +class ImageDto(@SerialName("ImageURL") val imageURL: String) + +@Serializable +class TokenResponseDto( + @JsonNames("id_token") val idToken: String, + @JsonNames("refresh_token") val refreshToken: String, +)