diff --git a/src/en/mangafree/build.gradle b/src/en/mangafree/build.gradle deleted file mode 100644 index 7cf490583..000000000 --- a/src/en/mangafree/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - appName = 'Tachiyomi: Mangafree' - pkgNameSuffix = 'en.mangafree' - extClass = '.Mangafree' - extVersionCode = 4 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/mangafree/res/mipmap-hdpi/ic_launcher.png b/src/en/mangafree/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 77a6a5eb0..000000000 Binary files a/src/en/mangafree/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafree/res/mipmap-mdpi/ic_launcher.png b/src/en/mangafree/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index f98f75dcf..000000000 Binary files a/src/en/mangafree/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafree/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangafree/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 8473cb1b8..000000000 Binary files a/src/en/mangafree/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafree/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangafree/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index f2a204b0a..000000000 Binary files a/src/en/mangafree/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafree/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangafree/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 429bea6f3..000000000 Binary files a/src/en/mangafree/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangafree/res/web_hi_res_512.png b/src/en/mangafree/res/web_hi_res_512.png deleted file mode 100644 index 9950b9f18..000000000 Binary files a/src/en/mangafree/res/web_hi_res_512.png and /dev/null differ diff --git a/src/en/mangafree/src/eu/kanade/tachiyomi/extension/en/mangafree/Mangafree.kt b/src/en/mangafree/src/eu/kanade/tachiyomi/extension/en/mangafree/Mangafree.kt deleted file mode 100644 index 179cdb653..000000000 --- a/src/en/mangafree/src/eu/kanade/tachiyomi/extension/en/mangafree/Mangafree.kt +++ /dev/null @@ -1,161 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangafree - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element - -class Mangafree : ParsedHttpSource() { - - override val name = "Mangafree" - - override val baseUrl = "http://mangafree.online" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient - - override fun popularMangaSelector() = "div.truyen-list > div.list-truyen-item-wrap" - - override fun popularMangaRequest(page: Int): Request { - - return GET("$baseUrl/hotmanga/$page") - } - - override fun latestUpdatesSelector() = popularMangaSelector() - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/latest/$page") - } - - override fun latestUpdatesParse(response: Response): MangasPage { - val document = response.asJsoup() - - val mangas = document.select(latestUpdatesSelector()).map { element -> - latestUpdatesFromElement(element) - } - - return MangasPage(mangas, hasNextPage(document)) - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("h3 a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - manga.thumbnail_url = element.select("img").first().attr("src") - return manga - } - - override fun popularMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - - val mangas = document.select(popularMangaSelector()).map { element -> - popularMangaFromElement(element) - } - - return MangasPage(mangas, hasNextPage(document)) - } - - override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = throw UnsupportedOperationException("Not used") - - override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException("Not used") - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - //site ignore everything after the first word - val substringBefore = query.substringBefore(" ") - val url = "$baseUrl/search/$substringBefore/$page" - return GET(url, headers) - } - - override fun searchMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - - - val mangas = document.select(searchMangaSelector()).map { element -> - searchMangaFromElement(element) - } - - return MangasPage(mangas, hasNextPage(document)) - } - - private fun hasNextPage(document: Document): Boolean { - val pagiNag = document.getElementsByTag("script").map { - it.data().trim() - }.find { - it.contains("//<![CDATA[") && it.contains("setPagiNation(") - } ?: throw IllegalArgumentException("Cannot find pages") - val list = pagiNag.substringAfter("setPagiNation(").substringBefore(",'").split(",") - return list[0] != list[1] - } - - - override fun searchMangaSelector() = popularMangaSelector() - - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not used") - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.manga-info-top").first() - - - val manga = SManga.create() - manga.title = infoElement.select("h1").first().text() - manga.author = infoElement.select("div.manga-info-top li a#ContentPlaceHolderLeft_mA_Actor").text() - manga.status = parseStatus(infoElement.select("div.manga-info-top li span#ContentPlaceHolderLeft_span_status").text()) - - val genres = mutableListOf<String>() - infoElement.select("div.manga-info-top li p#ContentPlaceHolderLeft_mP_Kind a").forEach { it -> genres.add(it.text()) } - manga.genre = genres.joinToString() - manga.description = document.select("div#noidungm div#ContentPlaceHolderLeft_maincontent").text() - manga.thumbnail_url = document.select("div.manga-info-pic").first().select("img").first().attr("src") - return manga - } - - private fun parseStatus(status: String) = when { - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.chapter-list div.row" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - val url = urlElement.attr("href").replace("[","%255B").replace("]","%255D") - chapter.setUrlWithoutDomain(url) - chapter.name = urlElement.text() - return chapter - } - - - override fun pageListParse(document: Document): List<Page> { - - val pages = mutableListOf<Page>() - - document.select("div#vungdoc img")?.forEach { - pages.add(Page(pages.size, "", it.attr("src"))) - } - - return pages - } - - override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("No used") - - override fun getFilterList() = FilterList() - - -} diff --git a/src/en/mangakakalot/build.gradle b/src/en/mangakakalot/build.gradle deleted file mode 100644 index 4268b3a25..000000000 --- a/src/en/mangakakalot/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - appName = 'Tachiyomi: MangaKakalot' - pkgNameSuffix = 'en.mangakakalot' - extClass = '.Mangakakalot' - extVersionCode = 8 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/mangakakalot/res/mipmap-hdpi/ic_launcher.png b/src/en/mangakakalot/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 741fe9e0d..000000000 Binary files a/src/en/mangakakalot/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangakakalot/res/mipmap-mdpi/ic_launcher.png b/src/en/mangakakalot/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 16f30b5b8..000000000 Binary files a/src/en/mangakakalot/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangakakalot/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangakakalot/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index fd2b4a8e2..000000000 Binary files a/src/en/mangakakalot/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangakakalot/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangakakalot/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 5d3725e6d..000000000 Binary files a/src/en/mangakakalot/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangakakalot/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangakakalot/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index e367bfb53..000000000 Binary files a/src/en/mangakakalot/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/mangakakalot/res/web_hi_res_512.png b/src/en/mangakakalot/res/web_hi_res_512.png deleted file mode 100644 index 81fa2c31d..000000000 Binary files a/src/en/mangakakalot/res/web_hi_res_512.png and /dev/null differ diff --git a/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt b/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt deleted file mode 100644 index 293920336..000000000 --- a/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt +++ /dev/null @@ -1,293 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.mangakakalot - -import eu.kanade.tachiyomi.network.GET -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.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.HttpUrl -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale - -class Mangakakalot : ParsedHttpSource() { - - override val name = "Mangakakalot" - - override val baseUrl = "http://mangakakalot.com" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient - - override fun popularMangaSelector() = "div.truyen-list > div.list-truyen-item-wrap" - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/manga_list?type=topview&category=all&state=all&page=$page") - } - - override fun latestUpdatesSelector() = popularMangaSelector() - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/manga_list?type=latest&category=all&state=all&page=$page") - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("h3 a").first().let { - manga.url = it.attr("href") - manga.title = it.text() - } - manga.thumbnail_url = element.select("img").first().attr("src") - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a.page_select + a:not(.page_last)" - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/manga_list")!!.newBuilder() - url.addQueryParameter("page", page.toString()) - - filters.forEach { filter -> - when (filter) { - is SortFilter -> { - url.addQueryParameter("type", filter.toUriPart()) - } - is StatusFilter -> { - url.addQueryParameter("state", filter.toUriPart()) - } - is GenreFilter -> { - url.addQueryParameter("category", filter.toUriPart()) - } - } - } - - return if (query.isNotBlank()) { - GET("$baseUrl/search/${normalizeSearchQuery(query)}?page=$page") - } else GET(url.build().toString(), headers) - } - - override fun searchMangaSelector() = ".panel_story_list .story_item" - - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaParse(response: Response): MangasPage { - val document = response.asJsoup() - val mangaSelector = if (document.select(searchMangaSelector()).isNotEmpty()) { - searchMangaSelector() - } else { - popularMangaSelector() - } - val mangas = document.select(mangaSelector).map { element -> - searchMangaFromElement(element) - } - val hasNextPage = searchMangaNextPageSelector().let { selector -> - document.select(selector).first() - } != null - return MangasPage(mangas, hasNextPage) - } - - override fun mangaDetailsRequest(manga: SManga): Request { - if (manga.url.startsWith("http")) { - return GET(manga.url, headers) - } - return super.mangaDetailsRequest(manga) - } - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.manga-info-top").first() - - val manga = SManga.create() - manga.title = infoElement.select("h1").first().text() - manga.author = infoElement.select("div.manga-info-top li").find { it.text().startsWith("Author") }?.text()?.substringAfter(") :") - val status = infoElement.select("div.manga-info-top li").find { it.text().startsWith("Status") }?.text()?.substringAfter("Status :") - manga.status = parseStatus(status) - - val genres = mutableListOf<String>() - infoElement.select("div.manga-info-top li").find { it.text().startsWith("Genres :") }?.select("a")?.forEach { genres.add(it.text()) } - manga.genre = genres.joinToString() - manga.description = document.select("div#noidungm").text() - manga.thumbnail_url = document.select("div.manga-info-pic").first().select("img").first().attr("src") - return manga - } - - private fun parseStatus(status: String?) = when { - status == null -> SManga.UNKNOWN - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListRequest(manga: SManga): Request { - if (manga.url.startsWith("http")) { - return GET(manga.url, headers) - } - return super.chapterListRequest(manga) - } - - override fun chapterListSelector() = "div.chapter-list div.row" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.url = urlElement.attr("href") - chapter.name = urlElement.text() - chapter.date_upload = parseChapterDate(element.select("span").last().text()) - return chapter - } - - private fun parseChapterDate(date: String): Long { - if ("ago" in date) { - val value = date.split(' ')[0].toInt() - - if ("min" in date) { - return Calendar.getInstance().apply { - add(Calendar.MINUTE, value * -1) - }.timeInMillis - } - - if ("hour" in date) { - return Calendar.getInstance().apply { - add(Calendar.HOUR_OF_DAY, value * -1) - }.timeInMillis - } - - if ("day" in date) { - return Calendar.getInstance().apply { - add(Calendar.DATE, value * -1) - }.timeInMillis - } - } - - try { - return SimpleDateFormat("MMM-dd-yy", Locale.ENGLISH).parse(date).time - } catch (e: ParseException) { - } - - return 0L - } - - override fun pageListRequest(chapter: SChapter): Request { - if (chapter.url.startsWith("http")) { - return GET(chapter.url, headers) - } - return super.pageListRequest(chapter) - } - - override fun pageListParse(document: Document): List<Page> { - val pages = mutableListOf<Page>() - - document.select("div#vungdoc img")?.forEach { - pages.add(Page(pages.size, "", it.attr("src"))) - } - - return pages - } - - override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("No used") - - // Based on change_alias JS function from website - private fun normalizeSearchQuery(query: String): String { - var str = query.toLowerCase() - str = str.replace("à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ".toRegex(), "a") - str = str.replace("è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ".toRegex(), "e") - str = str.replace("ì|í|ị|ỉ|ĩ".toRegex(), "i") - str = str.replace("ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ".toRegex(), "o") - str = str.replace("ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ".toRegex(), "u") - str = str.replace("ỳ|ý|ỵ|ỷ|ỹ".toRegex(), "y") - str = str.replace("đ".toRegex(), "d") - str = str.replace("""!|@|%|\^|\*|\(|\)|\+|=|<|>|\?|/|,|\.|:|;|'| |"|&|#|\[|]|~|-|$|_""".toRegex(), "_") - str = str.replace("_+_".toRegex(), "_") - str = str.replace("""^_+|_+$""".toRegex(), "") - return str - } - - override fun getFilterList() = FilterList( - Filter.Header("NOTE: Ignored if using text search!"), - Filter.Separator(), - SortFilter(), - StatusFilter(), - GenreFilter() - ) - - private class SortFilter : UriPartFilter("Sort", arrayOf( - Pair("latest", "Latest"), - Pair("newest", "Newest"), - Pair("topview", "Top read") - )) - - private class StatusFilter : UriPartFilter("Status", arrayOf( - Pair("all", "ALL"), - Pair("completed", "Completed"), - Pair("ongoing", "Ongoing"), - Pair("drop", "Dropped") - )) - - private class GenreFilter : UriPartFilter("Category", arrayOf( - Pair("all", "ALL"), - Pair("2", "Action"), - Pair("3", "Adult"), - Pair("4", "Adventure"), - Pair("6", "Comedy"), - Pair("7", "Cooking"), - Pair("9", "Doujinshi"), - Pair("10", "Drama"), - Pair("11", "Ecchi"), - Pair("12", "Fantasy"), - Pair("13", "Gender bender"), - Pair("14", "Harem"), - Pair("15", "Historical"), - Pair("16", "Horror"), - Pair("45", "Isekai"), - Pair("17", "Josei"), - Pair("44", "Manhua"), - Pair("43", "Manhwa"), - Pair("19", "Martial arts"), - Pair("20", "Mature"), - Pair("21", "Mecha"), - Pair("22", "Medical"), - Pair("24", "Mystery"), - Pair("25", "One shot"), - Pair("26", "Psychological"), - Pair("27", "Romance"), - Pair("28", "School life"), - Pair("29", "Sci fi"), - Pair("30", "Seinen"), - Pair("31", "Shoujo"), - Pair("32", "Shoujo ai"), - Pair("33", "Shounen"), - Pair("34", "Shounen ai"), - Pair("35", "Slice of life"), - Pair("36", "Smut"), - Pair("37", "Sports"), - Pair("38", "Supernatural"), - Pair("39", "Tragedy"), - Pair("40", "Webtoons"), - Pair("41", "Yaoi"), - Pair("42", "Yuri") - )) - - private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) : - Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) { - fun toUriPart() = vals[state].first - } -} diff --git a/src/en/manganelo/build.gradle b/src/en/manganelo/build.gradle deleted file mode 100644 index 101128dd3..000000000 --- a/src/en/manganelo/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - appName = 'Tachiyomi: MangaNelo' - pkgNameSuffix = 'en.manganelo' - extClass = '.Manganelo' - extVersionCode = 4 - libVersion = '1.2' -} - -apply from: "$rootDir/common.gradle" diff --git a/src/en/manganelo/res/mipmap-hdpi/ic_launcher.png b/src/en/manganelo/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 854665e81..000000000 Binary files a/src/en/manganelo/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manganelo/res/mipmap-mdpi/ic_launcher.png b/src/en/manganelo/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index eb9110b06..000000000 Binary files a/src/en/manganelo/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manganelo/res/mipmap-xhdpi/ic_launcher.png b/src/en/manganelo/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 0ad724d81..000000000 Binary files a/src/en/manganelo/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manganelo/res/mipmap-xxhdpi/ic_launcher.png b/src/en/manganelo/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 5317d4a75..000000000 Binary files a/src/en/manganelo/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manganelo/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/manganelo/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 0d84ac068..000000000 Binary files a/src/en/manganelo/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/manganelo/res/web_hi_res_512.png b/src/en/manganelo/res/web_hi_res_512.png deleted file mode 100644 index 34f7ee97d..000000000 Binary files a/src/en/manganelo/res/web_hi_res_512.png and /dev/null differ diff --git a/src/en/manganelo/src/eu/kanade/tachiyomi/extension/en/manganelo/Manganelo.kt b/src/en/manganelo/src/eu/kanade/tachiyomi/extension/en/manganelo/Manganelo.kt deleted file mode 100644 index 1c1425f85..000000000 --- a/src/en/manganelo/src/eu/kanade/tachiyomi/extension/en/manganelo/Manganelo.kt +++ /dev/null @@ -1,115 +0,0 @@ -package eu.kanade.tachiyomi.extension.en.manganelo - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* -import eu.kanade.tachiyomi.source.online.ParsedHttpSource -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element - -class Manganelo : ParsedHttpSource() { - - override val name = "Manganelo" - - override val baseUrl = "http://manganelo.com" - - override val lang = "en" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient - - override fun popularMangaSelector() = "div.truyen-list > div.list-truyen-item-wrap" - - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl/manga_list?type=topview&category=all&state=all&page=$page") - } - - override fun latestUpdatesSelector() = popularMangaSelector() - - override fun latestUpdatesRequest(page: Int): Request { - return GET("$baseUrl/manga_list?type=latest&category=all&state=all&page=$page") - } - - override fun popularMangaFromElement(element: Element): SManga { - val manga = SManga.create() - element.select("h3 a").first().let { - manga.setUrlWithoutDomain(it.attr("href")) - manga.title = it.text() - } - manga.thumbnail_url = element.select("img").first().attr("src") - return manga - } - - override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element) - - override fun popularMangaNextPageSelector() = "a.page_select + a:not(.page_last)" - - override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - // Site ignores everything after the first word - val substringBefore = query.replace(" ", "_").replace(",", "_").replace(":", "_") - val url = "$baseUrl/search/$substringBefore?page=$page" - return GET(url, headers) - } - - override fun searchMangaSelector() = ".panel_story_list .story_item" - - override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) - - override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() - - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select("div.manga-info-top").first() - - val manga = SManga.create() - manga.title = infoElement.select("h1").first().text() - manga.author = infoElement.select("div.manga-info-top li").find { it.text().startsWith("Author") }?.text()?.substringAfter(") :") - val status = infoElement.select("div.manga-info-top li").find { it.text().startsWith("Status") }?.text()?.substringAfter("Status :") - manga.status = parseStatus(status) - - val genres = mutableListOf<String>() - infoElement.select("div.manga-info-top li").find { it.text().startsWith("Genres :") }?.select("a")?.forEach { genres.add(it.text()) } - manga.genre = genres.joinToString() - manga.description = document.select("div#noidungm").text() - manga.thumbnail_url = document.select("div.manga-info-pic").first().select("img").first().attr("src") - return manga - } - - private fun parseStatus(status: String?) = when { - status == null -> SManga.UNKNOWN - status.contains("Ongoing") -> SManga.ONGOING - status.contains("Completed") -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - - override fun chapterListSelector() = "div.chapter-list div.row" - - override fun chapterFromElement(element: Element): SChapter { - val urlElement = element.select("a").first() - - val chapter = SChapter.create() - chapter.setUrlWithoutDomain(urlElement.attr("href")) - chapter.name = urlElement.text() - return chapter - } - - override fun pageListParse(document: Document): List<Page> { - val pages = mutableListOf<Page>() - - document.select("div#vungdoc img")?.forEach { - pages.add(Page(pages.size, "", it.attr("src"))) - } - - return pages - } - - override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("No used") - - override fun getFilterList() = FilterList() - -}