package eu.kanade.tachiyomi.extension.all.asurascans import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SManga import org.jsoup.nodes.Document import java.text.SimpleDateFormat import java.util.Locale class AsuraScansFactory : SourceFactory { override fun createSources() = listOf( AsuraScansEn(), AsuraScansTr() ) } class AsuraScansEn : AsuraScans("https://www.asurascans.com", "en", SimpleDateFormat("MMM d, yyyy", Locale.US)) { override val mangaDetailsSelectorDescription = "div.desc p, div.entry-content p, div[itemprop=description]:not(:has(p))" override val pageSelector = "div.rdminimal > img, div.rdminimal > p > img" // Skip scriptPages override fun pageListParse(document: Document): List { return document.select(pageSelector) .filterNot { it.attr("src").isNullOrEmpty() } .mapIndexed { i, img -> Page(i, "", img.attr("src")) } } } class AsuraScansTr : AsuraScans("https://tr.asurascans.com", "tr", SimpleDateFormat("MMM d, yyyy", Locale("tr"))) { override fun mangaDetailsParse(document: Document): SManga { return SManga.create().apply { document.select("div.bigcontent").firstOrNull()?.let { infoElement -> status = parseStatus(infoElement.select(".imptdt:contains(Durum) i").firstOrNull()?.ownText()) infoElement.select(".fmed b:contains(Yazar)+span").firstOrNull()?.ownText().let { if (it.isNullOrBlank().not() && it != "N/A" && it != "-") { author = it } } infoElement.select(".fmed b:contains(Çizer)+span").firstOrNull()?.ownText().let { if (it.isNullOrBlank().not() && it != "N/A" && it != "-") { artist = it } } description = infoElement.select("div.desc p, div.entry-content p").joinToString("\n") { it.text() } thumbnail_url = infoElement.select("div.thumb img").imgAttr() val genres = infoElement.select(".mgen a") .map { element -> element.text().lowercase(Locale.ROOT) } .toMutableSet() // add series type(manga/manhwa/manhua/other) thinggy to genre document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let { if (it.isEmpty().not() && genres.contains(it).not()) { genres.add(it.lowercase(Locale.ROOT)) } } genre = genres.toList().map { it.capitalize(Locale.ROOT) }.joinToString(", ") // add alternative name to manga description document.select(altNameSelector).firstOrNull()?.ownText()?.let { if (it.isBlank().not() && it != "N/A" && it != "-") { description = when { description.isNullOrBlank() -> altName + it else -> description + "\n\n$altName" + it } } } } } } override val seriesTypeSelector = ".imptdt:contains(Tür) a" override val altName: String = "Alternatif isim: " override fun parseStatus(element: String?): Int = when { element == null -> SManga.UNKNOWN listOf("Devam Ediyor").any { it.contains(element, ignoreCase = true) } -> SManga.ONGOING listOf("Tamamlandı").any { it.contains(element, ignoreCase = true) } -> SManga.COMPLETED else -> SManga.UNKNOWN } }