Compare commits
No commits in common. "4856f0b89e79f98ea50d3872df4e3a007fbe798e" and "9ead0e02186e2f754a577ef94fe5030b14ac6054" have entirely different histories.
4856f0b89e
...
9ead0e0218
@ -6,8 +6,6 @@ apply plugin: 'org.jmailen.kotlinter'
|
|||||||
assert !ext.has("pkgNameSuffix")
|
assert !ext.has("pkgNameSuffix")
|
||||||
assert !ext.has("libVersion")
|
assert !ext.has("libVersion")
|
||||||
|
|
||||||
assert extName.chars().max().asInt < 0x180 : "Extension name should be romanized"
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdk AndroidConfig.compileSdk
|
compileSdk AndroidConfig.compileSdk
|
||||||
|
|
||||||
|
@ -34,9 +34,7 @@ fun SharedPreferences.getPrefCustomUA(): String? {
|
|||||||
fun addRandomUAPreferenceToScreen(
|
fun addRandomUAPreferenceToScreen(
|
||||||
screen: PreferenceScreen,
|
screen: PreferenceScreen,
|
||||||
) {
|
) {
|
||||||
val context = screen.context
|
ListPreference(screen.context).apply {
|
||||||
|
|
||||||
ListPreference(context).apply {
|
|
||||||
key = PREF_KEY_RANDOM_UA
|
key = PREF_KEY_RANDOM_UA
|
||||||
title = TITLE_RANDOM_UA
|
title = TITLE_RANDOM_UA
|
||||||
entries = RANDOM_UA_ENTRIES
|
entries = RANDOM_UA_ENTRIES
|
||||||
@ -45,28 +43,28 @@ fun addRandomUAPreferenceToScreen(
|
|||||||
setDefaultValue("off")
|
setDefaultValue("off")
|
||||||
}.also(screen::addPreference)
|
}.also(screen::addPreference)
|
||||||
|
|
||||||
EditTextPreference(context).apply {
|
EditTextPreference(screen.context).apply {
|
||||||
key = PREF_KEY_CUSTOM_UA
|
key = PREF_KEY_CUSTOM_UA
|
||||||
title = TITLE_CUSTOM_UA
|
title = TITLE_CUSTOM_UA
|
||||||
summary = CUSTOM_UA_SUMMARY
|
summary = CUSTOM_UA_SUMMARY
|
||||||
setOnPreferenceChangeListener { _, newValue ->
|
setOnPreferenceChangeListener { _, newValue ->
|
||||||
try {
|
try {
|
||||||
Headers.headersOf("User-Agent", newValue as String)
|
Headers.Builder().add("User-Agent", newValue as String).build()
|
||||||
true
|
true
|
||||||
} catch (e: IllegalArgumentException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
Toast.makeText(context, "Invalid user agent string: ${e.message}", Toast.LENGTH_LONG).show()
|
Toast.makeText(screen.context, "User Agent invalid:${e.message}", Toast.LENGTH_LONG).show()
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.also(screen::addPreference)
|
}.also(screen::addPreference)
|
||||||
}
|
}
|
||||||
|
|
||||||
const val TITLE_RANDOM_UA = "Random user agent string (requires restart)"
|
const val TITLE_RANDOM_UA = "Random User-Agent (Requires Restart)"
|
||||||
const val PREF_KEY_RANDOM_UA = "pref_key_random_ua_"
|
const val PREF_KEY_RANDOM_UA = "pref_key_random_ua_"
|
||||||
val RANDOM_UA_ENTRIES = arrayOf("OFF", "Desktop", "Mobile")
|
val RANDOM_UA_ENTRIES = arrayOf("OFF", "Desktop", "Mobile")
|
||||||
val RANDOM_UA_VALUES = arrayOf("off", "desktop", "mobile")
|
val RANDOM_UA_VALUES = arrayOf("off", "desktop", "mobile")
|
||||||
|
|
||||||
const val TITLE_CUSTOM_UA = "Custom user agent string (requires restart)"
|
const val TITLE_CUSTOM_UA = "Custom User-Agent (Requires Restart)"
|
||||||
const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua_"
|
const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua_"
|
||||||
const val CUSTOM_UA_SUMMARY = "Leave blank to use the default user agent string (ignored if random user agent string is enabled)"
|
const val CUSTOM_UA_SUMMARY = "Leave blank to use application default user-agent (IGNORED if Random User-Agent is enabled)"
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
68
multisrc/overrides/bakamanga/manhwaxxl/src/ManhwaXXL.kt
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.manhwaxxl
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.bakamanga.BakaManga
|
||||||
|
|
||||||
|
class ManhwaXXL : BakaManga(
|
||||||
|
"Manhwa XXL",
|
||||||
|
"https://manhwaxxl.com",
|
||||||
|
"en",
|
||||||
|
) {
|
||||||
|
override fun getGenreList() = arrayOf(
|
||||||
|
Pair("All", ""),
|
||||||
|
Pair("Action", "action"),
|
||||||
|
Pair("Adaptation", "adaptation"),
|
||||||
|
Pair("Adult", "adult"),
|
||||||
|
Pair("Adventure", "adventure"),
|
||||||
|
Pair("BL", "bl"),
|
||||||
|
Pair("Comedy", "comedy"),
|
||||||
|
Pair("Cooking", "cooking"),
|
||||||
|
Pair("Demons", "demons"),
|
||||||
|
Pair("Drama", "drama"),
|
||||||
|
Pair("Ecchi", "ecchi"),
|
||||||
|
Pair("Fantasy", "fantasy"),
|
||||||
|
Pair("Full color", "full-color"),
|
||||||
|
Pair("Game", "game"),
|
||||||
|
Pair("Gender Bender", "gender-bender"),
|
||||||
|
Pair("GL", "gl"),
|
||||||
|
Pair("Harem", "harem"),
|
||||||
|
Pair("Historical", "historical"),
|
||||||
|
Pair("Horror", "horror"),
|
||||||
|
Pair("Isekai", "isekai"),
|
||||||
|
Pair("Josei", "josei"),
|
||||||
|
Pair("Live action", "live-action"),
|
||||||
|
Pair("Love & Romance", "love-romance"),
|
||||||
|
Pair("Magic", "magic"),
|
||||||
|
Pair("Manga", "manga"),
|
||||||
|
Pair("Manhua", "manhua"),
|
||||||
|
Pair("Manhwa", "manhwa"),
|
||||||
|
Pair("Martial Arts", "martial-arts"),
|
||||||
|
Pair("Mature", "mature"),
|
||||||
|
Pair("Mecha", "mecha"),
|
||||||
|
Pair("Mystery", "mystery"),
|
||||||
|
Pair("Omegaverse", "omegaverse"),
|
||||||
|
Pair("Psychological", "psychological"),
|
||||||
|
Pair("Raw", "raw"),
|
||||||
|
Pair("Reincarnation", "reincarnation"),
|
||||||
|
Pair("Romance", "romance"),
|
||||||
|
Pair("RPG", "rpg"),
|
||||||
|
Pair("School Life", "school-life"),
|
||||||
|
Pair("Sci-fi", "sci-fi"),
|
||||||
|
Pair("Seinen", "seinen"),
|
||||||
|
Pair("Shoujo", "shoujo"),
|
||||||
|
Pair("Shoujo Ai", "shoujo-ai"),
|
||||||
|
Pair("Shounen", "shounen"),
|
||||||
|
Pair("Slice of Life", "slice-of-life"),
|
||||||
|
Pair("Smut", "smut"),
|
||||||
|
Pair("Sports", "sports"),
|
||||||
|
Pair("Supernatural", "supernatural"),
|
||||||
|
Pair("Thriller", "thriller"),
|
||||||
|
Pair("Tragedy", "tragedy"),
|
||||||
|
Pair("Vampire", "vampire"),
|
||||||
|
Pair("Vanilla", "vanilla"),
|
||||||
|
Pair("Webtoon", "webtoon"),
|
||||||
|
Pair("Webtoons", "webtoons"),
|
||||||
|
Pair("Yaoi", "yaoi"),
|
||||||
|
Pair("Yuri", "yuri"),
|
||||||
|
Pair("Zombie", "zombie"),
|
||||||
|
)
|
||||||
|
}
|
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 9.1 KiB |
@ -1,7 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.extension.id.neumanga
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.multisrc.colorlibanime.ColorlibAnime
|
|
||||||
|
|
||||||
class Neumanga : ColorlibAnime("Neumanga", "https://neumanga.xyz", "id") {
|
|
||||||
override val versionId = 2
|
|
||||||
}
|
|
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 8.7 KiB |
165
multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.es.yugenmangas
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import eu.kanade.tachiyomi.multisrc.heancms.Genre
|
||||||
|
import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
|
||||||
|
import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.ProtocolException
|
||||||
|
import okhttp3.Response
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
import java.io.IOException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.TimeZone
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class YugenMangas :
|
||||||
|
HeanCms(
|
||||||
|
"YugenMangas",
|
||||||
|
"https://yugenmangas.net",
|
||||||
|
"es",
|
||||||
|
"https://api.yugenmangas.net",
|
||||||
|
) {
|
||||||
|
|
||||||
|
// Site changed from Madara to HeanCms.
|
||||||
|
override val versionId = 2
|
||||||
|
|
||||||
|
override val baseUrl by lazy { getPrefBaseUrl() }
|
||||||
|
|
||||||
|
private val preferences by lazy {
|
||||||
|
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var lastDomain = ""
|
||||||
|
|
||||||
|
private fun domainChangeIntercept(chain: Interceptor.Chain): Response {
|
||||||
|
val request = chain.request()
|
||||||
|
|
||||||
|
if (!request.url.host.startsWith("yugenmangas")) {
|
||||||
|
return chain.proceed(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastDomain.isNotEmpty()) {
|
||||||
|
val newUrl = request.url.newBuilder()
|
||||||
|
.host(preferences.baseUrlHost)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
return chain.proceed(
|
||||||
|
request.newBuilder()
|
||||||
|
.url(newUrl)
|
||||||
|
.build(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val response = try {
|
||||||
|
chain.proceed(request)
|
||||||
|
} catch (e: ProtocolException) {
|
||||||
|
if (e.message?.contains("Too many follow-up requests") == true) {
|
||||||
|
throw IOException("No se pudo obtener la nueva URL del sitio")
|
||||||
|
} else {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.url.host == response.request.url.host) return response
|
||||||
|
|
||||||
|
response.close()
|
||||||
|
|
||||||
|
preferences.baseUrlHost = response.request.url.host
|
||||||
|
|
||||||
|
lastDomain = request.url.host
|
||||||
|
|
||||||
|
val newUrl = request.url.newBuilder()
|
||||||
|
.host(response.request.url.host)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
return chain.proceed(
|
||||||
|
request.newBuilder()
|
||||||
|
.url(newUrl)
|
||||||
|
.build(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val slugStrategy = SlugStrategy.ID
|
||||||
|
override val useNewQueryEndpoint = true
|
||||||
|
|
||||||
|
override val client = super.client.newBuilder()
|
||||||
|
.connectTimeout(60, TimeUnit.SECONDS)
|
||||||
|
.readTimeout(90, TimeUnit.SECONDS)
|
||||||
|
.rateLimitHost(apiUrl.toHttpUrl(), 2, 3)
|
||||||
|
.addInterceptor(::domainChangeIntercept)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
override val coverPath: String = ""
|
||||||
|
|
||||||
|
override val dateFormat: SimpleDateFormat = super.dateFormat.apply {
|
||||||
|
timeZone = TimeZone.getTimeZone("UTC")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getGenreList(): List<Genre> = listOf(
|
||||||
|
Genre("+18", 1),
|
||||||
|
Genre("Acción", 36),
|
||||||
|
Genre("Adulto", 38),
|
||||||
|
Genre("Apocalíptico", 3),
|
||||||
|
Genre("Artes marciales (1)", 16),
|
||||||
|
Genre("Artes marciales (2)", 37),
|
||||||
|
Genre("Aventura", 2),
|
||||||
|
Genre("Boys Love", 4),
|
||||||
|
Genre("Ciencia ficción", 39),
|
||||||
|
Genre("Comedia", 5),
|
||||||
|
Genre("Demonios", 6),
|
||||||
|
Genre("Deporte", 26),
|
||||||
|
Genre("Drama", 7),
|
||||||
|
Genre("Ecchi", 8),
|
||||||
|
Genre("Familia", 9),
|
||||||
|
Genre("Fantasía", 10),
|
||||||
|
Genre("Girls Love", 11),
|
||||||
|
Genre("Gore", 12),
|
||||||
|
Genre("Harem", 13),
|
||||||
|
Genre("Harem inverso", 14),
|
||||||
|
Genre("Histórico", 48),
|
||||||
|
Genre("Horror", 41),
|
||||||
|
Genre("Isekai", 40),
|
||||||
|
Genre("Josei", 15),
|
||||||
|
Genre("Maduro", 42),
|
||||||
|
Genre("Magia", 17),
|
||||||
|
Genre("MangoScan", 35),
|
||||||
|
Genre("Mecha", 18),
|
||||||
|
Genre("Militar", 19),
|
||||||
|
Genre("Misterio", 20),
|
||||||
|
Genre("Psicológico", 21),
|
||||||
|
Genre("Realidad virtual", 46),
|
||||||
|
Genre("Recuentos de la vida", 25),
|
||||||
|
Genre("Reencarnación", 22),
|
||||||
|
Genre("Regresion", 23),
|
||||||
|
Genre("Romance", 24),
|
||||||
|
Genre("Seinen", 27),
|
||||||
|
Genre("Shonen", 28),
|
||||||
|
Genre("Shoujo", 29),
|
||||||
|
Genre("Sistema", 45),
|
||||||
|
Genre("Smut", 30),
|
||||||
|
Genre("Supernatural", 31),
|
||||||
|
Genre("Supervivencia", 32),
|
||||||
|
Genre("Tragedia", 33),
|
||||||
|
Genre("Transmigración", 34),
|
||||||
|
Genre("Vida Escolar", 47),
|
||||||
|
Genre("Yaoi", 43),
|
||||||
|
Genre("Yuri", 44),
|
||||||
|
)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val defaultBaseUrlHost = "yugenmangas.net"
|
||||||
|
private const val BASE_URL_PREF = "prefOverrideBaseUrl"
|
||||||
|
}
|
||||||
|
|
||||||
|
private var SharedPreferences.baseUrlHost
|
||||||
|
get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost
|
||||||
|
set(newHost) {
|
||||||
|
edit().putString(BASE_URL_PREF, newHost).commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getPrefBaseUrl(): String = preferences.baseUrlHost.let { "https://$it" }
|
||||||
|
}
|
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 8.3 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 16 KiB |
9
multisrc/overrides/madara/archerscans/src/ArcheRScans.kt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.archerscans
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class ArcheRScans : Madara("ArcheR Scans", "https://www.archerscans.com", "en") {
|
||||||
|
override val useNewChapterEndpoint = false
|
||||||
|
|
||||||
|
override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
|
||||||
|
}
|
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 21 KiB |
17
multisrc/overrides/madara/astrallibrary/src/AstralLibrary.kt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.astrallibrary
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import okhttp3.Request
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class AstralLibrary : Madara("Astral Library", "https://www.astrallibrary.net", "en", SimpleDateFormat("d MMM", Locale.US)) {
|
||||||
|
override fun popularMangaRequest(page: Int): Request {
|
||||||
|
return GET("$baseUrl/manga-tag/manga/?m_orderby=views&page=$page", headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request {
|
||||||
|
return GET("$baseUrl/manga-tag/manga/?m_orderby=latest&page=$page", headers)
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 9.2 KiB |
9
multisrc/overrides/madara/bluesolo/src/BlueSolo.kt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.fr.bluesolo
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class BlueSolo : Madara("Blue Solo", "https://www1.bluesolo.org", "fr", dateFormat = SimpleDateFormat("d MMMM yyyy", Locale.FRENCH)) {
|
||||||
|
override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Statut) + .summary-content"
|
||||||
|
}
|
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 8.9 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 25 KiB |
@ -0,0 +1,64 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.coffeemangatop
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class CoffeeMangaTop : Madara(
|
||||||
|
"CoffeeManga.top (unoriginal)",
|
||||||
|
"https://coffeemanga.top",
|
||||||
|
"en",
|
||||||
|
dateFormat = SimpleDateFormat("MMM dd, HH:mm", Locale.ENGLISH),
|
||||||
|
) {
|
||||||
|
override val useNewChapterEndpoint = false
|
||||||
|
|
||||||
|
override fun searchPage(page: Int): String = "search?page=$page"
|
||||||
|
|
||||||
|
override fun popularMangaRequest(page: Int): Request =
|
||||||
|
GET("$baseUrl/popular-manga?page=$page", headers)
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request =
|
||||||
|
GET("$baseUrl/latest-manga?page=$page", headers)
|
||||||
|
|
||||||
|
// Copied from IsekaiScan.top (unoriginal)
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
val chaptersWrapper = document.select("div[id^=manga-chapters-holder]")
|
||||||
|
|
||||||
|
var chapterElements = document.select(chapterListSelector())
|
||||||
|
|
||||||
|
if (chapterElements.isEmpty() && !chaptersWrapper.isNullOrEmpty()) {
|
||||||
|
val mangaId = chaptersWrapper.attr("data-id")
|
||||||
|
val xhrHeaders = headersBuilder()
|
||||||
|
.add("X-Requested-With", "XMLHttpRequest")
|
||||||
|
.build()
|
||||||
|
val xhrRequest = GET("$baseUrl/ajax-list-chapter?mangaID=$mangaId", xhrHeaders)
|
||||||
|
val xhrResponse = client.newCall(xhrRequest).execute()
|
||||||
|
|
||||||
|
chapterElements = xhrResponse.asJsoup().select(chapterListSelector())
|
||||||
|
xhrResponse.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
countViews(document)
|
||||||
|
return chapterElements.map(::chapterFromElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copied from IsekaiScan.top (unoriginal)
|
||||||
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
|
val stringArray = document.select("p#arraydata").text().split(",").toTypedArray()
|
||||||
|
return stringArray.mapIndexed { index, url ->
|
||||||
|
Page(
|
||||||
|
index,
|
||||||
|
document.location(),
|
||||||
|
url,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 41 KiB |
14
multisrc/overrides/madara/dokkomanga/src/DokkoManga.kt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.es.dokkomanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class DokkoManga : Madara(
|
||||||
|
"DokkoManga",
|
||||||
|
"https://dokkomanga.com",
|
||||||
|
"es",
|
||||||
|
SimpleDateFormat("MMMMM dd, yyyy", Locale("es")),
|
||||||
|
) {
|
||||||
|
override val useNewChapterEndpoint = true
|
||||||
|
}
|
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 7.1 KiB |
7
multisrc/overrides/madara/dreammanga/src/DreamManga.kt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.dreammanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class DreamManga : Madara("Dream Manga", "https://www.swarmmanga.com", "en", SimpleDateFormat("dd/MM/yyyy", Locale.US))
|
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 7.3 KiB |
After Width: | Height: | Size: 11 KiB |
22
multisrc/overrides/madara/falconmanga/src/FalconManga.kt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.ar.falconmanga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class FalconManga : Madara(
|
||||||
|
"فالكون مانجا",
|
||||||
|
"https://falconmanga.com",
|
||||||
|
"ar",
|
||||||
|
dateFormat = SimpleDateFormat("dd MMMM، yyyy", Locale("ar")),
|
||||||
|
) {
|
||||||
|
override val useNewChapterEndpoint = true
|
||||||
|
|
||||||
|
override fun searchPage(page: Int): String {
|
||||||
|
return if (page > 1) {
|
||||||
|
"page/$page/"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 6.3 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 31 KiB |
20
multisrc/overrides/madara/finalscans/src/FinalScans.kt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.pt.finalscans
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class FinalScans : Madara(
|
||||||
|
"Final Scans",
|
||||||
|
"https://finalscans.com",
|
||||||
|
"pt-BR",
|
||||||
|
SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
|
||||||
|
) {
|
||||||
|
|
||||||
|
override val client: OkHttpClient = super.client.newBuilder()
|
||||||
|
.rateLimit(1, 2, TimeUnit.SECONDS)
|
||||||
|
.build()
|
||||||
|
}
|
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,9 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.firstkissmangablog
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
|
||||||
|
class FirstKissMangaBlog : Madara("1stKissManga.blog", "https://1stkissmanga.blog", "en") {
|
||||||
|
override val useNewChapterEndpoint = false
|
||||||
|
|
||||||
|
override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
|
||||||
|
}
|
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 20 KiB |
@ -0,0 +1,16 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.en.firstkissmangaclub
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
|
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
class FirstKissMangaClub : Madara(
|
||||||
|
"1stKissManga.Club",
|
||||||
|
"https://1stkissmanga.club",
|
||||||
|
"en",
|
||||||
|
) {
|
||||||
|
|
||||||
|
override val client = super.client.newBuilder()
|
||||||
|
.rateLimit(1, 3, TimeUnit.SECONDS)
|
||||||
|
.build()
|
||||||
|
}
|