diff --git a/src/all/junmeitu/build.gradle b/src/all/junmeitu/build.gradle index 587b512dc..ad8f4c106 100644 --- a/src/all/junmeitu/build.gradle +++ b/src/all/junmeitu/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' ext { extName = 'Junmeitu' pkgNameSuffix = 'all.junmeitu' extClass = '.Junmeitu' - extVersionCode = 2 + extVersionCode = 3 isNsfw = true } diff --git a/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/Junmeitu.kt b/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/Junmeitu.kt index fd55887c6..e94be9638 100644 --- a/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/Junmeitu.kt +++ b/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/Junmeitu.kt @@ -12,12 +12,17 @@ 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.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json import okhttp3.Request +import okhttp3.Response +import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import org.jsoup.select.Evaluator import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy class Junmeitu : ConfigurableSource, ParsedHttpSource() { override val lang = "all" @@ -25,6 +30,8 @@ class Junmeitu : ConfigurableSource, ParsedHttpSource() { override val supportsLatest = true override val id = 4721197766605490540 + private val json: Json by injectLazy() + // Preference private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) @@ -40,13 +47,6 @@ class Junmeitu : ConfigurableSource, ParsedHttpSource() { entryValues = MIRROR_PREF_ENTRY_VALUES setDefaultValue(MIRROR_PREF_DEFAULT_VALUE) summary = "%s" - - setOnPreferenceChangeListener { _, newValue -> - val selected = newValue as String - val index = findIndexOfValue(selected) - val entry = entryValues[index] as String - preferences.edit().putString("${MIRROR_PREF_KEY}_$lang", entry).commit() - } } screen.addPreference(mirrorPref) } @@ -112,11 +112,8 @@ class Junmeitu : ConfigurableSource, ParsedHttpSource() { val manga = SManga.create() manga.title = document.selectFirst(".news-title,.title").text() manga.description = document.select(".news-info,.picture-details").text() + "\n" + document.select(".introduce").text() - val genres = mutableListOf() - document.select(".relation_tags > a").forEach { - genres.add(it.text()) - } - manga.genre = genres.joinToString(", ") + manga.genre = document.select(".relation_tags > a").joinToString { it.text() } + manga.status = SManga.COMPLETED return manga } @@ -133,39 +130,37 @@ class Junmeitu : ConfigurableSource, ParsedHttpSource() { // Pages override fun pageListParse(document: Document): List { val numPages = document.select(".pages > a:nth-last-of-type(2)").text().toIntOrNull() - var url = document.select(".position a:last-child").first().attr("abs:href") - val pages = mutableListOf() - var count = 0 - if (numPages != null) { - url = url.substringBeforeLast(".") - while (numPages != count) { - count += 1 - val doc = when (count) { - 1 -> document - else -> client.newCall(GET("$url-$count.html")).execute().asJsoup() - } - doc.select(".pictures img,.news-body img").forEachIndexed() { index, it -> - val imgUrl = when { - it.hasAttr("data-original") -> it.attr("abs:data-original") - it.hasAttr("data-src") -> it.attr("abs:data-src") - it.hasAttr("data-lazy-src") -> it.attr("abs:data-lazy-src") - else -> it.attr("abs:src") - } - pages.add(Page(index, imgUrl, imgUrl)) - } + val newsBody = document.selectFirst(Evaluator.Class("news-body")) + if (newsBody == null) { + val baseUrl = this.baseUrl + val prefix = document.location().run { + val index = lastIndexOf('.') // .html + baseUrl + "/ajax_" + substring(baseUrl.length + 1, index) + '-' } + val postfix = document.selectFirst("body > script").data().run { + val script = substringAfterLast("pc_cid = ") + val categoryId = script.substringBefore(';') + val contentId = script.substringAfter("pc_id = ").substringBeforeLast(';') + ".html?ajax=1&catid=$categoryId&conid=$contentId" + } + return (1..numPages!!).map { Page(it - 1, "$prefix$it$postfix") } } else { - document.select(".pictures img,.news-body img").forEachIndexed() { index, it -> + return newsBody.select(Evaluator.Tag("img")).mapIndexed { index, it -> val imgUrl = when { it.hasAttr("data-original") -> it.attr("abs:data-original") it.hasAttr("data-src") -> it.attr("abs:data-src") it.hasAttr("data-lazy-src") -> it.attr("abs:data-lazy-src") else -> it.attr("abs:src") } - pages.add(Page(index, imgUrl, imgUrl)) + Page(index, imageUrl = imgUrl) } } - return pages + } + + override fun imageUrlParse(response: Response): String { + val page: PageDto = json.decodeFromString(response.body!!.string()) + val img = Jsoup.parseBodyFragment(page.pic).body().child(0) + return img.attr("src") } override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used") diff --git a/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/PageDto.kt b/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/PageDto.kt new file mode 100644 index 000000000..6ef7f0a24 --- /dev/null +++ b/src/all/junmeitu/src/eu/kanade/tachiyomi/extension/all/junmeitu/PageDto.kt @@ -0,0 +1,6 @@ +package eu.kanade.tachiyomi.extension.all.junmeitu + +import kotlinx.serialization.Serializable + +@Serializable +class PageDto(val pic: String)