Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/zh/copymangas/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {

keiyoushi {
name = "CopyMangas"
versionCode = 57
versionCode = 58
contentWarning = ContentWarning.SAFE
libVersion = "1.6"

Expand Down
4 changes: 4 additions & 0 deletions src/zh/copymangas/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-keep class eu.kanade.tachiyomi.extension.zh.copymangas.CopyMangas {
public java.lang.Object getMangaDetails(eu.kanade.tachiyomi.source.model.SManga, kotlin.coroutines.Continuation);
public java.lang.Object getChapterList(eu.kanade.tachiyomi.source.model.SManga, kotlin.coroutines.Continuation);
}
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,15 @@ abstract class CopyMangas :

override fun OkHttpClient.Builder.configureClient() = sslSocketFactory(sslContext.socketFactory, trustManager)
.rateLimit(preferences.getString(CHAPTER_API_RATE_PREF, "15")!!.toInt(), 61.seconds) { it.toString().contains(chapterRatelimitRegex) }
.addInterceptor(CommentsInterceptor)
.addInterceptor(::responseInterceptor)
.apply {
interceptors().apply {
val uncaughtExceptionInterceptor = first { it.javaClass.simpleName == "UncaughtExceptionInterceptor" }
remove(uncaughtExceptionInterceptor)
add(0, uncaughtExceptionInterceptor)
add(1, ::responseInterceptor)
}
addInterceptor(CommentsInterceptor)
}

private fun Headers.Builder.setUserAgent(userAgent: String) = set("User-Agent", userAgent)
private fun Headers.Builder.setWebp(useWebp: Boolean) = set(
Expand Down Expand Up @@ -298,6 +305,22 @@ abstract class CopyMangas :
apiHeaders,
).parseAs<ResultDto<MangaWrapperDto>>().results

suspend fun getMangaDetails(manga: SManga): SManga = getMangaDetails(manga.url.removePrefix(MangaDto.URL_PREFIX)).toSMangaDetails()

suspend fun getChapterList(manga: SManga): List<SChapter> {
val mangaSlug = manga.url.removePrefix(MangaDto.URL_PREFIX)
val mangaDetails = getMangaDetails(mangaSlug)
return fetchChapterList(mangaSlug, mangaDetails.groups)
}

private suspend fun fetchChapterList(manga: String, groups: ChapterGroups?): List<SChapter> {
val result = ArrayList<SChapter>()
for (group in groups.orEmpty().values) {
result += fetchChapterGroup(manga, group.path_word, group.name)
}
return result
}

private suspend fun fetchChapterGroup(manga: String, key: String, name: String): List<SChapter> {
val result = ArrayList<SChapter>(0)
var offset = 0
Expand Down Expand Up @@ -326,15 +349,16 @@ abstract class CopyMangas :
fetchDetails: Boolean,
fetchChapters: Boolean,
): SMangaUpdate {
val mangaDetails = getMangaDetails(manga.url.removePrefix(MangaDto.URL_PREFIX))
val chapterList = ArrayList<SChapter>()
val groups = mangaDetails.groups!!.values
val mangaSlug = manga.url.removePrefix(MangaDto.URL_PREFIX)
for (group in groups) {
chapterList += fetchChapterGroup(mangaSlug, group.path_word, group.name)
if (!fetchDetails && !fetchChapters) {
return SMangaUpdate(manga, chapters)
}

return SMangaUpdate(mangaDetails.toSMangaDetails(), chapterList)
val mangaSlug = manga.url.removePrefix(MangaDto.URL_PREFIX)
val mangaDetails = getMangaDetails(mangaSlug)
val updatedManga = if (fetchDetails) mangaDetails.toSMangaDetails() else manga
val chapterList = if (fetchChapters) fetchChapterList(mangaSlug, mangaDetails.groups) else chapters

return SMangaUpdate(updatedManga, chapterList)
}

override fun getChapterUrl(chapter: SChapter) = baseUrl + chapter.url.replace("/chapter2/", "/chapter/")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ class MangaDto(
thumbnail_url = cover.removeSuffix(".328x422.jpg")
}

fun toSMangaDetails(groups: ChapterGroups) = toSManga().apply {
description = (
fun toSMangaDetails() = toSManga().apply {
description = brief?.let {
if (convertToSc) {
ChineseUtils.toSimplified(brief)
ChineseUtils.toSimplified(it)
} else {
brief
it
}
)
genre = buildList(theme!!.size + 1) {
add(region!!.display)
theme.mapTo(this) { it.name }
}
genre = buildList {
this@MangaDto.region?.display?.let { add(it) }
this@MangaDto.theme.orEmpty().mapTo(this) { it.name }
}.joinToString { ChineseUtils.toSimplified(it) }
status = when (this@MangaDto.status!!.value) {
status = when (this@MangaDto.status?.value) {
0 -> SManga.ONGOING
1 -> SManga.COMPLETED
else -> SManga.UNKNOWN
Expand Down Expand Up @@ -89,7 +89,7 @@ class ValueDto(val value: Int, val display: String)
@Serializable
class MangaWrapperDto(val comic: MangaDto, val groups: ChapterGroups? = null) {
fun toSManga() = comic.toSManga()
fun toSMangaDetails() = comic.toSMangaDetails(groups!!)
fun toSMangaDetails() = comic.toSMangaDetails()
}

typealias ChapterGroups = LinkedHashMap<String, KeywordDto>
Expand Down