148 lines
5.6 KiB
Kotlin
148 lines
5.6 KiB
Kotlin
package eu.kanade.tachiyomi.extension.pt.neoxscanlator
|
|
|
|
import android.app.Application
|
|
import android.content.SharedPreferences
|
|
import android.widget.Toast
|
|
import androidx.preference.EditTextPreference
|
|
import androidx.preference.PreferenceScreen
|
|
import eu.kanade.tachiyomi.BuildConfig
|
|
import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor
|
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
|
import eu.kanade.tachiyomi.network.GET
|
|
import eu.kanade.tachiyomi.network.asObservable
|
|
import eu.kanade.tachiyomi.source.ConfigurableSource
|
|
import eu.kanade.tachiyomi.source.model.FilterList
|
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
|
import eu.kanade.tachiyomi.source.model.Page
|
|
import eu.kanade.tachiyomi.source.model.SManga
|
|
import okhttp3.Headers
|
|
import okhttp3.OkHttpClient
|
|
import okhttp3.Request
|
|
import okhttp3.Response
|
|
import rx.Observable
|
|
import uy.kohesive.injekt.Injekt
|
|
import uy.kohesive.injekt.api.get
|
|
import java.text.SimpleDateFormat
|
|
import java.util.Locale
|
|
import java.util.concurrent.TimeUnit
|
|
import kotlin.Exception
|
|
|
|
class NeoxScanlator :
|
|
Madara(
|
|
"Neox Scanlator",
|
|
DEFAULT_BASE_URL,
|
|
"pt-BR",
|
|
SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR"))
|
|
),
|
|
ConfigurableSource {
|
|
|
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
.connectTimeout(1, TimeUnit.MINUTES)
|
|
.readTimeout(1, TimeUnit.MINUTES)
|
|
.addInterceptor(RateLimitInterceptor(1, 2, TimeUnit.SECONDS))
|
|
.build()
|
|
|
|
override val altNameSelector = ".post-content_item:contains(Alternativo) .summary-content"
|
|
|
|
override val altName = "Nome alternativo: "
|
|
|
|
private val preferences: SharedPreferences by lazy {
|
|
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
|
}
|
|
|
|
override val baseUrl: String by lazy {
|
|
preferences.getString(BASE_URL_PREF_KEY, DEFAULT_BASE_URL)!!
|
|
}
|
|
|
|
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
|
|
.add("Accept", ACCEPT)
|
|
.add("Accept-Language", ACCEPT_LANGUAGE)
|
|
.add("Referer", REFERER)
|
|
|
|
// Filter the novels in pure text format.
|
|
override fun popularMangaSelector() = "div.page-item-detail.manga"
|
|
|
|
override fun searchMangaParse(response: Response): MangasPage {
|
|
val mangaPage = super.searchMangaParse(response)
|
|
val filteredResult = mangaPage.mangas.filter { it.title.contains(NOVEL_REGEX).not() }
|
|
|
|
return MangasPage(filteredResult, mangaPage.hasNextPage)
|
|
}
|
|
|
|
// Sometimes the site changes the manga URL. This override will
|
|
// add an error instead of the HTTP 404 to inform the user to
|
|
// migrate from Neox to Neox to update the URL.
|
|
override fun fetchMangaDetails(manga: SManga): Observable<SManga> {
|
|
return client.newCall(mangaDetailsRequest(manga))
|
|
.asObservable()
|
|
.doOnNext { response ->
|
|
if (!response.isSuccessful) {
|
|
response.close()
|
|
throw Exception(if (response.code == 404) MIGRATION_MESSAGE else "HTTP error ${response.code}")
|
|
}
|
|
}
|
|
.map { response ->
|
|
mangaDetailsParse(response).apply { initialized = true }
|
|
}
|
|
}
|
|
|
|
override fun imageRequest(page: Page): Request {
|
|
val newHeaders = headersBuilder()
|
|
.set("Accept", ACCEPT_IMAGE)
|
|
.set("Referer", page.url)
|
|
.build()
|
|
|
|
return GET(page.imageUrl!!, newHeaders)
|
|
}
|
|
|
|
// Only status and order by filter work.
|
|
override fun getFilterList(): FilterList = FilterList(super.getFilterList().slice(3..4))
|
|
|
|
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
|
val baseUrlPref = EditTextPreference(screen.context).apply {
|
|
key = BASE_URL_PREF_KEY
|
|
title = BASE_URL_PREF_TITLE
|
|
summary = BASE_URL_PREF_SUMMARY
|
|
setDefaultValue(DEFAULT_BASE_URL)
|
|
dialogTitle = BASE_URL_PREF_TITLE
|
|
dialogMessage = "Padrão: $DEFAULT_BASE_URL"
|
|
|
|
setOnPreferenceChangeListener { _, newValue ->
|
|
try {
|
|
val res = preferences.edit()
|
|
.putString(BASE_URL_PREF_KEY, newValue as String)
|
|
.commit()
|
|
Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show()
|
|
res
|
|
} catch (e: Exception) {
|
|
e.printStackTrace()
|
|
false
|
|
}
|
|
}
|
|
}
|
|
|
|
screen.addPreference(baseUrlPref)
|
|
}
|
|
|
|
companion object {
|
|
private const val MIGRATION_MESSAGE = "O URL deste mangá mudou. " +
|
|
"Faça a migração do Neox para o Neox para atualizar a URL."
|
|
|
|
private const val ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9," +
|
|
"image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
|
|
private const val ACCEPT_IMAGE = "image/webp,image/apng,image/*,*/*;q=0.8"
|
|
private const val ACCEPT_LANGUAGE = "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6,gl;q=0.5"
|
|
private const val REFERER = "https://google.com/"
|
|
|
|
private const val DEFAULT_BASE_URL = "https://neoxscans.com"
|
|
private const val BASE_URL_PREF_KEY = "base_url_${BuildConfig.VERSION_NAME}"
|
|
private const val BASE_URL_PREF_TITLE = "URL da fonte"
|
|
private const val BASE_URL_PREF_SUMMARY = "Para uso temporário. Quando você atualizar a " +
|
|
"extensão, esta configuração será apagada."
|
|
|
|
private const val RESTART_TACHIYOMI = "Reinicie o Tachiyomi para aplicar as configurações."
|
|
|
|
private val NOVEL_REGEX = "novel|livro".toRegex(RegexOption.IGNORE_CASE)
|
|
}
|
|
}
|