* Asura Scans: attempt to find new url * bump * store slugMap in SharedPreference * use `MutableMap.getOrPut()` * use existing instance of json * fix no page on Asura Tr * Don't use rng slug to for search * retry ci * use dbSlug as key permaSlug could end up causing problems when a user migrates to update the url as the extension would still end up using the storedSlug from the Map instead of the more updated one from db. * attempt to make search better their search is really dogshit `player who returned 10000 years later` doesn't work while `player who returned 10 000 years later` works * suggested changes * remove initialized check in `fetchMangaDetails` ddos time * fix deep links * use updated slug for WebView * make sure random user-agent is applied
62 lines
2.4 KiB
Kotlin
62 lines
2.4 KiB
Kotlin
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 kotlinx.serialization.Serializable
|
||
import kotlinx.serialization.decodeFromString
|
||
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 seriesDescriptionSelector = "div.desc p, div.entry-content p, div[itemprop=description]:not(:has(p))"
|
||
|
||
override val pageSelector = "div.rdminimal > img, div.rdminimal > p > img, div.rdminimal > a > img, div.rdminimal > p > a > img, " +
|
||
"div.rdminimal > noscript > img, div.rdminimal > p > noscript > img, div.rdminimal > a > noscript > img, div.rdminimal > p > a > noscript > img"
|
||
}
|
||
|
||
class AsuraScansTr : AsuraScans("https://asurascanstr.com", "tr", SimpleDateFormat("MMM d, yyyy", Locale("tr"))) {
|
||
|
||
override val seriesArtistSelector = ".fmed b:contains(Çizer)+span"
|
||
override val seriesAuthorSelector = ".fmed b:contains(Yazar)+span"
|
||
override val seriesStatusSelector = ".imptdt:contains(Durum) i"
|
||
override val seriesTypeSelector = ".imptdt:contains(Tür) a"
|
||
|
||
override val altNamePrefix: String = "Alternatif isim: "
|
||
|
||
override fun String?.parseStatus(): Int = when {
|
||
this == null -> SManga.UNKNOWN
|
||
this.contains("Devam Ediyor", ignoreCase = true) -> SManga.ONGOING
|
||
this.contains("Tamamlandı", ignoreCase = true) -> SManga.COMPLETED
|
||
else -> SManga.UNKNOWN
|
||
}
|
||
|
||
override fun pageListParse(document: Document): List<Page> {
|
||
val scriptContent = document.selectFirst("script:containsData(ts_reader)")!!.data()
|
||
val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
|
||
val tsReader = json.decodeFromString<TSReader>(jsonString)
|
||
val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
|
||
return imageUrls.mapIndexed { index, imageUrl -> Page(index, imageUrl = imageUrl) }
|
||
}
|
||
|
||
@Serializable
|
||
data class TSReader(
|
||
val sources: List<ReaderImageSource>,
|
||
)
|
||
|
||
@Serializable
|
||
data class ReaderImageSource(
|
||
val source: String,
|
||
val images: List<String>,
|
||
)
|
||
}
|