From 8143b34bf011acb8376711672aaf16d648708340 Mon Sep 17 00:00:00 2001 From: DitFranXX <45893338+DitFranXX@users.noreply.github.com> Date: Sun, 20 Sep 2020 07:50:30 +0900 Subject: [PATCH] Update NewToki extension v1.2.16 / Remove ManaMoa Extension (#4389) Update NewToki extension v1.2.16 / Remove ManaMoa Extension --- src/ko/mangashowme/AndroidManifest.xml | 38 -- src/ko/mangashowme/build.gradle | 12 - .../res/mipmap-hdpi/ic_launcher.png | Bin 3118 -> 0 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 1898 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 4419 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 7803 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 12729 -> 0 bytes src/ko/mangashowme/res/web_hi_res_512.png | Bin 36117 -> 0 bytes .../ko/mangashowme/MMCDNUrlHandler.kt | 20 - .../extension/ko/mangashowme/MMFilters.kt | 181 ------ .../ko/mangashowme/MMImageDecoder.kt | 171 ------ .../ko/mangashowme/MMmageUrlHandler.kt | 61 -- .../extension/ko/mangashowme/ManaMoa.kt | 531 ------------------ .../ko/mangashowme/ManaMoaUrlActivity.kt | 34 -- .../extension/ko/mangashowme/Utils.kt | 5 - src/ko/newtoki/build.gradle | 4 +- .../tachiyomi/extension/ko/newtoki/NewToki.kt | 102 +++- .../extension/ko/newtoki/NewTokiFactory.kt | 137 ++++- 18 files changed, 215 insertions(+), 1081 deletions(-) delete mode 100644 src/ko/mangashowme/AndroidManifest.xml delete mode 100644 src/ko/mangashowme/build.gradle delete mode 100644 src/ko/mangashowme/res/mipmap-hdpi/ic_launcher.png delete mode 100644 src/ko/mangashowme/res/mipmap-mdpi/ic_launcher.png delete mode 100644 src/ko/mangashowme/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/ko/mangashowme/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/ko/mangashowme/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src/ko/mangashowme/res/web_hi_res_512.png delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMCDNUrlHandler.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoaUrlActivity.kt delete mode 100644 src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/Utils.kt diff --git a/src/ko/mangashowme/AndroidManifest.xml b/src/ko/mangashowme/AndroidManifest.xml deleted file mode 100644 index 6bb3d95eb..000000000 --- a/src/ko/mangashowme/AndroidManifest.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ko/mangashowme/build.gradle b/src/ko/mangashowme/build.gradle deleted file mode 100644 index 575279672..000000000 --- a/src/ko/mangashowme/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - extName = 'ManaMoa' - pkgNameSuffix = 'ko.mangashowme' - extClass = '.ManaMoa' - extVersionCode = 20 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/ko/mangashowme/res/mipmap-hdpi/ic_launcher.png b/src/ko/mangashowme/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 9a375700705061b0e6785806911e7118ba5721c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3118 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 IM6N<$g1mj)m;e9( diff --git a/src/ko/mangashowme/res/mipmap-mdpi/ic_launcher.png b/src/ko/mangashowme/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 86639e571076179dcf48c7c6747508547533f397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 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 N002ovPDHLkV1m@-BvSwY diff --git a/src/ko/mangashowme/res/mipmap-xxxhdpi/ic_launcher.png b/src/ko/mangashowme/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index d8eaadfc076090543ca7314b67ae530a26177505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12729 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 Sa|FL715lJzlc|w15B?vBp4%t@ diff --git a/src/ko/mangashowme/res/web_hi_res_512.png b/src/ko/mangashowme/res/web_hi_res_512.png deleted file mode 100644 index 9357e66dd95da2cfc0741e0079922b5bb188cccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36117 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 M?bS`vwz=~E03G54AOHXW diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMCDNUrlHandler.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMCDNUrlHandler.kt deleted file mode 100644 index d9b59fe11..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMCDNUrlHandler.kt +++ /dev/null @@ -1,20 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import org.json.JSONArray - -internal class MMCDNUrlHandler(scripts: String) { - private val domains = JSONArray("[${scripts.substringBetween("var cdn_domains = [", "];")}]") - private val chapter = scripts.substringBetween("var chapter = ", ";") - .toIntOrNull() ?: 0 - - fun replace(array: JSONArray): List { - return (0 until array.length()) - .map { - val cdn: String = domains.get((chapter + 4 * it) % domains.length()) as String - (array.get(it) as String) - .replace("cdntigermask.xyz", cdn) - .replace("cdnmadmax.xyz", cdn) - .replace("filecdn.xyz", cdn) - } - } -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt deleted file mode 100644 index 370accd0e..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMFilters.kt +++ /dev/null @@ -1,181 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList -import okhttp3.HttpUrl -import okhttp3.Request - -// TODO: Completely Implement/Update Filters(Genre/Artist). -private class TextField(name: String, val key: String) : Filter.Text(name) - -private class SearchCheckBox(name: String, val id: String = name) : Filter.CheckBox(name) - -private class SearchMatch : Filter.Select("Match", arrayOf("AND", "OR")) -private class SearchType : Filter.Select("Type", arrayOf("Title", "Artist")) -private class SearchGenresList(genres: List) : Filter.Group("Genres", genres) -private class SearchNamingList : Filter.Select("Naming", searchNaming()) -private class SearchStatusList : Filter.Select("Status", searchStatus()) -private class SearchOrderList : Filter.Select("Order", order()) - -// [`"Not Set"`, ...[...document.querySelectorAll(".categories ul[data-type='1'] li")].map((el, i) => `"${el.innerText.trim()}"`)].join(',\n') -private fun searchNaming() = arrayOf( - "Not Set", - "ㄱ", - "ㄲ", - "ㄴ", - "ㄷ", - "ㄸ", - "ㄹ", - "ㅁ", - "ㅂ", - "ㅃ", - "ㅅ", - "ㅆ", - "ㅇ", - "ㅈ", - "ㅉ", - "ㅊ", - "ㅋ", - "ㅌ", - "ㅍ", - "ㅎ", - "A-Z", - "0-9" -) - -// [`"Not Set"`, ...[...document.querySelectorAll(".categories ul[data-type='2'] li")].map((el, i) => `"${el.innerText.trim()}"`)].join(',\n') -private fun searchStatus() = arrayOf( - "Not Set", - "주간", - "격주", - "월간", - "격월/비정기", - "단편", - "단행본", - "완결" -) - -// [...document.querySelectorAll(".categories ul[data-type='2'] li")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') -private fun order() = arrayOf( - "Recent", - "Likes", - "Popular", - "Comments", - "Bookmarks" -) - -// [...document.querySelectorAll(".categories ul[data-type='3'] li")].map((el, i) => `SearchCheckBox("${el.innerText.trim()}")`).join(',\n') -private fun searchGenres() = listOf( - SearchCheckBox("17"), - SearchCheckBox("BL"), - SearchCheckBox("SF"), - SearchCheckBox("TS"), - SearchCheckBox("개그"), - SearchCheckBox("게임"), - SearchCheckBox("공포"), - SearchCheckBox("도박"), - SearchCheckBox("드라마"), - SearchCheckBox("라노벨"), - SearchCheckBox("러브코미디"), - SearchCheckBox("먹방"), - SearchCheckBox("백합"), - SearchCheckBox("붕탁"), - SearchCheckBox("순정"), - SearchCheckBox("스릴러"), - SearchCheckBox("스포츠"), - SearchCheckBox("시대"), - SearchCheckBox("애니화"), - SearchCheckBox("액션"), - SearchCheckBox("음악"), - SearchCheckBox("이세계"), - SearchCheckBox("일상"), - SearchCheckBox("전생"), - SearchCheckBox("추리"), - SearchCheckBox("판타지"), - SearchCheckBox("학원"), - SearchCheckBox("호러") -) - -fun getFilters() = FilterList( - SearchNamingList(), - SearchStatusList(), - SearchGenresList(searchGenres()), - Filter.Separator(), - SearchType(), - SearchMatch(), - SearchOrderList() -) - -fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: String, filters: FilterList): Request { - var nameFilter: Int? = null - var statusFilter: Int? = null - val genresFilter = mutableListOf() - var matchFilter = 1 - var orderFilter = 0 - var typeFilter = 0 - - filters.forEach { filter -> - when (filter) { - is SearchMatch -> { - matchFilter = filter.state + 1 - } - - is SearchOrderList -> { - orderFilter = filter.state - } - - is SearchType -> { - typeFilter = arrayOf(0, 5)[filter.state] - } - - is SearchNamingList -> { - if (filter.state > 0) { - nameFilter = filter.state - 1 - } - } - - is SearchStatusList -> { - if (filter.state > 0) { - statusFilter = filter.state - } - } - - is SearchGenresList -> { - filter.state.forEach { - if (it.state) { - genresFilter.add(it.id) - } - } - } - } - } - - /* - if (!authorFilter.isNullOrEmpty()) { - Log.println(Log.DEBUG, "TACHI REQUEST", "ARTIST REQU") - return GET("$baseUrl/bbs/page.php?hid=manga_list&search_type=1&sfl=5&_0=$authorFilter&_1=&_2=&_3=&_4=$orderFilter") - } - */ - - if (query.isEmpty() && nameFilter == null && statusFilter == null && orderFilter == 0 && matchFilter == 1 && genresFilter.isEmpty()) { - return GET( - "$baseUrl/bbs/page.php?hid=manga_list" + - if (page > 1) "&page=${page - 1}" else "" - ) - } - - val url = HttpUrl.parse("$baseUrl/bbs/page.php?hid=manga_list")!!.newBuilder() - url.addQueryParameter("search_type", matchFilter.toString()) - url.addQueryParameter("sfl", typeFilter.toString()) - url.addQueryParameter("_0", query) - url.addQueryParameter("_1", nameFilter?.toString() ?: "") - url.addQueryParameter("_2", statusFilter?.toString() ?: "") - url.addQueryParameter("_3", genresFilter.joinToString(",")) - url.addQueryParameter("_4", orderFilter.toString()) - if (page > 1) { - url.addQueryParameter("page", "${page - 1}") - } - - return GET(url.toString()) -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt deleted file mode 100644 index 3f251b20a..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMImageDecoder.kt +++ /dev/null @@ -1,171 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.graphics.Canvas -import android.graphics.Rect -import okhttp3.Interceptor -import okhttp3.MediaType -import okhttp3.Response -import okhttp3.ResponseBody -import java.io.ByteArrayOutputStream -import java.io.IOException -import java.io.InputStream -import kotlin.math.cos -import kotlin.math.floor -import kotlin.math.sin -import kotlin.math.tan - -/* - * `v1` means url padding of image host. - * It's not need now, but it remains in this code for sometime. - */ - -internal class ImageDecoder(scripts: String) { - private val cnt = scripts.substringBetween("var view_cnt = ", ";") - .toIntOrNull() ?: 0 - private val chapter = scripts.substringBetween("var chapter = ", ";") - .toIntOrNull() ?: 0 - - fun request(url: String): String { - if (cnt < 10) return url - return "$url??$chapter;$cnt" - } -} - -internal class ImageDecoderInterceptor : Interceptor { - override fun intercept(chain: Interceptor.Chain): Response { - val req = chain.request() - val newReq = req.newBuilder()!! - .removeHeader("ImageRequest") - .removeHeader("ImageDecodeRequest") - .removeHeader("SecondUrlToRequest") - .build()!! - val response = chain.proceed(newReq) - - val decodeHeader = req.header("ImageDecodeRequest") - - return if (decodeHeader != null) { - try { - val s = decodeHeader.split(";").map { it.toInt() } - - if (s[1] < 10) return response - - val res = response.body()!!.byteStream().use { - decodeImageRequest(it, s[0], s[1]) - } - - val rb = ResponseBody.create(MediaType.parse("image/png"), res) - response.newBuilder().body(rb).build() - } catch (e: Exception) { - e.printStackTrace() - throw IOException("Image decoder failure.", e) - } - } else { - response - } - } - - private fun decodeImageRequest(img: InputStream, chapter: Int, view_cnt: Int): ByteArray { - val decoded = BitmapFactory.decodeStream(img) - val result = imageDecoder(decoded, chapter, view_cnt) - - val output = ByteArrayOutputStream() - result.compress(Bitmap.CompressFormat.PNG, 100, output) - return output.toByteArray() - } - - /* - * `imageDecoder` is modified version of - * https://github.com/junheah/MangaViewAndroid/blob/b69a4427258fe7fc5fb5363108572bbee0d65e94/app/src/main/java/ml/melun/mangaview/mangaview/Decoder.java#L6-L60 - * - * MIT License - * - * Copyright (c) 2019 junheah - */ - private fun imageDecoder(input: Bitmap, chapter: Int, view_cnt: Int, half: Int = 0): Bitmap { - if (view_cnt == 0) return input - val viewCnt = view_cnt / 10 - var cx = ManaMoa.V1_CX - var cy = ManaMoa.V1_CY - - // view_cnt / 10 > 30000 ? (this._CX = 1, this._CY = 6) : view_cnt / 10 > 20000 ? this._CX = 1 : view_cnt / 10 > 10000 && (this._CY = 1) - // DO NOT (AUTOMATICALLY) REPLACE TO when USING IDEA. seems it doesn't detect correct condition - if (viewCnt > 30000) { - cx = 1 - cy = 6 - } else if (viewCnt > 20000) { - cx = 1 - } else if (viewCnt > 10000) { - cy = 1 - } - - // decode image - val order = Array(cx * cy) { IntArray(2) } - val oSize = order.size - 1 - - for (i in 0..oSize) { - order[i][0] = i - order[i][1] = decoderRandom(chapter, viewCnt, i) - } - - java.util.Arrays.sort(order) { a, b -> a[1].toDouble().compareTo(b[1].toDouble()) } - - // create new bitmap - val outputWidth = if (half == 0) input.width else input.width / 2 - val output = Bitmap.createBitmap(outputWidth, input.height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(output) - - val rowWidth = input.width / cx - val rowHeight = input.height / cy - - for (i in 0..oSize) { - val o = order[i] - val ox = i % cx - val oy = i / cx - val tx = o[0] % cx - val ty = o[0] / cx - val sx = if (half == 2) -input.width / 2 else 0 - - val srcX = ox * rowWidth - val srcY = oy * rowHeight - val destX = (tx * rowWidth) + sx - val destY = ty * rowHeight - - canvas.drawBitmap( - input, - Rect(srcX, srcY, srcX + rowWidth, srcY + rowHeight), - Rect(destX, destY, destX + rowWidth, destY + rowHeight), - null - ) - } - - return output - } - - /* - * `decodeRandom` is modified version of - * https://github.com/junheah/MangaViewAndroid/blob/b69a4427258fe7fc5fb5363108572bbee0d65e94/app/src/main/java/ml/melun/mangaview/mangaview/Decoder.java#L6-L60 - * - * MIT License - * - * Copyright (c) 2019 junheah - */ - private fun decoderRandom(chapter: Int, view_cnt: Int, index: Int): Int { - if (chapter < 554714) { - val x = 10000 * sin((view_cnt + index).toDouble()) - return floor(100000 * (x - floor(x))).toInt() - } - - val seed = view_cnt + index + 1 - val t = 100 * sin((10 * seed).toDouble()) - val n = 1000 * cos((13 * seed).toDouble()) - val a = 10000 * tan((14 * seed).toDouble()) - - return ( - floor(100 * (t - floor(t))) + - floor(1000 * (n - floor(n))) + - floor(10000 * (a - floor(a))) - ).toInt() - } -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt deleted file mode 100644 index aec9d7b2f..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MMmageUrlHandler.kt +++ /dev/null @@ -1,61 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import okhttp3.Interceptor -import okhttp3.Response - -internal class ImageUrlHandlerInterceptor : Interceptor { - override fun intercept(chain: Interceptor.Chain): Response = RequestHandler(chain).run() -} - -private class RequestHandler(val chain: Interceptor.Chain) { - val req = chain.request()!! - val origUrl = req.url().toString() - - fun run(): Response { - // only for image Request - if (req.header("ImageRequest") != "1") return chain.proceed(req) - - val secondUrl = req.header("SecondUrlToRequest") - - val res = getRequest(origUrl) - return if (!isSuccess(res) && secondUrl != null) { - getRequest(secondUrl) - } else res - } - - private fun isSuccess(res: Response): Boolean { - val length = res.header("content-length")?.toInt() ?: 0 - return !(!res.isSuccessful || length < ManaMoa.MINIMUM_IMAGE_SIZE) - } - - private fun getRequest(url: String): Response = when { - ".xyz/" in url -> ownCDNRequestHandler(url) - else -> outsideRequestHandler(url) - } - - private fun ownCDNRequestHandler(url: String): Response { - val res = proceedRequest(url) - return if (!isSuccess(res)) { - val s3url = if (url.contains("img.")) { - url.replace("img.", "s3.") - } else { - url.replace("://", "://s3.") - } - proceedRequest(s3url) // s3 - } else res - } - - private fun outsideRequestHandler(url: String): Response { - val outUrl = url.substringBefore("?quick") - return proceedRequest(outUrl) - } - - private fun proceedRequest(url: String): Response = chain.proceed( - req.newBuilder()!! - .url(url) - .removeHeader("ImageRequest") - .removeHeader("ImageDecodeRequest") - .removeHeader("SecondUrlToRequest") - .build()!! - ) -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt deleted file mode 100644 index 7e1130874..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoa.kt +++ /dev/null @@ -1,531 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import android.annotation.SuppressLint -import android.annotation.TargetApi -import android.app.Application -import android.content.SharedPreferences -import android.os.Build -import android.support.v7.preference.CheckBoxPreference -import android.support.v7.preference.EditTextPreference -import android.support.v7.preference.PreferenceScreen -import android.widget.Toast -import eu.kanade.tachiyomi.extension.BuildConfig -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.source.ConfigurableSource -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.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.Call -import okhttp3.Callback -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.json.JSONArray -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import org.jsoup.select.Elements -import rx.Observable -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import java.io.IOException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.concurrent.CompletableFuture -import java.util.concurrent.TimeUnit - -/** - * ManaMoa Source - * - * Originally it was mangashow.me extension but they changed site structure widely. - * so I moved to new name for treating as new source. - * Users who uses =<1.2.11 need to migrate source. starts 1.2.12 - * - * PS. There's no Popular section. It's just a list of manga. Also not latest updates. - * `manga_list` returns latest 'added' manga. not a chapter updates. - **/ -class ManaMoa : ConfigurableSource, ParsedHttpSource() { - - override val name = "ManaMoa" - - // This keeps updating: https://twitter.com/manamoa24 - private val defaultBaseUrl = "https://manamoa34.net" - override val baseUrl by lazy { getCurrentBaseUrl() } - - override val lang: String = "ko" - - // Latest updates currently returns duplicate manga as it separates manga into chapters - // But allowing to fetch from chapters with experimental setting. - override val supportsLatest by lazy { getExperimentLatest() } - - override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .connectTimeout(10, TimeUnit.SECONDS) - .readTimeout(30, TimeUnit.SECONDS) - .addInterceptor(ImageDecoderInterceptor()) - .addInterceptor(ImageUrlHandlerInterceptor()) - .build()!! - - override fun popularMangaSelector() = "div.manga-list-gallery > div > div.post-row" - - override fun popularMangaFromElement(element: Element): SManga { - val linkElement = element.select("a") - val titleElement = element.select(".manga-subject > a").first() - - val manga = SManga.create() - manga.url = linkElement.attr("href") - manga.title = titleElement.html().trim() - manga.thumbnail_url = urlFinder(element.select(".img-wrap-back").attr("style")) - return manga - } - - override fun popularMangaNextPageSelector() = "ul.pagination > li:not(.disabled)" - - // Do not add page parameter if page is 1 to prevent tracking. - override fun popularMangaRequest(page: Int) = GET( - "$baseUrl/bbs/page.php?hid=manga_list" + - if (page > 1) "&page=${page - 1}" else "" - ) - - override fun popularMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - - val mangas = document.select(popularMangaSelector()).map { element -> - popularMangaFromElement(element) - } - - val hasNextPage = try { - !document.select(popularMangaNextPageSelector()).last().hasClass("active") - } catch (_: Exception) { - false - } - - return MangasPage(mangas, hasNextPage) - } - - override fun searchMangaSelector() = popularMangaSelector() - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - override fun searchMangaNextPageSelector() = popularMangaSelector() - override fun searchMangaParse(response: Response) = popularMangaParse(response) - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - return if (query.startsWith(PREFIX_ID_SEARCH)) { - val realQuery = query.removePrefix(PREFIX_ID_SEARCH) - val urlPath = "/bbs/page.php?hid=manga_detail&manga_id=$realQuery" - client.newCall(GET("$baseUrl$urlPath")) - .asObservableSuccess() - .map { response -> - val details = mangaDetailsParse(response) - details.url = urlPath - MangasPage(listOf(details), false) - } - } else super.fetchSearchManga(page, query, filters) - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = - searchComplexFilterMangaRequestBuilder(baseUrl, page, query, filters) - - override fun mangaDetailsParse(document: Document): SManga { - val info = document.select("div.left-info").first() - val thumbnailElement = info.select("div.manga-thumbnail").first() - val publishTypeText = thumbnailElement.select("a.publish_type").trimText("Unknown") - val authorText = thumbnailElement.select("a.author").trimText() - - val mangaStatus = info.select("div.recommend") - val mangaLike = mangaStatus.select(".fa-thumbs-up").trimText("0") - // val mangaViews = trimElementText(mangaStatus.select(".fa-smile-o"), "0") - val mangaComments = mangaStatus.select(".fa-comment").trimText("0") - val mangaBookmarks = info.select(".fa-bookmark").trimText("0") - val mangaChaptersLike = mangaElementsSum(document.select(".title i.fa.fa-thumbs-up > span")) - val mangaChaptersComments = mangaElementsSum(document.select(".title i.fa.fa-comment > span")) - - val genres = mutableListOf() - document.select("div.left-info div.information > .manga-tags > a.tag").forEach { - genres.add(it.text()) - } - - val manga = SManga.create() - manga.title = info.select("div.red.title").html().trim() - // They using background-image style tag for cover. extract url from style attribute. - manga.thumbnail_url = urlFinder(thumbnailElement.attr("style")) - manga.description = - "\uD83D\uDCDD: $publishTypeText\n" + - "👍: $mangaLike ($mangaChaptersLike)\n" + - // "\uD83D\uDD0D: $mangaViews\n" + - "\uD83D\uDCAC: $mangaComments ($mangaChaptersComments)\n" + - "\uD83D\uDD16: $mangaBookmarks" - manga.author = authorText - manga.genre = genres.joinToString(", ") - manga.status = parseStatus(publishTypeText) - return manga - } - - private fun parseStatus(status: String) = when (status.trim()) { - "주간", "격주", "월간", "격월/비정기", "단행본" -> SManga.ONGOING - "단편", "완결" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - private fun mangaElementsSum(element: Elements?): String { - if (element.isNullOrEmpty()) return "0" - return try { - String.format( - "%,d", - element.map { - it.text().toInt() - }.sum() - ) - } catch (_: Exception) { - "0" - } - } - - override fun chapterListSelector() = "div.manga-detail-list > div.chapter-list > .slot" - - override fun chapterFromElement(element: Element): SChapter { - val linkElement = element.select("a") - val rawName = linkElement.select("div.title").last() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(linkElement.attr("href")) - chapter.chapter_number = parseChapterNumber(rawName.text()) - chapter.name = rawName.html().substringBefore(" calendar.get(Calendar.MONTH) + 1) // Before December now, // and Retrieved month is December == 2018. - currYear - 1 else currYear - SimpleDateFormat("yyyy-MM-dd").parse("$year-$date")?.time ?: 0L - } catch (e: Exception) { - e.printStackTrace() - 0 - } - } - - // They are using full url in every links. - // There's possibility to using another domain for serve manga(s). Like marumaru. - // override fun pageListRequest(chapter: SChapter) = GET(chapter.url, headers) - override fun pageListParse(document: Document): List { - val pages = mutableListOf() - - try { - val element = document.toString() - val cdnHandler = MMCDNUrlHandler(element) - - val imageUrl = element.substringBetween("var img_list = [", "];") - val imageUrls = cdnHandler.replace(JSONArray("[$imageUrl]")) - - val imageUrl1 = element.substringBetween("var img_list1 = [", "];") - val imageUrls1 = cdnHandler.replace(JSONArray("[$imageUrl1]")) - - val decoder = ImageDecoder(element) - - (imageUrls.indices) - .map { - imageUrls[it] + try { - "!!${imageUrls1[it]}" - } catch (_: Exception) { - "" - } - } - .forEach { pages.add(Page(pages.size, decoder.request(it), it.substringBefore("!!"))) } - } catch (e: Exception) { - e.printStackTrace() - } - - return pages - } - - override fun imageRequest(page: Page): Request { - val requestHeaders = try { - val data = page.url.substringAfter("??", "") - val secondUrl = page.url.substringAfter("!!", "").substringBefore("??") - - val builder = headers.newBuilder()!! - - if (data.isNotBlank()) { - builder.add("ImageDecodeRequest", data) - } - - if (secondUrl.isNotBlank()) { - builder.add("SecondUrlToRequest", secondUrl) - } - - builder.build()!! - } catch (_: Exception) { - headers - }.newBuilder()!!.add("ImageRequest", "1").build()!! - - return GET(page.imageUrl!!, requestHeaders) - } - - // Latest not supported - override fun latestUpdatesSelector() = ".post-row > div.media.post-list" - - override fun latestUpdatesFromElement(element: Element): SManga { - val linkElement = element.select("a.btn-primary") - val rawTitle = element.select(".post-subject > a").first().ownText() - - // TODO: Make Clear Regex. - val chapterRegex = Regex("""((?:\s+)(?:(?:(?:[0-9]+권)?(?:[0-9]+부)?(?:[0-9]*?시즌[0-9]*?)?)?(?:\s*)(?:(?:[0-9]+)(?:[-.](?:[0-9]+))?)?(?:\s*[~,]\s*)?(?:[0-9]+)(?:[-.](?:[0-9]+))?)(?:화))""") - val title = rawTitle.trim().replace(chapterRegex, "") - // val regexSpecialChapter = Regex("(부록|단편|외전|.+편)") - // val lastTitleWord = excludeChapterTitle.split(" ").last() - // val title = excludeChapterTitle.replace(lastTitleWord, lastTitleWord.replace(regexSpecialChapter, "")) - - val manga = SManga.create() - manga.url = linkElement.attr("href") - manga.title = title - manga.thumbnail_url = element.select(".img-item > img").attr("src") - manga.initialized = false - return manga - } - - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/bbs/board.php?bo_table=manga" + if (page > 1) "&page=$page" else "") - override fun latestUpdatesNextPageSelector() = "ul.pagination > li:not(.disabled)" - - // We are able to get the image URL directly from the page list - override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("This method should not be called!") - - private fun urlFinder(style: String): String { - // val regex = Regex("(https?:)?//[-a-zA-Z0-9@:%._\\\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\\\+.~#?&/=]*)") - // return regex.find(style)!!.value - return style.substringAfter("background-image:url(").substringBefore(")") - } - - private fun Elements.trimText(fallback: String = ""): String { - return this.text()?.trim()?.takeUnless { it.isBlank() } ?: fallback - } - - private val preferences: SharedPreferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { - val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { - key = BASE_URL_PREF_TITLE - title = BASE_URL_PREF_TITLE - summary = BASE_URL_PREF_SUMMARY - this.setDefaultValue(defaultBaseUrl) - dialogTitle = BASE_URL_PREF_TITLE - dialogMessage = "Default: $defaultBaseUrl" - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putString(BASE_URL_PREF, newValue as String).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - val autoFetchUrlPref = androidx.preference.CheckBoxPreference(screen.context).apply { - key = AUTOFETCH_URL_PREF_TITLE - title = AUTOFETCH_URL_PREF_TITLE - summary = AUTOFETCH_URL_PREF_SUMMARY - this.setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putBoolean(AUTOFETCH_URL_PREF, newValue as Boolean).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - val latestExperimentPref = androidx.preference.CheckBoxPreference(screen.context).apply { - key = EXPERIMENTAL_LATEST_PREF_TITLE - title = EXPERIMENTAL_LATEST_PREF_TITLE - summary = EXPERIMENTAL_LATEST_PREF_SUMMARY - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putBoolean(EXPERIMENTAL_LATEST_PREF, newValue as Boolean).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - screen.addPreference(baseUrlPref) - screen.addPreference(autoFetchUrlPref) - screen.addPreference(latestExperimentPref) - } - - override fun setupPreferenceScreen(screen: PreferenceScreen) { - val baseUrlPref = EditTextPreference(screen.context).apply { - key = BASE_URL_PREF_TITLE - title = BASE_URL_PREF_TITLE - summary = BASE_URL_PREF_SUMMARY - this.setDefaultValue(defaultBaseUrl) - dialogTitle = BASE_URL_PREF_TITLE - dialogMessage = "Default: $defaultBaseUrl" - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putString(BASE_URL_PREF, newValue as String).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - val autoFetchUrlPref = CheckBoxPreference(screen.context).apply { - key = AUTOFETCH_URL_PREF_TITLE - title = AUTOFETCH_URL_PREF_TITLE - summary = AUTOFETCH_URL_PREF_SUMMARY - this.setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putBoolean(AUTOFETCH_URL_PREF, newValue as Boolean).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - val latestExperimentPref = CheckBoxPreference(screen.context).apply { - key = EXPERIMENTAL_LATEST_PREF_TITLE - title = EXPERIMENTAL_LATEST_PREF_TITLE - summary = EXPERIMENTAL_LATEST_PREF_SUMMARY - - setOnPreferenceChangeListener { _, newValue -> - try { - val res = preferences.edit().putBoolean(EXPERIMENTAL_LATEST_PREF, newValue as Boolean).commit() - Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() - res - } catch (e: Exception) { - e.printStackTrace() - false - } - } - } - - screen.addPreference(baseUrlPref) - screen.addPreference(autoFetchUrlPref) - screen.addPreference(latestExperimentPref) - } - - private fun getCurrentBaseUrl(): String { - val prefBaseUrl = getPrefBaseUrl() - if (!preferences.getBoolean(AUTOFETCH_URL_PREF, false)) { - return prefBaseUrl - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - try { - @TargetApi(Build.VERSION_CODES.O) - class CallbackFuture : CompletableFuture(), Callback { - override fun onResponse(call: Call?, response: Response?) { - super.complete(response) - } - - override fun onFailure(call: Call?, e: IOException?) { - super.completeExceptionally(e) - } - } - - val request: Request = Request.Builder().get() - // .url("https://mnmnmnmnm.xyz/") - .url("http://52.74.159.59") - .build() - - val future = CallbackFuture() - network.client - // .newBuilder() - // .addInterceptor(DDOSGuardInterceptor()) - // .build()!! - .newCall(request).enqueue(future) - - val response = future.get()!! - return "https://${response.request().url().host()}" - // val code = response.body().toString().substringBetween("manamoa", ".net") - // return "https://manamoa$code.net" - } catch (e: Exception) { - e.printStackTrace() - return prefBaseUrl - } - } else { - return prefBaseUrl - } - } - - private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!! - private fun getExperimentLatest(): Boolean = preferences.getBoolean(EXPERIMENTAL_LATEST_PREF, false) - - override fun getFilterList() = getFilters() - - companion object { - // Setting: Override BaseUrl - private const val BASE_URL_PREF_TITLE = "Override BaseUrl" - private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_NAME}" - private const val BASE_URL_PREF_SUMMARY = "For temporary uses. Update extension will erase this setting." - // Setting: Fetch Domain - private const val AUTOFETCH_URL_PREF_TITLE = "Automatically fetch new domain" - private const val AUTOFETCH_URL_PREF = "autoFetchNewUrl" - private const val AUTOFETCH_URL_PREF_SUMMARY = - "Experimental, May cause Tachiyomi *very* unstable.\n" + - "Requires Android Oreo or newer." - - // Setting: Experimental Latest Fetcher - private const val EXPERIMENTAL_LATEST_PREF_TITLE = "Enable Latest (Experimental)" - private const val EXPERIMENTAL_LATEST_PREF = "fetchLatestExperiment" - private const val EXPERIMENTAL_LATEST_PREF_SUMMARY = "Fetch Latest Manga using Latest Chapters. May has duplicates or invalid name." - - private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." - - // Image Decoder - internal const val V1_CX = 5 - internal const val V1_CY = 5 - - // Url Handler - internal const val MINIMUM_IMAGE_SIZE = 10000 - - // Activity Url Handler - const val PREFIX_ID_SEARCH = "id:" - } -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoaUrlActivity.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoaUrlActivity.kt deleted file mode 100644 index b7b354667..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/ManaMoaUrlActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.util.Log -import kotlin.system.exitProcess - -class ManaMoaUrlActivity : Activity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val titleid = intent?.data?.getQueryParameter("manga_id") - if (titleid != null && titleid.toInt() > 1) { - val mainIntent = Intent().apply { - action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${ManaMoa.PREFIX_ID_SEARCH}$titleid") - putExtra("filter", packageName) - } - - try { - startActivity(mainIntent) - } catch (e: ActivityNotFoundException) { - Log.e("ManaMoaUrlActivity", e.toString()) - } - } else { - Log.e("ManaMoaUrlActivity", "could not parse uri from intent $intent") - } - - finish() - exitProcess(0) - } -} diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/Utils.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/Utils.kt deleted file mode 100644 index e86575c92..000000000 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/Utils.kt +++ /dev/null @@ -1,5 +0,0 @@ -package eu.kanade.tachiyomi.extension.ko.mangashowme - -internal fun String.substringBetween(prefix: String, suffix: String): String = { - this.substringAfter(prefix).substringBefore(suffix) -}() diff --git a/src/ko/newtoki/build.gradle b/src/ko/newtoki/build.gradle index 2eb4d5f4f..0b3eb6c93 100644 --- a/src/ko/newtoki/build.gradle +++ b/src/ko/newtoki/build.gradle @@ -2,10 +2,10 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' ext { - extName = 'NewToki' + extName = 'NewToki / ManaToki(ManaMoa)' pkgNameSuffix = 'ko.newtoki' extClass = '.NewTokiFactory' - extVersionCode = 15 + extVersionCode = 16 libVersion = '1.2' } diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt index ea85757c6..289b86f80 100644 --- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt +++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.extension.ko.newtoki import android.annotation.SuppressLint import android.app.Application import android.content.SharedPreferences +import android.support.v7.preference.CheckBoxPreference import android.support.v7.preference.EditTextPreference import android.support.v7.preference.PreferenceScreen import android.widget.Toast @@ -20,11 +21,14 @@ import eu.kanade.tachiyomi.util.asJsoup import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response +import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.net.URI +import java.net.URISyntaxException import java.text.SimpleDateFormat import java.util.Calendar @@ -82,14 +86,35 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String client.newCall(GET("$baseUrl$urlPath")) .asObservableSuccess() .map { response -> - // TODO: Fix the error which caused by shares id field with detail and each chapters in the source - val details = mangaDetailsParse(response.asJsoup()) - details.url = urlPath - MangasPage(listOf(details), false) + // the id is matches any of 'post' from their CMS board. + // Includes Manga Details Page, Chapters, Comments, and etcs... + actualMangaParseById(urlPath, response) } } else super.fetchSearchManga(page, query, filters) } + private fun actualMangaParseById(urlPath: String, response: Response): MangasPage { + val document = response.asJsoup() + + // Only exists on detail page. + val firstChapterButton = document.select("tr > th > button.btn-blue").first() + // only exists on chapter with proper manga detail page. + val fullListButton = document.select(".comic-navbar .toon-nav a").last() + + val list: List = if (firstChapterButton?.text()?.contains("첫회보기") ?: false) { // Check this page is detail page + val details = mangaDetailsParse(document) + details.url = urlPath + listOf(details) + } else if (fullListButton?.text()?.contains("전체목록") ?: false) { // Check this page is chapter page + val url = fullListButton.attr("abs:href") + val details = mangaDetailsParse(client.newCall(GET(url)).execute()) + details.url = getUrlPath(url) + listOf(details) + } else emptyList() + + return MangasPage(list, false) + } + override fun mangaDetailsParse(document: Document): SManga { val info = document.select("div.view-title > .view-content").first() val title = document.select("div.view-content > span > b").text() @@ -181,11 +206,18 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String } } + private val htmlDataRegex = Regex("""html_data\+='([^']+)'""") + override fun pageListParse(document: Document): List { - //
-
- optional
-
- optional

- - return document.select("article > div div img") - .filterNot { !it.hasAttr("data-original") || it.attr("data-original").contains("blank.gif") } - .mapIndexed { i, img -> Page(i, "", img.attr("abs:data-original")) } + val script = document.select("script:containsData(html_data)").firstOrNull()?.data() ?: throw Exception("script not found") + + return htmlDataRegex.findAll(script).map { it.groupValues[1] } + .asIterable() + .flatMap { it.split(".") } + .joinToString("") { it.toIntOrNull(16)?.toChar()?.toString() ?: "" } + .let { Jsoup.parse(it) } + .select("img[alt]") + .mapIndexed { i, img -> Page(i, "", if (img.hasAttr("abs:data-original")) img.attr("abs:data-original") else img.attr("abs:content")) } } override fun latestUpdatesSelector() = popularMangaSelector() @@ -224,7 +256,27 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String } } + val latestExperimentPref = androidx.preference.CheckBoxPreference(screen.context).apply { + key = EXPERIMENTAL_LATEST_PREF_TITLE + title = EXPERIMENTAL_LATEST_PREF_TITLE + summary = EXPERIMENTAL_LATEST_PREF_SUMMARY + + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putBoolean(EXPERIMENTAL_LATEST_PREF, newValue as Boolean).commit() + Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + } + screen.addPreference(baseUrlPref) + if (name == "ManaToki") { + screen.addPreference(latestExperimentPref) + } } override fun setupPreferenceScreen(screen: PreferenceScreen) { @@ -248,10 +300,39 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String } } + val latestExperimentPref = CheckBoxPreference(screen.context).apply { + key = EXPERIMENTAL_LATEST_PREF_TITLE + title = EXPERIMENTAL_LATEST_PREF_TITLE + summary = EXPERIMENTAL_LATEST_PREF_SUMMARY + + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putBoolean(EXPERIMENTAL_LATEST_PREF, newValue as Boolean).commit() + Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + } + screen.addPreference(baseUrlPref) + if (name == "ManaToki") { + screen.addPreference(latestExperimentPref) + } + } + + protected fun getUrlPath(orig: String): String { + return try { + URI(orig).path + } catch (e: URISyntaxException) { + orig + } } private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!! + protected fun getExperimentLatest(): Boolean = preferences.getBoolean(EXPERIMENTAL_LATEST_PREF, false) companion object { private const val BASE_URL_PREF_TITLE = "Override BaseUrl" @@ -259,6 +340,11 @@ open class NewToki(override val name: String, private val defaultBaseUrl: String private const val BASE_URL_PREF_SUMMARY = "For temporary uses. Update extension will erase this setting." private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." + // Setting: Experimental Latest Fetcher + private const val EXPERIMENTAL_LATEST_PREF_TITLE = "Enable Latest (Experimental)" + private const val EXPERIMENTAL_LATEST_PREF = "fetchLatestExperiment" + private const val EXPERIMENTAL_LATEST_PREF_SUMMARY = "Fetch Latest Manga using Latest Chapters. May has duplicates, Also requires LOTS OF requests (70 per page)" + const val PREFIX_ID_SEARCH = "id:" } } diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt index 9e1d03fcb..e09c7d36a 100644 --- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt +++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewTokiFactory.kt @@ -5,15 +5,17 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.CacheControl import okhttp3.HttpUrl import okhttp3.Request -import org.jsoup.Jsoup -import org.jsoup.nodes.Document +import okhttp3.Response import java.security.MessageDigest import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.concurrent.TimeUnit.DAYS /** * Source changes domain names every few days (e.g. newtoki31.net to newtoki32.net) @@ -35,6 +37,32 @@ class NewTokiFactory : SourceFactory { class NewTokiManga : NewToki("ManaToki", "https://manatoki$domainNumber.net", "comic") { // / ! DO NOT CHANGE THIS ! Only the site name changed from newtoki. override val id by lazy { generateSourceId("NewToki", lang, versionId) } + override val supportsLatest by lazy { getExperimentLatest() } + + // this does 70 request per page.... + override fun latestUpdatesSelector() = ".media.post-list p > a" + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/page/update?hid=update&page=$page") + override fun latestUpdatesNextPageSelector() = "nav.pg_wrap > .pg > strong" + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + + // given cache time to prevent repeated lots of request in latest. + val cacheControl = CacheControl.Builder().maxAge(14, DAYS).maxStale(14, DAYS).build() + val mangas = document.select(latestUpdatesSelector()).map { element -> + val url = element.attr("abs:href") + val manga = mangaDetailsParse(client.newCall(GET(url, cache = cacheControl)).execute()) + manga.url = getUrlPath(url) + manga + } + + val hasNextPage = try { + !document.select(popularMangaNextPageSelector()).text().contains("10") + } catch (_: Exception) { + false + } + + return MangasPage(mangas, hasNextPage) + } override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val url = HttpUrl.parse("$baseUrl/comic" + (if (page > 1) "/p$page" else ""))!!.newBuilder() @@ -151,6 +179,7 @@ class NewTokiManga : NewToki("ManaToki", "https://manatoki$domainNumber.net", "c ) override fun getFilterList() = FilterList( + Filter.Header("Filter can't use with query"), SearchPublishTypeList(), SearchJaumTypeList(), SearchGenreTypeList() @@ -165,7 +194,7 @@ class NewTokiWebtoon : NewToki("NewToki", "https://newtoki$domainNumber.com", "w val url = HttpUrl.parse("$baseUrl/webtoon" + (if (page > 1) "/p$page" else ""))!!.newBuilder() filters.forEach { filter -> when (filter) { - is SearchTypeList -> { + is SearchTargetTypeList -> { if (filter.state > 0) { url.addQueryParameter("toon", filter.values[filter.state]) } @@ -173,31 +202,103 @@ class NewTokiWebtoon : NewToki("NewToki", "https://newtoki$domainNumber.com", "w } } + // Imcompatible with Other Search Parametor if (!query.isBlank()) { url.addQueryParameter("stx", query) + } else { + filters.forEach { filter -> + when (filter) { + is SearchYoilTypeList -> { + if (filter.state > 0) { + url.addQueryParameter("yoil", filter.values[filter.state]) + } + } + + is SearchJaumTypeList -> { + if (filter.state > 0) { + url.addQueryParameter("jaum", filter.values[filter.state]) + } + } + + is SearchGenreTypeList -> { + if (filter.state > 0) { + url.addQueryParameter("tag", filter.values[filter.state]) + } + } + } + } } return GET(url.toString()) } - private val htmlDataRegex = Regex("""html_data\+='([^']+)'""") + private class SearchTargetTypeList : Filter.Select("Type", arrayOf("전체", "일반웹툰", "성인웹툰", "BL/GL", "완결웹툰")) - override fun pageListParse(document: Document): List { - val script = document.select("script:containsData(html_data)").firstOrNull()?.data() ?: throw Exception("script not found") + // [...document.querySelectorAll("form.form td")[1].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') + private class SearchYoilTypeList : Filter.Select( + "Day of the Week", + arrayOf( + "전체", + "월", + "화", + "수", + "목", + "금", + "토", + "일", + "열흘" + ) + ) - return htmlDataRegex.findAll(script).map { it.groupValues[1] } - .asIterable() - .flatMap { it.split(".") } - .joinToString("") { it.toIntOrNull(16)?.toChar()?.toString() ?: "" } - .let { Jsoup.parse(it) } - .select("img[alt]") - .mapIndexed { i, img -> Page(i, "", img.attr("abs:data-original")) } - } - - private class SearchTypeList : Filter.Select("Type", arrayOf("전체", "일반웹툰", "성인웹툰", "BL/GL", "완결웹툰")) + // [...document.querySelectorAll("form.form td")[2].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') + private class SearchJaumTypeList : Filter.Select( + "Jaum", + arrayOf( + "전체", + "ㄱ", + "ㄴ", + "ㄷ", + "ㄹ", + "ㅁ", + "ㅂ", + "ㅅ", + "ㅇ", + "ㅈ", + "ㅊ", + "ㅋ", + "ㅌ", + "ㅍ", + "ㅎ", + "a-z", + "0-9" + ) + ) + // [...document.querySelectorAll("form.form td")[3].querySelectorAll("a")].map((el, i) => `"${el.innerText.trim()}"`).join(',\n') + private class SearchGenreTypeList : Filter.Select( + "Genre", + arrayOf( + "전체", + "판타지", + "액션", + "개그", + "미스터리", + "로맨스", + "드라마", + "무협", + "스포츠", + "일상", + "학원", + "성인" + ) + ) override fun getFilterList() = FilterList( - SearchTypeList() + SearchTargetTypeList(), + Filter.Separator(), + Filter.Header("Under 3 Filters can't use with query"), + SearchYoilTypeList(), + SearchJaumTypeList(), + SearchGenreTypeList() ) }