package eu.kanade.tachiyomi.extension.en.lunarscans import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import okhttp3.Request import org.jsoup.nodes.Document class LunarScans : MangaThemesia( "Lunar Scans", "https://lunarscan.org", "en", "/series", ) { override val client = super.client.newBuilder() .rateLimit(1) .build() override fun headersBuilder() = super.headersBuilder() .add("Referer", "$baseUrl/") override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { return if (query.isEmpty()) { super.searchMangaRequest(page, query, filters) } else { GET("$baseUrl/?s=$query&page=$page", headers) } } override fun getFilterList(): FilterList { val filters = mutableListOf>( Filter.Header("Note: Can't be used with text search!"), Filter.Separator(), StatusFilter(), TypeFilter(), OrderByFilter(), Filter.Header("Genre exclusion is not available for all sources"), GenreListFilter(getGenreList()), ) if (hasProjectPage) { filters.addAll( mutableListOf>( Filter.Separator(), Filter.Header("NOTE: Can't be used with other filter!"), Filter.Header("$name Project List page"), ProjectFilter(), ), ) } return FilterList(filters) } override fun pageListParse(document: Document): List { val scriptContent = document.selectFirst("script:containsData(ts_reader)")?.data() ?: return super.pageListParse(document) val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");") val tsReader = json.decodeFromString(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, ) @Serializable data class ReaderImageSource( val source: String, val images: List, ) }