From da9fc95d4d40d39b8b8824284fcdf8716fac322c Mon Sep 17 00:00:00 2001 From: pavkazzz Date: Tue, 11 Sep 2018 16:55:57 +0300 Subject: [PATCH] Added new source com-x --- src/ru/comx/build.gradle | 13 ++ .../tachiyomi/extension/ru/comx/ComX.kt | 194 ++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 src/ru/comx/build.gradle create mode 100644 src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt diff --git a/src/ru/comx/build.gradle b/src/ru/comx/build.gradle new file mode 100644 index 000000000..3ed66fb5a --- /dev/null +++ b/src/ru/comx/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: ComX' + pkgNameSuffix = 'ru.comx' + extClass = '.ComX' + extVersionCode = 0 + extVersionSuffix = 0 + libVersion = '1.0' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt new file mode 100644 index 000000000..303a07c80 --- /dev/null +++ b/src/ru/comx/src/eu/kanade/tachiyomi/extension/ru/comx/ComX.kt @@ -0,0 +1,194 @@ +package eu.kanade.tachiyomi.extension.ru.comx + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.FilterList +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.FormBody +import okhttp3.Headers +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element + +class ComX : ParsedHttpSource() { + override val name = "Com-x" + + override val baseUrl = "https://com-x.life" + + override val lang = "ru" + + override val supportsLatest = true + + override fun popularMangaSelector() = "div.shortstory1" + + override fun latestUpdatesSelector() = "ul.last-comix li" + + override fun popularMangaRequest(page: Int): Request = + GET("$baseUrl/comix/page/$page/", headers) + + override fun latestUpdatesRequest(page: Int): Request = + GET(baseUrl, headers) + + override fun popularMangaFromElement(element: Element): SManga { + val manga = SManga.create() + manga.thumbnail_url = baseUrl + element.select("img").first().attr("src") + element.select("a").first().let { + manga.setUrlWithoutDomain(it.attr("href")) + manga.title = it.text() + } + return manga + } + + override fun latestUpdatesFromElement(element: Element): SManga { + val manga = SManga.create() + manga.thumbnail_url = baseUrl + element.select("img").first().attr("src") + element.select("a.comix-last-title").first().let { + manga.setUrlWithoutDomain(it.attr("href")) + manga.title = it.text() + } + return manga + } + + + override fun popularMangaNextPageSelector() = "div.nextprev:last-child" + + override fun latestUpdatesNextPageSelector(): Nothing? = null + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + return POST("$baseUrl/comix/", + body = FormBody.Builder() + .add("do", "search") + .add("story", query) + .add("subaction", "search") + .build(), + headers = headers + ) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + + // max 200 results + override fun searchMangaNextPageSelector(): Nothing? = null + + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select("div.maincont").first() + + val manga = SManga.create() + manga.author = infoElement.select("p:eq(2)").text().removePrefix("Издатель: ") + manga.genre = infoElement.select("p:eq(3)").text() + .removePrefix("Жанр: ") + + manga.status = parseStatus(infoElement.select("p:eq(4)").text() + .removePrefix("Статус: ")) + + val text = infoElement.select("*").text() + if (!text.contains("Добавить описание на комикс")) { + manga.description = text + .removeRange(0, text.indexOf("Отслеживать")) + .removeRange(text.indexOf("Читать комикс"), text.length) + } + + val src = infoElement.select("img").attr("src") + if (src.contains(baseUrl)) { + manga.thumbnail_url = src + } else { + manga.thumbnail_url = baseUrl + src + } + return manga + } + + private fun parseStatus(element: String): Int = when { + element.contains("Продолжается") -> SManga.ONGOING + element.contains("Завершён") || + element.contains("Лимитка") || + element.contains("Ван шот") || + element.contains("Графический роман") -> SManga.COMPLETED + + else -> SManga.UNKNOWN + } + + override fun chapterListSelector() = "li[id^=cmx-]" + + private fun chapterResponseParse(document: Document) : List { + return document.select(chapterListSelector()).map { chapterFromElement(it) } + } + + private fun chapterPageListParse(document: Document) : List { + return document.select("span[class=\"\"]").map { it -> it.text() } + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val id = response.request().url().toString().removePrefix("$baseUrl/").split('-')[0] + + val list = mutableListOf() + list += chapterResponseParse(document) + + val pages = chapterPageListParse(document).distinct() + + for (page in pages) { + val post = POST("$baseUrl/engine/mods/comix/listPages.php", + body = FormBody.Builder() + .add("newsid", id) + .add("page", page) + .build(), + headers = headers) + + list += chapterResponseParse(client.newCall(post).execute().asJsoup()) + } + + return list + } + + override fun chapterFromElement(element: Element): SChapter { + val urlElement = element.select("a").first() + val urlText = urlElement.text() + val chapter = SChapter.create() + chapter.name = urlText + chapter.setUrlWithoutDomain(urlElement.attr("href")) + chapter.date_upload = 0 + return chapter + } + + override fun pageListParse(response: Response): List { + val html = response.body()!!.string() + val beginTag = "comix_images=[" + val beginIndex = html.indexOf(beginTag) + val endTag = "], comix_link='" + val endIndex = html.indexOf(endTag, beginIndex) + val comixIndex = html.indexOf("', page=", endIndex) + + val link = html.substring(endIndex + endTag.length, comixIndex) + val urls: List = html.substring(beginIndex + beginTag.length, endIndex) + .split(',') + + + val pages = mutableListOf() + for (i in 0 until urls.size) { + pages.add(Page(i, "", link+(urls[i].removeSurrounding("'")))) + } + + return pages + } + + override fun pageListParse(document: Document): List { + throw Exception("Not used") + } + + override fun imageUrlParse(document: Document) = "" + + override fun imageRequest(page: Page): Request { + val imgHeader = Headers.Builder().apply { + add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") + add("Referer", baseUrl) + }.build() + return GET(page.imageUrl!!, imgHeader) + } +} \ No newline at end of file