package eu.kanade.tachiyomi.extension.ar.mangaswat import android.app.Application import android.content.SharedPreferences import android.widget.Toast import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.extension.BuildConfig import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.SimpleDateFormat import java.util.Locale class MangaSwat : MangaThemesia( "MangaSwat", "https://stmgs.com", "ar", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")), ) { private val defaultBaseUrl = "https://swatmanga.co" override val baseUrl by lazy { getPrefBaseUrl() } private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } override val client: OkHttpClient = super.client.newBuilder() .rateLimit(1) .build() override fun headersBuilder(): Headers.Builder = super.headersBuilder() .add("Referer", "$baseUrl/") override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val request = super.searchMangaRequest(page, query, filters) if (query.isBlank()) return request val url = request.url.newBuilder() .removePathSegment(0) .removeAllQueryParameters("title") .addQueryParameter("s", query) .build() return request.newBuilder() .url(url) .build() } override fun searchMangaNextPageSelector() = "a[rel=next]" override val seriesArtistSelector = "span:contains(الناشر) i" override val seriesAuthorSelector = "span:contains(المؤلف) i" override val seriesGenreSelector = "span:contains(التصنيف) a, .mgen a" override val seriesTypeSelector = "span:contains(النوع) a" override val seriesStatusSelector = "span:contains(الحالة)" override fun pageListParse(document: Document): List { val scriptContent = document.selectFirst("script:containsData(ts_reader)")!!.data() 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) } } override fun chapterListSelector() = "div.bxcl li, ul div:has(span.lchx)" override fun chapterFromElement(element: Element) = SChapter.create().apply { val urlElements = element.select("a") setUrlWithoutDomain(urlElements.attr("href")) name = element.select(".lch a, .chapternum").text().ifBlank { urlElements.last()!!.text() } date_upload = element.selectFirst(".chapter-date")?.text().parseChapterDate() } @Serializable data class TSReader( val sources: List, ) @Serializable data class ReaderImageSource( val source: String, val images: List, ) companion object { private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." private const val BASE_URL_PREF_TITLE = "Override BaseUrl" private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_CODE}" private const val BASE_URL_PREF_SUMMARY = "For temporary uses. Updating the extension will erase this setting." } override fun setupPreferenceScreen(screen: PreferenceScreen) { val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { key = BASE_URL_PREF title = BASE_URL_PREF_TITLE summary = BASE_URL_PREF_SUMMARY this.setDefaultValue(defaultBaseUrl) dialogTitle = BASE_URL_PREF_TITLE setOnPreferenceChangeListener { _, _ -> Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() true } } screen.addPreference(baseUrlPref) super.setupPreferenceScreen(screen) } private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!! }