diff --git a/src/all/paprika/build.gradle b/src/all/paprika/build.gradle index f3ebc1ee7..d29f828ce 100644 --- a/src/all/paprika/build.gradle +++ b/src/all/paprika/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Paprika' pkgNameSuffix = 'all.paprika' extClass = '.PaprikaFactory' - extVersionCode = 1 + extVersionCode = 2 libVersion = '1.2' } diff --git a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt index 7ee28a371..f89313f10 100644 --- a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt +++ b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/Paprika.kt @@ -7,6 +7,7 @@ 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 java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale @@ -104,7 +105,7 @@ abstract class Paprika( } } - private fun String?.toStatus() = when { + fun String?.toStatus() = when { this == null -> SManga.UNKNOWN this.contains("Ongoing", ignoreCase = true) -> SManga.ONGOING this.contains("Completed", ignoreCase = true) -> SManga.COMPLETED @@ -119,15 +120,22 @@ abstract class Paprika( */ override fun chapterListParse(response: Response): List { - return super.chapterListParse(response).distinctBy { it.url } + val document = response.asJsoup() + val mangaTitle = document.select("div.manga-detail h1").text() + return document.select(chapterListSelector()).map { chapterFromElement(it, mangaTitle) }.distinctBy { it.url } } override fun chapterListSelector() = "div.total-chapter:has(h2) li" + // never called override fun chapterFromElement(element: Element): SChapter { + throw Exception("unreachable code was reached!") + } + + open fun chapterFromElement(element: Element, mangaTitle: String): SChapter { return SChapter.create().apply { element.select("a").let { - name = it.text() + name = it.text().substringAfter("$mangaTitle ") setUrlWithoutDomain(it.attr("href")) } date_upload = element.select("div.small").firstOrNull()?.text().toDate() @@ -136,7 +144,7 @@ abstract class Paprika( private val currentYear by lazy { Calendar.getInstance(Locale.US)[1].toString().takeLast(2) } - private fun String?.toDate(): Long { + fun String?.toDate(): Long { this ?: return 0L return try { when { @@ -181,7 +189,7 @@ abstract class Paprika( GenreFilter(getGenreList()) ) - private class OrderFilter(vals: Array>) : UriPartFilter("Category", vals) + class OrderFilter(vals: Array>) : UriPartFilter("Category", vals) private fun getOrderList() = arrayOf( Pair("Views", "2"), @@ -189,7 +197,7 @@ abstract class Paprika( Pair("A-Z", "1") ) - private class GenreFilter(vals: Array>) : UriPartFilter("Category", vals) + class GenreFilter(vals: Array>) : UriPartFilter("Category", vals) private fun getGenreList() = arrayOf( Pair("4 koma", "4-koma"), diff --git a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaAlt.kt b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaAlt.kt new file mode 100644 index 000000000..885a47a88 --- /dev/null +++ b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaAlt.kt @@ -0,0 +1,89 @@ +package eu.kanade.tachiyomi.extension.all.paprika + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element + +abstract class PaprikaAlt( + override val name: String, + override val baseUrl: String, + override val lang: String +) : Paprika(name, baseUrl, lang) { + override fun popularMangaSelector() = "div.anipost" + + override fun popularMangaFromElement(element: Element): SManga { + //Log.d("Paprika", "processing popular element") + return SManga.create().apply { + element.select("a:has(h2)").let { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + //Log.d("Paprika", "manga url: $url") + //Log.d("Paprika", "manga title: $title") + } + thumbnail_url = element.select("img").attr("abs:src") + //Log.d("Paprika", "manga thumb: $thumbnail_url") + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + return if (query.isNotBlank()) { + GET("$baseUrl/search?s=$query&post_type=manga&page=$page") + } else { + val url = HttpUrl.parse("$baseUrl/genres/")!!.newBuilder() + filters.forEach { filter -> + when (filter) { + is GenreFilter -> url.addPathSegment(filter.toUriPart()) + is OrderFilter -> url.addQueryParameter("orderby", filter.toUriPart()) + } + } + url.addQueryParameter("page", page.toString()) + GET(url.toString(), headers) + } + } + + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + title = document.select(".animeinfo .rm h1")[0].text() + thumbnail_url = document.select(".animeinfo .lm img").attr("abs:src") + document.select(".listinfo li").forEach { + it.text().apply { + when { + this.startsWith("Author") -> author = this.substringAfter(":").trim() + this.startsWith("Artist") -> artist = this.substringAfter(":").trim() + this.startsWith("Genre") -> genre = this.substringAfter(":").trim().replace(";", ",") + this.startsWith("Status") -> status = this.substringAfter(":").trim().toStatus() + } + } + } + description = document.select("#noidungm").joinToString("\n") { it.text() } + + //Log.d("Paprika", "mangaDetials") + } + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val mangaTitle = document.select(".animeinfo .rm h1")[0].text() + return document.select(chapterListSelector()).map { chapterFromElement(it, mangaTitle) }.distinctBy { it.url } + } + + override fun chapterListSelector() = ".animeinfo .rm .cl li" + + // changing the signature to pass the manga title in order to trim the title from chapter titles + override fun chapterFromElement(element: Element, mangaTitle: String): SChapter { + return SChapter.create().apply { + element.select(".leftoff").let { + name = it.text().substringAfter("$mangaTitle ") + setUrlWithoutDomain(it.select("a").attr("href")) + } + date_upload = element.select(".rightoff").firstOrNull()?.text().toDate() + } + } +} diff --git a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaFactory.kt b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaFactory.kt index 5706a5ac3..4ee1febf5 100644 --- a/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaFactory.kt +++ b/src/all/paprika/src/eu/kanade/tachiyomi/extension/all/paprika/PaprikaFactory.kt @@ -6,9 +6,13 @@ import eu.kanade.tachiyomi.source.SourceFactory class PaprikaFactory : SourceFactory { override fun createSources(): List = listOf( MangazukiXyz(), - MangaTensei() + MangaTensei(), + MangaNelo(), + MangaWindowClub() ) } class MangazukiXyz : Paprika("MangaZuki.xyz", "https://ir2me.com", "en") class MangaTensei : Paprika("MangaTensei", "https://www.mangatensei.com", "en") +class MangaNelo : Paprika("MangaNelo", "http://manganelos.com", "en") +class MangaWindowClub : PaprikaAlt("MangaWindow.club", "https://mangawindow.club", "en")