Add missing changes from keiyoushi
0
multisrc/overrides/guya/magicaltranslators/res/mipmap-hdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
0
multisrc/overrides/guya/magicaltranslators/res/mipmap-mdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
0
multisrc/overrides/guya/magicaltranslators/res/mipmap-xhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
0
multisrc/overrides/guya/magicaltranslators/res/mipmap-xxhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
0
multisrc/overrides/guya/magicaltranslators/res/mipmap-xxxhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
@ -0,0 +1,3 @@
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":lib-synchrony"))
|
||||||
|
}
|
|
@ -1,11 +1,28 @@
|
||||||
package eu.kanade.tachiyomi.extension.id.shinigami
|
package eu.kanade.tachiyomi.extension.id.shinigami
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.util.Base64
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.preference.EditTextPreference
|
||||||
|
import androidx.preference.PreferenceScreen
|
||||||
|
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
|
||||||
|
import eu.kanade.tachiyomi.lib.synchrony.Deobfuscator
|
||||||
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
import eu.kanade.tachiyomi.multisrc.madara.Madara
|
||||||
import eu.kanade.tachiyomi.network.interceptor.rateLimit
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.decodeFromString
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
|
import okhttp3.Interceptor
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
import java.io.IOException
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
class Shinigami : Madara("Shinigami", "https://shinigamitoon.com", "id") {
|
class Shinigami : Madara("Shinigami", "https://shinigamitoon.com", "id") {
|
||||||
|
@ -16,15 +33,91 @@ class Shinigami : Madara("Shinigami", "https://shinigamitoon.com", "id") {
|
||||||
|
|
||||||
override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
|
override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
|
||||||
|
|
||||||
override val client: OkHttpClient = super.client.newBuilder()
|
private val preferences: SharedPreferences by lazy {
|
||||||
.rateLimit(4, 1, TimeUnit.SECONDS)
|
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val encodedString = "AAA AaAAAAH QAAAB0 AAAAcA AAAHMAA AA6AAA ALwAAAC8AA " + "AB0AAAAYQA AAGM AAADoAAAAaQAAAH kAAABvAA AAbQAAA GkAAABvAAAA cgAAAGcAAAAuAAA AZwAAAGk " + "AAAB0AAAA aAAAAHUAA ABiAAAALgAAAGkAA ABvAAAAL wAAAHUAAABzA AAAZQAAAHIAAAAtA AAAYQAAAGcA " + "AABlyAtAAAbgA AAHQAAAB6AAAA LwAAAHUAAA BcAAAAZQ AAAHIAAAAtAAA AYQAAAGcAAABl AAAAbgAA AHQAAAB6AAAALgAAAG" + " oAhAntUAABzAA AAbwAAAG4="
|
||||||
|
|
||||||
|
private val tachiUaUrl = Base64.decode(encodedString.replace("\\s".toRegex(), "").replace("DoA", "BoA").replace("GoAhAntU", "GoA").replace("BlyAt", "BlA").replace("BcA", "BzA"), Base64.DEFAULT).toString(Charsets.UTF_32).replace("z", "s")
|
||||||
|
|
||||||
|
private var secChUaMP: List<String>? = null
|
||||||
|
private var userAgent: String? = null
|
||||||
|
private var checkedUa = false
|
||||||
|
|
||||||
|
private val uaIntercept = object : Interceptor {
|
||||||
|
override fun intercept(chain: Interceptor.Chain): Response {
|
||||||
|
val customUa = preferences.getString(PREF_KEY_CUSTOM_UA, "")
|
||||||
|
try {
|
||||||
|
if (customUa!!.isNotBlank()) userAgent = customUa
|
||||||
|
|
||||||
|
if (userAgent.isNullOrBlank() && checkedUa.not()) {
|
||||||
|
val uaResponse = chain.proceed(GET(tachiUaUrl))
|
||||||
|
if (uaResponse.isSuccessful) {
|
||||||
|
val parseTachiUa = uaResponse.use { json.decodeFromString<TachiUaResponse>(it.body.string()) }
|
||||||
|
|
||||||
|
var listUserAgentString = parseTachiUa.desktop + parseTachiUa.mobile
|
||||||
|
|
||||||
|
listUserAgentString = listUserAgentString!!.filter {
|
||||||
|
listOf("windows", "android").any { filter ->
|
||||||
|
it.contains(filter, ignoreCase = true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
userAgent = listUserAgentString!!.random()
|
||||||
|
checkedUa = true
|
||||||
|
}
|
||||||
|
uaResponse.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userAgent.isNullOrBlank().not()) {
|
||||||
|
secChUaMP = if (userAgent!!.contains("Windows")) {
|
||||||
|
listOf("?0", "Windows")
|
||||||
|
} else {
|
||||||
|
listOf("?1", "Android")
|
||||||
|
}
|
||||||
|
|
||||||
|
val newRequest = chain.request().newBuilder()
|
||||||
|
.header("User-Agent", userAgent!!.trim())
|
||||||
|
.header("Sec-CH-UA-Mobile", secChUaMP!![0])
|
||||||
|
.header("Sec-CH-UA-Platform", secChUaMP!![1])
|
||||||
|
.removeHeader("X-Requested-With")
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
|
return chain.proceed(newRequest)
|
||||||
|
}
|
||||||
|
return chain.proceed(chain.request())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
throw IOException(e.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class TachiUaResponse(
|
||||||
|
val desktop: List<String> = emptyList(),
|
||||||
|
val mobile: List<String> = emptyList(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// disable random ua in ext setting from multisrc (.setRandomUserAgent)
|
||||||
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||||
|
.addInterceptor(uaIntercept)
|
||||||
|
.connectTimeout(10, TimeUnit.SECONDS)
|
||||||
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
override fun headersBuilder(): Headers.Builder {
|
||||||
|
val builder = super.headersBuilder()
|
||||||
.add("Sec-Fetch-Dest", "document")
|
.add("Sec-Fetch-Dest", "document")
|
||||||
.add("Sec-Fetch-Mode", "navigate")
|
.add("Sec-Fetch-Mode", "navigate")
|
||||||
.add("Sec-Fetch-Site", "same-origin")
|
.add("Sec-Fetch-Site", "same-origin")
|
||||||
.add("Upgrade-Insecure-Requests", "1")
|
.add("Upgrade-Insecure-Requests", "1")
|
||||||
|
.add("X-Requested-With", "") // added for webview, and removed in interceptor for normal use
|
||||||
|
|
||||||
|
// used to flush tachi custom ua in webview and use system ua instead
|
||||||
|
if (userAgent.isNullOrBlank()) builder.removeAll("User-Agent")
|
||||||
|
|
||||||
|
return builder
|
||||||
|
}
|
||||||
|
|
||||||
override val mangaSubString = "semua-series"
|
override val mangaSubString = "semua-series"
|
||||||
|
|
||||||
|
@ -43,4 +136,76 @@ class Shinigami : Madara("Shinigami", "https://shinigamitoon.com", "id") {
|
||||||
|
|
||||||
setUrlWithoutDomain(fixedUrl)
|
setUrlWithoutDomain(fixedUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Page list
|
||||||
|
@Serializable
|
||||||
|
data class CDT(val ct: String, val s: String)
|
||||||
|
|
||||||
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
|
val script = document.selectFirst("script:containsData(chapter_data)")?.data()
|
||||||
|
?: throw Exception("chapter_data script not found")
|
||||||
|
|
||||||
|
val deobfuscated = Deobfuscator.deobfuscateScript(script)
|
||||||
|
?: throw Exception("Unable to deobfuscate chapter_data script")
|
||||||
|
|
||||||
|
val postId = script.substringAfter("var post_id = '").substringBefore("'")
|
||||||
|
val chapterData = json.decodeFromString<CDT>(
|
||||||
|
script.substringAfter("var chapter_data = '").substringBefore("'"),
|
||||||
|
)
|
||||||
|
|
||||||
|
val keyMatch = KEY_REGEX.find(deobfuscated)!!.groupValues
|
||||||
|
val key = postId + keyMatch[1] + postId + keyMatch[2] + postId
|
||||||
|
val salt = chapterData.s.decodeHex()
|
||||||
|
|
||||||
|
val unsaltedCiphertext = Base64.decode(chapterData.ct, Base64.DEFAULT)
|
||||||
|
val ciphertext = SALTED + salt + unsaltedCiphertext
|
||||||
|
|
||||||
|
val decrypted = CryptoAES.decrypt(Base64.encodeToString(ciphertext, Base64.DEFAULT), key)
|
||||||
|
val data = json.decodeFromString<List<String>>(decrypted)
|
||||||
|
return data.mapIndexed { idx, it ->
|
||||||
|
Page(idx, document.location(), it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://stackoverflow.com/a/66614516
|
||||||
|
private fun String.decodeHex(): ByteArray {
|
||||||
|
check(length % 2 == 0) { "Must have an even length" }
|
||||||
|
|
||||||
|
return chunked(2)
|
||||||
|
.map { it.toInt(16).toByte() }
|
||||||
|
.toByteArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove random ua in setting ext from multisrc and use custom one
|
||||||
|
override fun setupPreferenceScreen(screen: PreferenceScreen) {
|
||||||
|
val prefCustomUserAgent = EditTextPreference(screen.context).apply {
|
||||||
|
key = PREF_KEY_CUSTOM_UA
|
||||||
|
title = TITLE_CUSTOM_UA
|
||||||
|
summary = (preferences.getString(PREF_KEY_CUSTOM_UA, "")!!.trim() + SUMMARY_STRING_CUSTOM_UA).trim()
|
||||||
|
setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
val customUa = newValue as String
|
||||||
|
preferences.edit().putString(PREF_KEY_CUSTOM_UA, customUa).apply()
|
||||||
|
if (customUa.isNullOrBlank()) {
|
||||||
|
Toast.makeText(screen.context, RESTART_APP_STRING, Toast.LENGTH_LONG).show()
|
||||||
|
} else {
|
||||||
|
userAgent = null
|
||||||
|
}
|
||||||
|
summary = (customUa.trim() + SUMMARY_STRING2_CUSTOM_UA).trim()
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
screen.addPreference(prefCustomUserAgent)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val TITLE_CUSTOM_UA = "Custom User-Agent"
|
||||||
|
const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua"
|
||||||
|
const val SUMMARY_STRING_CUSTOM_UA = "\n\nBiarkan kosong untuk menggunakan User-Agent secara random"
|
||||||
|
const val SUMMARY_STRING2_CUSTOM_UA = "\n\nKosongkan untuk menggunakan User-Agent secara random"
|
||||||
|
|
||||||
|
const val RESTART_APP_STRING = "Restart Tachiyomi untuk menggunakan pengaturan baru."
|
||||||
|
|
||||||
|
private val KEY_REGEX by lazy { Regex("""post_id\s+\+\s+'(.*?)'\s+\+\s+post_id\s+\+\s+'(.*?)'\s+\+\s+post_id""") }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 19 KiB |
|
@ -65,7 +65,6 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Cat300", "https://cat300.com", "th", isNsfw = true, className = "Cat300", overrideVersionCode = 1),
|
SingleLang("Cat300", "https://cat300.com", "th", isNsfw = true, className = "Cat300", overrideVersionCode = 1),
|
||||||
SingleLang("CatOnHeadTranslations", "https://catonhead.com", "en", overrideVersionCode = 2),
|
SingleLang("CatOnHeadTranslations", "https://catonhead.com", "en", overrideVersionCode = 2),
|
||||||
SingleLang("Cerise Scan", "https://cerisescan.com", "pt-BR", pkgName = "cerisescans", isNsfw = true, overrideVersionCode = 7),
|
SingleLang("Cerise Scan", "https://cerisescan.com", "pt-BR", pkgName = "cerisescans", isNsfw = true, overrideVersionCode = 7),
|
||||||
SingleLang("Çizgi Roman Arşivi", "https://cizgiromanarsivi.com", "tr", className = "CizgiRomanArsivi"),
|
|
||||||
SingleLang("Clover Manga", "https://clover-manga.com", "tr", overrideVersionCode = 2),
|
SingleLang("Clover Manga", "https://clover-manga.com", "tr", overrideVersionCode = 2),
|
||||||
SingleLang("Coco Rip", "https://cocorip.net", "es"),
|
SingleLang("Coco Rip", "https://cocorip.net", "es"),
|
||||||
SingleLang("Coffee Manga", "https://coffeemanga.io", "en", isNsfw = false, overrideVersionCode = 2),
|
SingleLang("Coffee Manga", "https://coffeemanga.io", "en", isNsfw = false, overrideVersionCode = 2),
|
||||||
|
@ -214,23 +213,22 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Manga Lord", "https://mangalord.com", "en", overrideVersionCode = 1),
|
SingleLang("Manga Lord", "https://mangalord.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Mammy", "https://mangamammy.ru", "ru", isNsfw = true),
|
SingleLang("Manga Mammy", "https://mangamammy.ru", "ru", isNsfw = true),
|
||||||
SingleLang("Manga Mitsu", "https://mangamitsu.com", "en", isNsfw = true, overrideVersionCode = 2),
|
SingleLang("Manga Mitsu", "https://mangamitsu.com", "en", isNsfw = true, overrideVersionCode = 2),
|
||||||
SingleLang("Mangá Nanquim", "https://mangananquim.com", "pt-BR", className = "MangaNanquim"),
|
|
||||||
SingleLang("Manga Nerds", "https://manganerds.com", "en", isNsfw = false),
|
SingleLang("Manga Nerds", "https://manganerds.com", "en", isNsfw = false),
|
||||||
SingleLang("Manga One Love", "https://mangaonelove.site/", "ru", isNsfw = true),
|
SingleLang("Manga One Love", "https://mangaonelove.site/", "ru", isNsfw = true),
|
||||||
SingleLang("Manga Online Team", "https://mangaonlineteam.com", "en"),
|
SingleLang("Manga Online Team", "https://mangaonlineteam.com", "en"),
|
||||||
|
SingleLang("Manga Queen", "https://mangaqueen.net", "en"),
|
||||||
SingleLang("Manga Queen.com", "https://mangaqueen.com", "en", isNsfw = true, className = "MangaQueenCom"),
|
SingleLang("Manga Queen.com", "https://mangaqueen.com", "en", isNsfw = true, className = "MangaQueenCom"),
|
||||||
SingleLang("Manga Queen.online (unoriginal)", "https://mangaqueen.online", "en", isNsfw = true, className = "MangaQueenOnline"),
|
SingleLang("Manga Queen.online (unoriginal)", "https://mangaqueen.online", "en", isNsfw = true, className = "MangaQueenOnline"),
|
||||||
SingleLang("Manga Queen", "https://mangaqueen.net", "en"),
|
|
||||||
SingleLang("Manga Read", "https://mangaread.co", "en", overrideVersionCode = 1),
|
SingleLang("Manga Read", "https://mangaread.co", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Rock Team", "https://mangarockteam.com", "en", overrideVersionCode = 1),
|
SingleLang("Manga Rock Team", "https://mangarockteam.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Rock.team (unoriginal)", "https://mangarock.team", "en", isNsfw = false, className = "MangaRockTeamUnoriginal"),
|
SingleLang("Manga Rock.team (unoriginal)", "https://mangarock.team", "en", isNsfw = false, className = "MangaRockTeamUnoriginal"),
|
||||||
SingleLang("Manga Rocky", "https://mangarocky.com", "en", overrideVersionCode = 1),
|
SingleLang("Manga Rocky", "https://mangarocky.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Rose", "https://mangarose.net", "ar"),
|
SingleLang("Manga Rose", "https://mangarose.net", "ar"),
|
||||||
SingleLang("Manga Şehri", "https://manga-sehri.com", "tr", className = "MangaSehri", isNsfw = true, overrideVersionCode = 1),
|
|
||||||
SingleLang("Manga Starz", "https://mangastarz.org", "ar", overrideVersionCode = 5),
|
SingleLang("Manga Starz", "https://mangastarz.org", "ar", overrideVersionCode = 5),
|
||||||
SingleLang("Manga Too", "https://mangatoo.com", "en", overrideVersionCode = 1),
|
SingleLang("Manga Too", "https://mangatoo.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("Manga Tx.gg (unoriginal)", "https://mangatx.gg", "en", isNsfw = false, className = "MangaTxGg"),
|
SingleLang("Manga Tx.gg (unoriginal)", "https://mangatx.gg", "en", isNsfw = false, className = "MangaTxGg"),
|
||||||
SingleLang("Manga Weebs", "https://mangaweebs.in", "en", overrideVersionCode = 8),
|
SingleLang("Manga Weebs", "https://mangaweebs.in", "en", overrideVersionCode = 8),
|
||||||
|
SingleLang("Manga Şehri", "https://manga-sehri.com", "tr", className = "MangaSehri", isNsfw = true, overrideVersionCode = 1),
|
||||||
SingleLang("Manga-1001.com", "https://manga-1001.com", "en", isNsfw = false, className = "MangaDash1001Com"),
|
SingleLang("Manga-1001.com", "https://manga-1001.com", "en", isNsfw = false, className = "MangaDash1001Com"),
|
||||||
SingleLang("Manga-fast.com", "https://manga-fast.com", "en", className = "Mangafastcom", overrideVersionCode = 3),
|
SingleLang("Manga-fast.com", "https://manga-fast.com", "en", className = "Mangafastcom", overrideVersionCode = 3),
|
||||||
SingleLang("Manga-Raw.info (unoriginal)", "https://manga-raw.info", "en", isNsfw = true, className = "MangaRawInfo"),
|
SingleLang("Manga-Raw.info (unoriginal)", "https://manga-raw.info", "en", isNsfw = true, className = "MangaRawInfo"),
|
||||||
|
@ -244,8 +242,8 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("MangaBaz", "https://mangabaz.net", "en"),
|
SingleLang("MangaBaz", "https://mangabaz.net", "en"),
|
||||||
SingleLang("MangaBob", "https://mangabob.com", "en", overrideVersionCode = 1),
|
SingleLang("MangaBob", "https://mangabob.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("MangaCC", "https://mangacc.com", "en"),
|
SingleLang("MangaCC", "https://mangacc.com", "en"),
|
||||||
SingleLang("MangaClash.tv (unoriginal)", "https://mangaclash.tv", "en", isNsfw = true, className = "MangaClashTv"),
|
|
||||||
SingleLang("MangaClash", "https://mangaclash.com", "en", overrideVersionCode = 3),
|
SingleLang("MangaClash", "https://mangaclash.com", "en", overrideVersionCode = 3),
|
||||||
|
SingleLang("MangaClash.tv (unoriginal)", "https://mangaclash.tv", "en", isNsfw = true, className = "MangaClashTv"),
|
||||||
SingleLang("MangaCrazy", "https://mangacrazy.net", "all", isNsfw = true),
|
SingleLang("MangaCrazy", "https://mangacrazy.net", "all", isNsfw = true),
|
||||||
SingleLang("MangaCultivator", "https://mangacultivator.com", "en", overrideVersionCode = 2),
|
SingleLang("MangaCultivator", "https://mangacultivator.com", "en", overrideVersionCode = 2),
|
||||||
SingleLang("MangaCV", "https://mangacv.com", "en", isNsfw = true),
|
SingleLang("MangaCV", "https://mangacv.com", "en", isNsfw = true),
|
||||||
|
@ -307,6 +305,7 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Mangaxico", "https://mangaxico.com", "es", isNsfw = true),
|
SingleLang("Mangaxico", "https://mangaxico.com", "es", isNsfw = true),
|
||||||
SingleLang("MangaXP", "https://mangaxp.com", "en", overrideVersionCode = 1),
|
SingleLang("MangaXP", "https://mangaxp.com", "en", overrideVersionCode = 1),
|
||||||
SingleLang("MangaYami", "https://www.mangayami.club", "en", overrideVersionCode = 2),
|
SingleLang("MangaYami", "https://www.mangayami.club", "en", overrideVersionCode = 2),
|
||||||
|
SingleLang("Mangá Nanquim", "https://mangananquim.com", "pt-BR", className = "MangaNanquim"),
|
||||||
SingleLang("Manhastro", "https://manhastro.com", "pt-BR"),
|
SingleLang("Manhastro", "https://manhastro.com", "pt-BR"),
|
||||||
SingleLang("Manhatic", "https://manhatic.com", "ar", isNsfw = true),
|
SingleLang("Manhatic", "https://manhatic.com", "ar", isNsfw = true),
|
||||||
SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 6),
|
SingleLang("Manhua ES", "https://manhuaes.com", "en", overrideVersionCode = 6),
|
||||||
|
@ -319,12 +318,12 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("ManhuaBox", "https://manhuabox.net", "en", overrideVersionCode = 2),
|
SingleLang("ManhuaBox", "https://manhuabox.net", "en", overrideVersionCode = 2),
|
||||||
SingleLang("ManhuaChill", "https://manhuachill.com", "en"),
|
SingleLang("ManhuaChill", "https://manhuachill.com", "en"),
|
||||||
SingleLang("ManhuaDex", "https://manhuadex.com", "en", isNsfw = false),
|
SingleLang("ManhuaDex", "https://manhuadex.com", "en", isNsfw = false),
|
||||||
SingleLang("ManhuaFast.net (unoriginal)", "https://manhuafast.net", "en", isNsfw = false, className = "ManhuaFastNet"),
|
|
||||||
SingleLang("ManhuaFast", "https://manhuafast.com", "en", overrideVersionCode = 3),
|
SingleLang("ManhuaFast", "https://manhuafast.com", "en", overrideVersionCode = 3),
|
||||||
|
SingleLang("ManhuaFast.net (unoriginal)", "https://manhuafast.net", "en", isNsfw = false, className = "ManhuaFastNet"),
|
||||||
SingleLang("Manhuaga", "https://manhuaga.com", "en", overrideVersionCode = 2),
|
SingleLang("Manhuaga", "https://manhuaga.com", "en", overrideVersionCode = 2),
|
||||||
SingleLang("ManhuaHot", "https://manhuahot.com", "en"),
|
SingleLang("ManhuaHot", "https://manhuahot.com", "en"),
|
||||||
SingleLang("ManhuaManhwa.online", "https://manhuamanhwa.online", "en", isNsfw = false, className = "ManhuaManhwaOnline"),
|
|
||||||
SingleLang("ManhuaManhwa", "https://manhuamanhwa.com", "en", isNsfw = true),
|
SingleLang("ManhuaManhwa", "https://manhuamanhwa.com", "en", isNsfw = true),
|
||||||
|
SingleLang("ManhuaManhwa.online", "https://manhuamanhwa.online", "en", isNsfw = false, className = "ManhuaManhwaOnline"),
|
||||||
SingleLang("ManhuaScan.info (unoriginal)", "https://manhuascan.info", "en", isNsfw = true, className = "ManhuaScanInfo"),
|
SingleLang("ManhuaScan.info (unoriginal)", "https://manhuascan.info", "en", isNsfw = true, className = "ManhuaScanInfo"),
|
||||||
SingleLang("ManhuaUS", "https://manhuaus.com", "en", overrideVersionCode = 5),
|
SingleLang("ManhuaUS", "https://manhuaus.com", "en", overrideVersionCode = 5),
|
||||||
SingleLang("ManhuaZone", "https://manhuazone.org", "en", overrideVersionCode = 1),
|
SingleLang("ManhuaZone", "https://manhuazone.org", "en", overrideVersionCode = 1),
|
||||||
|
@ -349,8 +348,8 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Mantraz Scan", "https://mantrazscan.com", "es"),
|
SingleLang("Mantraz Scan", "https://mantrazscan.com", "es"),
|
||||||
SingleLang("ManWe", "https://manwe.pro", "tr", className = "EvaScans", overrideVersionCode = 1),
|
SingleLang("ManWe", "https://manwe.pro", "tr", className = "EvaScans", overrideVersionCode = 1),
|
||||||
SingleLang("ManyComic", "https://manycomic.com", "en", isNsfw = true, overrideVersionCode = 1),
|
SingleLang("ManyComic", "https://manycomic.com", "en", isNsfw = true, overrideVersionCode = 1),
|
||||||
SingleLang("ManyToon.me", "https://manytoon.me", "en", isNsfw = true, className = "ManyToonMe", overrideVersionCode = 5),
|
|
||||||
SingleLang("ManyToon", "https://manytoon.com", "en", isNsfw = true, overrideVersionCode = 5),
|
SingleLang("ManyToon", "https://manytoon.com", "en", isNsfw = true, overrideVersionCode = 5),
|
||||||
|
SingleLang("ManyToon.me", "https://manytoon.me", "en", isNsfw = true, className = "ManyToonMe", overrideVersionCode = 5),
|
||||||
SingleLang("ManyToonClub", "https://manytoon.club", "ko", isNsfw = true, overrideVersionCode = 2),
|
SingleLang("ManyToonClub", "https://manytoon.club", "ko", isNsfw = true, overrideVersionCode = 2),
|
||||||
SingleLang("MG Komik", "https://mgkomik.id", "id", overrideVersionCode = 11),
|
SingleLang("MG Komik", "https://mgkomik.id", "id", overrideVersionCode = 11),
|
||||||
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 6),
|
SingleLang("Midnight Mess Scans", "https://midnightmess.org", "en", isNsfw = true, overrideVersionCode = 6),
|
||||||
|
@ -505,18 +504,19 @@ class MadaraGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 3),
|
SingleLang("Yuri Verso", "https://yuri.live", "pt-BR", overrideVersionCode = 3),
|
||||||
SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"),
|
SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"),
|
||||||
SingleLang("ZinChanManga", "https://zinchanmanga.com", "en", isNsfw = true),
|
SingleLang("ZinChanManga", "https://zinchanmanga.com", "en", isNsfw = true),
|
||||||
SingleLang("ZinManga.top (unoriginal)", "https://zinmanga.top", "en", isNsfw = false, className = "ZinMangaTop"),
|
|
||||||
SingleLang("Zinmanga", "https://zinmanga.com", "en", overrideVersionCode = 1),
|
SingleLang("Zinmanga", "https://zinmanga.com", "en", overrideVersionCode = 1),
|
||||||
|
SingleLang("ZinManga.top (unoriginal)", "https://zinmanga.top", "en", isNsfw = false, className = "ZinMangaTop"),
|
||||||
SingleLang("Zinmanhwa", "https://zinmanhwa.com", "en"),
|
SingleLang("Zinmanhwa", "https://zinmanhwa.com", "en"),
|
||||||
SingleLang("ZuttoManga", "https://zuttomanga.com", "en", overrideVersionCode = 1),
|
SingleLang("ZuttoManga", "https://zuttomanga.com", "en", overrideVersionCode = 1),
|
||||||
|
SingleLang("Çizgi Roman Arşivi", "https://cizgiromanarsivi.com", "tr", className = "CizgiRomanArsivi"),
|
||||||
SingleLang("شبكة كونان العربية", "https://manga.detectiveconanar.com", "ar", className = "DetectiveConanAr", overrideVersionCode = 2),
|
SingleLang("شبكة كونان العربية", "https://manga.detectiveconanar.com", "ar", className = "DetectiveConanAr", overrideVersionCode = 2),
|
||||||
SingleLang("عرب تونز", "https://arabtoons.net", "ar", isNsfw = true, className = "ArabToons"),
|
SingleLang("عرب تونز", "https://arabtoons.net", "ar", isNsfw = true, className = "ArabToons"),
|
||||||
|
SingleLang("فالكون مانجا", "https://falconmanga.com", "ar", className = "FalconManga"),
|
||||||
|
SingleLang("كوميك العرب", "https://comicarab.com", "ar", isNsfw = true, className = "ComicArab"),
|
||||||
SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq", overrideVersionCode = 2),
|
SingleLang("مانجا العاشق", "https://3asq.org", "ar", className = "Manga3asq", overrideVersionCode = 2),
|
||||||
SingleLang("مانجا ليك", "https://manga-lek.net", "ar", className = "Mangalek", overrideVersionCode = 4),
|
SingleLang("مانجا ليك", "https://manga-lek.net", "ar", className = "Mangalek", overrideVersionCode = 4),
|
||||||
SingleLang("مانجا ليكس", "https://mangaleks.com", "ar", className = "MangaLeks"),
|
SingleLang("مانجا ليكس", "https://mangaleks.com", "ar", className = "MangaLeks"),
|
||||||
SingleLang("مانجا لينك", "https://mangalink.io", "ar", className = "MangaLinkio", overrideVersionCode = 3),
|
SingleLang("مانجا لينك", "https://mangalink.io", "ar", className = "MangaLinkio", overrideVersionCode = 3),
|
||||||
SingleLang("كوميك العرب", "https://comicarab.com", "ar", isNsfw = true, className = "ComicArab"),
|
|
||||||
SingleLang("فالكون مانجا", "https://falconmanga.com", "ar", className = "FalconManga"),
|
|
||||||
SingleLang("巴卡漫画", "https://bakamh.com", "zh", isNsfw = true, className = "Bakamh"),
|
SingleLang("巴卡漫画", "https://bakamh.com", "zh", isNsfw = true, className = "Bakamh"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -68,8 +68,8 @@ class MangaThemesiaGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo", overrideVersionCode = 3),
|
SingleLang("KomikIndo.co", "https://komikindo.co", "id", className = "KomikindoCo", overrideVersionCode = 3),
|
||||||
SingleLang("KomikMama", "https://komikmama.co", "id", overrideVersionCode = 1),
|
SingleLang("KomikMama", "https://komikmama.co", "id", overrideVersionCode = 1),
|
||||||
SingleLang("KomikManhwa", "https://komikmanhwa.me", "id", isNsfw = true),
|
SingleLang("KomikManhwa", "https://komikmanhwa.me", "id", isNsfw = true),
|
||||||
SingleLang("Komiktap", "https://komiktap.me", "id", isNsfw = true),
|
|
||||||
SingleLang("Komiksan", "https://komiksan.link", "id", overrideVersionCode = 2),
|
SingleLang("Komiksan", "https://komiksan.link", "id", overrideVersionCode = 2),
|
||||||
|
SingleLang("Komiktap", "https://komiktap.me", "id", isNsfw = true),
|
||||||
SingleLang("Komiku.com", "https://komiku.com", "id", className = "KomikuCom"),
|
SingleLang("Komiku.com", "https://komiku.com", "id", className = "KomikuCom"),
|
||||||
SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans", overrideVersionCode = 1),
|
SingleLang("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en", className = "KumaScans", overrideVersionCode = 1),
|
||||||
SingleLang("KumaPoi", "https://kumapoi.info", "id", isNsfw = true, overrideVersionCode = 3),
|
SingleLang("KumaPoi", "https://kumapoi.info", "id", isNsfw = true, overrideVersionCode = 3),
|
||||||
|
@ -86,7 +86,6 @@ class MangaThemesiaGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("Mangacim", "https://www.mangacim.com", "tr", overrideVersionCode = 1),
|
SingleLang("Mangacim", "https://www.mangacim.com", "tr", overrideVersionCode = 1),
|
||||||
SingleLang("MangaKita", "https://mangakita.id", "id", overrideVersionCode = 2),
|
SingleLang("MangaKita", "https://mangakita.id", "id", overrideVersionCode = 2),
|
||||||
SingleLang("Mangakyo", "https://mangakyo.org", "id", overrideVersionCode = 3),
|
SingleLang("Mangakyo", "https://mangakyo.org", "id", overrideVersionCode = 3),
|
||||||
SingleLang("Mangás Chan", "https://mangaschan.net", "pt-BR", className = "MangasChan", overrideVersionCode = 1),
|
|
||||||
SingleLang("MangaShiina", "https://mangashiina.com", "es"),
|
SingleLang("MangaShiina", "https://mangashiina.com", "es"),
|
||||||
SingleLang("MangaShiro", "https://mangashiro.me", "id"),
|
SingleLang("MangaShiro", "https://mangashiro.me", "id"),
|
||||||
SingleLang("Mangasusu", "https://mangasusuku.xyz", "id", isNsfw = true, overrideVersionCode = 3),
|
SingleLang("Mangasusu", "https://mangasusuku.xyz", "id", isNsfw = true, overrideVersionCode = 3),
|
||||||
|
@ -94,6 +93,7 @@ class MangaThemesiaGenerator : ThemeSourceGenerator {
|
||||||
SingleLang("MangaTale", "https://mangatale.co", "id", overrideVersionCode = 1),
|
SingleLang("MangaTale", "https://mangatale.co", "id", overrideVersionCode = 1),
|
||||||
SingleLang("MangaWT", "https://mangawt.com", "tr", overrideVersionCode = 5),
|
SingleLang("MangaWT", "https://mangawt.com", "tr", overrideVersionCode = 5),
|
||||||
SingleLang("Mangayaro", "https://www.mangayaro.id", "id", overrideVersionCode = 1),
|
SingleLang("Mangayaro", "https://www.mangayaro.id", "id", overrideVersionCode = 1),
|
||||||
|
SingleLang("Mangás Chan", "https://mangaschan.net", "pt-BR", className = "MangasChan", overrideVersionCode = 1),
|
||||||
SingleLang("Mangás Online", "https://mangasonline.cc", "pt-BR", className = "MangasOnline"),
|
SingleLang("Mangás Online", "https://mangasonline.cc", "pt-BR", className = "MangasOnline"),
|
||||||
SingleLang("Manhwa Freak", "https://manhwa-freak.com", "en", overrideVersionCode = 3),
|
SingleLang("Manhwa Freak", "https://manhwa-freak.com", "en", overrideVersionCode = 3),
|
||||||
SingleLang("Manhwa Lover", "https://manhwalover.com", "en", isNsfw = true, overrideVersionCode = 1),
|
SingleLang("Manhwa Lover", "https://manhwalover.com", "en", isNsfw = true, overrideVersionCode = 1),
|
||||||
|
|
|
@ -456,7 +456,7 @@ open class BatoTo(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val script = document.selectFirst("script:containsData(imgHttpLis):containsData(batoWord):containsData(batoPass)")?.html()
|
val script = document.selectFirst("script:containsData(imgHttps):containsData(batoWord):containsData(batoPass)")?.html()
|
||||||
?: throw RuntimeException("Couldn't find script with image data.")
|
?: throw RuntimeException("Couldn't find script with image data.")
|
||||||
|
|
||||||
val imgHttpsString = script.substringAfter("const imgHttps =").substringBefore(";").trim()
|
val imgHttpsString = script.substringAfter("const imgHttps =").substringBefore(";").trim()
|
||||||
|
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
0
src/all/vinnieVeritas/src/eu/kanade/tachiyomi/extension/all/vinnieVeritas/vinnieVeritas.kt
Executable file → Normal file
0
src/all/vinnieVeritas/src/eu/kanade/tachiyomi/extension/all/vinnieVeritas/vinnieVeritasFactory.kt
Executable file → Normal file
|
@ -2,7 +2,7 @@ ext {
|
||||||
extName = 'Team X'
|
extName = 'Team X'
|
||||||
pkgNameSuffix = 'ar.teamx'
|
pkgNameSuffix = 'ar.teamx'
|
||||||
extClass = '.TeamX'
|
extClass = '.TeamX'
|
||||||
extVersionCode = 15
|
extVersionCode = 16
|
||||||
isNsfw = false
|
isNsfw = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ class TeamX : ParsedHttpSource() {
|
||||||
|
|
||||||
override val name = "Team X"
|
override val name = "Team X"
|
||||||
|
|
||||||
override val baseUrl = "https://team11x11.com"
|
override val baseUrl = "https://team1x12.com"
|
||||||
|
|
||||||
override val lang = "ar"
|
override val lang = "ar"
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest package="eu.kanade.tachiyomi.extension" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<application>
|
||||||
|
<activity
|
||||||
|
android:name=".en.reaperscans.ReaperScansUrlActivity"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:exported="true"
|
||||||
|
android:theme="@android:style/Theme.NoDisplay">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
|
||||||
|
<data
|
||||||
|
android:host="reaperscans.com"
|
||||||
|
android:pathPattern="/comics/..*"
|
||||||
|
android:scheme="https" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
|
@ -0,0 +1,8 @@
|
||||||
|
ext {
|
||||||
|
extName = 'Reaper Scans'
|
||||||
|
pkgNameSuffix = 'en.reaperscans'
|
||||||
|
extClass = '.ReaperScans'
|
||||||
|
extVersionCode = 47
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "$rootDir/common.gradle"
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,21 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.reaperscans
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class LiveWireResponseDto(
|
||||||
|
val effects: LiveWireEffectsDto,
|
||||||
|
val serverMemo: JsonObject,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class LiveWireEffectsDto(
|
||||||
|
val html: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class LiveWireDataDto(
|
||||||
|
val fingerprint: JsonObject,
|
||||||
|
val serverMemo: JsonObject,
|
||||||
|
)
|
|
@ -0,0 +1,34 @@
|
||||||
|
package eu.kanade.tachiyomi.extension.en.reaperscans
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.ActivityNotFoundException
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
class ReaperScansUrlActivity : Activity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val pathSegments = intent?.data?.pathSegments
|
||||||
|
if (pathSegments != null && pathSegments.size >= 2) {
|
||||||
|
val id = pathSegments[1]
|
||||||
|
val mainIntent = Intent().apply {
|
||||||
|
action = "eu.kanade.tachiyomi.SEARCH"
|
||||||
|
putExtra("query", ReaperScans.PREFIX_ID_SEARCH + id)
|
||||||
|
putExtra("filter", packageName)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
startActivity(mainIntent)
|
||||||
|
} catch (e: ActivityNotFoundException) {
|
||||||
|
Log.e("ReaperScansUrlActivity", e.toString())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.e("ReaperScansUrlActivity", "could not parse uri from intent $intent")
|
||||||
|
}
|
||||||
|
|
||||||
|
finish()
|
||||||
|
exitProcess(0)
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ ext {
|
||||||
extName = 'Zero Scans'
|
extName = 'Zero Scans'
|
||||||
pkgNameSuffix = 'en.zeroscans'
|
pkgNameSuffix = 'en.zeroscans'
|
||||||
extClass = '.ZeroScans'
|
extClass = '.ZeroScans'
|
||||||
extVersionCode = 6
|
extVersionCode = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -26,7 +26,7 @@ class ZeroScans : HttpSource() {
|
||||||
|
|
||||||
override val lang: String = "en"
|
override val lang: String = "en"
|
||||||
|
|
||||||
override val baseUrl: String = "https://zeroscans.com"
|
override val baseUrl: String = "https://zscans.com"
|
||||||
|
|
||||||
override val supportsLatest: Boolean = true
|
override val supportsLatest: Boolean = true
|
||||||
|
|
||||||
|
|
0
src/es/ikuhentai/src/eu/kanade/tachiyomi/extension/es/ikuhentai/Ikuhentai.kt
Executable file → Normal file
0
src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt
Executable file → Normal file
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
0
src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt
Executable file → Normal file
0
src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt
Executable file → Normal file
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |