diff --git a/.editorconfig b/.editorconfig
index 79a8309183..ebf0322a0d 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -12,3 +12,8 @@ ij_kotlin_allow_trailing_comma = true
ij_kotlin_allow_trailing_comma_on_call_site = true
ij_kotlin_name_count_to_use_star_import = 2147483647
ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
+
+[*.properties]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
diff --git a/.github/scripts/create-repo.sh b/.github/scripts/create-repo.sh
index ca905c2ff4..9bb13b3409 100755
--- a/.github/scripts/create-repo.sh
+++ b/.github/scripts/create-repo.sh
@@ -30,7 +30,10 @@ for APK in ${APKS[@]}; do
LANG=$(echo $APK | grep -Po "tachiyomi-\K[^\.]+")
ICON=$(echo "$BADGING" | grep -Po "application-icon-320.*'\K[^']+")
- unzip -p $APK $ICON > icon/${FILENAME%.*}.png
+ unzip -p $APK $ICON > icon/${PKGNAME}.png
+
+ # TODO: legacy icons; remove after a while
+ cp icon/${PKGNAME}.png icon/${FILENAME%.*}.png
SOURCE_INFO=$(jq ".[\"$PKGNAME\"]" < ../output.json)
diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml
index d72c89c7ab..77cbcb99f2 100644
--- a/.github/workflows/build_pull_request.yml
+++ b/.github/workflows/build_pull_request.yml
@@ -26,7 +26,7 @@ jobs:
CI_MODULE_GEN: true
steps:
- name: Clone repo
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
@@ -105,7 +105,7 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }}
steps:
- name: Checkout PR
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Set up JDK
uses: actions/setup-java@v3
@@ -139,7 +139,7 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }}
steps:
- name: Checkout PR
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Set up JDK
uses: actions/setup-java@v3
diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml
index 085e57ee59..5f15f39ada 100644
--- a/.github/workflows/build_push.yml
+++ b/.github/workflows/build_push.yml
@@ -28,7 +28,7 @@ jobs:
CI_MODULE_GEN: true
steps:
- name: Clone repo
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
@@ -72,7 +72,7 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }}
steps:
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Set up JDK
uses: actions/setup-java@v3
@@ -120,7 +120,7 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }}
steps:
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
- name: Set up JDK
uses: actions/setup-java@v3
@@ -169,11 +169,11 @@ jobs:
- name: Set up JDK
uses: actions/setup-java@v3
with:
- java-version: 11
+ java-version: 17
distribution: adopt
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
with:
ref: master
path: master
@@ -187,7 +187,7 @@ jobs:
java -jar ./Inspector.jar "apk" "output.json" "tmp"
./.github/scripts/create-repo.sh
- name: Checkout repo branch
- uses: actions/checkout@v3
+ uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4
with:
ref: repo
path: repo
diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml
index 299349cc62..a08bc857f4 100644
--- a/.github/workflows/issue_moderator.yml
+++ b/.github/workflows/issue_moderator.yml
@@ -43,17 +43,17 @@ jobs:
},
{
"type": "both",
- "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|reaper\\s*scans).*",
+ "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|day\\s*comics?|reaper\\s*scans|constellar\\s*scans|mode\\s*scanlator|bakai|japscan).*",
"ignoreCase": true,
"labels": ["invalid"],
- "message": "{match} will not be added back as it is too difficult to maintain. Read #3475 for more information."
+ "message": "{match} will not be added back as it is too difficult to maintain. Read [this](https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master/REMOVED_SOURCES.md) for more information."
},
{
"type": "both",
- "regex": ".*(komiktap|gourmet\\s*scans|mangawow|mangagegecesi|knightnoscanlations|ahstudios|mangagecesi|nartag|xxx\\s*yaoi|yaoi\\s*fan\\s*clube|luminous|dragontea|manhwaid\\.org|reset(?:\\s*|-)scan|manga-flix\\.com|astra\\s*scans|manganoon|manga(?:-|\\s*)pro|coven\\s*scans?|shinobiscans|plot ?twist ?no ?fansub(?: ?scans?)?|plot-twistnf-scans(?:\\.com)?|mhscans|realm ?scans?).*",
+ "regex": ".*(komiktap|gourmet\\s*scans|mangawow|knightnoscanlations|mangasy|nartag|xxx\\s*yaoi|luminous|hunters\\s*scan|reset(?:\\s*|-)scan|astra\\s*scans|manga(?:-|\\s*)pro|shinobiscans|plot ?twist ?no ?fansub(?: ?scans?)?|plot-twistnf-scans(?:\\.com)?|mhscans|aresmanga|realm ?scans?|mono ?manga).*",
"ignoreCase": true,
"labels": ["invalid"],
- "message": "{match} will not be added back as the scanlator team has requested it to be removed. Read #3475 for more information."
+ "message": "{match} will not be added back as the scanlator team has requested it to be removed. Read [this](https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master/REMOVED_SOURCES.md) for more information."
},
{
"type": "both",
diff --git a/.run/FlixScansGenerator.run.xml b/.run/FlixScansGenerator.run.xml
new file mode 100644
index 0000000000..bbb4ce682e
--- /dev/null
+++ b/.run/FlixScansGenerator.run.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b3e1db9c0a..e4f6f65168 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -257,6 +257,16 @@ dependencies {
}
```
+#### i18n library
+
+[`lib-i18n`](https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/lib/i18n) is a library for handling internationalization in the sources. It allows loading `.properties` files with messages located under the `assets/i18n` folder of each extension, that can be used to translate strings under the source.
+
+```gradle
+dependencies {
+ implementation(project(':lib-i18n'))
+}
+```
+
#### Additional dependencies
If you find yourself needing additional functionality, you can add more dependencies to your `build.gradle` file.
@@ -297,7 +307,7 @@ a.k.a. the Browse source entry point in the app (invoked by tapping on the sourc
- The app calls `fetchPopularManga` which should return a `MangasPage` containing the first batch of found `SManga` entries.
- This method supports pagination. When user scrolls the manga list and more results must be fetched, the app calls it again with increasing `page` values (starting with `page=1`). This continues while `MangasPage.hasNextPage` is passed as `true` and `MangasPage.mangas` is not empty.
- To show the list properly, the app needs `url`, `title` and `thumbnail_url`. You **must** set them here. The rest of the fields could be filled later (refer to Manga Details below).
- - You should set `thumbnail_url` if is available, if not, `fetchMangaDetails` will be **immediately** called (this will increase network calls heavily and should be avoided).
+ - You should set `thumbnail_url` if is available, if not, `getMangaDetails` will be **immediately** called (this will increase network calls heavily and should be avoided).
#### Latest Manga
@@ -314,7 +324,7 @@ a.k.a. the Latest source entry point in the app (invoked by tapping on the "Late
##### Filters
-The search flow have support to filters that can be added to a `FilterList` inside the `getFilterList` method. When the user changes the filters' state, they will be passed to the `searchRequest`, and they can be iterated to create the request (by getting the `filter.state` value, where the type varies depending on the `Filter` used). You can check the filter types available [here](https://github.com/tachiyomiorg/tachiyomi/blob/master/app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt) and in the table below.
+The search flow have support to filters that can be added to a `FilterList` inside the `getFilterList` method. When the user changes the filters' state, they will be passed to the `searchRequest`, and they can be iterated to create the request (by getting the `filter.state` value, where the type varies depending on the `Filter` used). You can check the filter types available [here](https://github.com/tachiyomiorg/tachiyomi/blob/master/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/Filter.kt) and in the table below.
| Filter | State type | Description |
| ------ | ---------- | ----------- |
@@ -340,15 +350,15 @@ open class UriPartFilter(displayName: String, private val vals: Array
-
+
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index 90524827b0..d3e951c3e0 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -9,6 +9,8 @@ android {
minSdk = AndroidConfig.minSdk
}
+ namespace = "eu.kanade.tachiyomi.extension"
+
sourceSets {
named("main") {
manifest.srcFile("AndroidManifest.xml")
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index bb80878998..88100fa5ca 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -4,7 +4,7 @@ coroutines_version = "1.6.4"
serialization_version = "1.4.0"
[libraries]
-gradle-agp = { module = "com.android.tools.build:gradle", version = "7.4.1" }
+gradle-agp = { module = "com.android.tools.build:gradle", version = "7.4.2" }
gradle-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin_version" }
gradle-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin_version" }
gradle-kotlinter = { module = "org.jmailen.gradle:kotlinter-gradle", version = "3.13.0" }
@@ -19,7 +19,6 @@ coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", ve
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines_version" }
injekt-core = { module = "com.github.inorichi.injekt:injekt-core", version = "65b0440" }
-rxandroid = { module = "io.reactivex:rxandroid", version = "1.2.1" }
rxjava = { module = "io.reactivex:rxjava", version = "1.3.8" }
jsoup = { module = "org.jsoup:jsoup", version = "1.15.1" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version = "5.0.0-alpha.11" }
@@ -27,4 +26,3 @@ quickjs = { module = "app.cash.quickjs:quickjs-android", version = "0.9.2" }
[bundles]
common = ["kotlin-stdlib", "coroutines-core", "coroutines-android", "injekt-core", "rxjava", "kotlin-protobuf", "kotlin-json", "jsoup", "okhttp", "tachiyomi-lib", "quickjs"]
-reactivex = ["rxandroid"]
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 7454180f2a..943f0cbfa7 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 070cb702f0..ac72c34e8a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 1b6c787337..65dcd68d65 100755
--- a/gradlew
+++ b/gradlew
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,10 +80,10 @@ do
esac
done
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-APP_NAME="Gradle"
+# This is normally unused
+# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
@@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -205,6 +209,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
diff --git a/gradlew.bat b/gradlew.bat
index ac1b06f938..6689b85bee 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/lib/cryptoaes/build.gradle.kts b/lib/cryptoaes/build.gradle.kts
index 5eaa29645e..caabcb291e 100644
--- a/lib/cryptoaes/build.gradle.kts
+++ b/lib/cryptoaes/build.gradle.kts
@@ -10,6 +10,8 @@ android {
minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk
}
+
+ namespace = "eu.kanade.tachiyomi.lib.cryptoaes"
}
repositories {
diff --git a/lib/cryptoaes/src/main/AndroidManifest.xml b/lib/cryptoaes/src/main/AndroidManifest.xml
deleted file mode 100644
index 1ac16ea735..0000000000
--- a/lib/cryptoaes/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
diff --git a/lib/dataimage/build.gradle.kts b/lib/dataimage/build.gradle.kts
index d02fbec564..d5fcea1dfa 100644
--- a/lib/dataimage/build.gradle.kts
+++ b/lib/dataimage/build.gradle.kts
@@ -10,6 +10,8 @@ android {
minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk
}
+
+ namespace = "eu.kanade.tachiyomi.lib.dataimage"
}
repositories {
diff --git a/lib/dataimage/src/main/AndroidManifest.xml b/lib/dataimage/src/main/AndroidManifest.xml
deleted file mode 100644
index 11d9e3ff5b..0000000000
--- a/lib/dataimage/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
diff --git a/lib/i18n/build.gradle.kts b/lib/i18n/build.gradle.kts
new file mode 100644
index 0000000000..4a741aa0a5
--- /dev/null
+++ b/lib/i18n/build.gradle.kts
@@ -0,0 +1,23 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ targetSdk = AndroidConfig.targetSdk
+ }
+
+ namespace = "eu.kanade.tachiyomi.lib.i18n"
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compileOnly(libs.kotlin.stdlib)
+}
diff --git a/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt b/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt
new file mode 100644
index 0000000000..7899da8cae
--- /dev/null
+++ b/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt
@@ -0,0 +1,89 @@
+package eu.kanade.tachiyomi.lib.i18n
+
+import java.io.InputStreamReader
+import java.text.Collator
+import java.util.Locale
+import java.util.PropertyResourceBundle
+
+/**
+ * A simple wrapper to make internationalization easier to use in sources.
+ *
+ * Message files should be put in the `assets/i18n` folder, with the name
+ * `messages_{iso_639_1}.properties`, where `iso_639_1` should be using
+ * snake case and be in lowercase.
+ *
+ * To edit the strings, use the official JetBrain's
+ * [Resource Bundle Editor plugin](https://plugins.jetbrains.com/plugin/17035-resource-bundle-editor).
+ *
+ * Make sure to configure Android Studio to save Properties files as UTF-8 as well.
+ * You can refer to this [documentation](https://www.jetbrains.com/help/idea/properties-files.html#1cbc434e)
+ * on how to do so.
+ */
+class Intl(
+ private val language: String,
+ private val baseLanguage: String,
+ private val availableLanguages: Set,
+ private val classLoader: ClassLoader,
+ private val createMessageFileName: (String) -> String = { createDefaultMessageFileName(it) }
+) {
+
+ val chosenLanguage: String = when (language) {
+ in availableLanguages -> language
+ else -> baseLanguage
+ }
+
+ private val locale: Locale = Locale.forLanguageTag(chosenLanguage)
+
+ val collator: Collator = Collator.getInstance(locale)
+
+ private val baseBundle: PropertyResourceBundle by lazy { createBundle(baseLanguage) }
+
+ private val bundle: PropertyResourceBundle by lazy {
+ if (chosenLanguage == baseLanguage) baseBundle else createBundle(chosenLanguage)
+ }
+
+ /**
+ * Returns the string from the message file. If the [key] is not present
+ * in the current language, the English value will be returned. If the [key]
+ * is also not present in English, the [key] surrounded by brackets will be returned.
+ */
+ operator fun get(key: String): String = when {
+ bundle.containsKey(key) -> bundle.getString(key)
+ baseBundle.containsKey(key) -> baseBundle.getString(key)
+ else -> "[$key]"
+ }
+
+ /**
+ * Uses the string as a format string and returns a string obtained by
+ * substituting the specified arguments, using the instance locale.
+ */
+ fun format(key: String, vararg args: Any?) = get(key).format(locale, *args)
+
+ fun languageDisplayName(localeCode: String): String =
+ Locale.forLanguageTag(localeCode)
+ .getDisplayName(locale)
+ .replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() }
+
+ /**
+ * Creates a [PropertyResourceBundle] instance from the language specified.
+ * The expected message file will be loaded from the `res/raw`.
+ *
+ * The [PropertyResourceBundle] is used directly instead of [java.util.ResourceBundle]
+ * because the later has issues with UTF-8 files in Java 8, which would need
+ * the message files to be saved in ISO-8859-1, making the file readability bad.
+ */
+ private fun createBundle(lang: String): PropertyResourceBundle {
+ val fileName = createMessageFileName(lang)
+ val fileContent = classLoader.getResourceAsStream(fileName)
+
+ return PropertyResourceBundle(InputStreamReader(fileContent, "UTF-8"))
+ }
+
+ companion object {
+ fun createDefaultMessageFileName(lang: String): String {
+ val langSnakeCase = lang.replace("-", "_").lowercase()
+
+ return "assets/i18n/messages_$langSnakeCase.properties"
+ }
+ }
+}
diff --git a/lib/randomua/build.gradle.kts b/lib/randomua/build.gradle.kts
new file mode 100644
index 0000000000..39942da283
--- /dev/null
+++ b/lib/randomua/build.gradle.kts
@@ -0,0 +1,24 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+ id("kotlinx-serialization")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ targetSdk = AndroidConfig.targetSdk
+ }
+
+ namespace = "eu.kanade.tachiyomi.lib.randomua"
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compileOnly(libs.bundles.common)
+}
diff --git a/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentInterceptor.kt b/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentInterceptor.kt
new file mode 100644
index 0000000000..0d36add8af
--- /dev/null
+++ b/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentInterceptor.kt
@@ -0,0 +1,121 @@
+package eu.kanade.tachiyomi.lib.randomua
+
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.NetworkHelper
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import okhttp3.Interceptor
+import okhttp3.OkHttpClient
+import okhttp3.Response
+import uy.kohesive.injekt.injectLazy
+import java.io.IOException
+
+private class RandomUserAgentInterceptor(
+ private val userAgentType: UserAgentType,
+ private val customUA: String?,
+ private val filterInclude: List,
+ private val filterExclude: List,
+) : Interceptor {
+
+ private var userAgent: String? = null
+
+ private val json: Json by injectLazy()
+
+ private val network: NetworkHelper by injectLazy()
+
+ private val client = network.client
+
+ override fun intercept(chain: Interceptor.Chain): Response {
+ try {
+ val originalRequest = chain.request()
+
+ val newUserAgent = getUserAgent()
+ ?: return chain.proceed(originalRequest)
+
+ val originalHeaders = originalRequest.headers
+
+ val modifiedHeaders = originalHeaders.newBuilder()
+ .set("User-Agent", newUserAgent)
+ .build()
+
+ return chain.proceed(
+ originalRequest.newBuilder()
+ .headers(modifiedHeaders)
+ .build()
+ )
+ } catch (e: Exception) {
+ throw IOException(e.message)
+ }
+ }
+
+ private fun getUserAgent(): String? {
+ if (userAgentType == UserAgentType.OFF) {
+ return customUA?.ifBlank { null }
+ }
+
+ if (!userAgent.isNullOrEmpty()) return userAgent
+
+ val uaResponse = client.newCall(GET(UA_DB_URL)).execute()
+
+ if (!uaResponse.isSuccessful) {
+ uaResponse.close()
+ return null
+ }
+
+ val userAgentList = uaResponse.use { json.decodeFromString(it.body.string()) }
+
+ return when (userAgentType) {
+ UserAgentType.DESKTOP -> userAgentList.desktop
+ UserAgentType.MOBILE -> userAgentList.mobile
+ else -> error("Expected UserAgentType.DESKTOP or UserAgentType.MOBILE but got UserAgentType.${userAgentType.name} instead")
+ }
+ .filter {
+ filterInclude.isEmpty() || filterInclude.any { filter ->
+ it.contains(filter, ignoreCase = true)
+ }
+ }
+ .filterNot {
+ filterExclude.any { filter ->
+ it.contains(filter, ignoreCase = true)
+ }
+ }
+ .randomOrNull()
+ .also { userAgent = it }
+ }
+
+ companion object {
+ private const val UA_DB_URL = "https://tachiyomiorg.github.io/user-agents/user-agents.json"
+ }
+}
+
+/**
+ * Helper function to add a latest random user agent interceptor.
+ * The interceptor will added at the first position in the chain,
+ * so the CloudflareInterceptor in the app will be able to make usage of it.
+ *
+ * @param userAgentType User Agent type one of (DESKTOP, MOBILE, OFF)
+ * @param customUA Optional custom user agent used when userAgentType is OFF
+ * @param filterInclude Filter to only include User Agents containing these strings
+ * @param filterExclude Filter to exclude User Agents containing these strings
+ */
+fun OkHttpClient.Builder.setRandomUserAgent(
+ userAgentType: UserAgentType,
+ customUA: String? = null,
+ filterInclude: List = emptyList(),
+ filterExclude: List = emptyList(),
+) = apply {
+ interceptors().add(0, RandomUserAgentInterceptor(userAgentType, customUA, filterInclude, filterExclude))
+}
+
+enum class UserAgentType {
+ MOBILE,
+ DESKTOP,
+ OFF
+}
+
+@Serializable
+private data class UserAgentList(
+ val desktop: List,
+ val mobile: List
+)
diff --git a/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentPreference.kt b/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentPreference.kt
new file mode 100644
index 0000000000..a92e67fa95
--- /dev/null
+++ b/lib/randomua/src/main/java/eu/kanade/tachiyomi/lib/randomua/RandomUserAgentPreference.kt
@@ -0,0 +1,70 @@
+package eu.kanade.tachiyomi.lib.randomua
+
+import android.content.SharedPreferences
+import android.widget.Toast
+import androidx.preference.EditTextPreference
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import okhttp3.Headers
+
+
+ /**
+ * Helper function to return UserAgentType based on SharedPreference value
+ */
+fun SharedPreferences.getPrefUAType(): UserAgentType {
+ return when (getString(PREF_KEY_RANDOM_UA, "off")) {
+ "mobile" -> UserAgentType.MOBILE
+ "desktop" -> UserAgentType.DESKTOP
+ else -> UserAgentType.OFF
+ }
+}
+
+/**
+ * Helper function to return custom UserAgent from SharedPreference
+ */
+fun SharedPreferences.getPrefCustomUA(): String? {
+ return getString(PREF_KEY_CUSTOM_UA, null)
+}
+
+/**
+ * Helper function to add Random User-Agent settings to SharedPreference
+ *
+ * @param screen, PreferenceScreen from `setupPreferenceScreen`
+ */
+fun addRandomUAPreferenceToScreen(
+ screen: PreferenceScreen,
+) {
+ ListPreference(screen.context).apply {
+ key = PREF_KEY_RANDOM_UA
+ title = TITLE_RANDOM_UA
+ entries = RANDOM_UA_ENTRIES
+ entryValues = RANDOM_UA_VALUES
+ summary = "%s"
+ setDefaultValue("off")
+ }.also(screen::addPreference)
+
+ EditTextPreference(screen.context).apply {
+ key = PREF_KEY_CUSTOM_UA
+ title = TITLE_CUSTOM_UA
+ summary = CUSTOM_UA_SUMMARY
+ setOnPreferenceChangeListener { _, newValue ->
+ try {
+ Headers.Builder().add("User-Agent", newValue as String).build()
+ true
+ } catch (e: IllegalArgumentException) {
+ Toast.makeText(screen.context, "User Agent invalid:${e.message}", Toast.LENGTH_LONG).show()
+ false
+ }
+ }
+ }.also(screen::addPreference)
+}
+
+const val TITLE_RANDOM_UA = "Random User-Agent (Requires Restart)"
+const val PREF_KEY_RANDOM_UA = "pref_key_random_ua_"
+val RANDOM_UA_ENTRIES = arrayOf("OFF", "Desktop", "Mobile")
+val RANDOM_UA_VALUES = arrayOf("off", "desktop", "mobile")
+
+const val TITLE_CUSTOM_UA = "Custom User-Agent (Requires Restart)"
+const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua_"
+const val CUSTOM_UA_SUMMARY = "Leave blank to use application default user-agent (IGNORED if Random User-Agent is enabled)"
+
diff --git a/lib/synchrony/build.gradle.kts b/lib/synchrony/build.gradle.kts
index 38ccda93fe..d53ef825ef 100644
--- a/lib/synchrony/build.gradle.kts
+++ b/lib/synchrony/build.gradle.kts
@@ -5,12 +5,13 @@ plugins {
android {
compileSdk = AndroidConfig.compileSdk
- namespace = "eu.kanade.tachiyomi.lib.synchrony"
defaultConfig {
minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk
}
+
+ namespace = "eu.kanade.tachiyomi.lib.synchrony"
}
repositories {
diff --git a/lib/textinterceptor/build.gradle.kts b/lib/textinterceptor/build.gradle.kts
index e8086827ca..aa5a1762cf 100644
--- a/lib/textinterceptor/build.gradle.kts
+++ b/lib/textinterceptor/build.gradle.kts
@@ -10,6 +10,8 @@ android {
minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk
}
+
+ namespace = "eu.kanade.tachiyomi.lib.textinterceptor"
}
repositories {
diff --git a/lib/textinterceptor/src/main/AndroidManifest.xml b/lib/textinterceptor/src/main/AndroidManifest.xml
deleted file mode 100644
index 6d52001ade..0000000000
--- a/lib/textinterceptor/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
diff --git a/multisrc/build.gradle.kts b/multisrc/build.gradle.kts
index dbc098f91f..511012eff4 100644
--- a/multisrc/build.gradle.kts
+++ b/multisrc/build.gradle.kts
@@ -12,6 +12,8 @@ android {
targetSdk = AndroidConfig.targetSdk
}
+ namespace = "eu.kanade.tachiyomi.lib.themesources"
+
kotlinOptions {
freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi"
}
diff --git a/multisrc/overrides/a3manga/default/AndroidManifest.xml b/multisrc/overrides/a3manga/default/AndroidManifest.xml
index 9a92f3a79e..0489d5a185 100644
--- a/multisrc/overrides/a3manga/default/AndroidManifest.xml
+++ b/multisrc/overrides/a3manga/default/AndroidManifest.xml
@@ -1,7 +1,5 @@
-
-
+
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml b/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml
index 5603a61fe4..6b86dbfce3 100644
--- a/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml
+++ b/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/flixscans/flixscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/flixscans/flixscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..96992a1858
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/flixscans/flixscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..bf4daa4174
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/flixscans/flixscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8beccb9bc6
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/flixscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d09cf7a560
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/flixscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9067ecd9cd
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/res/web_hi_res_512.png b/multisrc/overrides/flixscans/flixscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..8ac2f0947f
Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/flixscans/flixscans/src/FlixScansNet.kt b/multisrc/overrides/flixscans/flixscans/src/FlixScansNet.kt
new file mode 100644
index 0000000000..b148a2283e
--- /dev/null
+++ b/multisrc/overrides/flixscans/flixscans/src/FlixScansNet.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.flixscans
+
+import eu.kanade.tachiyomi.multisrc.flixscans.FlixScans
+
+class FlixScansNet : FlixScans("Flix Scans", "https://flixscans.net", "en", cdnUrl = "https://media.flixscans.net/")
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..508b1a1d1f
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8a52388887
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0ced75903a
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e5e17f45dd
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2e68f0aab3
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/res/web_hi_res_512.png b/multisrc/overrides/flixscans/galaxymanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e37dad0c0a
Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/flixscans/galaxymanga/src/GalaxyManga.kt b/multisrc/overrides/flixscans/galaxymanga/src/GalaxyManga.kt
new file mode 100644
index 0000000000..ea536d9ad8
--- /dev/null
+++ b/multisrc/overrides/flixscans/galaxymanga/src/GalaxyManga.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.ar.galaxymanga
+
+import eu.kanade.tachiyomi.multisrc.flixscans.FlixScans
+
+class GalaxyManga : FlixScans("جالاكسي مانجا", "https://flixscans.com", "ar") {
+ override val versionId = 2
+}
diff --git a/multisrc/overrides/flixscans/manganoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/flixscans/manganoon/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..57f68e7839
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/manganoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/flixscans/manganoon/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..54fb858234
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/manganoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/flixscans/manganoon/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b780a4629e
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/manganoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/manganoon/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6b3f3691ec
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/manganoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/flixscans/manganoon/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..574a70fad6
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/flixscans/manganoon/res/web_hi_res_512.png b/multisrc/overrides/flixscans/manganoon/res/web_hi_res_512.png
new file mode 100644
index 0000000000..16b34084ad
Binary files /dev/null and b/multisrc/overrides/flixscans/manganoon/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/fmreader/kisslove/src/KissLove.kt b/multisrc/overrides/fmreader/kisslove/src/KissLove.kt
index 130b4fe482..2e31fa7df3 100644
--- a/multisrc/overrides/fmreader/kisslove/src/KissLove.kt
+++ b/multisrc/overrides/fmreader/kisslove/src/KissLove.kt
@@ -1,9 +1,80 @@
package eu.kanade.tachiyomi.extension.ja.kisslove
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
-import eu.kanade.tachiyomi.source.model.Page
-import org.jsoup.nodes.Document
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import org.jsoup.nodes.Element
+import java.util.Calendar
-class KissLove : FMReader("KissLove", "https://klmanga.com", "ja") {
- override fun pageListParse(document: Document): List = base64PageListParse(document)
+class KissLove : FMReader("KissLove", "https://klz9.com", "ja") {
+ override fun latestUpdatesRequest(page: Int) =
+ GET("$baseUrl/manga-list.html?page=$page&sort=last_update")
+
+ override fun chapterListRequest(manga: SManga): Request {
+ val mangaId = MID_URL_REGEX.find(manga.url)
+ ?.groupValues?.get(1)
+ ?: throw Exception("Could not find manga id")
+
+ val xhrUrl = "$baseUrl/app/manga/controllers/cont.listChapter.php".toHttpUrl().newBuilder()
+ .addQueryParameter("slug", mangaId)
+ .build()
+
+ return GET(xhrUrl, headers)
+ }
+
+ override fun chapterFromElement(element: Element, mangaTitle: String): SChapter {
+ return SChapter.create().apply {
+ element.select(chapterUrlSelector).first()!!.let {
+ setUrlWithoutDomain("$baseUrl/${it.attr("href")}")
+ name = it.attr("title")
+ }
+
+ date_upload = element.select(chapterTimeSelector)
+ .let { if (it.hasText()) parseChapterDate(it.text()) else 0 }
+ }
+ }
+
+ private fun parseChapterDate(date: String): Long {
+ val value = date.split(' ')[dateValueIndex].toInt()
+ val chapterDate = Calendar.getInstance().apply {
+ set(Calendar.SECOND, 0)
+ set(Calendar.MILLISECOND, 0)
+ }
+
+ when (date.split(' ')[dateWordIndex]) {
+ "mins", "minutes" -> chapterDate.add(Calendar.MINUTE, value * -1)
+ "hours" -> chapterDate.add(Calendar.HOUR_OF_DAY, value * -1)
+ "days" -> chapterDate.add(Calendar.DATE, value * -1)
+ "weeks" -> chapterDate.add(Calendar.DATE, value * 7 * -1)
+ "months" -> chapterDate.add(Calendar.MONTH, value * -1)
+ "years" -> chapterDate.add(Calendar.YEAR, value * -1)
+ else -> return 0
+ }
+
+ return chapterDate.timeInMillis
+ }
+
+ override fun pageListRequest(chapter: SChapter): Request {
+ val request = super.pageListRequest(chapter)
+ val response = client.newCall(request).execute()
+ val document = response.asJsoup()
+
+ val chapterId = document.selectFirst("#chapter")
+ ?.`val`()
+ ?: throw Exception("Could not find chapter id")
+
+ val xhrUrl = "$baseUrl/app/manga/controllers/cont.listImg.php".toHttpUrl().newBuilder()
+ .addQueryParameter("cid", chapterId)
+ .build()
+
+ return GET(xhrUrl, headers)
+ }
+
+ companion object {
+ private val MID_URL_REGEX = "-([^.]+).html".toRegex()
+ }
}
diff --git a/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt b/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt
index a6c8e05cb7..b9431823c4 100644
--- a/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt
+++ b/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt
@@ -1,14 +1,12 @@
package eu.kanade.tachiyomi.extension.ja.rawlh
-import android.util.Base64
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.Request
-import org.jsoup.nodes.Attribute
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
-import java.nio.charset.Charset
class WeLoveManga : FMReader("WeLoveManga", "https://weloma.art", "ja") {
// Formerly "RawLH"
@@ -17,13 +15,9 @@ class WeLoveManga : FMReader("WeLoveManga", "https://weloma.art", "ja") {
override val chapterUrlSelector = ""
override fun pageListParse(document: Document): List {
fun Element.decoded(): String {
- val attr = this.attributes().map(Attribute::key).maxByOrNull(kotlin.String::length) ?: "src"
- return if (!this.attr(attr).contains(".")) {
- Base64.decode(this.attr(attr), Base64.DEFAULT).toString(Charset.defaultCharset())
- } else {
- this.attr("abs:$attr")
- }
+ return this.attr("data-src").trimEnd()
}
+
return document.select(pageListImageSelector).mapIndexed { i, img ->
Page(i, document.location(), img.decoded())
}
@@ -31,4 +25,20 @@ class WeLoveManga : FMReader("WeLoveManga", "https://weloma.art", "ja") {
// Referer needs to be chapter URL
override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().set("Referer", page.url).build())
+
+ override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
+ element.select(headerSelector).let {
+ setUrlWithoutDomain(it.attr("abs:href"))
+ title = it.text()
+ }
+ thumbnail_url = element
+ .select("div.content.img-in-ratio")
+ .first()!!
+ .attr("style")
+ .let { BACKGROUND_IMAGE_REGEX.find(it)?.groups?.get(1)?.value }
+ }
+
+ companion object {
+ val BACKGROUND_IMAGE_REGEX = Regex("""url\(['"]?(.*?)['"]?\)""")
+ }
}
diff --git a/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt b/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt
index f1c09a21c5..8c07321f42 100644
--- a/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt
+++ b/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt
@@ -3,6 +3,10 @@ package eu.kanade.tachiyomi.extension.ja.welovemangaone
import eu.kanade.tachiyomi.multisrc.fmreader.FMReader
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
import org.jsoup.nodes.Element
import java.util.Calendar
@@ -10,6 +14,18 @@ class WeLoveMangaOne : FMReader("WeLoveMangaOne", "https://welovemanga.one", "ja
override fun latestUpdatesRequest(page: Int) =
GET("$baseUrl/manga-list.html?page=$page&sort=last_update")
+ override fun chapterListRequest(manga: SManga): Request {
+ val mangaId = MID_URL_REGEX.find(manga.url)
+ ?.groupValues?.get(1)
+ ?: throw Exception("Could not find manga id")
+
+ val xhrUrl = "$baseUrl/app/manga/controllers/cont.Listchapter.php".toHttpUrl().newBuilder()
+ .addQueryParameter("mid", mangaId)
+ .build()
+
+ return GET(xhrUrl, headers)
+ }
+
override fun chapterFromElement(element: Element, mangaTitle: String): SChapter {
return SChapter.create().apply {
element.let {
@@ -41,4 +57,24 @@ class WeLoveMangaOne : FMReader("WeLoveMangaOne", "https://welovemanga.one", "ja
return chapterDate.timeInMillis
}
+
+ override fun pageListRequest(chapter: SChapter): Request {
+ val request = super.pageListRequest(chapter)
+ val response = client.newCall(request).execute()
+ val document = response.asJsoup()
+
+ val chapterId = document.selectFirst("#chapter")
+ ?.`val`()
+ ?: throw Exception("Could not find chapter id")
+
+ val xhrUrl = "$baseUrl/app/manga/controllers/cont.listImg.php".toHttpUrl().newBuilder()
+ .addQueryParameter("cid", chapterId)
+ .build()
+
+ return GET(xhrUrl, headers)
+ }
+
+ companion object {
+ private val MID_URL_REGEX = "(\\d+)/".toRegex()
+ }
}
diff --git a/multisrc/overrides/grouple/default/AndroidManifest.xml b/multisrc/overrides/grouple/default/AndroidManifest.xml
index 87f96afd91..294993e552 100644
--- a/multisrc/overrides/grouple/default/AndroidManifest.xml
+++ b/multisrc/overrides/grouple/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/heancms/perfscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/perfscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..acb868c34f
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/heancms/perfscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/perfscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..164f6611a0
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/heancms/perfscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/perfscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4cf6669f30
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/heancms/perfscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/perfscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..74c2a6dc5a
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/heancms/perfscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/perfscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fee5511710
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/heancms/perfscan/res/web_hi_res_512.png b/multisrc/overrides/heancms/perfscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..dfdba5083f
Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/heancms/perfscan/src/PerfScan.kt b/multisrc/overrides/heancms/perfscan/src/PerfScan.kt
new file mode 100644
index 0000000000..23479e70d9
--- /dev/null
+++ b/multisrc/overrides/heancms/perfscan/src/PerfScan.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.fr.perfscan
+
+import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.OkHttpClient
+
+class PerfScan : HeanCms("Perf Scan", "https://perf-scan.fr", "fr") {
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimitHost(apiUrl.toHttpUrl(), 1, 2)
+ .build()
+
+ override val coverPath: String = ""
+ override val useNewQueryEndpoint = true
+}
diff --git a/multisrc/overrides/heancms/reaperscans/src/ReaperScans.kt b/multisrc/overrides/heancms/reaperscans/src/ReaperScans.kt
index 8257e9a7c9..77122a85bd 100644
--- a/multisrc/overrides/heancms/reaperscans/src/ReaperScans.kt
+++ b/multisrc/overrides/heancms/reaperscans/src/ReaperScans.kt
@@ -21,7 +21,8 @@ class ReaperScans : HeanCms(
// Site changed from Madara to HeanCms.
override val versionId = 2
- override val fetchAllTitles = true
+ override val slugStrategy = SlugStrategy.FETCH_ALL
+ override val useNewQueryEndpoint = true
override val coverPath: String = ""
diff --git a/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt b/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
index 8aa9f7310d..60343a7534 100644
--- a/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
+++ b/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
@@ -2,25 +2,30 @@ package eu.kanade.tachiyomi.extension.es.yugenmangas
import eu.kanade.tachiyomi.multisrc.heancms.Genre
import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import okhttp3.HttpUrl.Companion.toHttpUrl
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",
-) {
+class YugenMangas :
+ HeanCms(
+ "YugenMangas",
+ "https://yugenmangas.net",
+ "es",
+ "https://api.yugenmangas.net",
+ ) {
// Site changed from Madara to HeanCms.
override val versionId = 2
+ override val slugStrategy = SlugStrategy.ID
+ override val useNewQueryEndpoint = true
+
override val client = super.client.newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(90, TimeUnit.SECONDS)
- .rateLimit(1, 1)
+ .rateLimitHost(apiUrl.toHttpUrl(), 2, 3)
.build()
override val coverPath: String = ""
diff --git a/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml
index 543d49e63c..29cb390940 100644
--- a/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml
+++ b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
-
+
1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/blmanhwaclub/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 3a5842f3e8..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/blmanhwaclub/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 11d0f98266..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 6f10b3b000..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 31b191f20f..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index b6872a5cd1..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/res/web_hi_res_512.png b/multisrc/overrides/madara/blmanhwaclub/res/web_hi_res_512.png
deleted file mode 100644
index 93eea3093d..0000000000
Binary files a/multisrc/overrides/madara/blmanhwaclub/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/blmanhwaclub/src/BlManhwaClub.kt b/multisrc/overrides/madara/blmanhwaclub/src/BlManhwaClub.kt
deleted file mode 100644
index f08f396f2b..0000000000
--- a/multisrc/overrides/madara/blmanhwaclub/src/BlManhwaClub.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.blmanhwaclub
-
-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 BlManhwaClub : Madara(
- "BL Manhwa Club",
- "https://blmanhwa.club",
- "pt-BR",
- SimpleDateFormat("dd MMM yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt b/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt
index f45bd0d4b4..4e04436099 100644
--- a/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt
+++ b/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt
@@ -14,7 +14,6 @@ import uy.kohesive.injekt.api.get
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
class BokugenTranslation : Madara(
"BokugenTranslation",
@@ -23,8 +22,7 @@ class BokugenTranslation : Madara(
dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
) {
private var loadWebView = true
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .addInterceptor(uaIntercept)
+ override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor { chain ->
val request = chain.request()
val url = request.url.toString()
@@ -56,8 +54,6 @@ class BokugenTranslation : Madara(
}
chain.proceed(request)
}
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
.rateLimit(1, 1)
.build()
diff --git a/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt
new file mode 100644
index 0000000000..90e0fe3e5a
--- /dev/null
+++ b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.extension.pt.cerisescans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class CeriseScan : Madara(
+ "Cerise Scan",
+ "https://cerisescan.com/home1",
+ "pt-BR",
+ SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")),
+) {
+
+ // Name changed from 'Cerise Scans' to 'Cerise Scan'
+ override val id: Long = 8629915907358523454
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun mangaDetailsRequest(manga: SManga): Request {
+ return GET(baseUrl + manga.url.replace("/home1", ""), headers)
+ }
+
+ override fun chapterListRequest(manga: SManga): Request {
+ return GET(baseUrl + manga.url.replace("/home1", ""), headers)
+ }
+}
diff --git a/multisrc/overrides/madara/cerisescans/src/CeriseScans.kt b/multisrc/overrides/madara/cerisescans/src/CeriseScans.kt
deleted file mode 100644
index 53d0ebbcec..0000000000
--- a/multisrc/overrides/madara/cerisescans/src/CeriseScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.cerisescans
-
-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 CeriseScans : Madara(
- "Cerise Scans",
- "https://cerisescans.com",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/cocorip/res/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cocorip/res/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..c5077ea895
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/cocorip/res/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cocorip/res/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f3fb3ab36b
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/cocorip/res/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cocorip/res/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..36e0034926
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/cocorip/res/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cocorip/res/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..02bb580dc6
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/cocorip/res/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cocorip/res/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3a8a486e67
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/cocorip/res/web_hi_res_512.png b/multisrc/overrides/madara/cocorip/res/web_hi_res_512.png
new file mode 100644
index 0000000000..50f591bdcc
Binary files /dev/null and b/multisrc/overrides/madara/cocorip/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/cocorip/src/CocoRip.kt b/multisrc/overrides/madara/cocorip/src/CocoRip.kt
new file mode 100644
index 0000000000..d9f79856cb
--- /dev/null
+++ b/multisrc/overrides/madara/cocorip/src/CocoRip.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.es.cocorip
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class CocoRip : Madara("Coco Rip", "https://cocorip.net", "es", SimpleDateFormat("dd/MM/yyyy", Locale("es"))) {
+ override val mangaDetailsSelectorDescription = "div.summary__content"
+}
diff --git a/multisrc/overrides/madara/coffeemangatop/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemangatop/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd0218e9ce
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemangatop/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a9af109203
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..067e5bfd10
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4ddb41385c
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7bc1fae4e1
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/res/web_hi_res_512.png b/multisrc/overrides/madara/coffeemangatop/res/web_hi_res_512.png
new file mode 100644
index 0000000000..dae6bccb46
Binary files /dev/null and b/multisrc/overrides/madara/coffeemangatop/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/coffeemangatop/src/CoffeeMangaTop.kt b/multisrc/overrides/madara/coffeemangatop/src/CoffeeMangaTop.kt
new file mode 100644
index 0000000000..76b8b2ae0c
--- /dev/null
+++ b/multisrc/overrides/madara/coffeemangatop/src/CoffeeMangaTop.kt
@@ -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 {
+ 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 {
+ val stringArray = document.select("p#arraydata").text().split(",").toTypedArray()
+ return stringArray.mapIndexed { index, url ->
+ Page(
+ index,
+ document.location(),
+ url,
+ )
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/coloredmanga/src/ColoredManga.kt b/multisrc/overrides/madara/coloredmanga/src/ColoredManga.kt
new file mode 100644
index 0000000000..be16c5d063
--- /dev/null
+++ b/multisrc/overrides/madara/coloredmanga/src/ColoredManga.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.en.coloredmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ColoredManga : Madara(
+ "Colored Manga",
+ "https://coloredmanga.com",
+ "en",
+ dateFormat = SimpleDateFormat("dd-MMM", Locale.ENGLISH),
+) {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/comicarab/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/comicarab/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..e9f3b50c33
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicarab/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/comicarab/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..cf530cf62f
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicarab/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/comicarab/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b8be692b5c
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicarab/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicarab/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3bca922d90
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicarab/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicarab/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2382dc7e93
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicarab/res/web_hi_res_512.png b/multisrc/overrides/madara/comicarab/res/web_hi_res_512.png
new file mode 100644
index 0000000000..41b33859ca
Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/comicarab/src/ComicArab.kt b/multisrc/overrides/madara/comicarab/src/ComicArab.kt
new file mode 100644
index 0000000000..6dc77be66a
--- /dev/null
+++ b/multisrc/overrides/madara/comicarab/src/ComicArab.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.ar.comicarab
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ComicArab : Madara(
+ "كوميك العرب",
+ "https://comicarab.com",
+ "ar",
+ dateFormat = SimpleDateFormat("dd MMMM، yyyy", Locale("ar")),
+) {
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/comicscans/src/ComicScans.kt b/multisrc/overrides/madara/comicscans/src/ComicScans.kt
new file mode 100644
index 0000000000..910b11d707
--- /dev/null
+++ b/multisrc/overrides/madara/comicscans/src/ComicScans.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.comicscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ComicScans : Madara("Comic Scans", "https://www.comicscans.org", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/comicznetv2/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/comicznetv2/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..2a512df276
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/comicznetv2/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d1b00a2858
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/comicznetv2/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2647035d8d
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicznetv2/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9d70ba7551
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicznetv2/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..687733af37
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/res/web_hi_res_512.png b/multisrc/overrides/madara/comicznetv2/res/web_hi_res_512.png
new file mode 100644
index 0000000000..081e777620
Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/comicznetv2/src/ComiczNetV2.kt b/multisrc/overrides/madara/comicznetv2/src/ComiczNetV2.kt
new file mode 100644
index 0000000000..c04d7bf89a
--- /dev/null
+++ b/multisrc/overrides/madara/comicznetv2/src/ComiczNetV2.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.all.comicznetv2
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ComiczNetV2 : Madara("Comicz.net v2", "https://v2.comiz.net", "all") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/cookietoon/src/CookieToon.kt b/multisrc/overrides/madara/cookietoon/src/CookieToon.kt
deleted file mode 100644
index 7ce3fac90d..0000000000
--- a/multisrc/overrides/madara/cookietoon/src/CookieToon.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.cookietoon
-
-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 CookieToon : Madara(
- "CookieToon",
- "https://cookietoon.online",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/cronosscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cronosscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 84879466d2..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cronosscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index f148ae0265..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cronosscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1070c8d17a..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cronosscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a66bd4b927..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cronosscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2f60627045..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/res/web_hi_res_512.png b/multisrc/overrides/madara/cronosscan/res/web_hi_res_512.png
deleted file mode 100644
index 9199c25d33..0000000000
Binary files a/multisrc/overrides/madara/cronosscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/cronosscan/src/CronosScan.kt b/multisrc/overrides/madara/cronosscan/src/CronosScan.kt
deleted file mode 100644
index 8ed0a6aac0..0000000000
--- a/multisrc/overrides/madara/cronosscan/src/CronosScan.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.cronosscan
-
-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 CronosScan : Madara(
- "Cronos Scan",
- "https://cronosscan.net",
- "pt-BR",
- SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/default/AndroidManifest.xml b/multisrc/overrides/madara/default/AndroidManifest.xml
index ad44865c88..5d4316fb8e 100644
--- a/multisrc/overrides/madara/default/AndroidManifest.xml
+++ b/multisrc/overrides/madara/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/madara/default/additional.gradle b/multisrc/overrides/madara/default/additional.gradle
index 06abd18c65..214a0df0ed 100644
--- a/multisrc/overrides/madara/default/additional.gradle
+++ b/multisrc/overrides/madara/default/additional.gradle
@@ -1,3 +1,4 @@
dependencies {
- implementation(project(':lib-cryptoaes'))
-}
\ No newline at end of file
+ implementation(project(":lib-cryptoaes"))
+ implementation(project(":lib-randomua"))
+}
diff --git a/multisrc/overrides/madara/doodmanga/src/Doodmanga.kt b/multisrc/overrides/madara/doodmanga/src/Doodmanga.kt
index 232fdfd2ac..682f5c672b 100644
--- a/multisrc/overrides/madara/doodmanga/src/Doodmanga.kt
+++ b/multisrc/overrides/madara/doodmanga/src/Doodmanga.kt
@@ -7,16 +7,12 @@ import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class Doodmanga : Madara("Doodmanga", "https://www.doodmanga.com", "th", SimpleDateFormat("dd MMMMM yyyy", Locale("th"))) {
override val filterNonMangaItems = false
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .addInterceptor(uaIntercept)
+ override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(ScrambledImageInterceptor)
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
.build()
override val pageListParseSelector = "div.text-center > p > img, div.text-center > img, div.text-center > script"
diff --git a/multisrc/overrides/madara/dragontea/src/DragonTea.kt b/multisrc/overrides/madara/dragontea/src/DragonTea.kt
index d8502af460..fb784bb81f 100644
--- a/multisrc/overrides/madara/dragontea/src/DragonTea.kt
+++ b/multisrc/overrides/madara/dragontea/src/DragonTea.kt
@@ -1,20 +1,15 @@
package eu.kanade.tachiyomi.extension.en.dragontea
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.graphics.Canvas
-import android.graphics.Rect
+import android.util.Base64
+import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page
-import okhttp3.Interceptor
-import okhttp3.MediaType.Companion.toMediaType
+import kotlinx.serialization.json.JsonElement
+import kotlinx.serialization.json.jsonObject
+import kotlinx.serialization.json.jsonPrimitive
import okhttp3.OkHttpClient
-import okhttp3.Protocol
-import okhttp3.Response
-import okhttp3.ResponseBody.Companion.toResponseBody
import org.jsoup.nodes.Document
-import java.io.ByteArrayOutputStream
import java.text.SimpleDateFormat
import java.util.Locale
@@ -25,7 +20,6 @@ class DragonTea : Madara(
dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US),
) {
override val client: OkHttpClient = super.client.newBuilder()
- .addInterceptor(::begonepeconIntercept)
.rateLimit(1)
.build()
@@ -41,86 +35,54 @@ class DragonTea : Madara(
}
}
- private val begonepeconSelector: String = "div.begonepecon"
-
- private val peconholderSelector: String = "div.peconholder"
+ private val pageIndexRegex = Regex("""image-(\d+)[a-z]+""", RegexOption.IGNORE_CASE)
override fun pageListParse(document: Document): List {
- countViews(document)
-
- val hasSplitImages = document
- .select(begonepeconSelector)
- .firstOrNull() != null
-
- if (!hasSplitImages) {
- return super.pageListParse(document)
+ val dataId = document.selectFirst(".entry-header.header")?.attr("data-id")?.toInt()
+ ?: return super.pageListParse(document)
+ val elements = document.select(".reading-content .page-break img")
+ val pageCount = elements.size
+
+ val idKey = "8" + ((dataId + 1306) * 3 - pageCount).toString()
+ elements.forEach {
+ val decryptedId = decryptAesJson(it.attr("id"), idKey).jsonPrimitive.content
+ it.attr("id", decryptedId)
}
- return document.select("div.page-break, li.blocks-gallery-item, $begonepeconSelector")
- .mapIndexed { index, element ->
- val imageUrl = if (element.select(peconholderSelector).firstOrNull() == null) {
- element.select("img").first()?.let { it.absUrl(if (it.hasAttr("data-src")) "data-src" else "src") }
- } else {
- element.select("img").joinToString("|") { it.absUrl(if (it.hasAttr("data-src")) "data-src" else "src") } + BEGONEPECON_SUFFIX
- }
- Page(index, document.location(), imageUrl)
- }
- }
-
- private fun begonepeconIntercept(chain: Interceptor.Chain): Response {
- if (!chain.request().url.toString().endsWith(BEGONEPECON_SUFFIX)) {
- return chain.proceed(chain.request())
+ val orderedElements = elements.sortedBy {
+ pageIndexRegex.find(it.attr("id"))?.groupValues?.get(1)?.toInt() ?: 0
}
+ val dtaKey = "13" + orderedElements.joinToString("") { it.attr("id").takeLast(1) } + (((dataId + 88) * 2) - pageCount - 4).toString()
- val imageUrls = chain.request().url.toString()
- .removeSuffix(BEGONEPECON_SUFFIX)
- .split("%7C")
-
- var width = 0
- var height = 0
-
- val imageBitmaps = imageUrls.map { imageUrl ->
- val request = chain.request().newBuilder().url(imageUrl).build()
- val response = chain.proceed(request)
-
- val bitmap = BitmapFactory.decodeStream(response.body.byteStream())
+ val srcKey = (dataId + 20).toString() + orderedElements.joinToString("") {
+ decryptAesJson(it.attr("dta"), dtaKey).jsonPrimitive.content.takeLast(2)
+ } + (pageCount * 2).toString()
- width += bitmap.width
- height = bitmap.height
-
- bitmap
+ return orderedElements.mapIndexed { i, element ->
+ val src = decryptAesJson(element.attr("data-src"), srcKey).jsonPrimitive.content
+ Page(i, document.location(), src)
}
+ }
- val result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
- val canvas = Canvas(result)
-
- var left = 0
-
- imageBitmaps.forEach { bitmap ->
- val srcRect = Rect(0, 0, bitmap.width, bitmap.height)
- val dstRect = Rect(left, 0, left + bitmap.width, bitmap.height)
-
- canvas.drawBitmap(bitmap, srcRect, dstRect, null)
+ private fun decryptAesJson(ciphertext: String, key: String): JsonElement {
+ val cipherData = json.parseToJsonElement(ciphertext).jsonObject
- left += bitmap.width
- }
+ val unsaltedCiphertext = Base64.decode(cipherData["ct"]!!.jsonPrimitive.content, Base64.DEFAULT)
+ val salt = cipherData["s"]!!.jsonPrimitive.content.decodeHex()
+ val saltedCiphertext = SALTED + salt + unsaltedCiphertext
- val output = ByteArrayOutputStream()
- result.compress(Bitmap.CompressFormat.PNG, 100, output)
+ return json.parseToJsonElement(CryptoAES.decrypt(Base64.encodeToString(saltedCiphertext, Base64.DEFAULT), key))
+ }
- val responseBody = output.toByteArray().toResponseBody(PNG_MEDIA_TYPE)
+ private fun String.decodeHex(): ByteArray {
+ check(length % 2 == 0) { "Must have an even length" }
- return Response.Builder()
- .code(200)
- .protocol(Protocol.HTTP_1_1)
- .request(chain.request())
- .message("OK")
- .body(responseBody)
- .build()
+ return chunked(2)
+ .map { it.toInt(16).toByte() }
+ .toByteArray()
}
companion object {
- private const val BEGONEPECON_SUFFIX = "?begonepecon"
- private val PNG_MEDIA_TYPE = "image/png".toMediaType()
+ private val SALTED = "Salted__".toByteArray(Charsets.UTF_8)
}
}
diff --git a/multisrc/overrides/madara/drakescans/src/DrakeScans.kt b/multisrc/overrides/madara/drakescans/src/DrakeScans.kt
index 1fb045ebad..64976b23ac 100644
--- a/multisrc/overrides/madara/drakescans/src/DrakeScans.kt
+++ b/multisrc/overrides/madara/drakescans/src/DrakeScans.kt
@@ -8,7 +8,7 @@ class DrakeScans : Madara(
"Drake Scans",
"https://drakescans.com",
"en",
- SimpleDateFormat("MM/dd/yyyy", Locale.US),
+ SimpleDateFormat("dd/MM/yyyy", Locale.US),
) {
override val mangaDetailsSelectorTag = ""
diff --git a/multisrc/overrides/madara/elitemanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/elitemanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4424b05927
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/elitemanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/elitemanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..428955ee26
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/elitemanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/elitemanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2499371a1b
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/elitemanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/elitemanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..04113d6f08
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/elitemanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/elitemanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..af819ae32c
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/elitemanga/res/web_hi_res_512.png b/multisrc/overrides/madara/elitemanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..eee33c1774
Binary files /dev/null and b/multisrc/overrides/madara/elitemanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/elitemanga/src/EliteManga.kt b/multisrc/overrides/madara/elitemanga/src/EliteManga.kt
new file mode 100644
index 0000000000..5f396483e3
--- /dev/null
+++ b/multisrc/overrides/madara/elitemanga/src/EliteManga.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.elitemanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class EliteManga : Madara("Elite Manga", "https://www.elitemanga.org", "en") {
+ override val useNewChapterEndpoint = true
+ override val filterNonMangaItems = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/estufadecristal/src/EstufaDeCristal.kt b/multisrc/overrides/madara/estufadecristal/src/EstufaDeCristal.kt
deleted file mode 100644
index d1b598411c..0000000000
--- a/multisrc/overrides/madara/estufadecristal/src/EstufaDeCristal.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.estufadecristal
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.OkHttpClient
-import okhttp3.Response
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class EstufaDeCristal : Madara(
- "Estufa de Cristal",
- "https://scanestufadecristal.site",
- "pt-BR",
- SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-
- override fun chapterListParse(response: Response): List {
- return super.chapterListParse(response).reversed()
- }
-}
diff --git a/multisrc/overrides/madara/factmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/factmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..f53594f273
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/factmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/factmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..00e99ac3e6
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/factmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/factmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..af56ddefd8
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/factmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/factmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..83f3d845a2
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/factmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/factmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..186131840e
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/factmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/factmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..08868e5731
Binary files /dev/null and b/multisrc/overrides/madara/factmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/factmanga/src/FactManga.kt b/multisrc/overrides/madara/factmanga/src/FactManga.kt
new file mode 100644
index 0000000000..af542a68ec
--- /dev/null
+++ b/multisrc/overrides/madara/factmanga/src/FactManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.factmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class FactManga : Madara("FactManga", "https://factmanga.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/falconmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/falconmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..95bdbee52d
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/falconmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/falconmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..fcbc380af4
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/falconmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/falconmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4dd12c2f57
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/falconmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/falconmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..46d634b909
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/falconmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/falconmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..004a8231c1
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/falconmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/falconmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ac86b8566b
Binary files /dev/null and b/multisrc/overrides/madara/falconmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/falconmanga/src/FalconManga.kt b/multisrc/overrides/madara/falconmanga/src/FalconManga.kt
new file mode 100644
index 0000000000..8f2069dad7
--- /dev/null
+++ b/multisrc/overrides/madara/falconmanga/src/FalconManga.kt
@@ -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 {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/fdmscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/fdmscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f788a6f877..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/fdmscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 914b442118..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/fdmscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1ac00a17b3..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/fdmscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1dffccae51..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/fdmscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ea6ef4e5b0..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/res/web_hi_res_512.png b/multisrc/overrides/madara/fdmscan/res/web_hi_res_512.png
deleted file mode 100644
index f9a41eca02..0000000000
Binary files a/multisrc/overrides/madara/fdmscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fdmscan/src/FDMScan.kt b/multisrc/overrides/madara/fdmscan/src/FDMScan.kt
deleted file mode 100644
index b689a8490e..0000000000
--- a/multisrc/overrides/madara/fdmscan/src/FDMScan.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.fdmscan
-
-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 FDMScan : Madara(
- "FDM Scan",
- "https://fdmscan.com",
- "pt-BR",
- SimpleDateFormat("MMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/firstkissmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissdashmanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/firstkissmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissdashmanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/firstkissmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/firstkissmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/firstkissmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/firstkissmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/firstkissdashmanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/madara/firstkissmanga/res/web_hi_res_512.png
rename to multisrc/overrides/madara/firstkissdashmanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/madara/firstkissdashmanga/src/FirstKissDashManga.kt b/multisrc/overrides/madara/firstkissdashmanga/src/FirstKissDashManga.kt
new file mode 100644
index 0000000000..6438932b53
--- /dev/null
+++ b/multisrc/overrides/madara/firstkissdashmanga/src/FirstKissDashManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.firstkissdashmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class FirstKissDashManga : Madara("1st Kiss-Manga (unoriginal)", "https://1stkiss-manga.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/firstkissmanga/src/FirstKissManga.kt b/multisrc/overrides/madara/firstkissmanga/src/FirstKissManga.kt
deleted file mode 100644
index c8c6887ff0..0000000000
--- a/multisrc/overrides/madara/firstkissmanga/src/FirstKissManga.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.firstkissmanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.Headers
-import java.util.concurrent.TimeUnit
-
-class FirstKissManga : Madara(
- "1st Kiss",
- "https://1stkissmanga.me",
- "en",
-) {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
-
- override val client = network.cloudflareClient.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d8bbacd490
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec35ead1d0
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd959ac04d
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..58989ca02b
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ae51ec0a2
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/res/web_hi_res_512.png b/multisrc/overrides/madara/firstkissmangablog/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a624bd17dd
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangablog/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/firstkissmangablog/src/FirstKissMangaBlog.kt b/multisrc/overrides/madara/firstkissmangablog/src/FirstKissMangaBlog.kt
new file mode 100644
index 0000000000..2ec33b61a9
--- /dev/null
+++ b/multisrc/overrides/madara/firstkissmangablog/src/FirstKissMangaBlog.kt
@@ -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/"
+}
diff --git a/multisrc/overrides/madara/firstkissmangaclub/src/FirstKissMangaClub.kt b/multisrc/overrides/madara/firstkissmangaclub/src/FirstKissMangaClub.kt
index 71b2e1916d..1f9e3d3b8f 100644
--- a/multisrc/overrides/madara/firstkissmangaclub/src/FirstKissMangaClub.kt
+++ b/multisrc/overrides/madara/firstkissmangaclub/src/FirstKissMangaClub.kt
@@ -10,7 +10,7 @@ class FirstKissMangaClub : Madara(
"en",
) {
- override val client = network.cloudflareClient.newBuilder()
+ override val client = super.client.newBuilder()
.rateLimit(1, 3, TimeUnit.SECONDS)
.build()
}
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangalove/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 53308340f2..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangalove/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 979753d9b0..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7d83a1455c..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index f678027d4c..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aaf95b4e1b..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/res/web_hi_res_512.png b/multisrc/overrides/madara/firstkissmangalove/res/web_hi_res_512.png
deleted file mode 100644
index c9559e92fb..0000000000
Binary files a/multisrc/overrides/madara/firstkissmangalove/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmangalove/src/FirstKissMangaLove.kt b/multisrc/overrides/madara/firstkissmangalove/src/FirstKissMangaLove.kt
deleted file mode 100644
index 3e4ce15889..0000000000
--- a/multisrc/overrides/madara/firstkissmangalove/src/FirstKissMangaLove.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.firstkissmangalove
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import java.util.concurrent.TimeUnit
-
-class FirstKissMangaLove : Madara(
- "1st Kiss Manga.love",
- "https://1stkissmanga.love",
- "en",
-) {
-
- override val client = network.cloudflareClient.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..36d12e82fe
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd9d5104ae
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..006852662b
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..519f14eeb7
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..709f8a0844
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/res/web_hi_res_512.png b/multisrc/overrides/madara/firstkissmangatv/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2f86f7755e
Binary files /dev/null and b/multisrc/overrides/madara/firstkissmangatv/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/firstkissmangatv/src/FirstKissMangaTv.kt b/multisrc/overrides/madara/firstkissmangatv/src/FirstKissMangaTv.kt
new file mode 100644
index 0000000000..794df0d49a
--- /dev/null
+++ b/multisrc/overrides/madara/firstkissmangatv/src/FirstKissMangaTv.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.firstkissmangatv
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class FirstKissMangaTv : Madara("1stKissManga.tv", "https://1stkissmanga.tv", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmanhua/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index d3f01d2b14..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmanhua/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 854a17abc9..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index d0279e2dd5..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index d421b8e18f..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index a6df0ba573..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/res/web_hi_res_512.png b/multisrc/overrides/madara/firstkissmanhua/res/web_hi_res_512.png
deleted file mode 100644
index c48ce78955..0000000000
Binary files a/multisrc/overrides/madara/firstkissmanhua/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/firstkissmanhua/src/FirstKissManhua.kt b/multisrc/overrides/madara/firstkissmanhua/src/FirstKissManhua.kt
deleted file mode 100644
index 9afdeb94f6..0000000000
--- a/multisrc/overrides/madara/firstkissmanhua/src/FirstKissManhua.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.firstkissmanhua
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Page
-import okhttp3.Request
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class FirstKissManhua : Madara(
- "1st Kiss Manhua",
- "https://1stkissmanhua.com",
- "en",
- SimpleDateFormat("d MMM yyyy", Locale.US),
-) {
-
- override val client = network.cloudflareClient.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().add("Referer", "https://1stkissmanga.com").build())
-}
diff --git a/multisrc/overrides/madara/firstmanhwa/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firstmanhwa/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4c01a60c66
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firstmanhwa/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..153aa31447
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6e2a6c4afa
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2767aaf02d
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e666bd3c6d
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/res/web_hi_res_512.png b/multisrc/overrides/madara/firstmanhwa/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0d45512480
Binary files /dev/null and b/multisrc/overrides/madara/firstmanhwa/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/firstmanhwa/src/FirstManhwa.kt b/multisrc/overrides/madara/firstmanhwa/src/FirstManhwa.kt
new file mode 100644
index 0000000000..d7569cbd09
--- /dev/null
+++ b/multisrc/overrides/madara/firstmanhwa/src/FirstManhwa.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.en.firstmanhwa
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class FirstManhwa : Madara("1st Manhwa", "https://1stmanhwa.com", "en") {
+ override val useNewChapterEndpoint = true
+ override val filterNonMangaItems = false
+ override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Status) + div.summary-content"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/fizmanga/src/FizManga.kt b/multisrc/overrides/madara/fizmanga/src/FizManga.kt
index 91dd0cb750..b057a54a9b 100644
--- a/multisrc/overrides/madara/fizmanga/src/FizManga.kt
+++ b/multisrc/overrides/madara/fizmanga/src/FizManga.kt
@@ -1,9 +1,5 @@
package eu.kanade.tachiyomi.extension.en.fizmanga
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.Headers
-class FizManga : Madara("Fiz Manga", "https://fizmanga.com", "en") {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .add("Referer", baseUrl)
-}
+class FizManga : Madara("Fiz Manga", "https://fizmanga.com", "en")
diff --git a/multisrc/overrides/madara/fleurblanche/src/FleurBlanche.kt b/multisrc/overrides/madara/fleurblanche/src/FleurBlanche.kt
index 5f3635289a..336d6c8a5d 100644
--- a/multisrc/overrides/madara/fleurblanche/src/FleurBlanche.kt
+++ b/multisrc/overrides/madara/fleurblanche/src/FleurBlanche.kt
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.extension.pt.fleurblanche
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.Headers
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
@@ -25,8 +24,6 @@ class FleurBlanche : Madara(
override val useNewChapterEndpoint = true
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
-
private fun authWarningIntercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request())
diff --git a/multisrc/overrides/madara/frdashscan/src/FRScan.kt b/multisrc/overrides/madara/frdashscan/src/FRScan.kt
index eb270757ea..99837e8a82 100644
--- a/multisrc/overrides/madara/frdashscan/src/FRScan.kt
+++ b/multisrc/overrides/madara/frdashscan/src/FRScan.kt
@@ -4,4 +4,4 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
-class FRScan : Madara("FR-Scan", "https://fr-scan.com", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRANCE))
+class FRScan : Madara("FR-Scan", "https://fr-scan.cc", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRANCE))
diff --git a/multisrc/overrides/madara/freemanhwa/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/freemanhwa/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d61275c78b
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/freemanhwa/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..e10f48a1cc
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/freemanhwa/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..74537cee6b
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/freemanhwa/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ae7b8396dc
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/freemanhwa/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0a31331676
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/res/web_hi_res_512.png b/multisrc/overrides/madara/freemanhwa/res/web_hi_res_512.png
new file mode 100644
index 0000000000..15f3102c8a
Binary files /dev/null and b/multisrc/overrides/madara/freemanhwa/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/freemanhwa/src/FreeManhwa.kt b/multisrc/overrides/madara/freemanhwa/src/FreeManhwa.kt
new file mode 100644
index 0000000000..3b86977e47
--- /dev/null
+++ b/multisrc/overrides/madara/freemanhwa/src/FreeManhwa.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.freemanhwa
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class FreeManhwa : Madara("Free Manhwa", "https://manhwas.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/furioscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/furioscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 6e7fcaa133..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/furioscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 53e69abafd..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/furioscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 4ce9567f76..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/furioscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6c5d05fd29..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/furioscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index f1bc366cfc..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/res/web_hi_res_512.png b/multisrc/overrides/madara/furioscans/res/web_hi_res_512.png
deleted file mode 100644
index deaad95709..0000000000
Binary files a/multisrc/overrides/madara/furioscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/furioscans/src/FurioScans.kt b/multisrc/overrides/madara/furioscans/src/FurioScans.kt
deleted file mode 100644
index 2436dc4de6..0000000000
--- a/multisrc/overrides/madara/furioscans/src/FurioScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.furioscans
-
-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 FurioScans : Madara(
- "Furio Scans",
- "https://furioscans.com",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/ghostscan/src/GhostScan.kt b/multisrc/overrides/madara/ghostscan/src/GhostScan.kt
new file mode 100644
index 0000000000..577fac1275
--- /dev/null
+++ b/multisrc/overrides/madara/ghostscan/src/GhostScan.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.ghostscan
+
+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 GhostScan : Madara(
+ "Ghost Scan",
+ "https://ghostscan.com.br",
+ "pt-BR",
+ SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/girlslovemanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/girlslovemanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..221c1073b6
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/girlslovemanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ed34c81628
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5e5bc117fc
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..94cc3d70b4
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5417070717
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/res/web_hi_res_512.png b/multisrc/overrides/madara/girlslovemanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..6f26e4d462
Binary files /dev/null and b/multisrc/overrides/madara/girlslovemanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/girlslovemanga/src/GirlsLoveManga.kt b/multisrc/overrides/madara/girlslovemanga/src/GirlsLoveManga.kt
new file mode 100644
index 0000000000..76ce55f5f5
--- /dev/null
+++ b/multisrc/overrides/madara/girlslovemanga/src/GirlsLoveManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.girlslovemanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class GirlsLoveManga : Madara("Girls Love Manga!", "https://glmanga.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9411becc21
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..16f7e03e4d
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b62027ea0c
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6ebc4a6842
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1de17cb30b
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/res/web_hi_res_512.png b/multisrc/overrides/madara/goodgirlsscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..f5ea283b49
Binary files /dev/null and b/multisrc/overrides/madara/goodgirlsscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/goodgirlsscan/src/GoodGirlsScan.kt b/multisrc/overrides/madara/goodgirlsscan/src/GoodGirlsScan.kt
new file mode 100644
index 0000000000..0ec7c82bf4
--- /dev/null
+++ b/multisrc/overrides/madara/goodgirlsscan/src/GoodGirlsScan.kt
@@ -0,0 +1,89 @@
+package eu.kanade.tachiyomi.extension.en.goodgirlsscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.FormBody
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import org.jsoup.nodes.Element
+
+class GoodGirlsScan : Madara("Good Girls Scan", "https://goodgirls.moe", "en") {
+
+ override val fetchGenres = false
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+ override fun searchMangaSelector() = "article.wp-manga"
+ override fun searchMangaNextPageSelector() = "div.paginator .nav-next"
+ override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Status) + div.summary-content"
+ override val mangaDetailsSelectorDescription = "div.summary-specialfields"
+ override fun chapterListSelector() = "li.wp-manga-chapter:not(.vip-permission)"
+
+ private fun madaraLoadMoreRequest(page: Int, metaKey: String): Request {
+ val formBody = FormBody.Builder().apply {
+ add("action", "madara_load_more")
+ add("page", page.toString())
+ add("template", "madara-core/content/content-archive")
+ add("vars[paged]", "1")
+ add("vars[orderby]", "meta_value_num")
+ add("vars[template]", "archive")
+ add("vars[sidebar]", "right")
+ add("vars[post_type]", "wp-manga")
+ add("vars[post_status]", "publish")
+ add("vars[meta_key]", metaKey)
+ add("vars[meta_query][0][paged]", "1")
+ add("vars[meta_query][0][orderby]", "meta_value_num")
+ add("vars[meta_query][0][template]", "archive")
+ add("vars[meta_query][0][sidebar]", "right")
+ add("vars[meta_query][0][post_type]", "wp-manga")
+ add("vars[meta_query][0][post_status]", "publish")
+ add("vars[meta_query][0][meta_key]", metaKey)
+ add("vars[meta_query][relation]", "AND")
+ add("vars[manga_archives_item_layout]", "default")
+ }.build()
+
+ val xhrHeaders = headersBuilder()
+ .add("Content-Length", formBody.contentLength().toString())
+ .add("Content-Type", formBody.contentType().toString())
+ .add("X-Requested-With", "XMLHttpRequest")
+ .build()
+
+ return POST("$baseUrl/wp-admin/admin-ajax.php", xhrHeaders, formBody)
+ }
+
+ override fun popularMangaRequest(page: Int): Request {
+ return madaraLoadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return madaraLoadMoreRequest(page - 1, "_latest_update")
+ }
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+
+ // heavily modified madara theme, throws 5xx errors on any search filter
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val url = "$baseUrl/${searchPage(page)}".toHttpUrl().newBuilder().apply {
+ addQueryParameter("s", query.trim())
+ }.build()
+
+ return GET(url, headers)
+ }
+
+ override fun getFilterList() = FilterList()
+
+ override fun searchMangaFromElement(element: Element) = SManga.create().apply {
+ element.select(".entry-title a").let {
+ setUrlWithoutDomain(it.attr("href"))
+ title = it.text()
+ }
+ thumbnail_url = element.selectFirst(".post-thumbnail img")?.let(::imageFromElement)
+ }
+}
diff --git a/multisrc/overrides/madara/grabberzone/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/grabberzone/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..38d18ddbfe
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/grabberzone/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/grabberzone/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f957266b14
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/grabberzone/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/grabberzone/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7cebc98427
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/grabberzone/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/grabberzone/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dede1ebffa
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/grabberzone/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/grabberzone/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9e48c5591f
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/grabberzone/res/web_hi_res_512.png b/multisrc/overrides/madara/grabberzone/res/web_hi_res_512.png
new file mode 100644
index 0000000000..f831ed6857
Binary files /dev/null and b/multisrc/overrides/madara/grabberzone/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/grabberzone/src/GrabberZone.kt b/multisrc/overrides/madara/grabberzone/src/GrabberZone.kt
new file mode 100644
index 0000000000..98a3b3502e
--- /dev/null
+++ b/multisrc/overrides/madara/grabberzone/src/GrabberZone.kt
@@ -0,0 +1,30 @@
+package eu.kanade.tachiyomi.extension.all.grabberzone
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.SChapter
+import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class GrabberZone : Madara(
+ "Grabber Zone",
+ "https://grabber.zone",
+ "all",
+ SimpleDateFormat("dd.MM.yyyy", Locale.ENGLISH),
+) {
+ override val mangaSubString = "comics"
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+
+ override fun chapterFromElement(element: Element): SChapter {
+ return super.chapterFromElement(element).apply {
+ name = element.selectFirst("a + a")!!.text()
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/harimanga/src/Harimanga.kt b/multisrc/overrides/madara/harimanga/src/Harimanga.kt
index 9af4f9751f..6fbeffa786 100644
--- a/multisrc/overrides/madara/harimanga/src/Harimanga.kt
+++ b/multisrc/overrides/madara/harimanga/src/Harimanga.kt
@@ -1,7 +1,5 @@
package eu.kanade.tachiyomi.extension.en.harimanga
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-class Harimanga : Madara("Harimanga", "https://harimanga.com", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US))
+class Harimanga : Madara("Harimanga", "https://harimanga.com", "en")
diff --git a/multisrc/overrides/madara/helascan/src/HelaScan.kt b/multisrc/overrides/madara/helascan/src/HelaScan.kt
deleted file mode 100644
index f6914e2792..0000000000
--- a/multisrc/overrides/madara/helascan/src/HelaScan.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.helascan
-
-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 HelaScan : Madara(
- "Hela Scan",
- "https://helascan.com",
- "pt-BR",
- SimpleDateFormat("dd 'de' MMMMM 'de' yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-
- override val mangaDetailsSelectorTag = ""
-}
diff --git a/multisrc/overrides/madara/hentai3z/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/hentai3z/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7825c08b7e
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai3z/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/hentai3z/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ddcbe1ecca
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai3z/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai3z/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2635b6e493
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai3z/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai3z/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3edefcaf43
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai3z/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai3z/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cf5633a64d
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai3z/res/web_hi_res_512.png b/multisrc/overrides/madara/hentai3z/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a6f227e83a
Binary files /dev/null and b/multisrc/overrides/madara/hentai3z/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/hentai3z/src/Hentai3z.kt b/multisrc/overrides/madara/hentai3z/src/Hentai3z.kt
new file mode 100644
index 0000000000..4563a8c3d4
--- /dev/null
+++ b/multisrc/overrides/madara/hentai3z/src/Hentai3z.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.hentai3z
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Hentai3z : Madara("Hentai3z", "https://hentai3z.xyz", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/hentai4free/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/hentai4free/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9cd3ea9b58
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai4free/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/hentai4free/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f6fc19d46f
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai4free/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai4free/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7c10fc9c03
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai4free/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai4free/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6f398266dc
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai4free/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentai4free/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..13856ef345
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentai4free/res/web_hi_res_512.png b/multisrc/overrides/madara/hentai4free/res/web_hi_res_512.png
new file mode 100644
index 0000000000..13412e22b2
Binary files /dev/null and b/multisrc/overrides/madara/hentai4free/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/hentai4free/src/Hentai4Free.kt b/multisrc/overrides/madara/hentai4free/src/Hentai4Free.kt
new file mode 100644
index 0000000000..d8b2e7729e
--- /dev/null
+++ b/multisrc/overrides/madara/hentai4free/src/Hentai4Free.kt
@@ -0,0 +1,50 @@
+package eu.kanade.tachiyomi.extension.en.hentai4free
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.FilterList
+import okhttp3.Request
+
+class Hentai4Free : Madara("Hentai4Free", "https://hentai4free.net", "en") {
+ override val useNewChapterEndpoint = true
+ override val mangaSubString = "hentai"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
+ override fun popularMangaSelector() = searchMangaSelector()
+
+ override fun popularMangaRequest(page: Int): Request =
+ searchMangaRequest(
+ page,
+ "",
+ FilterList(
+ listOf(
+ OrderByFilter(
+ "",
+ listOf(
+ Pair("", ""),
+ Pair("", "views"),
+ ),
+ 1,
+ ),
+ ),
+ ),
+ )
+
+ override fun latestUpdatesRequest(page: Int): Request =
+ searchMangaRequest(
+ page,
+ "",
+ FilterList(
+ listOf(
+ OrderByFilter(
+ "",
+ listOf(
+ Pair("", ""),
+ Pair("", "latest"),
+ ),
+ 1,
+ ),
+ ),
+ ),
+ )
+}
diff --git a/multisrc/overrides/madara/hentaicube/src/HentaiCB.kt b/multisrc/overrides/madara/hentaicube/src/HentaiCB.kt
index eb1d34a6b1..9ae77feb79 100644
--- a/multisrc/overrides/madara/hentaicube/src/HentaiCB.kt
+++ b/multisrc/overrides/madara/hentaicube/src/HentaiCB.kt
@@ -6,7 +6,7 @@ import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
-class HentaiCB : Madara("Hentai CB", "https://cubeteam.xyz", "vi", SimpleDateFormat("dd/MM/yyyy", Locale("vi"))) {
+class HentaiCB : Madara("Hentai CB", "https://hentaicube.net", "vi", SimpleDateFormat("dd/MM/yyyy", Locale("vi"))) {
override val id: Long = 823638192569572166
override fun pageListParse(document: Document): List {
return super.pageListParse(document).distinctBy { it.imageUrl }
diff --git a/multisrc/overrides/madara/hentaiteca/src/HentaiTeca.kt b/multisrc/overrides/madara/hentaiteca/src/HentaiTeca.kt
index 5689d18f50..f63de0c24f 100644
--- a/multisrc/overrides/madara/hentaiteca/src/HentaiTeca.kt
+++ b/multisrc/overrides/madara/hentaiteca/src/HentaiTeca.kt
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.extension.pt.hentaiteca
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.Headers
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
@@ -18,7 +17,4 @@ class HentaiTeca : Madara(
override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", "$baseUrl/")
}
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..f8eb032487
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..619332776a
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0816dc0114
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fa25607252
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0986c1539d
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/res/web_hi_res_512.png b/multisrc/overrides/madara/hentaixdickgirl/res/web_hi_res_512.png
new file mode 100644
index 0000000000..5205361787
Binary files /dev/null and b/multisrc/overrides/madara/hentaixdickgirl/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/hentaixdickgirl/src/HentaiXDickgirl.kt b/multisrc/overrides/madara/hentaixdickgirl/src/HentaiXDickgirl.kt
new file mode 100644
index 0000000000..1e6704a684
--- /dev/null
+++ b/multisrc/overrides/madara/hentaixdickgirl/src/HentaiXDickgirl.kt
@@ -0,0 +1,23 @@
+package eu.kanade.tachiyomi.extension.en.hentaixdickgirl
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.source.model.UpdateStrategy
+import org.jsoup.nodes.Document
+
+class HentaiXDickgirl : Madara("HentaiXDickgirl", "https://hentaixdickgirl.com", "en") {
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+
+ override fun mangaDetailsParse(document: Document): SManga {
+ return super.mangaDetailsParse(document).apply {
+ update_strategy = UpdateStrategy.ONLY_FETCH_ONCE
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/hentaizone/src/HentaiZone.kt b/multisrc/overrides/madara/hentaizone/src/HentaiZone.kt
new file mode 100644
index 0000000000..bc4d2b4a37
--- /dev/null
+++ b/multisrc/overrides/madara/hentaizone/src/HentaiZone.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.fr.hentaizone
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class HentaiZone : Madara("HentaiZone", "https://hentaizone.xyz", "fr", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.FRENCH)) {
+ override val mangaSubString = "tous-les-mangas"
+}
diff --git a/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt b/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt
index 9f7b72d805..7f01997905 100644
--- a/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt
+++ b/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt
@@ -9,10 +9,10 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
-class Hiperdex : Madara("Hiperdex", "https://1sthiperdex.com", "en") {
+class Hiperdex : Madara("Hiperdex", "https://hiperdex.com", "en") {
override val useNewChapterEndpoint: Boolean = true
- private val defaultBaseUrl = "https://1sthiperdex.com"
+ private val defaultBaseUrl = "https://hiperdex.com"
override val baseUrl by lazy { getPrefBaseUrl() }
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 10ce53b207..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index dbf838111a..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index c80807b318..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index d3ede62067..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 56cd6d5a46..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/res/web_hi_res_512.png b/multisrc/overrides/madara/ichirinnohanayuri/res/web_hi_res_512.png
deleted file mode 100644
index 066c5dfa4a..0000000000
Binary files a/multisrc/overrides/madara/ichirinnohanayuri/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ichirinnohanayuri/src/IchirinNoHanaYuri.kt b/multisrc/overrides/madara/ichirinnohanayuri/src/IchirinNoHanaYuri.kt
deleted file mode 100644
index 9c5987f09b..0000000000
--- a/multisrc/overrides/madara/ichirinnohanayuri/src/IchirinNoHanaYuri.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.ichirinnohanayuri
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.Headers
-import okhttp3.OkHttpClient
-import java.io.IOException
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class IchirinNoHanaYuri : Madara(
- "Ichirin No Hana Yuri",
- "https://ichirinnohanayuriscan.com",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .addInterceptor { chain ->
- val response = chain.proceed(chain.request())
-
- if (response.code == 403) {
- response.close()
- throw IOException(BLOCKING_MESSAGE)
- }
-
- response
- }
- .build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
-
- companion object {
- private const val BLOCKING_MESSAGE = "O site está bloqueando o Tachiyomi. " +
- "Migre para outra fonte caso o problema persistir."
- }
-}
diff --git a/multisrc/overrides/madara/isekaiscaneu/src/IsekaiScanTo.kt b/multisrc/overrides/madara/isekaiscaneu/src/IsekaiScanTo.kt
index 7cd4ebadf3..45797cb35e 100644
--- a/multisrc/overrides/madara/isekaiscaneu/src/IsekaiScanTo.kt
+++ b/multisrc/overrides/madara/isekaiscaneu/src/IsekaiScanTo.kt
@@ -4,6 +4,8 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
-class IsekaiScanTo : Madara("IsekaiScan.to (unoriginal)", "https://isekaiscan.to", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US)) {
+class IsekaiScanTo : Madara("IsekaiScan.to (unoriginal)", "https://m.isekaiscan.to", "en", SimpleDateFormat("MM/dd/yyyy", Locale.US)) {
override val id = 8608305834807261892L; // from former IsekaiScan.eu source
+
+ override val mangaSubString = "mangax"
}
diff --git a/multisrc/overrides/madara/isekaiscantop/src/IsekaiScanTop.kt b/multisrc/overrides/madara/isekaiscantop/src/IsekaiScanTop.kt
index e29c02c568..54614826c4 100644
--- a/multisrc/overrides/madara/isekaiscantop/src/IsekaiScanTop.kt
+++ b/multisrc/overrides/madara/isekaiscantop/src/IsekaiScanTop.kt
@@ -41,7 +41,6 @@ class IsekaiScanTop : Madara(
if (chapterElements.isEmpty() && !chaptersWrapper.isNullOrEmpty()) {
val mangaId = chaptersWrapper.attr("data-id")
val xhrHeaders = headersBuilder()
- .add("Referer", "$baseUrl/")
.add("X-Requested-With", "XMLHttpRequest")
.build()
val xhrRequest = GET("$baseUrl/ajax-list-chapter?mangaID=$mangaId", xhrHeaders)
diff --git a/multisrc/overrides/madara/jimanga/src/Jimanga.kt b/multisrc/overrides/madara/jimanga/src/Jimanga.kt
new file mode 100644
index 0000000000..df1e41e133
--- /dev/null
+++ b/multisrc/overrides/madara/jimanga/src/Jimanga.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.jimanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Jimanga : Madara("Jimanga", "https://jimanga.com", "en") {
+ override val useNewChapterEndpoint = false
+ override val filterNonMangaItems = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/kalangoscan/src/KalangoScan.kt b/multisrc/overrides/madara/kalangoscan/src/KalangoScan.kt
deleted file mode 100644
index e5f19ebeec..0000000000
--- a/multisrc/overrides/madara/kalangoscan/src/KalangoScan.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.kalangoscan
-
-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 KalangoScan : Madara(
- "Kalango Scan",
- "https://kalangoscan.online",
- "pt-BR",
- SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/kataitake/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/kataitake/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..8a7c31d5e0
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kataitake/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/kataitake/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..0c1bc2802f
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kataitake/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/kataitake/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1d29bf452c
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kataitake/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/kataitake/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..670bf77366
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kataitake/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/kataitake/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cef93935d8
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kataitake/res/web_hi_res_512.png b/multisrc/overrides/madara/kataitake/res/web_hi_res_512.png
new file mode 100644
index 0000000000..6b3e83781a
Binary files /dev/null and b/multisrc/overrides/madara/kataitake/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/kataitake/src/Kataitake.kt b/multisrc/overrides/madara/kataitake/src/Kataitake.kt
new file mode 100644
index 0000000000..99080f11bd
--- /dev/null
+++ b/multisrc/overrides/madara/kataitake/src/Kataitake.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.fr.kataitake
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Kataitake : Madara("Kataitake", "https://www.kataitake.fr", "fr", dateFormat = SimpleDateFormat("dd/mm/yyyy", Locale.FRANCE)) {
+ override val altName: String = "Noms alternatifs :"
+}
diff --git a/multisrc/overrides/madara/kingsmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/kingsmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..e5de1eaf75
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/kingsmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..70ccfe481e
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/kingsmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cdb900aa7d
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/kingsmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3f9485894b
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/kingsmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ad0c337369
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/kingsmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c15978aa10
Binary files /dev/null and b/multisrc/overrides/madara/kingsmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/kingsmanga/src/KingsManga.kt b/multisrc/overrides/madara/kingsmanga/src/KingsManga.kt
new file mode 100644
index 0000000000..adf99355df
--- /dev/null
+++ b/multisrc/overrides/madara/kingsmanga/src/KingsManga.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.th.kingsmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class KingsManga : Madara(
+ "Kings-Manga",
+ "https://www.kings-manga.co",
+ "th",
+ dateFormat = SimpleDateFormat("d MMMM yyyy", Locale("th")),
+) {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/koinoboriscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/koinoboriscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4e63d01ef8
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/koinoboriscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..cb3bf91585
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..67ee088e6a
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1e363666d4
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cc3885bc78
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/res/web_hi_res_512.png b/multisrc/overrides/madara/koinoboriscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..54ec5ad667
Binary files /dev/null and b/multisrc/overrides/madara/koinoboriscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/koinoboriscan/src/KoinoboriScan.kt b/multisrc/overrides/madara/koinoboriscan/src/KoinoboriScan.kt
new file mode 100644
index 0000000000..332da54fea
--- /dev/null
+++ b/multisrc/overrides/madara/koinoboriscan/src/KoinoboriScan.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.es.koinoboriscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class KoinoboriScan : Madara(
+ "Koinobori Scan",
+ "https://koinoboriscan.com",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1)
+ .build()
+}
diff --git a/multisrc/overrides/madara/komikgue/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/komikgue/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..6aa99fd502
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/komikgue/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/komikgue/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..006ad96cc1
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/komikgue/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/komikgue/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6b2257f69c
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/komikgue/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/komikgue/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c021046ced
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/komikgue/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/komikgue/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1822e6a36a
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/komikgue/res/web_hi_res_512.png b/multisrc/overrides/madara/komikgue/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2a283540a1
Binary files /dev/null and b/multisrc/overrides/madara/komikgue/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/komikgue/src/KomikGue.kt b/multisrc/overrides/madara/komikgue/src/KomikGue.kt
new file mode 100644
index 0000000000..d067b98c4b
--- /dev/null
+++ b/multisrc/overrides/madara/komikgue/src/KomikGue.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.id.komikgue
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class KomikGue : Madara(
+ "Komik Gue",
+ "https://komikgue.pro",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")),
+) {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/legionscan/src/LegionScan.kt b/multisrc/overrides/madara/legionscan/src/LegionScan.kt
deleted file mode 100644
index 7ed52c5497..0000000000
--- a/multisrc/overrides/madara/legionscan/src/LegionScan.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.legionscan
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class LegionScan : Madara("Legion Scan", "https://legionscans.com", "es", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")))
diff --git a/multisrc/overrides/madara/leviatanscans/src/LeviatanScans.kt b/multisrc/overrides/madara/leviatanscans/src/LeviatanScans.kt
index 247bd399c0..611cb5e874 100644
--- a/multisrc/overrides/madara/leviatanscans/src/LeviatanScans.kt
+++ b/multisrc/overrides/madara/leviatanscans/src/LeviatanScans.kt
@@ -1,21 +1,24 @@
-package eu.kanade.tachiyomi.extension.all.leviatanscans
+package eu.kanade.tachiyomi.extension.en.leviatanscans
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
+import java.util.Locale
-abstract class LeviatanScans(
- baseUrl: String,
- lang: String,
- dateFormat: SimpleDateFormat,
-) : Madara(
+class LeviatanScans : Madara(
"Leviatan Scans",
- baseUrl,
- lang,
- dateFormat,
+ "https://lscomic.com",
+ "en",
+ dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.US),
) {
+
+ override val id = 4055499394183150749
+
+ override val mangaDetailsSelectorDescription = "div.manga-summary"
+ override val mangaDetailsSelectorAuthor = "div.manga-authors"
+
override val useNewChapterEndpoint: Boolean = true
override fun chapterListSelector() = "li.wp-manga-chapter:not(.premium-block)"
diff --git a/multisrc/overrides/madara/leviatanscans/src/LeviatanScansFactory.kt b/multisrc/overrides/madara/leviatanscans/src/LeviatanScansFactory.kt
deleted file mode 100644
index d110edad1a..0000000000
--- a/multisrc/overrides/madara/leviatanscans/src/LeviatanScansFactory.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.leviatanscans
-
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.Source
-import eu.kanade.tachiyomi.source.SourceFactory
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class LeviatanScansFactory : SourceFactory {
- override fun createSources(): List